From 6a186b80df5b2be614cac7b1427fdfac37ddeb46 Mon Sep 17 00:00:00 2001 From: kepoorhampond Date: Sat, 9 Sep 2017 22:11:54 -0700 Subject: [PATCH] -e/--exact flag feature --- irs/cli.py | 3 +++ irs/ripper.py | 66 ++++++++++++++++++++++++++++++++++++--------------- irs/utils.py | 10 ++++++-- 3 files changed, 58 insertions(+), 21 deletions(-) diff --git a/irs/cli.py b/irs/cli.py index 087e000..6454a92 100644 --- a/irs/cli.py +++ b/irs/cli.py @@ -26,6 +26,9 @@ name. Must be used with -s/--song or -A/--album") # Album parser.add_argument("-A", "--album", dest="album", help="Specify album \ name") + parser.add_argument("-e", "--exact", dest="exact", action="store_true", + help="The list will only be chosen if it equals the \ +user input.") # Playlist parser.add_argument("-u", "--username", dest="username", help="Specify \ diff --git a/irs/ripper.py b/irs/ripper.py index 54c86da..61c6c86 100644 --- a/irs/ripper.py +++ b/irs/ripper.py @@ -159,12 +159,13 @@ init, or in method arguments.") else: soup = BeautifulSoup(CaptchaCheat.cheat_it(link), 'html.parser') - # print(soup.prettify()) + # with open("index.html", "w") as f: + # f.write(soup.prettify().encode('utf-8')) def find_link(link): try: if "yt-simple-endpoint style-scope ytd-video-renderer" in str(" ".join(link["class"])) or \ - "yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink spf-link" in str(" ".join(link["class"])): + "yt-uix-tile-link yt-ui-ellipsis yt-ui-ellipsis-2 yt-uix-sessionlink spf-link " in str(" ".join(link["class"])): if "&list=" not in link["href"]: return link except KeyError: @@ -173,7 +174,7 @@ init, or in method arguments.") results = list(filter(None, map(find_link, soup.find_all("a")))) garbage_phrases = "cover album live clean rare version full full \ -album".split(" ") +album row at @ session".split(" ") self.code = None counter = 0 @@ -181,11 +182,11 @@ album".split(" ") while self.code is None and counter <= 10: counter += 1 for link in results: + if ObjManip.check_garbage_phrases(garbage_phrases, + link["title"], song): + continue if ObjManip.blank_include(link["title"], song) and \ ObjManip.blank_include(link["title"], artist): - if ObjManip.check_garbage_phrases(garbage_phrases, - link["title"], song): - continue self.code = link break @@ -200,6 +201,15 @@ album".split(" ") self.code = link break + if self.code is None: + for link in results: + if ObjManip.check_garbage_phrases(garbage_phrases, + link["title"], song): + continue + if ObjManip.blank_include(link["title"], song): + self.code = link + break + if self.code is None: song = ObjManip.limit_song_name(song) @@ -211,6 +221,7 @@ album".split(" ") return ("https://youtube.com" + self.code["href"], self.code["title"]) except TypeError: # Assuming Google catches you trying to search youtube for music ;) + print("Trying to bypass google captcha.") return self.find_yt_url(song=song, artist=artist, additional_search=additional_search, caught_by_google=True) @@ -252,20 +263,37 @@ with init, or in method arguments.") if len(list_of_lists) > 0: the_list = None for list_ in list_of_lists: - if ObjManip.blank_include(list_["name"], title): - if Config.parse_artist(self): - if ObjManip.blank_include(list_["artists"][0]["name"], - Config.parse_artist(self)): - the_list = self.spotify.album(list_["uri"]) - break - else: - if type == "album": - the_list = self.spotify.album(list_["uri"]) + if Config.parse_exact(self) == True: + if list_["name"].encode("utf-8") == title.encode("utf-8"): + if Config.parse_artist(self): + if list_["artists"][0]["name"].encode("utf-8") == \ + Config.parse_artist(self).encode('utf-8'): + the_list = self.spotify.album(list_["uri"]) + break else: - the_list = self.spotify.user_playlist( - list_["owner"]["id"], list_["uri"]) - the_list["artists"] = [{"name": username}] - break + if type == "album": + the_list = self.spotify.album(list_["uri"]) + else: + the_list = self.spotify.user_playlist( + list_["owner"]["id"], list_["uri"]) + the_list["artists"] = [{"name": username}] + break + + else: + if ObjManip.blank_include(list_["name"], title): + if Config.parse_artist(self): + if ObjManip.blank_include(list_["artists"][0]["name"], + Config.parse_artist(self)): + the_list = self.spotify.album(list_["uri"]) + break + else: + if type == "album": + the_list = self.spotify.album(list_["uri"]) + else: + the_list = self.spotify.user_playlist( + list_["owner"]["id"], list_["uri"]) + the_list["artists"] = [{"name": username}] + break if the_list is not None: YdlUtils.clear_line() diff --git a/irs/utils.py b/irs/utils.py index caef49f..61b43a3 100644 --- a/irs/utils.py +++ b/irs/utils.py @@ -90,8 +90,8 @@ class ObjManip: # Object Manipulation def check_garbage_phrases(phrases, string, title): for phrase in phrases: - if phrase in ObjManip.blank(string): - if phrase not in ObjManip.blank(title): + if phrase in string.lower(): + if phrase not in title.lower(): return True return False @@ -443,6 +443,12 @@ class Config: else: return True + def parse_exact(ripper): + exact = check_sources(ripper, "exact") + if exact in (True, False): + return exact + + #============== # Captcha Cheat