-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
99 lines (74 loc) · 3.68 KB
/
utils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import requests
from bs4 import BeautifulSoup
import spotipy
from spotipy.client import Spotify
from spotipy.oauth2 import SpotifyOAuth
from json import loads
from accessify import protected
import LogManager
class Uploader:
def __init__(self,
client_id,
client_secret,
redirect_uri,
debug_mode = True):
self.sp = spotipy.Spotify(auth_manager=SpotifyOAuth(scope="playlist-modify-public",
client_id=client_id,
client_secret=client_secret,
redirect_uri=redirect_uri))
self.debug_mode = debug_mode
@protected
def cache(self):
with open('.cache', 'r') as read_stream:
content = read_stream.read()
return loads(content)
@protected
def get_tracks_id(self, tracks) -> list:
ready_tracks = list()
for track in tracks:
result = self.sp.search(q = 'track:' + track.get('track'), type = 'track')
_ = result['tracks']['items']
for elem in _:
if elem.get('name').replace(' ', '').lower() == track.get('track').replace(' ', '').lower():
if elem['album']['artists'][0].get('name').lower() in track.get('artist').lower():
ready_tracks.append(elem.get('id'))
if self.debug_mode:
print(f'Successfuly added {track} [+]')
break
else:
if self.debug_mode:
print(f'Spotify has not track named {track} [-]')
return ready_tracks
@protected
def get_titles_from_vk_playlist(self, uri) -> list:
soup = BeautifulSoup(requests.get(uri).text, 'lxml')
text_content = soup.find_all('span')
temp, tracks = list(), list()
for span in text_content:
if span.text:
temp.append(span.text)
for i in range(len(temp)):
if '–' in temp[i]:
tracks.append({
'artist' : temp[i + 1],
'track' : temp[i - 1]
})
return tracks
def upload_tracks_from_vk(self, uri, playlist_name) -> int:
tracks_titles = self.get_titles_from_vk_playlist(uri)
tracks = self.get_tracks_id(tracks_titles)
playlists = self.sp.current_user_playlists().get('items')
for playlist in playlists:
if playlist.get('name') == playlist_name:
self.sp.playlist_add_items(playlist.get('id'), tracks, position=0)
return len(tracks)
def clear_playlist(self, playlist_name) -> int:
playlists = self.sp.current_user_playlists().get('items')
tracks_in_this_playlist = list()
for playlist in playlists:
playlists = self.sp.current_user_playlists().get('items')
if playlist.get('name') == playlist_name:
for elem in loads(requests.get(playlist['tracks']['href'] + '?access_token=' + self.cache().get('access_token')).text)['items']:
tracks_in_this_playlist.append(elem['track'].get('id'))
self.sp.playlist_remove_all_occurrences_of_items(playlist.get('id'), tracks_in_this_playlist)
return len(tracks_in_this_playlist)