Download video and audio of twitch
Browse files- download.py +82 -0
- requirements.txt +4 -0
download.py
ADDED
@@ -0,0 +1,82 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from pytube import YouTube
|
2 |
+
import os
|
3 |
+
import argparse
|
4 |
+
import twitchdl.commands as twitch_downloader
|
5 |
+
import twitchdl.twitch
|
6 |
+
from twitchdl.commands.download import _parse_playlists
|
7 |
+
|
8 |
+
VIDEO_FOLDER = 'videos'
|
9 |
+
AUDIO_FOLDER = 'audios'
|
10 |
+
|
11 |
+
DOWNLOAD_VIDEO_NAME = 'download_video'
|
12 |
+
DOWNLOAD_AUDIO_NAME = 'download_audio'
|
13 |
+
|
14 |
+
DOWNLOAD_VIDEO_FORMAT = 'mp4'
|
15 |
+
DOWNLOAD_AUDIO_FORMAT = 'mp3'
|
16 |
+
|
17 |
+
DOWNLOAD_VIDEO = 'video'
|
18 |
+
DOWNLOAD_AUDIO = 'audio'
|
19 |
+
|
20 |
+
def download_twitch(url, type):
|
21 |
+
# Create a new parser for the download command
|
22 |
+
argparser = argparse.ArgumentParser(description='Download twitch video from URL')
|
23 |
+
argparser.add_argument('--auth-token', default=None, help='Twitch auth token')
|
24 |
+
argparser.add_argument('--chapter', default=None, help='Chapter to download')
|
25 |
+
argparser.add_argument('--debug', default=False, help='Debug', action='store_true')
|
26 |
+
argparser.add_argument('--end', default=None, help='End')
|
27 |
+
argparser.add_argument('--format', default=f'{DOWNLOAD_VIDEO_FORMAT}', help='Format')
|
28 |
+
argparser.add_argument('--keep', default=False, help='Keep', action='store_true')
|
29 |
+
argparser.add_argument('--max_workers', default=5, help='Max workers')
|
30 |
+
argparser.add_argument('--no_color', default=False, help='No color', action='store_true')
|
31 |
+
argparser.add_argument('--no_join', default=False, help='No join', action='store_true')
|
32 |
+
argparser.add_argument('--output', default=f'{VIDEO_FOLDER}/{DOWNLOAD_VIDEO_NAME}.{format}', help='Output')
|
33 |
+
argparser.add_argument('--overwrite', default=False, help='Overwrite', action='store_true')
|
34 |
+
argparser.add_argument('--quality', default=None, help='Quality')
|
35 |
+
argparser.add_argument('--rate_limit', default=None, help='Rate limit')
|
36 |
+
argparser.add_argument('--start', default=None, help='Start')
|
37 |
+
argparser.add_argument('--version', default=False, help='Version', action='store_true')
|
38 |
+
argparser.add_argument('videos', default=[url], help='Videos', nargs='+')
|
39 |
+
args = argparser.parse_args()
|
40 |
+
|
41 |
+
# Get qualitys
|
42 |
+
access_token = twitchdl.twitch.get_access_token(1942562640, None)
|
43 |
+
playlists_m3u8 = twitchdl.twitch.get_playlists(1942562640, access_token)
|
44 |
+
playlists = list(_parse_playlists(playlists_m3u8))
|
45 |
+
qualitys = [name for (name, _, _) in playlists]
|
46 |
+
|
47 |
+
# Select quality
|
48 |
+
if type == DOWNLOAD_VIDEO:
|
49 |
+
args.quality = qualitys[0]
|
50 |
+
args.format = DOWNLOAD_VIDEO_FORMAT
|
51 |
+
args.output = f'{VIDEO_FOLDER}/{DOWNLOAD_VIDEO_NAME}.{args.format}'
|
52 |
+
elif type == DOWNLOAD_AUDIO:
|
53 |
+
args.quality = qualitys[-1]
|
54 |
+
args.format = "mkv"
|
55 |
+
args.output = f'{AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{args.format}'
|
56 |
+
|
57 |
+
# Download
|
58 |
+
twitch_downloader.download(args)
|
59 |
+
if type == DOWNLOAD_AUDIO:
|
60 |
+
os.system(f'ffmpeg -i {AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{args.format} -c:a libmp3lame -b:a 192k -stats -loglevel warning {AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{DOWNLOAD_AUDIO_FORMAT}')
|
61 |
+
os.system(f'rm {AUDIO_FOLDER}/{DOWNLOAD_AUDIO_NAME}.{args.format}')
|
62 |
+
|
63 |
+
def download_youtube_video(url, type):
|
64 |
+
# yt = YouTube(url)
|
65 |
+
# yt.streams.filter(only_audio=True).first().download()
|
66 |
+
pass
|
67 |
+
|
68 |
+
def main(args):
|
69 |
+
url = args.url
|
70 |
+
if 'twitch' in url.lower():
|
71 |
+
download_twitch(url, DOWNLOAD_VIDEO)
|
72 |
+
download_twitch(url, DOWNLOAD_AUDIO)
|
73 |
+
elif 'youtube' in url.lower() or 'youtu.be' in url.lower():
|
74 |
+
download_youtube_video(url)
|
75 |
+
else:
|
76 |
+
print('Unknown video source')
|
77 |
+
|
78 |
+
if __name__ == "__main__":
|
79 |
+
argparser = argparse.ArgumentParser(description='Download video from URL')
|
80 |
+
argparser.add_argument('url', help='URL of video')
|
81 |
+
args = argparser.parse_args()
|
82 |
+
main(args)
|
requirements.txt
CHANGED
@@ -1,6 +1,10 @@
|
|
1 |
# gradio
|
2 |
gradio
|
3 |
|
|
|
|
|
|
|
|
|
4 |
# mossformer --> separate speech audios
|
5 |
torch
|
6 |
torchvision
|
|
|
1 |
# gradio
|
2 |
gradio
|
3 |
|
4 |
+
# Download youtube and twitch videos
|
5 |
+
pytube
|
6 |
+
twitch-dl
|
7 |
+
|
8 |
# mossformer --> separate speech audios
|
9 |
torch
|
10 |
torchvision
|