Данное изменение позволяет использовать проект в качестве библиотеки, также упрощает поддержку и добавление новых возможностей.
58 lines
2.2 KiB
Python
58 lines
2.2 KiB
Python
import hashlib
|
|
import xml.etree.ElementTree as ET
|
|
|
|
from requests import Session
|
|
|
|
from .models import *
|
|
|
|
MD5_SALT = 'XGRlBW9FXlekgbPrRHuSiA'
|
|
|
|
|
|
def get_track_download_url(session: Session, track: BasicTrackInfo,
|
|
hq: bool) -> str:
|
|
resp = session.get('https://music.yandex.ru/api/v2.1/handlers/track'
|
|
f'/{track.id}:{track.album.id}'
|
|
'/web-album_track-track-track-main/download/m'
|
|
f'?hq={int(hq)}')
|
|
url_info_src = resp.json()['src']
|
|
|
|
resp = session.get('https:' + url_info_src)
|
|
url_info = ET.fromstring(resp.text)
|
|
path = url_info.find('path').text[1:]
|
|
s = url_info.find('s').text
|
|
ts = url_info.find('ts').text
|
|
host = url_info.find('host').text
|
|
path_hash = hashlib.md5((MD5_SALT + path + s).encode()).hexdigest()
|
|
return f'https://{host}/get-mp3/{path_hash}/{ts}/{path}?track-id={track.id}'
|
|
|
|
|
|
def get_full_track_info(session: Session, track_id: str) -> FullTrackInfo:
|
|
params = {'track': track_id, 'lang': 'ru'}
|
|
resp = session.get('https://music.yandex.ru/handlers/track.jsx',
|
|
params=params)
|
|
return FullTrackInfo.from_json(resp.json())
|
|
|
|
|
|
def get_full_album_info(session: Session, album_id: str) -> FullAlbumInfo:
|
|
params = {'album': album_id, 'lang': 'ru'}
|
|
resp = session.get('https://music.yandex.ru/handlers/album.jsx',
|
|
params=params)
|
|
return FullAlbumInfo.from_json(resp.json())
|
|
|
|
|
|
def get_artist_info(session: Session, artist_id: str) -> FullArtistInfo:
|
|
params = {'artist': artist_id, 'what': 'albums', 'lang': 'ru'}
|
|
resp = session.get('https://music.yandex.ru/handlers/artist.jsx',
|
|
params=params)
|
|
return FullArtistInfo.from_json(resp.json())
|
|
|
|
|
|
def get_playlist(session: Session,
|
|
playlist: PlaylistId) -> list[BasicTrackInfo]:
|
|
params = {'owner': playlist.owner, 'kinds': playlist.kind, 'lang': 'ru'}
|
|
resp = session.get('https://music.yandex.ru/handlers/playlist.jsx',
|
|
params=params)
|
|
raw_tracks = resp.json()['playlist'].get('tracks', [])
|
|
tracks = map(BasicTrackInfo.from_json, raw_tracks)
|
|
tracks = [t for t in tracks if t is not None]
|
|
return tracks
|