From d4b39fe9f2537f3040775e24161fce8765e88be2 Mon Sep 17 00:00:00 2001 From: aj Date: Tue, 30 Apr 2019 16:10:41 +0100 Subject: [PATCH] objectified network and playlist --- .gitignore | 1 + backup.py | 11 ++-- main.py | 30 ++--------- spotframework/io/csv.py | 11 ++-- spotframework/model/__init__.py | 0 spotframework/model/playlist.py | 9 ++++ spotframework/net/network.py | 94 +++++++++++++++++++++++++++++++++ spotframework/net/playlist.py | 73 ------------------------- 8 files changed, 120 insertions(+), 109 deletions(-) create mode 100644 spotframework/model/__init__.py create mode 100644 spotframework/model/playlist.py create mode 100644 spotframework/net/network.py delete mode 100644 spotframework/net/playlist.py diff --git a/.gitignore b/.gitignore index 0c6d0ce..d220d4e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ env __pycache__ *.csv +.idea \ No newline at end of file diff --git a/backup.py b/backup.py index 1c638d9..96a7d73 100644 --- a/backup.py +++ b/backup.py @@ -1,14 +1,13 @@ import spotframework.net.user as userclass -import spotframework.net.playlist as playlist +import spotframework.net.network as networkclass import spotframework.io.csv as csvwrite import sys, datetime, os if __name__ == '__main__': - user = userclass.User() - - playlists = playlist.getUserPlaylists(user) + network = networkclass.network(userclass.User()) + playlists = network.getUserPlaylists() path = sys.argv[1] @@ -20,5 +19,5 @@ if __name__ == '__main__': os.makedirs(totalpath) for play in playlists: - csvwrite.exportPlaylist(user, play['id'], play['name'], totalpath) - print(play['name'] + ' exported') + csvwrite.exportPlaylist(play, totalpath) + print(play.name + ' exported') diff --git a/main.py b/main.py index d7c0d15..eb82ae4 100644 --- a/main.py +++ b/main.py @@ -1,32 +1,10 @@ import spotframework.net.user as userclass -import spotframework.net.playlist as playlist +import spotframework.net.network as networkclass +import spotframework.net.network as playlist if __name__ == '__main__': print('hello world') - - user = userclass.User() - #playlists = playlist.getPlaylists(user) + network = networkclass.network(userclass.User()) - #for playlister in playlists: - #print(playlister['name']) - - #print(playlists[0]) - #print(len(playlists)) - - #print(user.username) - - #moreplaylists = playlist.getUserPlaylists(user) - #print(len(moreplaylists)) - - #tracks = playlist.getPlaylistTracks(user, '000Eh2vXzYGgrEFlgcWZj3') - - #print(tracks[0]) - - #print(len(tracks)) - - import spotframework.io.csv as csvwrite - - csvwrite.exportPlaylist(user, '000Eh2vXzYGgrEFlgcWZj3', 'february', '') - - print(user.access_token) + network.getPlaylist('000Eh2vXzYGgrEFlgcWZj3') diff --git a/spotframework/io/csv.py b/spotframework/io/csv.py index 0d0ac5d..2f7a532 100644 --- a/spotframework/io/csv.py +++ b/spotframework/io/csv.py @@ -1,21 +1,24 @@ import csv -import spotframework.net.playlist as playlistpull +import spotframework.net.network as network import datetime headers = ['name', 'artist', 'album', 'album artist', 'added', 'track id', 'album id', 'added by'] -def exportPlaylist(user, playlistid, name, path): +def exportPlaylist(playlist, path, name=None): - playlist = playlistpull.getPlaylistTracks(user, playlistid) + #playlist = network.getPlaylistTracks(user, playlistid) date = str(datetime.datetime.now()) + if name is None: + name = playlist.name + with open('{}/{}_{}.csv'.format(path, name.replace('/', '_'), date.split('.')[0]), 'w') as fileobj: writer = csv.DictWriter(fileobj, fieldnames = headers) writer.writeheader() - for track in playlist: + for track in playlist.tracks: trackdict = { 'name':track['track']['name'], diff --git a/spotframework/model/__init__.py b/spotframework/model/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/spotframework/model/playlist.py b/spotframework/model/playlist.py new file mode 100644 index 0000000..b8cca48 --- /dev/null +++ b/spotframework/model/playlist.py @@ -0,0 +1,9 @@ + + +class playlist: + + def __init__(self, playlistid, name=None, userid=None): + self.tracks = [] + self.name = name + self.playlistid = playlistid + self.userid = userid diff --git a/spotframework/net/network.py b/spotframework/net/network.py new file mode 100644 index 0000000..51c99b0 --- /dev/null +++ b/spotframework/net/network.py @@ -0,0 +1,94 @@ +import requests +from . import const +from spotframework.model.playlist import playlist as playlistclass + +limit = 50 + + +class network: + + def __init__(self, user): + self.user = user + + def getPlaylist(self, playlistid, tracksonly=False): + print('getting ' + playlistid) + + tracks = self.getPlaylistTracks(playlistid) + + playlist = playlistclass(playlistid) + playlist.tracks += tracks + + if not tracksonly: + pass + + return playlist + + def getPlaylists(self, offset=0): + print('getting user playlists') + + headers = {'Authorization': 'Bearer ' + self.user.access_token} + + playlists = [] + + params = {'offset': offset, 'limit': limit} + req = requests.get(const.api_url + 'me/playlists', params=params, headers=headers) + + #print(req.text) + + if req.status_code == 200: + + #print(req.text) + + resp = req.json() + + for responseplaylist in resp['items']: + + playlist = self.getPlaylist(responseplaylist['id'], tracksonly=True) + playlist.name = responseplaylist['name'] + playlist.userid = responseplaylist['owner']['id'] + + playlists.append(playlist) + + #playlists = playlists + resp['items'] + + if resp['next']: + playlists += self.getPlaylists(offset + limit) + + #print(req.text) + + return playlists + + else: + return None + + def getUserPlaylists(self): + + return list(filter(lambda x: x.userid == self.user.username, self.getPlaylists())) + + def getPlaylistTracks(self, playlistid, offset=0): + + headers = {'Authorization': 'Bearer ' + self.user.access_token} + + tracks = [] + + params = {'offset': offset, 'limit': limit} + req = requests.get(const.api_url + 'playlists/{}/tracks'.format(playlistid), params=params, headers=headers) + + #print(req.text) + + if req.status_code == 200: + + #print(req.text) + resp = req.json() + + tracks += resp['items'] + + if resp['next']: + tracks += self.getPlaylistTracks(playlistid, offset + limit) + + #print(req.text) + + return tracks + + else: + raise ValueError("Couldn't Pull Playlist " + str(playlistid) + ' ' + str(req.status_code)) diff --git a/spotframework/net/playlist.py b/spotframework/net/playlist.py deleted file mode 100644 index 7eb067e..0000000 --- a/spotframework/net/playlist.py +++ /dev/null @@ -1,73 +0,0 @@ -import requests -from . import const - -limit = 50 - -def getPlaylists(user, offset = 0): - - headers = {'Authorization': 'Bearer ' + user.access_token} - - playlists = [] - - params = {'offset': offset, 'limit': limit} - req = requests.get(const.api_url + 'me/playlists', params = params, headers = headers) - - #print(req.text) - - if req.status_code == 200: - - #print(req.text) - - resp = req.json() - - playlists = playlists + resp['items'] - - if resp['next']: - playlists += getPlaylists(user, offset + limit) - - #print(req.text) - - return playlists - - else: - return None - -def getUserPlaylists(user): - - playlists = getPlaylists(user) - - returnlist = [] - - for playlist in playlists: - if playlist['owner']['id'] == user.username: - returnlist.append(playlist) - - return returnlist - -def getPlaylistTracks(user, playlistid, offset = 0): - - headers = {'Authorization': 'Bearer ' + user.access_token} - - tracks = [] - - params = {'offset': offset, 'limit': limit} - req = requests.get(const.api_url + 'playlists/{}/tracks'.format(playlistid), params = params, headers = headers) - - #print(req.text) - - if req.status_code == 200: - - #print(req.text) - resp = req.json() - - tracks += resp['items'] - - if resp['next']: - tracks += getPlaylistTracks(user, playlistid, offset + limit) - - #print(req.text) - - return tracks - - else: - raise ValueError("Couldn't Pull Playlist " + str(playlistid) + ' ' + str(req.status_code))