aboutsummaryrefslogtreecommitdiff
path: root/main.py
diff options
context:
space:
mode:
Diffstat (limited to 'main.py')
-rw-r--r--main.py127
1 files changed, 127 insertions, 0 deletions
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..7b84260
--- /dev/null
+++ b/main.py
@@ -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)