/uploads/
/videos/
/thumbnails/
+/previews/
/certs/
/logs/
/torrents/
certs: 'certs/'
videos: 'videos/'
logs: 'logs/'
+ previews: 'previews/'
thumbnails: 'thumbnails/'
torrents: 'torrents/'
app.use(apiRoute, routes.api)
app.use('/', routes.client)
-// Static files
+// Static client files
+// TODO: move in client
app.use('/client', express.static(path.join(__dirname, '/client/dist'), { maxAge: constants.STATIC_MAX_AGE }))
// 404 for static files not found
app.use('/client/*', function (req, res, next) {
const thumbnailsPhysicalPath = constants.CONFIG.STORAGE.THUMBNAILS_DIR
app.use(constants.STATIC_PATHS.THUMBNAILS, express.static(thumbnailsPhysicalPath, { maxAge: constants.STATIC_MAX_AGE }))
+// Video previews path for express
+const previewsPhysicalPath = constants.CONFIG.STORAGE.PREVIEWS_DIR
+app.use(constants.STATIC_PATHS.PREVIEWS, express.static(previewsPhysicalPath, { maxAge: constants.STATIC_MAX_AGE }))
+
// Always serve index client page
app.use('/*', function (req, res, next) {
res.sendFile(path.join(__dirname, './client/dist/index.html'))
const required = [ 'listen.port',
'webserver.https', 'webserver.hostname', 'webserver.port',
'database.hostname', 'database.port', 'database.suffix',
- 'storage.certs', 'storage.videos', 'storage.logs', 'storage.thumbnails'
+ 'storage.certs', 'storage.videos', 'storage.logs', 'storage.thumbnails', 'storage.previews'
]
const miss = []
LOG_DIR: path.join(__dirname, '..', '..', config.get('storage.logs')),
VIDEOS_DIR: path.join(__dirname, '..', '..', config.get('storage.videos')),
THUMBNAILS_DIR: path.join(__dirname, '..', '..', config.get('storage.thumbnails')),
+ PREVIEWS_DIR: path.join(__dirname, '..', '..', config.get('storage.previews')),
TORRENTS_DIR: path.join(__dirname, '..', '..', config.get('storage.torrents'))
},
WEBSERVER: {
// Express static paths (router)
const STATIC_PATHS = {
+ PREVIEWS: '/static/previews',
THUMBNAILS: '/static/thumbnails',
TORRENTS: '/static/torrents/',
WEBSEED: '/static/webseed/'
// Videos thumbnail size
const THUMBNAILS_SIZE = '200x110'
+const PREVIEWS_SIZE = '640x480'
const USER_ROLES = {
ADMIN: 'admin',
REQUESTS_INTERVAL,
REQUESTS_LIMIT,
RETRY_REQUESTS,
+ PREVIEWS_SIZE,
SEARCHABLE_COLUMNS,
SORTABLE_COLUMNS,
STATIC_MAX_AGE,
},
function (callback) {
removeTorrent(video, callback)
+ },
+ function (callback) {
+ removePreview(video, callback)
}
)
}
},
function (callback) {
createThumbnail(videoPath, callback)
+ },
+ function (callback) {
+ createPreview(videoPath, callback)
}
)
fs.unlink(constants.CONFIG.STORAGE.VIDEOS_DIR + video.filename, callback)
}
-// Maybe the torrent is not seeded, but we catch the error to don't stop the removing process
function removeTorrent (video, callback) {
fs.unlink(constants.CONFIG.STORAGE.TORRENTS_DIR + video.filename + '.torrent', callback)
}
+function removePreview (video, callback) {
+ // Same name than video thumnail
+ // TODO: refractoring
+ fs.unlink(constants.CONFIG.STORAGE.PREVIEWS_DIR + video.thumbnail, callback)
+}
+
+function createPreview (videoPath, callback) {
+ const filename = pathUtils.basename(videoPath) + '.jpg'
+ ffmpeg(videoPath)
+ .on('error', callback)
+ .on('end', function () {
+ callback(null, filename)
+ })
+ .thumbnail({
+ count: 1,
+ folder: constants.CONFIG.STORAGE.PREVIEWS_DIR,
+ filename: filename
+ })
+}
+
function createThumbnail (videoPath, callback) {
const filename = pathUtils.basename(videoPath) + '.jpg'
ffmpeg(videoPath)