From 6efa5d05320ee6b8d00a28e8261136301cb98c8e Mon Sep 17 00:00:00 2001 From: qzdl Date: Fri, 7 Feb 2020 19:57:11 +0000 Subject: [PATCH] reinstate search functionality --- requirements.txt | 10 --- setup.py | 15 ++++- src/samplify/{platforms => }/platform.py | 7 +- src/samplify/platforms/spotify.py | 5 -- src/samplify/platforms/youtube.py | 72 -------------------- src/samplify/sample_finder.py | 6 +- src/samplify/samplify.py | 85 ++++++++++++------------ src/samplify/tools/logger.py | 2 +- src/samplify/tools/options.py | 2 +- 9 files changed, 67 insertions(+), 137 deletions(-) rename src/samplify/{platforms => }/platform.py (98%) delete mode 100644 src/samplify/platforms/spotify.py delete mode 100644 src/samplify/platforms/youtube.py diff --git a/requirements.txt b/requirements.txt index 2821560..bdf1d57 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,24 +1,14 @@ beautifulsoup4==4.8.0 -cachetools==3.1.1 -certifi==2019.6.16 -chardet==3.0.4 fuzzywuzzy==0.17.0 google-api-python-client==1.7.11 google-auth==1.6.3 google-auth-httplib2==0.0.3 google-auth-oauthlib==0.4.0 -httplib2==0.13.1 -idna==2.8 -oauthlib==3.1.0 objectpath==0.6.1 -pyasn1==0.4.7 -pyasn1-modules==0.2.6 python-Levenshtein==0.12.0 requests==2.22.0 -requests-oauthlib==1.2.0 rsa==4.0 six==1.12.0 soupsieve==1.9.3 spotipy==2.4.4 -uritemplate==3.0.0 urllib3==1.25.3 diff --git a/setup.py b/setup.py index 938be7c..0f68cc5 100644 --- a/setup.py +++ b/setup.py @@ -12,13 +12,22 @@ long_description=long_description, long_description_content_type="text/markdown", url="https://github.com/qzdl/samplify", - packages=setuptools.find_packages('src', 'src/tools'), + packages=setuptools.find_packages('src' 'platforms'), package_dir={'': 'src'}, install_requires=[ - "BeautifulSoup4", - "objectpath==0.6.1", + "beautifulsoup4==4.8.0", "fuzzywuzzy==0.17.0", + "google-api-python-client==1.7.11", + "google-auth==1.6.3", + "google-auth-httplib2==0.0.3", + "google-auth-oauthlib==0.4.0", + "objectpath==0.6.1", "python-Levenshtein==0.12.0", + "requests==2.22.0", + "rsa==4.0", + "six==1.12.0", + "soupsieve==1.9.3", + "urllib3==1.25.3", "spotipy @ git+https://github.com/qzdl/spotipy.git", ], # dependency_links=[ diff --git a/src/samplify/platforms/platform.py b/src/samplify/platform.py similarity index 98% rename from src/samplify/platforms/platform.py rename to src/samplify/platform.py index 4ae504b..3516690 100644 --- a/src/samplify/platforms/platform.py +++ b/src/samplify/platform.py @@ -9,10 +9,11 @@ from spotipy.oauth2 import SpotifyClientCredentials from spotipy import util -from config import config +from samplify.config import config SPOTIFY = 'spotify' YOUTUBE = 'youtube' +STDOUT = 'stdout' def get_platform(name): if name == SPOTIFY: @@ -246,3 +247,7 @@ def add_item_to_playlist(self, playlist_id, item_id): } }) # end insert return add_request.execute() # yields body of request + + +class StdOut(Platform): + pass diff --git a/src/samplify/platforms/spotify.py b/src/samplify/platforms/spotify.py deleted file mode 100644 index b5ac3be..0000000 --- a/src/samplify/platforms/spotify.py +++ /dev/null @@ -1,5 +0,0 @@ -""" Content wrapper for spotify - - Playlist management - - Search Management - -""" diff --git a/src/samplify/platforms/youtube.py b/src/samplify/platforms/youtube.py deleted file mode 100644 index 4fa508e..0000000 --- a/src/samplify/platforms/youtube.py +++ /dev/null @@ -1,72 +0,0 @@ -# -*- coding: utf-8 -*- - -import os - -import google_auth_oauthlib.flow -import googleapiclient.discovery -import googleapiclient.errors - -""" -A set of mappings is required for youtube to create playlists -- Is there a youtube python client? -- What sort of auth is required? -- Docs require update -- sample_finder.py needs to be further refactored to remove common elements - like mapping & interpretation of whosampled results. -""" - -class Youtube: - def __init__(self): - self.scopes = ["https://www.googleapis.com/auth/youtube.force-ssl"] - # Disable OAuthlib's HTTPS verification when running locally. - # *DO NOT* leave this option enabled in production. - os.environ["OAUTHLIB_INSECURE_TRANSPORT"] = "1" - - self.api_service_name = "youtube" - self.api_version = "v3" - self.client_secrets_file = "client.json" - - # Get credentials and create an API client - flow = google_auth_oauthlib.flow.InstalledAppFlow.from_client_secrets_file( - client_secrets_file, scopes) - credentials = flow.run_console() - self.yt_session = googleapiclient.discovery.build( - api_service_name, api_version, credentials=credentials) - - def create_playlist(self, playlist_name, description): - self.yt_session.playlists().insert( - part="snippet,status", - body={ - "snippet": { - "title": playlist_name, - "description": description, - "tags": [ - "SAMPLIFY", - "samplify", - "hiphopheads", - "QZDL", - "VinRican" - ], - "defaultLanguage": "en" - }, - "status": { - "privacyStatus": "private" - } - } - ) # end insert - return request.execute() - - - def add_video_to_playlist(self, video_id, playlist_id): - add_request=self.yt_session.playlistItems().insert( - part="snippet", - body={ - 'snippet': { - 'playlistId': playlist_id, - 'resourceId': { - 'kind': 'youtube#video', - 'videoId': video_id - } - } - }) # end insert - return add_request.execute() # yields body of request diff --git a/src/samplify/sample_finder.py b/src/samplify/sample_finder.py index 8b52b12..b0e7ffc 100644 --- a/src/samplify/sample_finder.py +++ b/src/samplify/sample_finder.py @@ -9,7 +9,7 @@ from samplify.tools.logger import Logger from samplify.tools import direction as d -from samplify.platforms import platform +import samplify.platform as platform import samplify.config as cfg # uri => spotify:album:2laBNOqPW85M3js7qCYhKt @@ -45,7 +45,7 @@ def samplify(self, options): def from_search(self, search_term, content_type, direction=None, output_name=None, output_type=None): options = Options() - result = self.input_platform.search(search_term) + builder, result = self.input_platform.search(search_term) self.log(message=f'Searched for "{search_term}"', function='from_search', data=result) @@ -55,7 +55,7 @@ def from_search(self, search_term, content_type, # build objectpath query & get first result tree_obj = objectpath.Tree(result) search_mod = '.album' if options.type_is_album(content_type) else '' - query = f'$.tracks.items{search_mod}.(name, uri)' + query = f'${search_mod}.(name, uri)' queried = json.loads(json.dumps(tuple(tree_obj.execute(query))))[0] options.parent_name = queried['name'] diff --git a/src/samplify/samplify.py b/src/samplify/samplify.py index 4827dc0..b82a735 100644 --- a/src/samplify/samplify.py +++ b/src/samplify/samplify.py @@ -1,5 +1,5 @@ import argparse -from samplify.platforms import platform +import samplify.platform as platform from samplify.sample_finder import Samplify from samplify.tools.options import Options """ @@ -9,66 +9,71 @@ def main(): options = Options() parser = argparse.ArgumentParser() - i_platform_group = parser.add_mutually_exclusive_group(required=True) + + # input platform, default = platform.SPOTIFY + i_platform_group = parser.add_mutually_exclusive_group(required=False) i_platform_group.add_argument( '--input-spotify', action="store_const", const=platform.SPOTIFY, - dest='i_platform' - ) + dest='i_platform') - o_platform_group = parser.add_mutually_exclusive_group(required=True) + # output platform, default = platform.SPOTIFY + o_platform_group = parser.add_mutually_exclusive_group(required=False) o_platform_group.add_argument( '--output-spotify', action="store_const", const=platform.SPOTIFY, - dest='o_platform' - ) + dest='o_platform') + o_platform_group.add_argument( '--output-youtube', action="store_const", const=platform.YOUTUBE, - dest='o_platform' - ) + dest='o_platform') + + o_platform_group.add_argument( + '--output-stdout', + action='store_const', + const=platform.STDOUT, + dest='o_platform') reference_group = parser.add_mutually_exclusive_group(required=True) reference_group.add_argument( '-l', '--link', - help='Click "Share" > "Copy Link"' - ) + help='Click "Share" > "Copy Link"') + reference_group.add_argument( '-s', '--search', - help='Search as you would in the app' - ) + help='Search as you would in the app') content_group = parser.add_mutually_exclusive_group(required=True) content_group.add_argument( '--album', action="store_const", const=options.ALBUM, - dest='content_type' - ) + dest='content_type') + content_group.add_argument( '--playlist', action="store_const", const=options.PLAYLIST, - dest='content_type' - ) + dest='content_type') + content_group.add_argument( '--song', action="store_const", const=options.SONG, - dest='content_type' - ) + dest='content_type') + # FIXME: current song can't work with '--search' content_group.add_argument( '--current-song', action="store_const", const=options.CURRENT_SONG, - dest='content_type' - ) + dest='content_type') parser.add_argument("--direction") parser.add_argument("--output-name") @@ -81,70 +86,68 @@ def main(): help='Include function detail', action="store_const", const=1, - dest='verbosity' - ) + dest='verbosity') + debug_group.add_argument( '-vv', help='Multiline, include limited data', action="store_const", const=2, - dest='verbosity' - ) + dest='verbosity') + debug_group.add_argument( '-vvv', help='Multiline, include full data', action="store_const", const=3, - dest='verbosity' - ) + dest='verbosity') + args = parser.parse_args() samplify = Samplify( verbosity=args.verbosity or 0, - input_platform=args.i_platform, - output_platform=args.o_platform, - ); - result = None + input_platform=args.i_platform or platform.SPOTIFY, + output_platform=args.o_platform or platform.SPOTIFY); + result = None if args.search: result = samplify.from_search( search_term=args.search, direction=args.direction, content_type=args.content_type, output_name=args.output_name, - output_type=args.output_type - ) + output_type=args.output_type) + elif options.type_is_playlist(args.content_type): result = samplify.playlist( reference=args.link, direction=args.direction, output_name=args.output_name, output_type=args.output_type, - username=args.username - ) + username=args.username) + elif options.type_is_album(args.content_type): result = samplify.album( reference=args.link, direction=args.direction, output_name=args.output_name, - output_type=args.output_type - ) + output_type=args.output_type) + elif options.type_is_song(args.content_type): result = samplify.song( reference=args.link, direction=args.direction, output_name=args.output_name, output_type=args.output_type, - username=args.username - ) + username=args.username) + elif options.type_is_current_song(args.content_type): result = samplify.current_song( reference=args.link, direction=args.direction, output_name=args.output_name, output_type=args.output_type, - username=args.username - ) + username=args.username) if __name__ == '__main__': main() diff --git a/src/samplify/tools/logger.py b/src/samplify/tools/logger.py index bfec011..d09066c 100644 --- a/src/samplify/tools/logger.py +++ b/src/samplify/tools/logger.py @@ -3,7 +3,7 @@ class Logger: def __init__(self, verbosity, log_file): self.verbosity = verbosity - self.log_file = f'logs/{log_file}.log' + self.log_file = f'{log_file}.log' self.logs = [] self._log(f'verbosity == {verbosity}') self._log(f'log_file == {log_file}') diff --git a/src/samplify/tools/options.py b/src/samplify/tools/options.py index 84414bf..858eaf2 100644 --- a/src/samplify/tools/options.py +++ b/src/samplify/tools/options.py @@ -56,4 +56,4 @@ def generate(self, reference, direction=None, content_type=None, scope=None, self.output_name = output_name self.output_type = output_type if output_type else self.CREATE_ONLY self.scope = scope - self.username = username if username else config.username + self.username = username if username else config.config.username