]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Fix peertube subtitles import
authorChocobozzz <me@florianbigard.com>
Fri, 26 May 2023 14:00:19 +0000 (16:00 +0200)
committerChocobozzz <me@florianbigard.com>
Fri, 26 May 2023 14:05:08 +0000 (16:05 +0200)
server/helpers/custom-validators/video-captions.ts
server/lib/video-pre-import.ts
server/tests/api/videos/video-imports.ts

index d5b09ea03628a998a921958bb72fec5c20c572b4..0e24655a081a793864a6890c5375bd0cdecd6fed 100644 (file)
@@ -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')
 
-  if (size > CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max) return false
+  logger.debug('Checking VTT file %s', filePath, { size, content })
 
-  const content = await readFile(filePath, 'utf8')
+  if (size > CONSTRAINTS_FIELDS.VIDEO_CAPTIONS.CAPTION_FILE.FILE_SIZE.max) return false
 
-  return content?.startsWith('WEBVTT\n')
+  return content?.startsWith('WEBVTT')
 }
 
 // ---------------------------------------------------------------------------
index 7960798758f9fbf5037588d964568d404a7c2c2b..df67dc953f52ba9e46bb338af8f3629fbfd0fe8e 100644 (file)
@@ -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 })
index 878452ed2c988315d66bf842ad6e0936cba81ef1..192b2aeb9ae7c705090ee2ecf90d1eaeb23e8ef0 100644 (file)
@@ -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))
           }
         }
       })