From a2eeab1ef2a7a89ecdda45aadb9a438ec2518097 Mon Sep 17 00:00:00 2001 From: Janne Koschinski <janne@kuschku.de> Date: Fri, 25 Sep 2020 21:54:50 +0200 Subject: [PATCH] Implement previews --- src/directory_walker.js | 7 ++++++- src/metadata_loader.js | 35 ++++++++++++++++++++++++----------- src/model.js | 3 +++ src/storage.js | 28 ++++++++++++++++++++++++++-- 4 files changed, 59 insertions(+), 14 deletions(-) diff --git a/src/directory_walker.js b/src/directory_walker.js index f20145b..faf5a33 100644 --- a/src/directory_walker.js +++ b/src/directory_walker.js @@ -114,6 +114,10 @@ class FileManager { fileName.endsWith(".vtt") ) + const previewFilePath = path.join(base, "spritesheets", "preview.vtt"); + const previewFileExists = (await fsPromises.stat(previewFilePath)).isFile(); + const previewFile = previewFileExists ? previewFilePath : null; + const mediaFiles = dashManifest ? [dashManifest] : files.filter(fileName => fileName.endsWith(".mp4") || fileName.endsWith(".webm") || @@ -138,7 +142,8 @@ class FileManager { src: encodePath(path.relative(this.basePath, path.join(base, "subtitles", name))) } }), - media: media + preview: previewFile !== null ? encodePath(path.relative(this.basePath, previewFile)) : null, + media } } } diff --git a/src/metadata_loader.js b/src/metadata_loader.js index 9866279..437e637 100644 --- a/src/metadata_loader.js +++ b/src/metadata_loader.js @@ -14,6 +14,7 @@ import { TitleImage, TitleMedia, TitleName, + TitlePreview, TitleRating, TitleSubtitles } from "./model"; @@ -237,7 +238,7 @@ class MetadataLoader { await originalTitleDescription.setTitle(episodeTitle.id, {save: false}); await originalTitleDescription.save(); for (let el of tmdbTranslations.translations) { - if (el.data.overview) { + if (el.data.overview && el.data.overview.trim() !== "") { const titleDescription = await TitleDescription.build({ region: el.iso_3166_1, languages: el.iso_639_1 ? el.iso_639_1.split(",") : [], @@ -408,11 +409,23 @@ class MetadataLoader { } async processMediaMetadata(title, media) { - await TitleMedia.destroy({ - where: { - title_id: title.id, - } - }) + await Promise.all([ + TitleMedia.destroy({ + where: { + title_id: title.id, + } + }), + TitleSubtitles.destroy({ + where: { + title_id: title.id, + } + }), + TitlePreview.destroy({ + where: { + title_id: title.id, + } + }) + ]); for (let format of media.media) { const titleMedia = await TitleMedia.build({ mime: format.container, @@ -423,11 +436,6 @@ class MetadataLoader { await titleMedia.setTitle(title.id, {save: false}); await titleMedia.save(); } - await TitleSubtitles.destroy({ - where: { - title_id: title.id, - } - }) for (let subtitle of media.subtitles) { const titleSubtitles = await TitleSubtitles.build({ language: subtitle.language, @@ -439,6 +447,11 @@ class MetadataLoader { await titleSubtitles.setTitle(title.id, {save: false}); await titleSubtitles.save(); } + const titlePreview = await TitlePreview.build({ + src: media.preview, + }) + await titlePreview.setTitle(title.id, {save: false}); + await titlePreview.save(); } async loadEpisodeMetadata(ids, episodeIdentifier) { diff --git a/src/model.js b/src/model.js index 7fd8a13..6b11d8a 100644 --- a/src/model.js +++ b/src/model.js @@ -35,3 +35,6 @@ export class TitleRating extends sequelize.Model { export class TitleSubtitles extends sequelize.Model { } + +export class TitlePreview extends sequelize.Model { +} diff --git a/src/storage.js b/src/storage.js index fe9b3bb..de5e1e7 100644 --- a/src/storage.js +++ b/src/storage.js @@ -10,8 +10,9 @@ import { TitleImage, TitleMedia, TitleName, + TitlePreview, TitleRating, - TitleSubtitles + TitleSubtitles, } from "./model"; class Backend { @@ -399,13 +400,36 @@ class Backend { } }); Title.hasMany(TitleSubtitles); + TitlePreview.init({ + id: { + type: sequelize.DataTypes.UUID, + defaultValue: sequelize.DataTypes.UUIDV4, + allowNull: false, + primaryKey: true + }, + src: { + type: sequelize.DataTypes.TEXT, + allowNull: true, + }, + }, { + sequelize: this.db, + underscored: true, + modelName: 'title_preview', + indexes: [] + }); + TitlePreview.belongsTo(Title, { + foreignKey: { + allowNull: false, + } + }); + Title.hasOne(TitlePreview); } async sync() { await Promise.all([ Genre.sync(), Person.sync(), Title.sync(), TitleCast.sync(), TitleDescription.sync(), TitleEpisode.sync(), TitleGenre.sync(), TitleImage.sync(), - TitleMedia.sync(), TitleName.sync(), TitleRating.sync(), TitleSubtitles.sync(), + TitleMedia.sync(), TitleName.sync(), TitleRating.sync(), TitleSubtitles.sync(), TitlePreview.sync(), ]); } -- GitLab