Skip to content

Commit 42a0613

Browse files
committed
Populate total track count in id3 tags
1 parent bc8bdc5 commit 42a0613

3 files changed

Lines changed: 15 additions & 8 deletions

File tree

zotify/const.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
TRACKNUMBER = 'tracknumber'
1010

11+
TOTALTRACKS = 'totaltracks'
12+
1113
DISCNUMBER = 'discnumber'
1214

1315
YEAR = 'year'
@@ -58,6 +60,8 @@
5860

5961
TRACK_NUMBER = 'track_number'
6062

63+
TOTAL_TRACKS = 'total_tracks'
64+
6165
DISC_NUMBER = 'disc_number'
6266

6367
SHOW = 'show'

zotify/track.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from librespot.metadata import TrackId
99
import ffmpy
1010

11-
from zotify.const import TRACKS, ALBUM, GENRES, NAME, ITEMS, DISC_NUMBER, TRACK_NUMBER, IS_PLAYABLE, ARTISTS, IMAGES, URL, \
11+
from zotify.const import TRACKS, ALBUM, GENRES, NAME, ITEMS, DISC_NUMBER, TRACK_NUMBER, TOTAL_TRACKS, IS_PLAYABLE, ARTISTS, IMAGES, URL, \
1212
RELEASE_DATE, ID, TRACKS_URL, FOLLOWED_ARTISTS_URL, SAVED_TRACKS_URL, TRACK_STATS_URL, CODEC_MAP, EXT_MAP, DURATION_MS, \
1313
HREF, ARTISTS, WIDTH
1414
from zotify.termoutput import Printer, PrintChannel
@@ -46,7 +46,7 @@ def get_followed_artists() -> list:
4646
return artists
4747

4848

49-
def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, Any, Any, Any, Any, int]:
49+
def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, Any, Any, Any, Any, Any, int]:
5050
""" Retrieves metadata for downloaded songs """
5151
with Loader(PrintChannel.PROGRESS_INFO, "Fetching track information..."):
5252
(raw, info) = Zotify.invoke_url(f'{TRACKS_URL}?ids={song_id}&market=from_token')
@@ -65,6 +65,7 @@ def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, An
6565
release_year = info[TRACKS][0][ALBUM][RELEASE_DATE].split('-')[0]
6666
disc_number = info[TRACKS][0][DISC_NUMBER]
6767
track_number = info[TRACKS][0][TRACK_NUMBER]
68+
total_tracks = info[TRACKS][0][ALBUM][TOTAL_TRACKS]
6869
scraped_song_id = info[TRACKS][0][ID]
6970
is_playable = info[TRACKS][0][IS_PLAYABLE]
7071
duration_ms = info[TRACKS][0][DURATION_MS]
@@ -75,7 +76,7 @@ def get_song_info(song_id) -> Tuple[List[str], List[Any], str, str, Any, Any, An
7576
image = i
7677
image_url = image[URL]
7778

78-
return artists, info[TRACKS][0][ARTISTS], album_name, album_id, name, image_url, release_year, disc_number, track_number, scraped_song_id, is_playable, duration_ms
79+
return artists, info[TRACKS][0][ARTISTS], album_name, album_id, name, image_url, release_year, disc_number, track_number, total_tracks, scraped_song_id, is_playable, duration_ms
7980
except Exception as e:
8081
raise ValueError(f'Failed to parse TRACKS_URL response: {str(e)}\n{raw}')
8182

@@ -156,7 +157,7 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba
156157
output_template = Zotify.CONFIG.get_output(mode)
157158

158159
(artists, raw_artists, album_name, album_id, name, image_url, release_year, disc_number,
159-
track_number, scraped_song_id, is_playable, duration_ms) = get_song_info(track_id)
160+
track_number, total_tracks, scraped_song_id, is_playable, duration_ms) = get_song_info(track_id)
160161

161162
song_name = fix_filename(artists[0]) + ' - ' + fix_filename(name)
162163

@@ -171,7 +172,8 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba
171172
output_template = output_template.replace("{song_name}", fix_filename(name))
172173
output_template = output_template.replace("{release_year}", fix_filename(release_year))
173174
output_template = output_template.replace("{disc_number}", fix_filename(disc_number))
174-
output_template = output_template.replace("{track_number}",'{:02d}'.format(int(fix_filename(track_number))))
175+
output_template = output_template.replace("{track_number}", '{:02d}'.format(int(fix_filename(track_number))))
176+
output_template = output_template.replace("{total_tracks}", fix_filename(total_tracks))
175177
output_template = output_template.replace("{id}", fix_filename(scraped_song_id))
176178
output_template = output_template.replace("{track_id}", fix_filename(track_id))
177179
output_template = output_template.replace("{ext}", ext)
@@ -268,7 +270,7 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba
268270
Printer.print(PrintChannel.SKIPS, f"### Skipping lyrics for {song_name}: lyrics not available ###")
269271
convert_audio_format(filename_temp)
270272
try:
271-
set_audio_tags(filename_temp, artists, genres, name, album_name, release_year, disc_number, track_number)
273+
set_audio_tags(filename_temp, artists, genres, name, album_name, release_year, disc_number, track_number, total_tracks)
272274
set_music_thumbnail(filename_temp, image_url)
273275
except Exception:
274276
Printer.print(PrintChannel.ERRORS, "Unable to write metadata, ensure ffmpeg is installed and added to your PATH.")

zotify/utils.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import music_tag
1212
import requests
1313

14-
from zotify.const import ARTIST, GENRE, TRACKTITLE, ALBUM, YEAR, DISCNUMBER, TRACKNUMBER, ARTWORK, \
14+
from zotify.const import ARTIST, GENRE, TRACKTITLE, ALBUM, YEAR, DISCNUMBER, TRACKNUMBER, TOTALTRACKS, ARTWORK, \
1515
WINDOWS_SYSTEM, ALBUMARTIST
1616
from zotify.zotify import Zotify
1717

@@ -126,7 +126,7 @@ def clear() -> None:
126126
os.system('clear')
127127

128128

129-
def set_audio_tags(filename, artists, genres, name, album_name, release_year, disc_number, track_number) -> None:
129+
def set_audio_tags(filename, artists, genres, name, album_name, release_year, disc_number, track_number, total_tracks) -> None:
130130
""" sets music_tag metadata """
131131
tags = music_tag.load_file(filename)
132132
tags[ALBUMARTIST] = artists[0]
@@ -137,6 +137,7 @@ def set_audio_tags(filename, artists, genres, name, album_name, release_year, di
137137
tags[YEAR] = release_year
138138
tags[DISCNUMBER] = disc_number
139139
tags[TRACKNUMBER] = track_number
140+
tags[TOTALTRACKS] = total_tracks
140141
tags.save()
141142

142143

0 commit comments

Comments
 (0)