Enhanced multi-disc on spotify
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -13,3 +13,7 @@ Test.py
|
|||||||
deezspot/models/callback/__pycache__/
|
deezspot/models/callback/__pycache__/
|
||||||
deezspot/models/download/__pycache__/
|
deezspot/models/download/__pycache__/
|
||||||
objects.ts
|
objects.ts
|
||||||
|
callback.log
|
||||||
|
.gitignore
|
||||||
|
deezspot_test.log
|
||||||
|
spotify_downloads
|
||||||
|
|||||||
@@ -88,9 +88,29 @@ def tracking(ids, album_data_for_track=None, market: list[str] | None = None) ->
|
|||||||
|
|
||||||
album_to_process = None
|
album_to_process = None
|
||||||
full_album_obj = None
|
full_album_obj = None
|
||||||
|
album_track_number = json_track.get('track_number', 1) # Default to individual track number
|
||||||
|
album_disc_number = json_track.get('disc_number', 1) # Default to individual disc number
|
||||||
|
|
||||||
if album_data_for_track:
|
if album_data_for_track:
|
||||||
album_to_process = album_data_for_track
|
album_to_process = album_data_for_track
|
||||||
|
# When we have album context, find the track's correct position within its disc
|
||||||
|
simplified_tracks = album_data_for_track.get('tracks', {}).get('items', [])
|
||||||
|
|
||||||
|
# Group tracks by disc and calculate track numbers relative to each disc
|
||||||
|
disc_track_counts = {}
|
||||||
|
for track_item in simplified_tracks:
|
||||||
|
if track_item and track_item.get('id'):
|
||||||
|
disc_num = track_item.get('disc_number', 1)
|
||||||
|
if disc_num not in disc_track_counts:
|
||||||
|
disc_track_counts[disc_num] = 0
|
||||||
|
|
||||||
|
if track_item.get('id') == ids:
|
||||||
|
disc_track_counts[disc_num] += 1
|
||||||
|
album_track_number = disc_track_counts[disc_num] # Track number within disc
|
||||||
|
album_disc_number = disc_num # Disc number from album context
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
disc_track_counts[disc_num] += 1
|
||||||
elif json_track.get('album'):
|
elif json_track.get('album'):
|
||||||
album_id = json_track.get('album', {}).get('id')
|
album_id = json_track.get('album', {}).get('id')
|
||||||
if album_id:
|
if album_id:
|
||||||
@@ -111,8 +131,8 @@ def tracking(ids, album_data_for_track=None, market: list[str] | None = None) ->
|
|||||||
|
|
||||||
track_obj = trackObject(
|
track_obj = trackObject(
|
||||||
title=json_track.get('name', ''),
|
title=json_track.get('name', ''),
|
||||||
disc_number=json_track.get('disc_number', 1),
|
disc_number=album_disc_number,
|
||||||
track_number=json_track.get('track_number', 1),
|
track_number=album_track_number,
|
||||||
duration_ms=json_track.get('duration_ms', 0),
|
duration_ms=json_track.get('duration_ms', 0),
|
||||||
explicit=json_track.get('explicit', False),
|
explicit=json_track.get('explicit', False),
|
||||||
genres=album_for_track.genres,
|
genres=album_for_track.genres,
|
||||||
@@ -186,15 +206,24 @@ def tracking_album(album_json, market: list[str] | None = None) -> Optional[albu
|
|||||||
# Fallback to simplified if batch fetch fails
|
# Fallback to simplified if batch fetch fails
|
||||||
track_items_to_process = simplified_tracks
|
track_items_to_process = simplified_tracks
|
||||||
|
|
||||||
for index, track_item in enumerate(track_items_to_process):
|
# Group tracks by disc and assign correct track numbers within each disc
|
||||||
|
disc_track_counts = {}
|
||||||
|
|
||||||
|
for track_item in track_items_to_process:
|
||||||
if not track_item or not track_item.get('id'):
|
if not track_item or not track_item.get('id'):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# For album context, use the position in album as track number to ensure correct ordering
|
# Get disc number and increment track count for this disc
|
||||||
# This is important for compilation albums where individual tracks may have different track numbers
|
disc_num = track_item.get('disc_number', 1)
|
||||||
|
if disc_num not in disc_track_counts:
|
||||||
|
disc_track_counts[disc_num] = 0
|
||||||
|
disc_track_counts[disc_num] += 1
|
||||||
|
|
||||||
|
# For album context, use the track position within its disc for correct numbering
|
||||||
|
# This is important for compilation albums and multi-disc albums
|
||||||
track_item_copy = dict(track_item) # Create a copy to avoid modifying original
|
track_item_copy = dict(track_item) # Create a copy to avoid modifying original
|
||||||
track_item_copy['track_number'] = index + 1 # Use album position as track number
|
track_item_copy['track_number'] = disc_track_counts[disc_num] # Track number within disc
|
||||||
track_item_copy['disc_number'] = track_item.get('disc_number', 1) # Keep original disc number
|
track_item_copy['disc_number'] = disc_num # Keep disc number
|
||||||
|
|
||||||
# Simplified track object from album endpoint is enough for trackAlbumObject
|
# Simplified track object from album endpoint is enough for trackAlbumObject
|
||||||
album_tracks.append(_json_to_track_album_object(track_item_copy))
|
album_tracks.append(_json_to_track_album_object(track_item_copy))
|
||||||
|
|||||||
Reference in New Issue
Block a user