From 0fbaad415325881de51e24ec0f796e6482ead4cc Mon Sep 17 00:00:00 2001 From: Ritiek Malhotra Date: Thu, 1 Dec 2016 09:57:09 +0530 Subject: [PATCH] improved code quality --- spotdl.py | 435 ++++++++++++++++++++++++++---------------------------- 1 file changed, 209 insertions(+), 226 deletions(-) diff --git a/spotdl.py b/spotdl.py index 37dd534..e398c5d 100644 --- a/spotdl.py +++ b/spotdl.py @@ -1,7 +1,7 @@ #!/bin/python -import mechanize from bs4 import BeautifulSoup +import mechanize import pafy import os import sys @@ -9,13 +9,8 @@ import spotipy import eyed3 #import spotipy.util as util -#print sys.path[0] -if not os.name == 'nt': - script_dir = sys.path[0] + '/' -else: - script_dir = sys.path[0] + '\\' - -os.chdir(script_dir) +#print(sys.path[0]) +os.chdir(sys.path[0] + '/') if not os.path.exists("Music"): os.makedirs("Music") @@ -23,229 +18,217 @@ open('Music/list.txt', 'a').close() spotify = spotipy.Spotify() -print '' +print('') -def Main(): - Title = '' - song = '' - while True: - try: - for m in os.listdir('Music/'): - if m.endswith(".temp") or m.endswith(".m4a"): - os.remove('Music/' + m) - print('') - print('') - raw_song = raw_input('>> Enter a song/cmd: ').decode('utf-8').encode('utf-8') - print '' - if raw_song == "exit": - exit() - elif raw_song == "play": - if not Title == '': - if not os.name == 'nt': - os.system('mplayer "' + script_dir + 'Music/' + Title + '.mp3"') - else: - print 'Playing..' - os.system('start ' + script_dir + 'Music\\' + Title + '.mp3') +def loadMechanize(): + global br + br = mechanize.Browser() + br.set_handle_robots(False) + br.addheaders = [("User-agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13")] - elif raw_song == "lyrics": - br = mechanize.Browser() - br.set_handle_robots(False) - br.addheaders = [("User-agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13")] - if not Title == '': - if song == '': - link = 'https://duckduckgo.com/html/?q=' + Title.replace(' ', '+') + '+musixmatch' - else: - link = 'https://duckduckgo.com/html/?q=' + song.replace(' ', '+') + '+musixmatch' - page = br.open(link) - page = page.read() - soup = BeautifulSoup(page, 'html.parser') - link = soup.find('a', {'class':'result__url'})['href'] - page = br.open(link).read() - soup = BeautifulSoup(page, 'html.parser') - for x in soup.find_all('p', {'class':'mxm-lyrics__content'}): - print x.get_text() - else: - print 'No log to read from..' - br.close() +def searchYT(number): + #print(URL) + items = br.open(URL) + #print(items) + items = items.read() + #print(items) + zoom1 = items.find('yt-uix-tile-link') + zoom2 = items.find('yt-uix-tile-link', zoom1+1) + zoom3 = items.find('yt-uix-tile-link', zoom2+1) + part = items[zoom1-100: zoom2] + items_parse = BeautifulSoup(part, "html.parser") - elif raw_song == "list": - f = open('Music/list.txt', 'r').read() - lines = f.splitlines() - x = 0 - y = 0 - for songie in lines: - if not len(songie) == 0: - x = x + 1 - print 'Total songs in list = ' + str(x) + ' songs' - for songie in lines: - try: - if not len(songie) == 0: - if (len(songie) == 22 and songie.replace(" ", "%20") == songie) or (songie.find('spotify') > -1): - #song = songie.replace(songie[-1:], "") - song = songie - content = spotify.track(song) - song = (content['artists'][0]['name'] + ' - ' + content['name']).replace(" ", "%20").encode('utf-8') - URL = "https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + song - else: - song = songie.replace(" ", "%20") - URL = "https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + song - song = '' + #items_parse = soup(items, "html.parser") + first_result = items_parse.find(attrs={'class':'yt-uix-tile-link'})['href'] - print '' - br = mechanize.Browser() - br.set_handle_robots(False) - br.addheaders = [("User-agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13")] - #print URL - items = br.open(URL) - #print items - items = items.read() - #print items - zoom1 = items.find('yt-uix-tile-link') - zoom2 = items.find('yt-uix-tile-link', zoom1+1) - zoom3 = items.find('yt-uix-tile-link', zoom2+1) - part = items[zoom1-100: zoom2] - items_parse = BeautifulSoup(part, "html.parser") - - #items_parse = soup(items, "html.parser") - first_result = items_parse.find(attrs={'class':'yt-uix-tile-link'})['href'] - - full_link = "youtube.com" + first_result - #print full_link - - video = pafy.new(full_link) - Title = ((video.title).replace("\\", "_").replace("/", "_").replace(":", "_").replace("*", "_").replace("?", "_").replace('"', "_").replace("<", "_").replace(">", "_").replace("|", "_").replace(" ", "_")).encode('utf-8') - y = y + 1 - print str(y) + '. ' + ((video.title).encode("utf-8")) - if os.path.exists("Music/" + Title + ".m4a.temp"): - os.remove("Music/" + Title + ".m4a.temp") - download = 1 - if os.path.exists("Music/" + Title + ".mp3"): - audiofile = eyed3.load("Music/" + Title + '.mp3') - if ((len(raw_song) == 22 and raw_song.replace(" ", "%20") == raw_song) or (raw_song.find('spotify') > -1)) and not audiofile.tag.title == content['name']: - os.remove("Music/" + Title + '.mp3') - else: - with open('Music/list.txt', 'r') as fin: - data = fin.read().splitlines(True) - with open('Music/list.txt', 'w') as fout: - fout.writelines(data[1:]) - download = 0 - if download == 1: - a = video.getbestaudio(preftype='m4a') - a.download(filepath="Music/" + Title + ".m4a") - with open('Music/list.txt', 'r') as fin: - data = fin.read().splitlines(True) - with open('Music/list.txt', 'w') as fout: - fout.writelines(data[1:]) - print '' - print 'Converting ' + Title + '.m4a' + ' to mp3..' - if not os.name == 'nt': - os.system('avconv -loglevel 0 -i "' + script_dir + 'Music/' + Title + '.m4a" -ab 192k "' + script_dir + 'Music/' + Title + '.mp3"') - else: - os.system('Scripts\\avconv.exe -loglevel 0 -i "' + script_dir + 'Music/' + Title + '.m4a" -ab 192k "' + script_dir + 'Music/' + Title + '.mp3"') - os.remove('Music/' + Title + '.m4a') - if (len(songie) == 22 and songie.replace(" ", "%20") == songie) or (songie.find('spotify') > -1): - print 'Fixing meta-tags..' - audiofile = eyed3.load("Music/" + Title + '.mp3') - audiofile.tag.artist = content['artists'][0]['name'] - audiofile.tag.album = content['album']['name'] - audiofile.tag.title = content['name'] - br.retrieve(content['album']['images'][0]['url'], 'Music/last_albumart.jpg') - bla = open("Music/last_albumart.jpg","rb").read() - audiofile.tag.images.set(3,bla,"image/jpeg") - audiofile.tag.save() - else: - with open('Music/list.txt', 'r') as fin: - data = fin.read().splitlines(True) - with open('Music/list.txt', 'w') as fout: - fout.writelines(data[1:]) - except KeyboardInterrupt: - Main() - except: - lines.append(songie) - with open('Music/list.txt', 'r') as fin: - data = fin.read().splitlines(True) - with open('Music/list.txt', 'w') as fout: - fout.writelines(data[1:]) - with open("Music/list.txt", "a") as myfile: - myfile.write(songie) - print 'Could not complete a Song download, will try later..' - br.close() - - else: - song = raw_song.replace(" ", "%20") - br = mechanize.Browser() - br.set_handle_robots(False) - br.addheaders = [("User-agent","Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13")] - if (len(raw_song) == 22 and raw_song == song) or (raw_song.find('spotify') > -1): - content = spotify.track(song) - song = (content['artists'][0]['name'] + ' - ' + content['name']).replace(" ", "%20").encode('utf-8') - URL = "https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + song - else: - URL = "https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + song - song = '' - items = br.open(URL) - items = items.read() - - zoom1 = items.find('yt-uix-tile-link') - zoom2 = items.find('yt-uix-tile-link', zoom1+1) - zoom3 = items.find('yt-uix-tile-link', zoom2+1) - part = items[zoom1-100: zoom2] - items_parse = BeautifulSoup(part, "html.parser") - - #items_parse = soup(items, "html.parser") - first_result = items_parse.find(attrs={'class':'yt-uix-tile-link'})['href'] - - full_link = "youtube.com" + first_result - #print full_link - - video = pafy.new(full_link) - Title = ((video.title).replace("\\", "_").replace("/", "_").replace(":", "_").replace("*", "_").replace("?", "_").replace('"', "_").replace("<", "_").replace(">", "_").replace("|", "_").replace(" ", "_")).encode('utf-8') - print ((video.title).encode("utf-8")) - if os.path.exists("Music/" + Title + ".m4a.temp"): - os.remove("Music/" + Title + ".m4a.temp") + full_link = "youtube.com" + first_result + #print(full_link) + global video + video = pafy.new(full_link) + global title + title = ((video.title).replace("\\", "_").replace("/", "_").replace(":", "_").replace("*", "_").replace("?", "_").replace('"', "_").replace("<", "_").replace(">", "_").replace("|", "_").replace(" ", "_")).encode('utf-8') + if not number == None: + print(str(number) + '. ' + (video.title).encode("utf-8")) + else: + print(video.title).encode("utf-8") +def checkExists(islist): + if os.path.exists("Music/" + title + ".m4a.temp"): + os.remove("Music/" + title + ".m4a.temp") + if os.path.exists("Music/" + title + ".mp3"): + audiofile = eyed3.load("Music/" + title + '.mp3') + if isSpotify() and not audiofile.tag.title == content['name']: + os.remove("Music/" + title + '.mp3') + elif islist: + trimSong() + return True + else: + prompt = raw_input('Song with same name has already been downloaded.. re-download? (y/n/play): ') + if prompt == "y": + os.remove("Music/" + title + ".mp3") download = 1 + elif prompt =="play": + if not os.name == 'nt': + os.system('mplayer "' + 'Music/' + title + '.mp3"') + else: + print('Playing ' + title + '.mp3') + os.system('start ' + 'Music/' + title + '.mp3') + return True + else: + return True + return False - if os.path.exists("Music/" + Title + ".mp3"): - audiofile = eyed3.load("Music/" + Title + '.mp3') - if ((len(raw_song) == 22 and raw_song.replace(" ", "%20") == raw_song) or (raw_song.find('spotify') > -1)) and not audiofile.tag.title == content['name']: - os.remove("Music/" + Title + '.mp3') - else: - prompt = raw_input('Song with same name has already been downloaded.. re-download? (y/n/play): ') - if prompt == "y": - os.remove("Music/" + Title + ".mp3") - download = 1 - elif prompt =="play": - if not os.name == 'nt': - os.system('mplayer "' + script_dir + 'Music/' + Title + '.mp3"') - else: - print 'Playing..' - os.system('start ' + script_dir + 'Music\\' + Title + '.mp3') - download = 0 - else: - download = 0 - if download == 1: - a = video.getbestaudio(preftype="m4a") - a.download(filepath="Music/" + Title + ".m4a") - print '' - print 'Converting ' + Title + '.m4a' + ' to mp3..' - if not os.name == 'nt': - os.system('avconv -loglevel 0 -i "' + script_dir + 'Music/' + Title + '.m4a" -ab 192k "' + script_dir + 'Music/' + Title + '.mp3"') - else: - os.system('Scripts\\avconv.exe -loglevel 0 -i "' + script_dir + 'Music/' + Title + '.m4a" -ab 192k "' + script_dir + 'Music/' + Title + '.mp3"') - os.remove('Music/' + Title + '.m4a') - if (len(raw_song) == 22 and raw_song.replace(" ", "%20") == raw_song) or (raw_song.find('spotify') > -1): - print 'Fixing meta-tags..' - audiofile = eyed3.load("Music/" + Title + '.mp3') - audiofile.tag.artist = content['artists'][0]['name'] - audiofile.tag.album = content['album']['name'] - audiofile.tag.title = content['name'] - br.retrieve(content['album']['images'][0]['url'], 'Music/last_albumart.jpg') - bla = open("Music/last_albumart.jpg","rb").read() - audiofile.tag.images.set(3,bla,"image/jpeg") - audiofile.tag.save() - br.close() - except KeyboardInterrupt: - pass +def getLyrics(): + if not title == '': + if song == '': + link = 'https://duckduckgo.com/html/?q=' + title.replace(' ', '+') + '+musixmatch' + else: + link = 'https://duckduckgo.com/html/?q=' + song.replace(' ', '+') + '+musixmatch' + loadMechanize() + page = br.open(link) + page = page.read() + soup = BeautifulSoup(page, 'html.parser') + link = soup.find('a', {'class':'result__url'})['href'] + page = br.open(link).read() + soup = BeautifulSoup(page, 'html.parser') + for x in soup.find_all('p', {'class':'mxm-lyrics__content'}): + print(x.get_text()).encode('utf-8') + br.close() + else: + print('No log to read from..') -Main() +def fixSong(): + print 'Fixing meta-tags..' + audiofile = eyed3.load("Music/" + title + '.mp3') + audiofile.tag.artist = content['artists'][0]['name'] + audiofile.tag.album = content['album']['name'] + audiofile.tag.title = content['name'] + br.retrieve(content['album']['images'][0]['url'], 'Music/last_albumart.jpg') + bla = open("Music/last_albumart.jpg","rb").read() + audiofile.tag.images.set(3,bla,"image/jpeg") + audiofile.tag.save() + +def playSong(): + if not title == '': + if not os.name == 'nt': + os.system('mplayer "' + 'Music/' + title + '.mp3"') + else: + print('Playing ' + title + '.mp3') + os.system('start ' + 'Music/' + title + '.mp3') + + +def convertSong(): + print('Converting ' + title + '.m4a to mp3..') + if not os.name == 'nt': + os.system('avconv -loglevel 0 -i "' + 'Music/' + title + '.m4a" -ab 192k "' + 'Music/' + title + '.mp3"') + else: + os.system('Scripts\\avconv.exe -loglevel 0 -i "' + 'Music/' + title + '.m4a" -ab 192k "' + 'Music/' + title + '.mp3"') + os.remove('Music/' + title + '.m4a') + +def downloadSong(): + a = video.getbestaudio(preftype="m4a") + a.download(filepath="Music/" + title + ".m4a") + +def isSpotify(): + if (len(raw_song) == 22 and raw_song.replace(" ", "%20") == raw_song) or (raw_song.find('spotify') > -1): + return True + else: + return False + +def trimSong(): + with open('Music/list.txt', 'r') as fin: + data = fin.read().splitlines(True) + with open('Music/list.txt', 'w') as fout: + fout.writelines(data[1:]) + +def trackPredict(): + global URL + if isSpotify(): + global content + content = spotify.track(raw_song) + song = (content['artists'][0]['name'] + ' - ' + content['name']).replace(" ", "%20").encode('utf-8') + URL = "https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + song + else: + song = raw_song.replace(" ", "%20") + URL = "https://www.youtube.com/results?sp=EgIQAQ%253D%253D&q=" + song + song = '' + +def graceQuit(): + print('') + print('') + print('Exitting..') + exit() + +title = '' +song = '' + +while True: + x = 0 + y = 0 + try: + for m in os.listdir('Music/'): + if m.endswith('.temp') or m.endswith('.m4a'): + os.remove('Music/' + m) + print('') + print('') + raw_song = raw_input('>> Enter a song/cmd: ').decode('utf-8').encode('utf-8') + print('') + if raw_song == 'exit': + exit() + elif raw_song == 'play': + playSong() + + elif raw_song == 'lyrics': + loadMechanize() + getLyrics() + + elif raw_song == 'list': + loadMechanize() + f = open('Music/list.txt', 'r').read() + lines = f.splitlines() + for raw_song in lines: + if not len(raw_song) == 0: + x = x + 1 + print('Total songs in list = ' + str(x) + ' songs') + for raw_song in lines: + try: + if not len(raw_song) == 0: + trackPredict() + print('') + y = y + 1 + searchYT(y) + if not checkExists(True): + downloadSong() + trimSong() + print('') + convertSong() + if isSpotify(): + fixSong() + else: + trimSong() + except KeyboardInterrupt: + graceQuit() + except: + lines.append(raw_song) + trimSong() + with open('Music/list.txt', 'a') as myfile: + myfile.write(raw_song) + print('Could not complete a Song download, will try later..') + + else: + try: + loadMechanize() + trackPredict() + searchYT(None) + if not checkExists(False): + downloadSong() + print('') + convertSong() + if isSpotify(): + fixSong() + except KeyboardInterrupt: + graceQuit() + br.close() + + except KeyboardInterrupt: + graceQuit()