From c56dd2807fe5d129907b9bf8c42656a8314d754b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 26 May 2023 16:00:19 +0200 Subject: [PATCH] Fix peertube subtitles import --- server/helpers/custom-validators/video-captions.ts | 8 +++++--- server/lib/video-pre-import.ts | 7 +++++-- server/tests/api/videos/video-imports.ts | 10 ++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/server/helpers/custom-validators/video-captions.ts b/server/helpers/custom-validators/video-captions.ts index d5b09ea03..0e24655a0 100644 --- a/server/helpers/custom-validators/video-captions.ts +++ b/server/helpers/custom-validators/video-captions.ts @@ -2,6 +2,7 @@ import { UploadFilesForCheck } from 'express' import { readFile } from 'fs-extra' import { getFileSize } from '@shared/extra-utils' import { CONSTRAINTS_FIELDS, MIMETYPES, VIDEO_LANGUAGES } from '../../initializers/constants' +import { logger } from '../logger' import { exists, isFileValid } from './misc' function isVideoCaptionLanguageValid (value: any) { @@ -24,12 +25,13 @@ function isVideoCaptionFile (files: UploadFilesForCheck, field: string) { async function isVTTFileValid (filePath: string) { const size = await getFileSize(filePath) + const content = await readFile(filePath, 'utf8') + + logger.debug('Checking VTT file %s', filePath, { size, content }) if (size > CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max) return false - const content = await readFile(filePath, 'utf8') - - return content?.startsWith('WEBVTT\n') + return content?.startsWith('WEBVTT') } // --------------------------------------------------------------------------- diff --git a/server/lib/video-pre-import.ts b/server/lib/video-pre-import.ts index 796079875..df67dc953 100644 --- a/server/lib/video-pre-import.ts +++ b/server/lib/video-pre-import.ts @@ -259,7 +259,7 @@ async function forgeThumbnail ({ inputPath, video, downloadUrl, type }: { try { return await updateVideoMiniatureFromUrl({ downloadUrl, video, type }) } catch (err) { - logger.warn('Cannot process thumbnail %s from youtubedl.', downloadUrl, { err }) + logger.warn('Cannot process thumbnail %s from youtube-dl.', downloadUrl, { err }) } } return null @@ -269,10 +269,11 @@ async function processYoutubeSubtitles (youtubeDL: YoutubeDLWrapper, targetUrl: try { const subtitles = await youtubeDL.getSubtitles() - logger.info('Will create %s subtitles from youtube import %s.', subtitles.length, targetUrl) + logger.info('Found %s subtitles candidates from youtube-dl import %s.', subtitles.length, targetUrl) for (const subtitle of subtitles) { if (!await isVTTFileValid(subtitle.path)) { + logger.info('%s is not a valid youtube-dl subtitle, skipping', subtitle.path) await remove(subtitle.path) continue } @@ -289,6 +290,8 @@ async function processYoutubeSubtitles (youtubeDL: YoutubeDLWrapper, targetUrl: await sequelizeTypescript.transaction(async t => { await VideoCaptionModel.insertOrReplaceLanguage(videoCaption, t) }) + + logger.info('Added %s youtube-dl subtitle', subtitle.path) } } catch (err) { logger.warn('Cannot get video subtitles.', { err }) diff --git a/server/tests/api/videos/video-imports.ts b/server/tests/api/videos/video-imports.ts index 878452ed2..192b2aeb9 100644 --- a/server/tests/api/videos/video-imports.ts +++ b/server/tests/api/videos/video-imports.ts @@ -449,6 +449,16 @@ describe('Test video imports', function () { const video = await server.videos.get({ id: videoUUID }) expect(video.name).to.equal('E2E tests') + + const { data: captions } = await server.captions.list({ videoId: videoUUID }) + expect(captions).to.have.lengthOf(1) + expect(captions[0].language.id).to.equal('fr') + + const str = `WEBVTT FILE\r?\n\r?\n` + + `1\r?\n` + + `00:00:04.000 --> 00:00:09.000\r?\n` + + `January 1, 1994. The North American` + await testCaptionFile(server.url, captions[0].captionPath, new RegExp(str)) } } })