diff options
author | Chocobozzz <me@florianbigard.com> | 2022-11-14 11:11:39 +0100 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2022-11-14 11:11:39 +0100 |
commit | 4efa5535ccc947597b7a8e343d6665229ab9cfce (patch) | |
tree | 7d3167499c83a9ef33782d4a120f0f757e919819 | |
parent | 0e45e336f62a411b3c423be46d16252355c754d7 (diff) | |
download | PeerTube-4efa5535ccc947597b7a8e343d6665229ab9cfce.tar.gz PeerTube-4efa5535ccc947597b7a8e343d6665229ab9cfce.tar.zst PeerTube-4efa5535ccc947597b7a8e343d6665229ab9cfce.zip |
Fix infinite playlist import
Using an hard videos limit in config
-rw-r--r-- | config/default.yaml | 3 | ||||
-rw-r--r-- | config/production.yaml.example | 3 | ||||
-rw-r--r-- | server/initializers/checker-before-init.ts | 1 | ||||
-rw-r--r-- | server/initializers/config.ts | 3 | ||||
-rw-r--r-- | server/lib/job-queue/handlers/video-channel-import.ts | 3 | ||||
-rw-r--r-- | server/lib/sync-channel.ts | 2 | ||||
-rw-r--r-- | server/tests/api/videos/channel-import-videos.ts | 43 | ||||
-rw-r--r-- | server/tests/api/videos/video-channel-syncs.ts | 2 |
8 files changed, 56 insertions, 4 deletions
diff --git a/config/default.yaml b/config/default.yaml index 2e249cc76..a916b1dc3 100644 --- a/config/default.yaml +++ b/config/default.yaml | |||
@@ -578,6 +578,9 @@ import: | |||
578 | # Number of latest published videos to check and to potentially import when syncing a channel | 578 | # Number of latest published videos to check and to potentially import when syncing a channel |
579 | videos_limit_per_synchronization: 10 | 579 | videos_limit_per_synchronization: 10 |
580 | 580 | ||
581 | # Max number of videos to import when the user asks for full sync | ||
582 | full_sync_videos_limit: 1000 | ||
583 | |||
581 | auto_blacklist: | 584 | auto_blacklist: |
582 | # New videos automatically blacklisted so moderators can review before publishing | 585 | # New videos automatically blacklisted so moderators can review before publishing |
583 | videos: | 586 | videos: |
diff --git a/config/production.yaml.example b/config/production.yaml.example index c136a73ad..100bc7948 100644 --- a/config/production.yaml.example +++ b/config/production.yaml.example | |||
@@ -588,6 +588,9 @@ import: | |||
588 | # Number of latest published videos to check and to potentially import when syncing a channel | 588 | # Number of latest published videos to check and to potentially import when syncing a channel |
589 | videos_limit_per_synchronization: 10 | 589 | videos_limit_per_synchronization: 10 |
590 | 590 | ||
591 | # Max number of videos to import when the user asks for full sync | ||
592 | full_sync_videos_limit: 1000 | ||
593 | |||
591 | auto_blacklist: | 594 | auto_blacklist: |
592 | # New videos automatically blacklisted so moderators can review before publishing | 595 | # New videos automatically blacklisted so moderators can review before publishing |
593 | videos: | 596 | videos: |
diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts index e5ec0d1df..42be7ee6e 100644 --- a/server/initializers/checker-before-init.ts +++ b/server/initializers/checker-before-init.ts | |||
@@ -35,6 +35,7 @@ function checkMissedConfig () { | |||
35 | 'import.videos.http.enabled', 'import.videos.torrent.enabled', 'import.videos.concurrency', 'import.videos.timeout', | 35 | 'import.videos.http.enabled', 'import.videos.torrent.enabled', 'import.videos.concurrency', 'import.videos.timeout', |
36 | 'import.video_channel_synchronization.enabled', 'import.video_channel_synchronization.max_per_user', | 36 | 'import.video_channel_synchronization.enabled', 'import.video_channel_synchronization.max_per_user', |
37 | 'import.video_channel_synchronization.check_interval', 'import.video_channel_synchronization.videos_limit_per_synchronization', | 37 | 'import.video_channel_synchronization.check_interval', 'import.video_channel_synchronization.videos_limit_per_synchronization', |
38 | 'import.video_channel_synchronization.full_sync_videos_limit', | ||
38 | 'auto_blacklist.videos.of_users.enabled', 'trending.videos.interval_days', | 39 | 'auto_blacklist.videos.of_users.enabled', 'trending.videos.interval_days', |
39 | 'client.videos.miniature.display_author_avatar', | 40 | 'client.videos.miniature.display_author_avatar', |
40 | 'client.videos.miniature.prefer_author_display_name', 'client.menu.login.redirect_on_single_external_auth', | 41 | 'client.videos.miniature.prefer_author_display_name', 'client.menu.login.redirect_on_single_external_auth', |
diff --git a/server/initializers/config.ts b/server/initializers/config.ts index 7652da24a..3dd1f6971 100644 --- a/server/initializers/config.ts +++ b/server/initializers/config.ts | |||
@@ -418,6 +418,9 @@ const CONFIG = { | |||
418 | get CHECK_INTERVAL () { return parseDurationToMs(config.get<string>('import.video_channel_synchronization.check_interval')) }, | 418 | get CHECK_INTERVAL () { return parseDurationToMs(config.get<string>('import.video_channel_synchronization.check_interval')) }, |
419 | get VIDEOS_LIMIT_PER_SYNCHRONIZATION () { | 419 | get VIDEOS_LIMIT_PER_SYNCHRONIZATION () { |
420 | return config.get<number>('import.video_channel_synchronization.videos_limit_per_synchronization') | 420 | return config.get<number>('import.video_channel_synchronization.videos_limit_per_synchronization') |
421 | }, | ||
422 | get FULL_SYNC_VIDEOS_LIMIT () { | ||
423 | return config.get<number>('import.video_channel_synchronization.full_sync_videos_limit') | ||
421 | } | 424 | } |
422 | } | 425 | } |
423 | }, | 426 | }, |
diff --git a/server/lib/job-queue/handlers/video-channel-import.ts b/server/lib/job-queue/handlers/video-channel-import.ts index c3dd8a688..035f88e96 100644 --- a/server/lib/job-queue/handlers/video-channel-import.ts +++ b/server/lib/job-queue/handlers/video-channel-import.ts | |||
@@ -37,6 +37,7 @@ export async function processVideoChannelImport (job: Job) { | |||
37 | await synchronizeChannel({ | 37 | await synchronizeChannel({ |
38 | channel: videoChannel, | 38 | channel: videoChannel, |
39 | externalChannelUrl: payload.externalChannelUrl, | 39 | externalChannelUrl: payload.externalChannelUrl, |
40 | channelSync | 40 | channelSync, |
41 | videosCountLimit: CONFIG.IMPORT.VIDEO_CHANNEL_SYNCHRONIZATION.FULL_SYNC_VIDEOS_LIMIT | ||
41 | }) | 42 | }) |
42 | } | 43 | } |
diff --git a/server/lib/sync-channel.ts b/server/lib/sync-channel.ts index 4d00d6163..10167ee38 100644 --- a/server/lib/sync-channel.ts +++ b/server/lib/sync-channel.ts | |||
@@ -12,8 +12,8 @@ import { ServerConfigManager } from './server-config-manager' | |||
12 | export async function synchronizeChannel (options: { | 12 | export async function synchronizeChannel (options: { |
13 | channel: MChannelAccountDefault | 13 | channel: MChannelAccountDefault |
14 | externalChannelUrl: string | 14 | externalChannelUrl: string |
15 | videosCountLimit: number | ||
15 | channelSync?: MChannelSync | 16 | channelSync?: MChannelSync |
16 | videosCountLimit?: number | ||
17 | onlyAfter?: Date | 17 | onlyAfter?: Date |
18 | }) { | 18 | }) { |
19 | const { channel, externalChannelUrl, videosCountLimit, onlyAfter, channelSync } = options | 19 | const { channel, externalChannelUrl, videosCountLimit, onlyAfter, channelSync } = options |
diff --git a/server/tests/api/videos/channel-import-videos.ts b/server/tests/api/videos/channel-import-videos.ts index 7cfd02fbb..a66f88a0e 100644 --- a/server/tests/api/videos/channel-import-videos.ts +++ b/server/tests/api/videos/channel-import-videos.ts | |||
@@ -109,6 +109,45 @@ describe('Test videos import in a channel', function () { | |||
109 | } | 109 | } |
110 | }) | 110 | }) |
111 | 111 | ||
112 | it('Should limit max amount of videos synced on full sync', async function () { | ||
113 | this.timeout(240_000) | ||
114 | |||
115 | await server.kill() | ||
116 | await server.run({ | ||
117 | import: { | ||
118 | video_channel_synchronization: { | ||
119 | full_sync_videos_limit: 1 | ||
120 | } | ||
121 | } | ||
122 | }) | ||
123 | |||
124 | const { id } = await server.channels.create({ attributes: { name: 'channel3' } }) | ||
125 | const channel3Id = id | ||
126 | |||
127 | const { videoChannelSync } = await server.channelSyncs.create({ | ||
128 | attributes: { | ||
129 | externalChannelUrl: FIXTURE_URLS.youtubeChannel, | ||
130 | videoChannelId: channel3Id | ||
131 | } | ||
132 | }) | ||
133 | const syncId = videoChannelSync.id | ||
134 | |||
135 | await waitJobs(server) | ||
136 | |||
137 | await server.channels.importVideos({ | ||
138 | channelName: 'channel3', | ||
139 | externalChannelUrl: FIXTURE_URLS.youtubeChannel, | ||
140 | videoChannelSyncId: syncId | ||
141 | }) | ||
142 | |||
143 | await waitJobs(server) | ||
144 | |||
145 | const { total, data } = await server.videos.listByChannel({ handle: 'channel3' }) | ||
146 | |||
147 | expect(total).to.equal(1) | ||
148 | expect(data).to.have.lengthOf(1) | ||
149 | }) | ||
150 | |||
112 | after(async function () { | 151 | after(async function () { |
113 | await server?.kill() | 152 | await server?.kill() |
114 | }) | 153 | }) |
@@ -116,5 +155,7 @@ describe('Test videos import in a channel', function () { | |||
116 | } | 155 | } |
117 | 156 | ||
118 | runSuite('yt-dlp') | 157 | runSuite('yt-dlp') |
119 | runSuite('youtube-dl') | 158 | |
159 | // FIXME: With recent changes on youtube, youtube-dl doesn't fetch live replays which means the test suite fails | ||
160 | // runSuite('youtube-dl') | ||
120 | }) | 161 | }) |
diff --git a/server/tests/api/videos/video-channel-syncs.ts b/server/tests/api/videos/video-channel-syncs.ts index 865b25f04..91291524d 100644 --- a/server/tests/api/videos/video-channel-syncs.ts +++ b/server/tests/api/videos/video-channel-syncs.ts | |||
@@ -220,7 +220,7 @@ describe('Test channel synchronizations', function () { | |||
220 | expect(total).to.equal(0) | 220 | expect(total).to.equal(0) |
221 | }) | 221 | }) |
222 | 222 | ||
223 | // FIXME: youtube-dl doesn't work when speicifying a port after the hostname | 223 | // FIXME: youtube-dl/yt-dlp doesn't work when speicifying a port after the hostname |
224 | // it('Should import a remote PeerTube channel', async function () { | 224 | // it('Should import a remote PeerTube channel', async function () { |
225 | // this.timeout(240_000) | 225 | // this.timeout(240_000) |
226 | 226 | ||