Exemple #1
0
    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)
Exemple #2
0
    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}')
Exemple #4
0
    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)
Exemple #5
0
    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)
Exemple #6
0
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))
Exemple #7
0
        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)