From 3b43dc96bd184a70a7d23cc01fbe909fa5c4ea8c Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 18 Dec 2025 23:30:22 +0100 Subject: [PATCH] Prepare V0.2 --- zotify/__pycache__/album.cpython-314.pyc | Bin 0 -> 4783 bytes zotify/__pycache__/config.cpython-314.pyc | Bin 0 -> 24064 bytes zotify/__pycache__/track.cpython-314.pyc | Bin 33500 -> 34277 bytes zotify/album.py | 15 ++++++++++++++- zotify/config.py | 6 +----- zotify/track.py | 18 ++++++++++++++++++ 6 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 zotify/__pycache__/album.cpython-314.pyc create mode 100644 zotify/__pycache__/config.cpython-314.pyc diff --git a/zotify/__pycache__/album.cpython-314.pyc b/zotify/__pycache__/album.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f46fc725d2aa0b4d56c06b42b7548677307a980 GIT binary patch literal 4783 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 Zl)T*OhfN~a`0zkGCq6#M30x~1{NKteYx4jA literal 0 HcmV?d00001 diff --git a/zotify/__pycache__/config.cpython-314.pyc b/zotify/__pycache__/config.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74770a3d178de9b25369433422c631a54ca85909 GIT binary patch literal 24064 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 delta 4489 zcmds5e{9po6~Fs_b<;{0&p*iPakkQf>#B(0M;HO5>5`a+yGG&p7O zT}TKa9RaOStwS2^wNSMyn>Iw%t(~YmY5Rj|;-CG&=n4}Pg3*d?R2^!!wrf|Q?2p}@ z^Y!;jX0_dFUVi#2UP_rykbgbNWhrF{H((4+!{tkKQkc zH58YAkPw6!F4mBt>Q*u*1gRV!+~9ys6vY@fuAT>AQUt&Tmf_ie3~!7Vi+UMB^x}0( zHtZZJ#P5XlwIv7|K)e*044^e%UR5d=TV#D|3qIOYjRU1L2c?oVFIY)+o1c*q+I$wGxnl{uZc z4p;R#^opC!_~Zdw5LL?d$yBn6VHr&2iR?aNebn!DC18_nj`M*zZoo%2W>cJuY%)}= zABQa_-Wo5#f9wp_y=`-OQO(po$fCp}5(1G4Ue0EUhQ5^rp@mRfBazkIN2nQwzmraQ{kac(SD9c~pp+{$=))>W>k+OKRlgq*~$mR3$t z5;w~yfgo~?9!FYK5?|GspOHF1e?fGZdTva(Xp901kCcFA&u#w1+wpnzlDE`3s# z#*#Rhu$yYP0jW;hBTG?v+=bVTSb3W`fXAYa;!@;}SH~Uk8pOxlo%y(Dq@uZ=%xORk z+cc}o0O*I4#B5R=bFVy4Q-O;u;15Px;3CV5iy@uHgX&}7V5P_wTcXtEkz-z_WHWV2 z-9sLH>|t|3U7`Vb;J*%Q%XLrlM7do~f(dfD}u*`L&i>X6%;y?n^k zRuZpM_q`g~6Qu4np(fP0`Z)lm*qIJ}0)Uv5$1`W2M^$joCISB{*0f@EyVWaxQ&t~c zkk46ajswX@ZO_)Gy&L}bYtzzK%t}YRzOx{+Ysn`bmiLdch0g)3KzvG(qkPmn`oid0 zRD^s%T}DoF;ae(=LgKq7)+a$xjs%uxR+fv(6Ck@l>^n4|EZL$?z>+dpCh9eQRTjcy z^op{3P${XsjjH=K3lPIBdb4k&GNRZdJ}+Y;FRCRWU@7*hWPaqOGEH- zZq${wvH3}PJ_}_tUJO+&>(F;#Xtd5f$2r)$AO)O2+#;*zFIP+ASEbx$F8VbU3F^hl zR$h*F2e5C7r=PtMiM(3*Cw zXlncH_{{Fzv*Xgl?2c>N>D{Sal$&{jjHbieT^u(vj>o4u;1l?nsae>9^LP9RbEyIN z9*(4jxPJhAJavSK?bAW?4E^OcQ$&8IvgTvb+cSc9PItlK^efZP!1S%1XCNF(zqo6J z7X<5x=(EvN-YeCiOVy!^>qajNW9j$49?8qQ`?rV&NA@0sUFq|Ck3%?~p4exEOV1PB zvqRc&uK+G+!bVEp6vEAvz6CvdyR~om^J&}er=p9s;j%>|xU@z~+TU_++SZ4Cgj_DC zoy#FN`F;F5S6>$)R~=OAY6Bg(R>ZV^AF3gp>n`_v7kE3rw|jo63*69zO+@&Iiat9b zH#=$IVz3uygx<8vcNqei*N!wN}8MxIIE+$&<7rGa0;C+8zHz6N3>WS#X4*Px! z_{g-roOC{I3>ygfduJ|+i!#5d?$Z92#M%+2c&!_zeGD-!F?_K9UmRI6M&R& z;VB=~FKCMHJfI`%-qq?CDs*>EIwHSo3+@;A&r7Jz=O##bf$^5WqMpB3K>2%xkn(!Q z8x7&!QvP1$fH&N0;Lr6Mh&`o*3Wl(i6vuPDPBIcHVcks&xAB6@C4|T$Fyynn!AxDFRHWz;Q`XL_b@K2s}nLnkv tf27S;+JvaiC-~-*_4zEOI9z(z4mV)`;nOAbkCoed^WAU(&d@&_{s~yGRbv1E diff --git a/zotify/album.py b/zotify/album.py index 5101dbb..99ddb81 100644 --- a/zotify/album.py +++ b/zotify/album.py @@ -63,12 +63,25 @@ def download_album(album): # inject these values into the template; track-level localized metadata will be used. get_album_name(album) tracks = get_album_tracks(album) + + # Only create Disc folders when the album truly has multiple discs. + disc_numbers = { + (t.get('disc_number') if isinstance(t, dict) else None) or 1 + for t in tracks + } + album_multi_disc = len(disc_numbers) > 1 + for n, track in Printer.progress(enumerate(tracks, start=1), unit_scale=True, unit='Song', total=len(tracks)): # Only pass dynamic numbering and album_id (useful for custom templates using {album_id}). download_track( 'album', track[ID], - extra_keys={'album_num': str(n).zfill(2), 'album_id': album}, + extra_keys={ + 'album_num': str(n).zfill(2), + 'album_id': album, + # Used by download_track() to decide whether to insert a Disc folder. + 'album_multi_disc': '1' if album_multi_disc else '0', + }, disable_progressbar=True ) diff --git a/zotify/config.py b/zotify/config.py index a5f3798..4fcc58e 100644 --- a/zotify/config.py +++ b/zotify/config.py @@ -50,7 +50,7 @@ CONFIG_VALUES = { SONG_ARCHIVE: { 'default': '', 'type': str, 'arg': '--song-archive' }, ROOT_PATH: { 'default': '', 'type': str, 'arg': '--root-path' }, ROOT_PODCAST_PATH: { 'default': '', 'type': str, 'arg': '--root-podcast-path' }, - SPLIT_ALBUM_DISCS: { 'default': 'False', 'type': bool, 'arg': '--split-album-discs' }, + SPLIT_ALBUM_DISCS: { 'default': 'True', 'type': bool, 'arg': '--split-album-discs' }, DOWNLOAD_LYRICS: { 'default': 'False', 'type': bool, 'arg': '--download-lyrics' }, LYRICS_LOCATION: { 'default': '', 'type': str, 'arg': '--lyrics-location' }, LYRICS_FILENAME: { 'default': '{artist}_{song_name}', 'type': str, 'arg': '--lyrics-filename' }, @@ -338,10 +338,6 @@ class Config: else: raise ValueError() - if cls.get_split_album_discs() and mode == 'album': - base = PurePath(v) - return str(base.parent / 'Disc {disc_number}' / base.name) - return v @classmethod diff --git a/zotify/track.py b/zotify/track.py index 1283f50..1e80afc 100644 --- a/zotify/track.py +++ b/zotify/track.py @@ -274,6 +274,24 @@ def download_track(mode: str, track_id: str, extra_keys=None, disable_progressba output_template = output_template.replace("{track_id}", fix_filename(track_id)) output_template = output_template.replace("{ext}", ext) + # SPLIT_ALBUM_DISCS should only create a Disc folder when the album truly has multiple discs. + # - When downloading via zotify.album.download_album(), we pass extra_keys['album_multi_disc']. + # - As a fallback, any track with disc_number > 1 implies multi-disc. + if mode == 'album' and Zotify.CONFIG.get_split_album_discs(): + flag_raw = extra_keys.get('album_multi_disc') + flag = str(flag_raw).strip().lower() in ('1', 'true', 'yes') + try: + disc_number_int = int(disc_number) + except Exception: + disc_number_int = 1 + + should_create_disc_dir = flag or disc_number_int > 1 + if should_create_disc_dir: + tpl_path = PurePath(output_template) + disc_dir_name = f"Disc {disc_number_int}" + if disc_dir_name not in tpl_path.parts: + output_template = str(tpl_path.parent / disc_dir_name / tpl_path.name) + filename = PurePath(Zotify.CONFIG.get_root_path()).joinpath(output_template) filedir = PurePath(filename).parent