-
Notifications
You must be signed in to change notification settings - Fork 0
/
ytdl.py
123 lines (104 loc) · 3.43 KB
/
ytdl.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
from pytube import YouTube, Playlist
import os
def download_song(song_link, dest):
'''
Downloads an mp3 audio stream and save it to a destination.
'''
# change to get the highest quality audio stream, but for now default to 140
song = YouTube(song_link)
audio_stream = song.streams.get_by_itag(140)
audio_stream.download(output_path=dest, filename=song.title+'.mp3')
# i was hesitant about making this return the song name, but I needed it for download_songs_from_playlist
return song.title
def download_songs_from_playlist(playlist_link, dest):
'''
Downloads all videos in a playlist as mp3 files to a destination.
'''
try:
songs = Playlist(playlist_link)
except Exception as e:
print(e)
print('Invalid playlist link.')
input('Press any key to exit...')
exit()
# add threads here to download more at once.
song_names = []
for song in songs:
try:
name = download_song(song, dest)
song_names.append(name)
print(f'Downloading {song}')
except:
print(f'Error downloading {song}, skipping...')
continue
print(f'Downloaded {len(song_names)} audios successfully!')
print(song_names)
def main():
# if no output folder exists, we create it
link = input('Input a YouTube video/playlist link: ')
input_dest = input('Destination folder (none for current directory): ')
dest = ''
run_again = False
# if the user gives an output dir, we create it, otherwise we default to output in the current dir
if input_dest:
dest = input_dest
if not os.path.isdir(input_dest):
try:
os.mkdir(input_dest)
except Exception as e:
print(e)
print('There was an error creating that destination. Try again.')
input('Press any key to exit...')
exit()
else:
dest = os.getcwd()+'/output'
if not os.path.isdir('output'):
os.mkdir('output')
# check if its a video or playlist
if ('https://' and 'playlist') in link:
download_songs_from_playlist(link, dest)
run_again = input('Download another? y/n: ')
elif ('https://' and ('watch' or 'https://youtu.be')) in link:
try:
name = download_song(link, dest)
print(f'Downloaded {name}')
run_again = input('Download another? y/n: ')
except Exception as e:
print(e)
print(f'There was an error downloading {link}')
else:
print('Link not valid!')
input('Press any key to exit...')
exit()
# a loop if the user wants to re-run the program
while run_again[0].lower() == 'y':
link = input('Input a YouTube video/playlist link: ')
input_dest = input('Destination folder (none to keep the same): ')
if input_dest:
dest = input_dest
if not os.path.isdir(input_dest):
try:
os.mkdir(input_dest)
except Exception as e:
print(e)
print('There was an error creating that destination. Try again.')
input('Press any key to exit...')
exit()
# check if its a video or playlist
if ('https://' and 'playlist') in link:
download_songs_from_playlist(link, dest)
run_again = input('Download another? y/n: ')
elif ('https://' and ('watch' or 'https://youtu.be')) in link:
try:
name = download_song(link, dest)
print(f'Downloaded {name}')
run_again = input('Download another? y/n: ')
except Exception as e:
print(e)
print(f'There was an error downloading {link}')
else:
print('Link not valid!')
input('Press any key to exit...')
exit()
if __name__ == '__main__':
main()