diff options
Diffstat (limited to 'main.py')
-rw-r--r-- | main.py | 127 |
1 files changed, 127 insertions, 0 deletions
@@ -0,0 +1,127 @@ +from VaporSong import VaporSong +import os +import sys +import youtube_dl +import logzero +from logzero import logger +from logzero import setup_logger +import re +import urllib.request +import urllib.parse + +import time + +MAX_DURATION = 600 # In-case the program finds a compilation +youtube_urls = ('youtube.com', 'https://www.youtube.com/', 'http://www.youtube.com/', 'http://youtu.be/', 'https://youtu.be/', 'youtu.be') + +def download_file(query,request_id=1): + """Returns audio to the vapor command handler + + Searches YouTube for 'query', finds first match that has + duration under the limit, download video with youtube_dl + and extract .wav audio with ffmpeg. + + Query can be YouTube link. + """ + ydl_opts = { + 'quiet': 'True', + 'format': 'bestaudio/best', + 'outtmpl': str(request_id) +'.%(ext)s', + 'prefer_ffmpeg': 'True', + 'noplaylist': 'True', + 'postprocessors': [{ + 'key': 'FFmpegExtractAudio', + 'preferredcodec': 'wav', + 'preferredquality': '192', + }], + } + + original_path = str(request_id) + ".wav" + file_title = "" + + # check if query is youtube url + if not query.lower().startswith((youtube_urls)): + # search for youtube videos matching query + query_string = urllib.parse.urlencode({"search_query" : query}) + html_content = urllib.request.urlopen("http://www.youtube.com/results?" + query_string) + search_results = re.findall(r'href=\"\/watch\?v=(.{11})', html_content.read().decode()) + info = False + + # find video that fits max duration + logger.info("Get video information...") + for url in search_results: + # check for video duration + try: + info = youtube_dl.YoutubeDL(ydl_opts).extract_info(url,download = False) + except Exception as e: + logger.error(e) + raise ValueError('Could not get information about video.') + full_title = info['title'] + if (info['duration'] < MAX_DURATION and info['duration'] >= 5): + # get first video that fits the limit duration + logger.info("Got video: " + str(full_title)) + file_title = info['title'] + break + + # if we ran out of urls, return error + if (not info): + raise ValueError('Could not find a video.') + + # query was a youtube link + else: + logger.info("Query was a YouTube URL.") + url = query + info = youtube_dl.YoutubeDL(ydl_opts).extract_info(url,download = False) + file_title = info['title'] + # check if video fits limit duration + if (info['duration'] < 5 or info['duration'] > MAX_DURATION): + raise ValueError('Video is too short. Need 5 seconds or more.') + + # download video and extract audio + logger.info("Downloading video...") + with youtube_dl.YoutubeDL(ydl_opts) as ydl: + try: + ydl.download([url]) + except Exception as e: + logger.error(e) + raise ValueError('Could not download ' + str(full_title) + '.') + + return original_path, file_title + + +def gen_vapor(filePath, title): + # Delete stuff if there is anything left over. + os.system("rm -r download/") + os.system("rm -r beats/") + + # Make the proper folders for intermediate steps + os.system("mkdir download/") + os.system("mkdir beats/") + + + # Download the youtube query's first result. Might be wrong but YOLO + #YTDownloader.download_wav_to_samp2(query) + + # For every song in download folder(just one for now) + """ + for fs in os.listdir("download/"): + # Slow down the song. + VaporSong.vaporize_song(query,"download/"+fs) + pass + # When we are finished, delete the old folders. + """ + VaporSong.vaporize_song(filePath, title) + + os.system("rm -r download/") + os.system("rm -r beats/") + + + +## Makes this a command line tool: disable when we get the webserver going +sys.argv.pop(0) +query = "" +for s in sys.argv: + query = query + s + +name, title = download_file(query) +gen_vapor(name, title) |