117 lines
3.4 KiB
Python
117 lines
3.4 KiB
Python
|
|
import requests
|
||
|
|
import os
|
||
|
|
from yandex_music import Client
|
||
|
|
|
||
|
|
def get_itunes_search_data(query):
|
||
|
|
url = "https://itunes.apple.com/search"
|
||
|
|
params = {"term": query, "entity": "album", "limit": 1}
|
||
|
|
try:
|
||
|
|
response = requests.get(url, params=params)
|
||
|
|
return response.json()
|
||
|
|
except Exception as e:
|
||
|
|
print(f"iTunes API Error: {e}")
|
||
|
|
return None
|
||
|
|
|
||
|
|
def extract_itunes_album(data):
|
||
|
|
if not data or data.get("resultCount") == 0:
|
||
|
|
return None
|
||
|
|
return data["results"][0]
|
||
|
|
|
||
|
|
def get_itunes_tracks(album_id):
|
||
|
|
params = {"id": album_id, "entity": "song"}
|
||
|
|
response = requests.get("https://itunes.apple.com/lookup", params=params)
|
||
|
|
results = response.json().get("results", [])
|
||
|
|
return results[1:] if len(results) > 1 else []
|
||
|
|
|
||
|
|
def format_itunes_track(item, artist_name):
|
||
|
|
ms = item.get('trackTimeMillis', 0)
|
||
|
|
duration = f"{ms // 60000}:{(ms // 1000) % 60:02d}"
|
||
|
|
return {
|
||
|
|
"no": item.get("trackNumber"),
|
||
|
|
"artist": artist_name,
|
||
|
|
"title": item.get("trackName"),
|
||
|
|
"duration": duration
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
def get_yandex_client():
|
||
|
|
try:
|
||
|
|
return Client().init()
|
||
|
|
except:
|
||
|
|
return None
|
||
|
|
|
||
|
|
def find_yandex_album(client, query):
|
||
|
|
search = client.search(query, type_='album')
|
||
|
|
if not search.albums or not search.albums.results:
|
||
|
|
return None
|
||
|
|
return search.albums.results[0]
|
||
|
|
|
||
|
|
def format_yandex_track(track):
|
||
|
|
sec = track.duration_ms // 1000
|
||
|
|
duration = f"{sec // 60}:{sec % 60:02d}"
|
||
|
|
artists = ", ".join([a.name for a in track.artists])
|
||
|
|
return {
|
||
|
|
"no": getattr(track, 'number', 0),
|
||
|
|
"artist": artists,
|
||
|
|
"title": track.title,
|
||
|
|
"duration": duration
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
def process_itunes(query):
|
||
|
|
data = get_itunes_search_data(query)
|
||
|
|
album = extract_itunes_album(data)
|
||
|
|
if not album:
|
||
|
|
return None
|
||
|
|
|
||
|
|
raw_tracks = get_itunes_tracks(album["collectionId"])
|
||
|
|
artist = album.get("artistName", "Unknown")
|
||
|
|
|
||
|
|
return {
|
||
|
|
"title": album["collectionName"],
|
||
|
|
"year": album["releaseDate"][:4],
|
||
|
|
"tracks": [format_itunes_track(t, artist) for t in raw_tracks]
|
||
|
|
}
|
||
|
|
|
||
|
|
def process_yandex(query):
|
||
|
|
client = get_yandex_client()
|
||
|
|
if not client: return None
|
||
|
|
|
||
|
|
album_info = find_yandex_album(client, query)
|
||
|
|
if not album_info: return None
|
||
|
|
|
||
|
|
full_album = client.albums_with_tracks(album_info.id)
|
||
|
|
tracks = []
|
||
|
|
for vol in full_album.volumes:
|
||
|
|
for t in vol:
|
||
|
|
tracks.append(format_yandex_track(t))
|
||
|
|
|
||
|
|
return {
|
||
|
|
"title": album_info.title,
|
||
|
|
"year": album_info.year or "Unknown",
|
||
|
|
"tracks": tracks
|
||
|
|
}
|
||
|
|
|
||
|
|
def save_to_file(album_data):
|
||
|
|
filename = f"{album_data['title']}.txt"
|
||
|
|
with open(filename, "w", encoding="utf-8") as f:
|
||
|
|
for t in album_data['tracks']:
|
||
|
|
line = f"{t['no']}. {t['artist']} - {t['title']} ({t['duration']})"
|
||
|
|
print(line)
|
||
|
|
f.write(f"{t['artist']} {t['title']}\n")
|
||
|
|
print(f"\nГотово! Сохранено в {filename}")
|
||
|
|
|
||
|
|
|
||
|
|
def main(request):
|
||
|
|
print(f"Поиск '{request}' в iTunes...")
|
||
|
|
result = process_itunes(request)
|
||
|
|
|
||
|
|
if not result:
|
||
|
|
print("В iTunes не найдено. Ищем в Яндекс.Музыке...")
|
||
|
|
result = process_yandex(request)
|
||
|
|
|
||
|
|
if result:
|
||
|
|
print(f"Найдено: {result['title']} ({result['year']})")
|
||
|
|
save_to_file(result)
|
||
|
|
else:
|
||
|
|
print(f"Альбом '{request}' не найден ни в одном источнике.")
|