def users_playlists_delete_track(self, kind: str or int, from_: int, to: int, revision: int = 1, user_id: str = None, timeout=None, *args, **kwargs): """Удаление треков из плейлиста. Для удаление необходимо указать границы с какого по какой элемент (трек) удалить. Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. from_ (:obj:`int`): С какого индекса. to (:obj:`int`): По какой индекс. revision (:obj:`int`): TODO. user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: :obj:`yandex_music.Playlist`: Объекта класса :class:`yandex_music.Playlist` представляющий изменённый плейлист, иначе :obj:`None`. Raises: :class:`yandex_music.YandexMusicError` """ if user_id is None: user_id = self.account.uid diff = Difference().add_delete(from_, to) return self.users_playlists_change(kind, diff.to_json(), revision, user_id, timeout, *args, **kwargs)
def users_playlists_insert_track(self, kind: str or int, track_id: str or int, album_id: str or int, at: int = 0, revision: int = 1, user_id: str = None, timeout=None, *args, **kwargs): """Добавление трека в плейлист. Трек можно вставить с любое место плейлиста задав индекс вставки (аргумент at). Args: kind (:obj:`str` | :obj:`int`): Уникальный идентификатор плейлиста. track_id (:obj:`str` | :obj:`int`): Уникальный идентификатор трека. album_id (:obj:`str` | :obj:`int`): Уникальный идентификатор альбома. at (:obj:`int`): Индекс для вставки. revision (:obj:`int`): TODO. user_id: (:obj:`int`, optional): Уникальный идентификатор пользователя владеющим плейлистом. timeout (:obj:`int` | :obj:`float`, optional): Если это значение указано, используется как время ожидания ответа от сервера вместо указанного при создании пула. **kwargs (:obj:`dict`, optional): Произвольные аргументы (будут переданы в запрос). Returns: :obj:`yandex_music.Playlist`: Объекта класса :class:`yandex_music.Playlist` представляющий изменённый плейлист, иначе :obj:`None`. Raises: :class:`yandex_music.YandexMusicError` """ if user_id is None: user_id = self.account.uid diff = Difference().add_insert(at, {'id': track_id, 'album_id': album_id}) return self.users_playlists_change(kind, diff.to_json(), revision, user_id, timeout, *args, **kwargs)
def import_playlists(self): import_tracks = '' playlists = self.export_data[self.source.upper()]["playlists"] for title, tracks in playlists.items(): logging.debug(f'IMPORTING playlist {title}') playlist_id, playlist_rev, playlist_trackCount = self.check_playlist(title) time.sleep(3) playlist_id, playlist_rev, playlist_trackCount = self.check_playlist(title) for item in tracks: import_tracks += ' '.join(item) + '\n' string_of_songs=import_tracks.replace(' ','+') json_values={ 'content':string_of_songs } while True: r1_import = requests.post(self.import_url, json=json_values, allow_redirects=False) if r1_import.status_code == 302: logging.warning('Request redirected to captcha. retrying...') time.sleep(3) if r1_import.status_code == 200: logging.warning('Request Successful') id_import = json.loads(r1_import.text)['importCode'] break params = { 'code': id_import } time.sleep(3) while True: resp = requests.get(url=self.import_url, params=params, allow_redirects=False) if resp.status_code == 200: logging.warning('Request Successful') resp = json.loads(resp.text) if resp['status'] == 'in-progress': logging.warning('Search in progress. retrying...') time.sleep(3) elif resp['status'] == 'done': trackIds = resp['trackIds'] logging.warning(f'Got trackIds for playlist {title}') break else: logging.warning( 'Request redirected to captcha. retrying...') time.sleep(3) tracks_diff = [dict([('id', item.split(':')[0]), ('album_id', item.split(':')[1])]) for item in trackIds] diff = Difference().add_insert(at=playlist_trackCount, tracks=tracks_diff) self.client.users_playlists_change( kind=playlist_id, diff=diff.to_json(), revision=playlist_rev) logging.warning(f'IMPORTED playlist {title}')
def users_playlists_delete_track(self, kind: str or int, from_: int, to: int, revision: int = 1, user_id: str = None, timeout=None, *args, **kwargs): if user_id is None: user_id = self.account.uid diff = Difference().add_delete(from_, to) return self.users_playlists_change(kind, diff.to_json(), revision, user_id, timeout, *args, **kwargs)
def users_playlists_insert_track(self, kind: str or int, track_id, album_id, at: int = 0, revision: int = 1, user_id: str = None, timeout=None, *args, **kwargs): if user_id is None: user_id = self.account.uid diff = Difference().add_insert(at, { 'id': track_id, 'album_id': album_id }) return self.users_playlists_change(kind, diff.to_json(), revision, user_id, timeout, *args, **kwargs)
params = [sys.argv[1], sys.argv[2]] client = Client.from_credentials(params[0], params[1]) listType = [ 'PlayListDaily', 'PlayListMissed', 'PlayListPremiere', 'PlayListDejavu', 'PlayListFamily' ] allPlaylists = client.usersPlaylistsList() fullPlayLists = [pl for pl in allPlaylists if pl.title in listType] for pl in fullPlayLists: tracks = pl.fetch_tracks() uniqueTracks = set() diff = Difference() first = -1 deleted = 0 for i, track in enumerate(tracks): if track.track.id in uniqueTracks: #удалить deleted += 1 if first < 0: first = i else: if first >= 0: diff.add_delete(first, i) first = -1 uniqueTracks.add(track.track.id) if first >= 0: diff.add_delete(first, len(tracks))
jsonForFull = [] for track in tracksShort: json = json + [{ 'id': track.track.id, 'album_id': track.track.albums[0].id }] if not track.track.id in trackInFullPL: jsonForFull += [{ 'id': track.track.id, 'album_id': track.track.albums[0].id }] newpls: List[Playlist] = [ tPl for tPl in allPlaylists if newPlayListName == tPl.title ] findPL = len(newpls) > 0 if findPL: print('уже есть такой') else: # Создаём новый плейлист playlistNew = client.usersPlaylistsCreate(newPlayListName) diff = Difference().add_insert(0, json) client.users_playlists_change(playlistNew.kind, diff.to_json()) # в суммарный diff = Difference().add_insert(fullPL.track_count, jsonForFull) client.users_playlists_change(fullPL.kind, diff.to_json(), revision=fullPL.revision)