Use largest image in torrent as the poster
...as a fallback, if no the torrent doesn't contain any video files
This commit is contained in:
@@ -510,6 +510,7 @@ function updateTorrentProgress () {
|
|||||||
var changed = false
|
var changed = false
|
||||||
state.client.torrents.forEach(function (torrent) {
|
state.client.torrents.forEach(function (torrent) {
|
||||||
var torrentSummary = getTorrentSummary(torrent.infoHash)
|
var torrentSummary = getTorrentSummary(torrent.infoHash)
|
||||||
|
if (!torrentSummary) return
|
||||||
torrent.files.forEach(function (file, index) {
|
torrent.files.forEach(function (file, index) {
|
||||||
var numPieces = file._endPiece - file._startPiece + 1
|
var numPieces = file._endPiece - file._startPiece + 1
|
||||||
var numPiecesPresent = 0
|
var numPiecesPresent = 0
|
||||||
@@ -530,12 +531,12 @@ function updateTorrentProgress () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function generateTorrentPoster (torrent, torrentSummary) {
|
function generateTorrentPoster (torrent, torrentSummary) {
|
||||||
torrentPoster(torrent, function (err, buf) {
|
torrentPoster(torrent, function (err, buf, extension) {
|
||||||
if (err) return onWarning(err)
|
if (err) return onWarning(err)
|
||||||
// save it for next time
|
// save it for next time
|
||||||
mkdirp(config.CONFIG_POSTER_PATH, function (err) {
|
mkdirp(config.CONFIG_POSTER_PATH, function (err) {
|
||||||
if (err) return onWarning(err)
|
if (err) return onWarning(err)
|
||||||
var posterFilePath = path.join(config.CONFIG_POSTER_PATH, torrent.infoHash + '.jpg')
|
var posterFilePath = path.join(config.CONFIG_POSTER_PATH, torrent.infoHash + extension)
|
||||||
fs.writeFile(posterFilePath, buf, function (err) {
|
fs.writeFile(posterFilePath, buf, function (err) {
|
||||||
if (err) return onWarning(err)
|
if (err) return onWarning(err)
|
||||||
// show the poster
|
// show the poster
|
||||||
|
|||||||
@@ -4,19 +4,32 @@ var captureVideoFrame = require('./capture-video-frame')
|
|||||||
var path = require('path')
|
var path = require('path')
|
||||||
|
|
||||||
function torrentPoster (torrent, cb) {
|
function torrentPoster (torrent, cb) {
|
||||||
// filter out file formats that the <video> tag definitely can't play
|
// First, try to use the largest video file
|
||||||
|
// Filter out file formats that the <video> tag definitely can't play
|
||||||
|
var videoFile = getLargestFileByExtension(torrent, ['.mp4', '.m4v', '.webm', '.mov', '.mkv'])
|
||||||
|
if (videoFile) return torrentPosterFromVideo(videoFile, torrent, cb)
|
||||||
|
|
||||||
|
// Second, try to use the largest image file
|
||||||
|
var imgFile = getLargestFileByExtension(torrent, ['.gif', '.jpg', '.png'])
|
||||||
|
if (imgFile) return torrentPosterFromImage(imgFile, torrent, cb)
|
||||||
|
|
||||||
|
// TODO: generate a waveform from the largest sound file
|
||||||
|
// Finally, admit defeat
|
||||||
|
return cb(new Error('Cannot generate a poster from any files in the torrent'))
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLargestFileByExtension (torrent, extensions) {
|
||||||
var files = torrent.files.filter(function (file) {
|
var files = torrent.files.filter(function (file) {
|
||||||
var extname = path.extname(file.name)
|
var extname = path.extname(file.name)
|
||||||
return ['.mp4', '.m4v', '.webm', '.mov', '.mkv'].indexOf(extname) !== -1
|
return extensions.indexOf(extname) !== -1
|
||||||
})
|
})
|
||||||
|
if (files.length === 0) return undefined
|
||||||
if (files.length === 0) return cb(new Error('cannot make screenshot for any files in torrent'))
|
return files.reduce(function (a, b) {
|
||||||
|
|
||||||
// use largest file
|
|
||||||
var file = files.reduce(function (a, b) {
|
|
||||||
return a.length > b.length ? a : b
|
return a.length > b.length ? a : b
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
function torrentPosterFromVideo (file, torrent, cb) {
|
||||||
var index = torrent.files.indexOf(file)
|
var index = torrent.files.indexOf(file)
|
||||||
|
|
||||||
var server = torrent.createServer(0)
|
var server = torrent.createServer(0)
|
||||||
@@ -51,7 +64,12 @@ function torrentPoster (torrent, cb) {
|
|||||||
|
|
||||||
server.destroy()
|
server.destroy()
|
||||||
|
|
||||||
cb(null, buf)
|
cb(null, buf, '.jpg')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function torrentPosterFromImage (file, torrent, cb) {
|
||||||
|
var extname = path.extname(file.name)
|
||||||
|
file.getBuffer((err, buf) => cb(err, buf, extname))
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user