mirror of https://github.com/Chocobozzz/PeerTube
Add ability to set proxies to youtube-dl
parent
766f2cb76a
commit
5439a591e0
|
@ -50,6 +50,7 @@ jobs:
|
||||||
OBJECT_STORAGE_SCALEWAY_KEY_ID: ${{ secrets.OBJECT_STORAGE_SCALEWAY_KEY_ID }}
|
OBJECT_STORAGE_SCALEWAY_KEY_ID: ${{ secrets.OBJECT_STORAGE_SCALEWAY_KEY_ID }}
|
||||||
OBJECT_STORAGE_SCALEWAY_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SCALEWAY_ACCESS_KEY }}
|
OBJECT_STORAGE_SCALEWAY_ACCESS_KEY: ${{ secrets.OBJECT_STORAGE_SCALEWAY_ACCESS_KEY }}
|
||||||
YOUTUBE_DL_DOWNLOAD_BEARER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
YOUTUBE_DL_DOWNLOAD_BEARER_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
YOUTUBE_DL_PROXY: ${{ secrets.YOUTUBE_DL_PROXY }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
|
@ -803,6 +803,12 @@ import:
|
||||||
# IPv6 is very strongly rate-limited on most sites supported by youtube-dl
|
# IPv6 is very strongly rate-limited on most sites supported by youtube-dl
|
||||||
force_ipv4: false
|
force_ipv4: false
|
||||||
|
|
||||||
|
# By default PeerTube uses HTTP_PROXY and HTTPS_PROXY environment variables
|
||||||
|
# But you can specify custom proxies for youtube-dl because remote websites (like YouTube) may block your server IP address
|
||||||
|
# PeerTube will randomly select a proxy from the following list
|
||||||
|
proxies:
|
||||||
|
# - "https://username:password@example.com:8888"
|
||||||
|
|
||||||
# Magnet URI or torrent file (use classic TCP/UDP/WebSeed to download the file)
|
# Magnet URI or torrent file (use classic TCP/UDP/WebSeed to download the file)
|
||||||
torrent:
|
torrent:
|
||||||
# We recommend to only enable magnet URI/torrent import if you trust your users
|
# We recommend to only enable magnet URI/torrent import if you trust your users
|
||||||
|
|
|
@ -813,6 +813,12 @@ import:
|
||||||
# IPv6 is very strongly rate-limited on most sites supported by youtube-dl
|
# IPv6 is very strongly rate-limited on most sites supported by youtube-dl
|
||||||
force_ipv4: false
|
force_ipv4: false
|
||||||
|
|
||||||
|
# By default PeerTube uses HTTP_PROXY and HTTPS_PROXY environment variables
|
||||||
|
# But you can specify custom proxies for youtube-dl because remote websites (like YouTube) may block your server IP address
|
||||||
|
# PeerTube will randomly select a proxy from the following list
|
||||||
|
proxies:
|
||||||
|
# - "https://username:password@example.com:8888"
|
||||||
|
|
||||||
# Magnet URI or torrent file (use classic TCP/UDP/WebSeed to download the file)
|
# Magnet URI or torrent file (use classic TCP/UDP/WebSeed to download the file)
|
||||||
torrent:
|
torrent:
|
||||||
# We recommend to only enable magnet URI/torrent import if you trust your users
|
# We recommend to only enable magnet URI/torrent import if you trust your users
|
||||||
|
|
|
@ -1,20 +1,9 @@
|
||||||
import { BinaryToTextEncoding, createHash } from 'crypto'
|
import { BinaryToTextEncoding, createHash } from 'crypto'
|
||||||
|
|
||||||
function sha256 (str: string | Buffer, encoding: BinaryToTextEncoding = 'hex') {
|
export function sha256 (str: string | Buffer, encoding: BinaryToTextEncoding = 'hex') {
|
||||||
return createHash('sha256').update(str).digest(encoding)
|
return createHash('sha256').update(str).digest(encoding)
|
||||||
}
|
}
|
||||||
|
|
||||||
function sha1 (str: string | Buffer, encoding: BinaryToTextEncoding = 'hex') {
|
export function sha1 (str: string | Buffer, encoding: BinaryToTextEncoding = 'hex') {
|
||||||
return createHash('sha1').update(str).digest(encoding)
|
return createHash('sha1').update(str).digest(encoding)
|
||||||
}
|
}
|
||||||
|
|
||||||
// high excluded
|
|
||||||
function randomInt (low: number, high: number) {
|
|
||||||
return Math.floor(Math.random() * (high - low) + low)
|
|
||||||
}
|
|
||||||
|
|
||||||
export {
|
|
||||||
randomInt,
|
|
||||||
sha256,
|
|
||||||
sha1
|
|
||||||
}
|
|
||||||
|
|
|
@ -58,6 +58,7 @@ import { PluginsCommand } from './plugins-command.js'
|
||||||
import { RedundancyCommand } from './redundancy-command.js'
|
import { RedundancyCommand } from './redundancy-command.js'
|
||||||
import { ServersCommand } from './servers-command.js'
|
import { ServersCommand } from './servers-command.js'
|
||||||
import { StatsCommand } from './stats-command.js'
|
import { StatsCommand } from './stats-command.js'
|
||||||
|
import merge from 'lodash-es/merge.js'
|
||||||
|
|
||||||
export type RunServerOptions = {
|
export type RunServerOptions = {
|
||||||
hideLogs?: boolean
|
hideLogs?: boolean
|
||||||
|
@ -240,10 +241,10 @@ export class PeerTubeServer {
|
||||||
|
|
||||||
await this.assignCustomConfigFile()
|
await this.assignCustomConfigFile()
|
||||||
|
|
||||||
const configOverride = this.buildConfigOverride()
|
let configOverride = this.buildConfigOverride()
|
||||||
|
|
||||||
if (configOverrideArg !== undefined) {
|
if (configOverrideArg !== undefined) {
|
||||||
Object.assign(configOverride, configOverrideArg)
|
configOverride = merge(configOverride, configOverrideArg)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Share the environment
|
// Share the environment
|
||||||
|
@ -363,9 +364,15 @@ export class PeerTubeServer {
|
||||||
}
|
}
|
||||||
|
|
||||||
private buildConfigOverride () {
|
private buildConfigOverride () {
|
||||||
if (!this.parallel) return {}
|
const base = process.env.YOUTUBE_DL_PROXY
|
||||||
|
? { import: { videos: { http: { proxies: [ process.env.YOUTUBE_DL_PROXY ] } } } }
|
||||||
|
: {}
|
||||||
|
|
||||||
|
if (!this.parallel) return base
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
...base,
|
||||||
|
|
||||||
listen: {
|
listen: {
|
||||||
port: this.port
|
port: this.port
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
|
import { randomInt } from '@peertube/peertube-core-utils'
|
||||||
|
import { VideoResolution, VideoResolutionType } from '@peertube/peertube-models'
|
||||||
|
import { CONFIG } from '@server/initializers/config.js'
|
||||||
import { execa, Options as ExecaNodeOptions } from 'execa'
|
import { execa, Options as ExecaNodeOptions } from 'execa'
|
||||||
import { ensureDir, pathExists } from 'fs-extra/esm'
|
import { ensureDir, pathExists } from 'fs-extra/esm'
|
||||||
import { writeFile } from 'fs/promises'
|
import { writeFile } from 'fs/promises'
|
||||||
import { OptionsOfBufferResponseBody } from 'got'
|
import { OptionsOfBufferResponseBody } from 'got'
|
||||||
import { dirname, join } from 'path'
|
import { dirname, join } from 'path'
|
||||||
import { VideoResolution, VideoResolutionType } from '@peertube/peertube-models'
|
|
||||||
import { CONFIG } from '@server/initializers/config.js'
|
|
||||||
import { logger, loggerTagsFactory } from '../logger.js'
|
import { logger, loggerTagsFactory } from '../logger.js'
|
||||||
import { getProxy, isProxyEnabled } from '../proxy.js'
|
import { getProxy, isProxyEnabled } from '../proxy.js'
|
||||||
import { isBinaryResponse, peertubeGot } from '../requests.js'
|
import { isBinaryResponse, peertubeGot } from '../requests.js'
|
||||||
|
@ -231,10 +232,17 @@ export class YoutubeDLCLI {
|
||||||
}
|
}
|
||||||
|
|
||||||
private wrapWithProxyOptions (args: string[]) {
|
private wrapWithProxyOptions (args: string[]) {
|
||||||
if (isProxyEnabled()) {
|
const config = CONFIG.IMPORT.VIDEOS.HTTP.PROXIES
|
||||||
logger.debug('Using proxy %s for YoutubeDL', getProxy(), lTags())
|
const configProxyEnabled = Array.isArray(config) && config.length !== 0
|
||||||
|
|
||||||
return [ '--proxy', getProxy() ].concat(args)
|
if (configProxyEnabled || isProxyEnabled()) {
|
||||||
|
const proxy = configProxyEnabled
|
||||||
|
? config[randomInt(0, config.length)]
|
||||||
|
: getProxy()
|
||||||
|
|
||||||
|
logger.debug('Using proxy %s for YoutubeDL', proxy, lTags())
|
||||||
|
|
||||||
|
return [ '--proxy', proxy ].concat(args)
|
||||||
}
|
}
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
|
|
@ -43,6 +43,7 @@ function checkMissedConfig () {
|
||||||
'remote_runners.stalled_jobs.vod', 'remote_runners.stalled_jobs.live',
|
'remote_runners.stalled_jobs.vod', 'remote_runners.stalled_jobs.live',
|
||||||
'thumbnails.generation_from_video.frames_to_analyze', 'thumbnails.sizes',
|
'thumbnails.generation_from_video.frames_to_analyze', 'thumbnails.sizes',
|
||||||
'import.videos.http.enabled', 'import.videos.torrent.enabled', 'import.videos.concurrency', 'import.videos.timeout',
|
'import.videos.http.enabled', 'import.videos.torrent.enabled', 'import.videos.concurrency', 'import.videos.timeout',
|
||||||
|
'import.videos.http.force_ipv4', 'import.videos.http.proxies',
|
||||||
'import.video_channel_synchronization.enabled', 'import.video_channel_synchronization.max_per_user',
|
'import.video_channel_synchronization.enabled', 'import.video_channel_synchronization.max_per_user',
|
||||||
'import.video_channel_synchronization.check_interval', 'import.video_channel_synchronization.videos_limit_per_synchronization',
|
'import.video_channel_synchronization.check_interval', 'import.video_channel_synchronization.videos_limit_per_synchronization',
|
||||||
'import.video_channel_synchronization.full_sync_videos_limit',
|
'import.video_channel_synchronization.full_sync_videos_limit',
|
||||||
|
|
|
@ -554,7 +554,9 @@ const CONFIG = {
|
||||||
get PYTHON_PATH () { return config.get<string>('import.videos.http.youtube_dl_release.python_path') }
|
get PYTHON_PATH () { return config.get<string>('import.videos.http.youtube_dl_release.python_path') }
|
||||||
},
|
},
|
||||||
|
|
||||||
get FORCE_IPV4 () { return config.get<boolean>('import.videos.http.force_ipv4') }
|
get FORCE_IPV4 () { return config.get<boolean>('import.videos.http.force_ipv4') },
|
||||||
|
|
||||||
|
get PROXIES () { return config.get<string[]>('import.videos.http.proxies') }
|
||||||
},
|
},
|
||||||
TORRENT: {
|
TORRENT: {
|
||||||
get ENABLED () { return config.get<boolean>('import.videos.torrent.enabled') }
|
get ENABLED () { return config.get<boolean>('import.videos.torrent.enabled') }
|
||||||
|
|
|
@ -76,6 +76,7 @@ Some env variables can be defined to disable/enable some tests:
|
||||||
* `OBJECT_STORAGE_SCALEWAY_KEY_ID` and `OBJECT_STORAGE_SCALEWAY_ACCESS_KEY`: specify Scaleway API keys to test object storage ACL (not supported by our `chocobozzz/s3-ninja` container)
|
* `OBJECT_STORAGE_SCALEWAY_KEY_ID` and `OBJECT_STORAGE_SCALEWAY_ACCESS_KEY`: specify Scaleway API keys to test object storage ACL (not supported by our `chocobozzz/s3-ninja` container)
|
||||||
* `ENABLE_FFMPEG_THUMBNAIL_PIXEL_COMPARISON_TESTS=true`: enable pixel comparison on images generated by ffmpeg. Disabled by default because a custom ffmpeg version may fails the tests
|
* `ENABLE_FFMPEG_THUMBNAIL_PIXEL_COMPARISON_TESTS=true`: enable pixel comparison on images generated by ffmpeg. Disabled by default because a custom ffmpeg version may fails the tests
|
||||||
* `YOUTUBE_DL_DOWNLOAD_BEARER_TOKEN`: Bearer token to download youtube-dl binary
|
* `YOUTUBE_DL_DOWNLOAD_BEARER_TOKEN`: Bearer token to download youtube-dl binary
|
||||||
|
* `YOUTUBE_DL_PROXY`: Custom proxy URL for youtube-dl HTTP video import
|
||||||
|
|
||||||
|
|
||||||
### Debug server logs
|
### Debug server logs
|
||||||
|
|
Loading…
Reference in New Issue