Add option to use album release date for songs

This commit is contained in:
Rafael Moraes
2026-01-03 14:43:55 -03:00
parent 414ce749d6
commit 6ed596ca42
4 changed files with 40 additions and 5 deletions
+8
View File
@@ -334,6 +334,12 @@ def make_sync(func):
help="Download only synced lyrics",
default=song_downloader_sig.parameters["synced_lyrics_only"].default,
)
@click.option(
"--use-album-date",
is_flag=True,
help="Use album release date for songs",
default=song_downloader_sig.parameters["use_album_date"].default,
)
# DownloaderMusicVideo specific options
@click.option(
"--music-video-codec-priority",
@@ -410,6 +416,7 @@ async def main(
synced_lyrics_format: SyncedLyricsFormat,
no_synced_lyrics: bool,
synced_lyrics_only: bool,
use_album_date: bool,
music_video_codec_priority: list[MusicVideoCodec],
music_video_remux_format: RemuxFormatMusicVideo,
music_video_resolution: MusicVideoResolution,
@@ -507,6 +514,7 @@ async def main(
synced_lyrics_format=synced_lyrics_format,
no_synced_lyrics=no_synced_lyrics,
synced_lyrics_only=synced_lyrics_only,
use_album_date=use_album_date,
)
music_video_downloader = AppleMusicMusicVideoDownloader(
base_downloader=base_downloader,
+4 -1
View File
@@ -19,6 +19,7 @@ class AppleMusicSongDownloader(AppleMusicBaseDownloader):
synced_lyrics_format: SyncedLyricsFormat = SyncedLyricsFormat.LRC,
no_synced_lyrics: bool = False,
synced_lyrics_only: bool = False,
use_album_date: bool = False,
):
self.__dict__.update(base_downloader.__dict__)
self.interface = interface
@@ -26,6 +27,7 @@ class AppleMusicSongDownloader(AppleMusicBaseDownloader):
self.synced_lyrics_format = synced_lyrics_format
self.no_synced_lyrics = no_synced_lyrics
self.synced_lyrics_only = synced_lyrics_only
self.use_album_date = use_album_date
async def get_download_item(
self,
@@ -45,9 +47,10 @@ class AppleMusicSongDownloader(AppleMusicBaseDownloader):
)
webplayback = await self.interface.apple_music_api.get_webplayback(song_id)
download_item.media_tags = self.interface.get_tags(
download_item.media_tags = await self.interface.get_tags(
webplayback,
download_item.lyrics.unsynced if download_item.lyrics else None,
self.use_album_date,
)
if playlist_metadata:
+19
View File
@@ -3,6 +3,7 @@ import base64
import datetime
import logging
from async_lru import alru_cache
from pywidevine import PSSH, Cdm
from ..api.apple_music_api import AppleMusicApi
@@ -66,3 +67,21 @@ class AppleMusicInterface:
logger.debug(f"Decryption key: {decryption_key}")
return decryption_key
@alru_cache()
async def get_media_date(
self,
media_id: str,
) -> datetime.datetime | None:
lookup_result = await self.itunes_api.get_lookup_result(media_id)
if not lookup_result["results"]:
return None
release_date = lookup_result["results"][0].get("releaseDate")
if not release_date:
return None
parsed_date = self.parse_date(release_date)
logger.debug(f"Parsed media date: {parsed_date}")
return parsed_date
+9 -4
View File
@@ -168,10 +168,11 @@ class AppleMusicSongInterface(AppleMusicInterface):
return f"[{timestamp.strftime('%M:%S.%f')[:-4]}]{text}"
def get_tags(
async def get_tags(
self,
webplayback: dict,
lyrics: str | None = None,
use_album_date: bool = False,
) -> MediaTags:
webplayback_metadata = webplayback["songList"][0]["assets"][0]["metadata"]
@@ -194,9 +195,13 @@ class AppleMusicSongInterface(AppleMusicInterface):
composer_sort=webplayback_metadata.get("sort-composer"),
copyright=webplayback_metadata.get("copyright"),
date=(
self.parse_date(webplayback_metadata["releaseDate"])
if webplayback_metadata.get("releaseDate")
else None
await self.get_media_date(webplayback_metadata["playlistId"])
if use_album_date
else (
self.parse_date(webplayback_metadata["releaseDate"])
if webplayback_metadata.get("releaseDate")
else None
)
),
disc=webplayback_metadata["discNumber"],
disc_total=webplayback_metadata["discCount"],