-
-
Save marjanmo/36f9f2328f5c4fa956b594375fd59b46 to your computer and use it in GitHub Desktop.
| import subprocess | |
| import sys, os | |
| """ | |
| ##################################### | |
| ##### YOUTUBE TO MP3 SPLITTER ###### | |
| ##################################### | |
| ABOUT: | |
| Have you ever found a good music compilation on youtube and wanted to download a playlist but you | |
| didn't have time to mess around with splitting music into separate songs and do the boring ID3 editing in Audacity? | |
| This script might help you. You just need a youtube link and a tracklist of the songs with their timestamps | |
| (usually already in description or in top comments). Read the comments below for detailed instructions! | |
| PYTHON REQUIREMENTS: | |
| Python 3, pydub and youtube_dl | |
| The script wil try to autoinstall missing dependecies, so if using in virtualenv, remove autoinstalling part or make sure | |
| you already have pydub and youtube_dl installed! | |
| USAGE: | |
| The script itself is already a working example for downloading and splitting a Proleter video, so just modify it | |
| according to your favourite Youtube music compilation. Just edit a SAVE_FOLDER to match your PC and create a textfile called | |
| Proleter.txt next to this script with the following content (found under the Youtube video) | |
| Proleter.txt | |
| 0:00:00 - My Melancholy Baby | |
| 0:03:58 - Can't Stop Me | |
| 0:07:42 - Fat Morris | |
| 0:11:32 - Sometimes | |
| 0:13:07 - Red Soap | |
| 0:16:23 - April Showers | |
| 0:20:52 - By The Rivers | |
| 0:24:33 - It Don't Mean A Thing | |
| 0:28:12 - Queen of Hearts | |
| 0:32:09 - U Can Get It | |
| 0:36:30 - Not Afraid | |
| 0:39:47 - Throw It Back (Instrumental) | |
| 0:42:48 - Downtown Irony | |
| 0:47:21 - Faidherbe Square | |
| 0:50:50 - Muhammad Ali | |
| DISCLAIMER: | |
| This is just a proof of concept. Use at your own risk! Songs might be cut unproperly if provided timestamps don't match | |
| the actual songs in the video! Tested on Linux only. | |
| Year: 2020 | |
| Author: Marjan Moderc | |
| github: https://github.com/marjanmo | |
| """ | |
| #YOUR INPUTS GO BELOW!: | |
| # Link of the youtube music video that you want split. | |
| YOUTUBE_LINK = 'https://www.youtube.com/watch?v=SYviQ0EztuQ' | |
| # Info about songs | |
| # Can usually be found in description of in the topmost comments. | |
| # Copy/paste playlist with timestamps in a text file that will reside next to this script. | |
| # You have to change the separator and the order of INFO list to match the original list. Be consistent! | |
| # You might need some text file editing to match given criteria! | |
| # INFO variable must have 2 or 3 elements. Adjust ordering of elements to match the file contents. | |
| # TIME and TITLE are neccessary, ARTIST is optional, if downloading compilation! If not in the file, specifiy artist | |
| # separately | |
| TRACKLIST_FILE = "Proleter.txt" #Text file to be put next to the script! | |
| INFO = ["TIME","TITLE"] #what info does the textfile contain and what is the order | |
| SEPARATOR = " - " | |
| # Constants for ID3 mp3 TAGGING | |
| ARTIST = "Proleter" #Will be obtained from the tracklist if specified. | |
| ALBUM = "The best of" | |
| YEAR = 2000 | |
| #DEMO FOLDER -- Script root | |
| SAVE_FOLDER = os.path.dirname(os.path.realpath(__file__)) #Will be crated if not exist | |
| #DEMO TEXT FILE - will be created for demo purposes, you should create it yourself for your own video. | |
| with open(TRACKLIST_FILE, "w") as f: | |
| f.write("0:00:00 - My Melancholy Baby\n0:03:58 - Can't Stop Me\n 0:07:42 - Fat Morris\n 0:11:32 - Sometimes\n 0:13:07 - Red Soap\n 0:16:23 - April Showers\n 0:20:52 - By The Rivers\n 0:24:33 - It Don't Mean A Thing\n 0:28:12 - Queen of Hearts\n 0:32:09 - U Can Get It\n 0:36:30 - Not Afraid\n 0:39:47 - Throw It Back (Instrumental)\n 0:42:48 - Downtown Irony\n 0:47:21 - Faidherbe Square\n 0:50:50 - Muhammad Ali") | |
| ################################################## | |
| ### Dont (have to) touch anything below this! #### | |
| ################################################## | |
| # Try to autoinstall missing modules... | |
| try: | |
| import youtube_dl | |
| except ImportError: | |
| subprocess.check_call([sys.executable, "-m", "pip", "install", 'youtube_dl']) | |
| import youtube_dl | |
| try: | |
| import pydub | |
| except ImportError: | |
| subprocess.check_call([sys.executable, "-m", "pip", "install", 'pydub']) | |
| import pydub | |
| # Helper function | |
| def time_to_seconds(time_str): | |
| if len(time_str.split(":")) == 2: | |
| m, s = time_str.split(':') | |
| return int(m) * 60 + int(s) | |
| else: | |
| h, m, s = time_str.split(':') | |
| return int(h) * 3600 + int(m) * 60 + int(s) | |
| # 1. Download the video to temporary file (couldn't make youtube_dl to create mp3 that pydub would eat happily) | |
| ydl_opts = { | |
| 'outtmpl': 'tmp.mp4', | |
| 'format': 'bestvideo[ext=mp4]+bestaudio[ext=m4a]' | |
| } | |
| with youtube_dl.YoutubeDL(ydl_opts) as ydl: | |
| a = ydl.download([YOUTUBE_LINK]) | |
| # 2. Read the songs info | |
| with open(TRACKLIST_FILE, "r") as f: | |
| songs = f.readlines() | |
| songs = [i.strip("\n").strip("").split(SEPARATOR) for i in songs] | |
| # 3. Read mp4 as AudioSegment | |
| print("Reading source mp3 file ...") | |
| sound = pydub.AudioSegment.from_file("tmp.mp4","mp4") | |
| print("Done.") | |
| # 4. Create a destination folder if doesnt exist | |
| if not os.path.exists(SAVE_FOLDER): | |
| os.mkdir(SAVE_FOLDER) | |
| INFO = [i.lower() for i in INFO] #idiot proofing | |
| # 5. Extract songs separately. | |
| for i,j in enumerate(songs): | |
| print("Converting song no.",i,j) | |
| artist = j[INFO.index("artist")] if "artist" in INFO else ARTIST | |
| time_start = j[INFO.index("time")] | |
| title = j[INFO.index("title")] | |
| time_start = time_to_seconds(time_start)*1000 | |
| # Last one have special treatment... | |
| if i+1 == len(songs): | |
| song = sound[time_start:-1] | |
| else: | |
| time_finish = time_to_seconds(songs[i+1][INFO.index("time")])*1000-200 #time to the next one! | |
| song = sound[time_start:time_finish] | |
| song.export(os.path.join(SAVE_FOLDER,"{} - {}.mp3".format(artist,title)), format="mp3", | |
| tags={"artist":artist,"album":ALBUM,"title":title, "track": i+1}) | |
| # 5. Clean temporary file. | |
| os.remove("tmp.mp4") |
marjanmo
commented
Aug 24, 2020
via email
doublechecked and aside from changes in imports (pip no longer having a main function), I could get my code to work normally (on Linux Ubuntu though). I dont have time to investigate further, but make sure that youtube_dl actually downloaded the file to the root of the script. Maybe you also forgot to setup SAVE_FOLDER variable, which I corrected to be root folder by default.
Thanks a lot!, now its working on my machine, I also downloaded ffmpeg.exe
where is the destination of extracted music ?
where is the destination of extracted music ?
In the root of where the script resides. You can change this by overwriting SAVE_FOLDER variable. More info in the comments of the gist.
don't know how to edit it do u have any suggestions?
Or if u have a discord or any fast reply method
Hi! It mostly works. But in the tracklist file could be all kinds of nasty characters that you couldn't put in a filename, so I added some sanitization, see my fork.
Interesting code, thanks for sharing.
I tried to write similar code in python, but all my attempts were unsuccessful. In addition, I found an excellent online service that will help you quickly and easily convert YouTube videos. The advantage of some online services like https://coconvert.com/youtube-aac-converter.html is that you do not need to download videos, but paste the link into the converter and get a ready-made audio format. It is more convenient than you think and it saves a lot of memory.
Worked well with yt-dlp, thank you very much!