mirror of
https://github.com/THIS-IS-NOT-A-BACKUP/zspotify.git
synced 2025-07-03 08:03:55 +00:00
add spotify id, total_traces and isrc to ID3 tags
This commit is contained in:
parent
a87017fd3d
commit
1b9c19d660
3
.gitignore
vendored
3
.gitignore
vendored
@ -157,3 +157,6 @@ zs_config.json
|
|||||||
|
|
||||||
# MacOS file
|
# MacOS file
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
# backup
|
||||||
|
*.bak
|
@ -28,6 +28,8 @@ ARTWORK = 'artwork'
|
|||||||
|
|
||||||
TRACKS = 'tracks'
|
TRACKS = 'tracks'
|
||||||
|
|
||||||
|
TOTAL_TRACKS = 'total_tracks'
|
||||||
|
|
||||||
TRACK = 'track'
|
TRACK = 'track'
|
||||||
|
|
||||||
ITEMS = 'items'
|
ITEMS = 'items'
|
||||||
@ -38,6 +40,12 @@ HREF = 'href'
|
|||||||
|
|
||||||
ID = 'id'
|
ID = 'id'
|
||||||
|
|
||||||
|
ISRC = 'isrc'
|
||||||
|
|
||||||
|
EXTERNAL_IDS = 'external_ids'
|
||||||
|
|
||||||
|
COMMENT = 'comment'
|
||||||
|
|
||||||
URL = 'url'
|
URL = 'url'
|
||||||
|
|
||||||
RELEASE_DATE = 'release_date'
|
RELEASE_DATE = 'release_date'
|
||||||
|
@ -9,7 +9,8 @@ from librespot.metadata import TrackId
|
|||||||
from ffmpy import FFmpeg
|
from ffmpy import FFmpeg
|
||||||
|
|
||||||
from const import TRACKS, ALBUM, GENRES, NAME, ITEMS, DISC_NUMBER, TRACK_NUMBER, IS_PLAYABLE, ARTISTS, IMAGES, URL, \
|
from const import TRACKS, ALBUM, GENRES, NAME, ITEMS, DISC_NUMBER, TRACK_NUMBER, IS_PLAYABLE, ARTISTS, IMAGES, URL, \
|
||||||
RELEASE_DATE, ID, TRACKS_URL, SAVED_TRACKS_URL, TRACK_STATS_URL, CODEC_MAP, EXT_MAP, DURATION_MS, HREF
|
RELEASE_DATE, ID, TRACKS_URL, SAVED_TRACKS_URL, TRACK_STATS_URL, CODEC_MAP, EXT_MAP, DURATION_MS, HREF, ISRC, \
|
||||||
|
EXTERNAL_IDS, TOTAL_TRACKS
|
||||||
from termoutput import Printer, PrintChannel
|
from termoutput import Printer, PrintChannel
|
||||||
from utils import fix_filename, set_audio_tags, set_music_thumbnail, create_download_directory, \
|
from utils import fix_filename, set_audio_tags, set_music_thumbnail, create_download_directory, \
|
||||||
get_directory_song_ids, add_to_directory_song_ids, get_previously_downloaded, add_to_archive, fmt_seconds
|
get_directory_song_ids, add_to_directory_song_ids, get_previously_downloaded, add_to_archive, fmt_seconds
|
||||||
@ -35,7 +36,7 @@ def get_saved_tracks() -> list:
|
|||||||
return songs
|
return songs
|
||||||
|
|
||||||
|
|
||||||
def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, Any, Any, Any, Any, int]:
|
def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, Any, Any, Any, Any, Any, Any, int]:
|
||||||
""" Retrieves metadata for downloaded songs """
|
""" Retrieves metadata for downloaded songs """
|
||||||
with Loader(PrintChannel.PROGRESS_INFO, "Fetching track information..."):
|
with Loader(PrintChannel.PROGRESS_INFO, "Fetching track information..."):
|
||||||
(raw, info) = ZSpotify.invoke_url(f'{TRACKS_URL}?ids={song_id}&market=from_token')
|
(raw, info) = ZSpotify.invoke_url(f'{TRACKS_URL}?ids={song_id}&market=from_token')
|
||||||
@ -44,6 +45,7 @@ def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, An
|
|||||||
raise ValueError(f'Invalid response from TRACKS_URL:\n{raw}')
|
raise ValueError(f'Invalid response from TRACKS_URL:\n{raw}')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
print(info)
|
||||||
artists = []
|
artists = []
|
||||||
for data in info[TRACKS][0][ARTISTS]:
|
for data in info[TRACKS][0][ARTISTS]:
|
||||||
artists.append(data[NAME])
|
artists.append(data[NAME])
|
||||||
@ -54,11 +56,13 @@ def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, An
|
|||||||
release_year = info[TRACKS][0][ALBUM][RELEASE_DATE].split('-')[0]
|
release_year = info[TRACKS][0][ALBUM][RELEASE_DATE].split('-')[0]
|
||||||
disc_number = info[TRACKS][0][DISC_NUMBER]
|
disc_number = info[TRACKS][0][DISC_NUMBER]
|
||||||
track_number = info[TRACKS][0][TRACK_NUMBER]
|
track_number = info[TRACKS][0][TRACK_NUMBER]
|
||||||
|
total_tracks = info[TRACKS][0][ALBUM][TOTAL_TRACKS]
|
||||||
scraped_song_id = info[TRACKS][0][ID]
|
scraped_song_id = info[TRACKS][0][ID]
|
||||||
is_playable = info[TRACKS][0][IS_PLAYABLE]
|
is_playable = info[TRACKS][0][IS_PLAYABLE]
|
||||||
duration_ms = info[TRACKS][0][DURATION_MS]
|
duration_ms = info[TRACKS][0][DURATION_MS]
|
||||||
|
isrc = info[TRACKS][0][EXTERNAL_IDS][ISRC]
|
||||||
return artists, info[TRACKS][0][ARTISTS], album_name, name, image_url, release_year, disc_number, track_number, scraped_song_id, is_playable, duration_ms
|
|
||||||
|
return artists, info[TRACKS][0][ARTISTS], album_name, name, image_url, release_year, disc_number, track_number, total_tracks, scraped_song_id, is_playable, duration_ms, isrc
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise ValueError(f'Failed to parse TRACKS_URL response: {str(e)}\n{raw}')
|
raise ValueError(f'Failed to parse TRACKS_URL response: {str(e)}\n{raw}')
|
||||||
|
|
||||||
@ -117,7 +121,7 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba
|
|||||||
output_template = ZSpotify.CONFIG.get_output(mode)
|
output_template = ZSpotify.CONFIG.get_output(mode)
|
||||||
|
|
||||||
(artists, raw_artists, album_name, name, image_url, release_year, disc_number,
|
(artists, raw_artists, album_name, name, image_url, release_year, disc_number,
|
||||||
track_number, scraped_song_id, is_playable, duration_ms) = get_song_info(track_id)
|
track_number, total_tracks, scraped_song_id, is_playable, duration_ms, isrc) = get_song_info(track_id)
|
||||||
|
|
||||||
song_name = fix_filename(artists[0]) + ' - ' + fix_filename(name)
|
song_name = fix_filename(artists[0]) + ' - ' + fix_filename(name)
|
||||||
|
|
||||||
@ -216,7 +220,7 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba
|
|||||||
genres = get_song_genres(raw_artists, name)
|
genres = get_song_genres(raw_artists, name)
|
||||||
|
|
||||||
convert_audio_format(filename_temp)
|
convert_audio_format(filename_temp)
|
||||||
set_audio_tags(filename_temp, artists, genres, name, album_name, release_year, disc_number, track_number)
|
set_audio_tags(filename_temp, artists, genres, name, album_name, release_year, disc_number, track_number, total_tracks, isrc, scraped_song_id)
|
||||||
set_music_thumbnail(filename_temp, image_url)
|
set_music_thumbnail(filename_temp, image_url)
|
||||||
|
|
||||||
if filename_temp != filename:
|
if filename_temp != filename:
|
||||||
|
@ -10,8 +10,8 @@ from typing import List, Tuple
|
|||||||
import music_tag
|
import music_tag
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
from const import ARTIST, GENRE, TRACKTITLE, ALBUM, YEAR, DISCNUMBER, TRACKNUMBER, ARTWORK, \
|
from const import ARTIST, GENRE, TRACKTITLE, ALBUM, YEAR, DISCNUMBER, TRACKNUMBER, TOTAL_TRACKS, ARTWORK, \
|
||||||
WINDOWS_SYSTEM, ALBUMARTIST
|
WINDOWS_SYSTEM, ALBUMARTIST, ISRC, COMMENT
|
||||||
from zspotify import ZSpotify
|
from zspotify import ZSpotify
|
||||||
|
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ def clear() -> None:
|
|||||||
os.system('clear')
|
os.system('clear')
|
||||||
|
|
||||||
|
|
||||||
def set_audio_tags(filename, artists, genres, name, album_name, release_year, disc_number, track_number) -> None:
|
def set_audio_tags(filename, artists, genres, name, album_name, release_year, disc_number, track_number, total_tracks, isrc, scraped_song_id) -> None:
|
||||||
""" sets music_tag metadata """
|
""" sets music_tag metadata """
|
||||||
tags = music_tag.load_file(filename)
|
tags = music_tag.load_file(filename)
|
||||||
tags[ALBUMARTIST] = artists[0]
|
tags[ALBUMARTIST] = artists[0]
|
||||||
@ -135,6 +135,9 @@ def set_audio_tags(filename, artists, genres, name, album_name, release_year, di
|
|||||||
tags[YEAR] = release_year
|
tags[YEAR] = release_year
|
||||||
tags[DISCNUMBER] = disc_number
|
tags[DISCNUMBER] = disc_number
|
||||||
tags[TRACKNUMBER] = track_number
|
tags[TRACKNUMBER] = track_number
|
||||||
|
tags[TOTAL_TRACKS] = total_tracks
|
||||||
|
tags[ISRC] = isrc
|
||||||
|
tags[COMMENT] = scraped_song_id
|
||||||
tags.save()
|
tags.save()
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user