Add release_date to Track and UI

Add a release_date field to the Track dataclass for both iTunes and Spotify clients (iTunes: parsed from releaseDate, Spotify: from album.release_date). Propagate release_date into enhanced search results in web_server and into the client-side script so album objects include release_date when available. Also broaden playlistId matching in the missing-tracks process to include 'enhanced_search_track_'. Removed SQLite SHM/WAL files from the repo (cleanup of DB temporary files). These changes enable showing and using track release dates across the app.
This commit is contained in:
Broque Thomas 2026-02-23 16:25:23 -08:00
parent f1fe72ceb2
commit 7eee2be38c
6 changed files with 12 additions and 7 deletions

View file

@ -68,6 +68,7 @@ class Track:
preview_url: Optional[str] = None
external_urls: Optional[Dict[str, str]] = None
image_url: Optional[str] = None
release_date: Optional[str] = None
@classmethod
def from_itunes_track(cls, track_data: Dict[str, Any], clean_artist_name: Optional[str] = None) -> 'Track':
@ -97,7 +98,8 @@ class Track:
popularity=0, # iTunes doesn't provide popularity
preview_url=track_data.get('previewUrl'),
external_urls=external_urls if external_urls else None,
image_url=album_image_url
image_url=album_image_url,
release_date=track_data.get('releaseDate', '').split('T')[0] if track_data.get('releaseDate') else None
)
@dataclass

View file

@ -85,6 +85,7 @@ class Track:
preview_url: Optional[str] = None
external_urls: Optional[Dict[str, str]] = None
image_url: Optional[str] = None
release_date: Optional[str] = None
@classmethod
def from_spotify_track(cls, track_data: Dict[str, Any]) -> 'Track':
@ -105,7 +106,8 @@ class Track:
popularity=track_data.get('popularity', 0),
preview_url=track_data.get('preview_url'),
external_urls=track_data.get('external_urls'),
image_url=album_image_url
image_url=album_image_url,
release_date=track_data.get('album', {}).get('release_date')
)
@dataclass

Binary file not shown.

Binary file not shown.

View file

@ -4022,7 +4022,8 @@ def enhanced_search():
"artist": artist_name,
"album": track.album,
"duration_ms": track.duration_ms,
"image_url": track.image_url
"image_url": track.image_url,
"release_date": track.release_date
})
logger.info(f"Enhanced search results: {len(db_artists)} DB artists, {len(spotify_artists)} Spotify artists, {len(spotify_albums)} albums, {len(spotify_tracks)} tracks")

View file

@ -3493,7 +3493,7 @@ function initializeSearchModeToggle() {
id: null,
album_type: 'single',
images: track.image_url ? [{ url: track.image_url }] : [],
release_date: null,
release_date: track.release_date || null,
total_tracks: 1
},
duration_ms: track.duration_ms,
@ -3520,7 +3520,7 @@ function initializeSearchModeToggle() {
id: null,
album_type: 'single',
images: track.image_url ? [{ url: track.image_url }] : [],
release_date: null,
release_date: track.release_date || null,
total_tracks: 1,
artists: [{ name: track.artist }]
};
@ -7940,8 +7940,8 @@ async function startMissingTracksProcess(playlistId) {
};
// If this is an artist album download, use album name and include full context
// Match 'artist_album_', 'enhanced_search_album_', 'discover_album_', and 'seasonal_album_' prefixes
if (playlistId.startsWith('artist_album_') || playlistId.startsWith('enhanced_search_album_') || playlistId.startsWith('discover_album_') || playlistId.startsWith('seasonal_album_')) {
// Match 'artist_album_', 'enhanced_search_album_', 'enhanced_search_track_', 'discover_album_', and 'seasonal_album_' prefixes
if (playlistId.startsWith('artist_album_') || playlistId.startsWith('enhanced_search_album_') || playlistId.startsWith('enhanced_search_track_') || playlistId.startsWith('discover_album_') || playlistId.startsWith('seasonal_album_')) {
requestBody.playlist_name = process.album?.name || process.playlist.name;
requestBody.is_album_download = true;
requestBody.album_context = process.album; // Full Spotify album object