Giter Site home page Giter Site logo

exislow / tidal-dl-ng Goto Github PK

View Code? Open in Web Editor NEW
102.0 6.0 5.0 2.08 MB

TIDAL Media Downloader Next Generation! Up to HiRes Lossless / TIDAL MAX 24-bit, 192 kHz.

License: GNU Affero General Public License v3.0

Makefile 1.94% Python 98.06%
audio downloader music python tidal

tidal-dl-ng's People

Contributors

exislow avatar typingbeaver avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

tidal-dl-ng's Issues

Error while Downloading Track: track.album issues

Let us check, if you are already logged in... Yep, looks good! You are logged in.
╭─────────────────────────────────── Download Progress ───────────────────────────────────╮
│                                                                                         │
│                                                                                         │
│  Item 'The Score, Travis Barker - All'   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100%  │
│                                                                                         │
│                                                                                         │
╰─────────────────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/cli.py:176 in download      │
│                                                                                                  │
│   173 │   │   with Live(progress_table, refresh_per_second=10):                                  │
│   174 │   │   │   # Download media.                                                              │
│   175 │   │   │   if media_type in [MediaType.TRACK, MediaType.VIDEO]:                           │
│ ❱ 176 │   │   │   │   dl.item(                                                                   │
│   177 │   │   │   │   │   media_id=item_id,                                                      │
│   178 │   │   │   │   │   media_type=media_type,                                                 │
│   179 │   │   │   │   │   file_template=file_template,                                           │
│                                                                                                  │
│ ╭─────────────────────────────────────── locals ───────────────────────────────────────╮         │
│ │            ctx = <click.core.Context object at 0x7251e7cfa890>                       │         │
│ │             dl = <tidal_dl_ng.download.Download object at 0x7251e7d0d050>            │         │
│ │  file_template = 'Tracks/{artist_name} - {track_title}'                              │         │
│ │      fn_logger = <tidal_dl_ng.helper.wrapper.LoggerWrapped object at 0x7251e7d0e550> │         │
│ │           item = 'https://tidal.com/browse/track/152668960'                          │         │
│ │        item_id = '152668960'                                                         │         │
│ │      list_urls = None                                                                │         │
│ │     media_type = <MediaType.TRACK: 'track'>                                          │         │
│ │       progress = <rich.progress.Progress object at 0x7251e7d3b0d0>                   │         │
│ │ progress_table = <rich.table.Table object at 0x7251e7d0e350>                         │         │
│ │       settings = <tidal_dl_ng.config.Settings object at 0x7251e7a0b150>              │         │
│ │           urls = ['https://tidal.com/browse/track/152668960']                        │         │
│ ╰──────────────────────────────────────────────────────────────────────────────────────╯         │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:231 in item     │
│                                                                                                  │
│   228 │   │   │   with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmp_path_dir   │
│   229 │   │   │   │   tmp_path_file = os.path.join(tmp_path_dir, str(uuid4()) + stream_manifes   │
│   230 │   │   │   │   # Download media.                                                          │
│ ❱ 231 │   │   │   │   tmp_path_file = self._download(media=media, stream_manifest=stream_manif   │
│   232 │   │   │   │                                                                              │
│   233 │   │   │   │   if isinstance(media, Video) and self.settings.data.video_convert_mp4:      │
│   234 │   │   │   │   │   # Convert `*.ts` file to `*.mp4` using ffmpeg                          │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │      download_skip = False                                                                   │ │
│ │ file_name_relative = 'Tracks/The Score, Travis Barker - All Of Me'                           │ │
│ │      file_template = 'Tracks/{artist_name} - {track_title}'                                  │ │
│ │           manifest = 'PD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz48TVBEIHhtbG5zPSJ1c… │ │
│ │              media = <tidalapi.media.Track object at 0x7251e7a20a10>                         │ │
│ │           media_id = '152668960'                                                             │ │
│ │         media_type = <MediaType.TRACK: 'track'>                                              │ │
│ │          mime_type = 'application/dash+xml'                                                  │ │
│ │          path_file = '/home/olivia/Downloads/Tracks/The Score, Travis Barker - All Of        │ │
│ │                      Me.m4a'                                                                 │ │
│ │               self = <tidal_dl_ng.download.Download object at 0x7251e7d0d050>                │ │
│ │             stream = <tidalapi.media.Stream object at 0x7251e7cfaf90>                        │ │
│ │    stream_manifest = StreamManifest(                                                         │ │
│ │                      │   codecs='mp4a.40.2',                                                 │ │
│ │                      │   mime_type='audio/mp4',                                              │ │
│ │                      │   urls=[                                                              │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │                                                                   │ │
│ │                      'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGVjYzQw… │ │
│ │                      │   │   ... +32                                                         │ │
│ │                      │   ],                                                                  │ │
│ │                      │   file_extension='.m4a',                                              │ │
│ │                      │   encryption_type='NONE',                                             │ │
│ │                      │   encryption_key=None                                                 │ │
│ │                      )                                                                       │ │
│ │       tmp_path_dir = '/tmp/tmpgf0l28gy'                                                      │ │
│ │      tmp_path_file = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a'             │ │
│ │     video_download = True                                                                    │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:152 in          │
│ _download                                                                                        │
│                                                                                                  │
│   149 │   │                                                                                      │
│   150 │   │   # Write metadata to file.                                                          │
│   151 │   │   if not isinstance(media, Video):                                                   │
│ ❱ 152 │   │   │   self.metadata_write(media, tmp_path_file_decrypted)                            │
│   153 │   │                                                                                      │
│   154 │   │   return tmp_path_file_decrypted                                                     │
│   155                                                                                            │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │              block_size = None                                                               │ │
│ │                    data = b'\x00\x00\x05\x94moof\x00\x00\x00\x10mfhd\x00\x00\x00\x00\x00\x0… │ │
│ │                       f = <_io.BufferedWriter                                                │ │
│ │                           name='/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a'>  │ │
│ │                   media = <tidalapi.media.Track object at 0x7251e7a20a10>                    │ │
│ │              media_name = 'The Score, Travis Barker - All Of Me'                             │ │
│ │        needs_decryption = False                                                              │ │
│ │                  p_task = 0                                                                  │ │
│ │               path_file = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a'        │ │
│ │         progress_stdout = True                                                               │ │
│ │          progress_total = 42                                                                 │ │
│ │                       r = <Response [200]>                                                   │ │
│ │                    self = <tidal_dl_ng.download.Download object at 0x7251e7d0d050>           │ │
│ │         stream_manifest = StreamManifest(                                                    │ │
│ │                           │   codecs='mp4a.40.2',                                            │ │
│ │                           │   mime_type='audio/mp4',                                         │ │
│ │                           │   urls=[                                                         │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │                           │   │   ... +32                                                    │ │
│ │                           │   ],                                                             │ │
│ │                           │   file_extension='.m4a',                                         │ │
│ │                           │   encryption_type='NONE',                                        │ │
│ │                           │   encryption_key=None                                            │ │
│ │                           )                                                                  │ │
│ │ tmp_path_file_decrypted = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a'        │ │
│ │                     url = 'https://sp-ad-fa.audio.tidal.com/mediatracks/GikSJzk1M2FhMmVkNGV… │ │
│ │              urls_count = 42                                                                 │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/download.py:289 in          │
│ metadata_write                                                                                   │
│                                                                                                  │
│   286 │   │   │   ),                                                                             │
│   287 │   │   )                                                                                  │
│   288 │   │                                                                                      │
│ ❱ 289 │   │   m.save()                                                                           │
│   290 │   │                                                                                      │
│   291 │   │   result = True                                                                      │
│   292                                                                                            │
│                                                                                                  │
│ ╭─────────────────────────────────── locals ───────────────────────────────────╮                 │
│ │   copy_right = '℗ 2020 Republic Records, a division of UMG Recordings, Inc.' │                 │
│ │         isrc = 'USUM72014229'                                                │                 │
│ │       lyrics = ''                                                            │                 │
│ │            m = <tidal_dl_ng.metadata.Metadata object at 0x7251e7a629d0>      │                 │
│ │    path_file = '/tmp/tmpgf0l28gy/969e9323-1895-4308-96db-4641d6c72479.m4a'   │                 │
│ │ release_date = ''                                                            │                 │
│ │       result = False                                                         │                 │
│ │         self = <tidal_dl_ng.download.Download object at 0x7251e7d0d050>      │                 │
│ │        track = <tidalapi.media.Track object at 0x7251e7a20a10>               │                 │
│ ╰──────────────────────────────────────────────────────────────────────────────╯                 │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/metadata.py:97 in save      │
│                                                                                                  │
│    94 │   │   elif isinstance(self.m, mutagen.mp3.MP3):                                          │
│    95 │   │   │   self.set_mp3()                                                                 │
│    96 │   │   elif isinstance(self.m, mutagen.mp4.MP4):                                          │
│ ❱  97 │   │   │   self.set_mp4()                                                                 │
│    98 │   │                                                                                      │
│    99 │   │   self._cover()                                                                      │
│   100 │   │   self.m.save()                                                                      │
│                                                                                                  │
│ ╭──────────────────────────── locals ─────────────────────────────╮                              │
│ │ self = <tidal_dl_ng.metadata.Metadata object at 0x7251e7a629d0> │                              │
│ ╰─────────────────────────────────────────────────────────────────╯                              │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/tidal_dl_ng/metadata.py:134 in set_mp4  │
│                                                                                                  │
│   131 │                                                                                          │
│   132 │   def set_mp4(self):                                                                     │
│   133 │   │   self.m.tags["\xa9nam"] = self.title                                                │
│ ❱ 134 │   │   self.m.tags["\xa9alb"] = self.album                                                │
│   135 │   │   self.m.tags["aART"] = self.albumartist                                             │
│   136 │   │   self.m.tags["\xa9ART"] = ", ".join(self.artists) if self.artists else ""           │
│   137 │   │   self.m.tags["cprt"] = self.copy_right                                              │
│                                                                                                  │
│ ╭──────────────────────────── locals ─────────────────────────────╮                              │
│ │ self = <tidal_dl_ng.metadata.Metadata object at 0x7251e7a629d0> │                              │
│ ╰─────────────────────────────────────────────────────────────────╯                              │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/mutagen/mp4/__init__.py:372 in          │
│ __setitem__                                                                                      │
│                                                                                                  │
│    369 │   def __setitem__(self, key, value):                                                    │
│    370 │   │   if not isinstance(key, str):                                                      │
│    371 │   │   │   raise TypeError("key has to be str")                                          │
│ ❱  372 │   │   self._render(key, value)                                                          │
│    373 │   │   super(MP4Tags, self).__setitem__(key, value)                                      │
│    374 │                                                                                         │
│    375 │   @classmethod                                                                          │
│                                                                                                  │
│ ╭─────────── locals ────────────╮                                                                │
│ │   key = '©alb'                │                                                                │
│ │  self = {'©nam': 'All Of Me'} │                                                                │
│ │ value = None                  │                                                                │
│ ╰───────────────────────────────╯                                                                │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/mutagen/mp4/__init__.py:388 in _render  │
│                                                                                                  │
│    385 │   │   │   render_func = type(self).__render_text                                        │
│    386 │   │   │   render_args = []                                                              │
│    387 │   │                                                                                     │
│ ❱  388 │   │   return render_func(self, key, value, *render_args)                                │
│    389 │                                                                                         │
│    390 │   @convert_error(IOError, error)                                                        │
│    391 │   @loadfile(writable=True)                                                              │
│                                                                                                  │
│ ╭───────────────────────────── locals ─────────────────────────────╮                             │
│ │   atom_name = b'\xa9alb'                                         │                             │
│ │         key = '©alb'                                             │                             │
│ │ render_args = ()                                                 │                             │
│ │ render_func = <function MP4Tags.__render_text at 0x7251e7a01260> │                             │
│ │        self = {'©nam': 'All Of Me'}                              │                             │
│ │       value = None                                               │                             │
│ ╰──────────────────────────────────────────────────────────────────╯                             │
│                                                                                                  │
│ /home/olivia/tidal-dl/.venv/lib/python3.11/site-packages/mutagen/mp4/__init__.py:822 in          │
│ __render_text                                                                                    │
│                                                                                                  │
│    819 │   │   │   value = [value]                                                               │
│    820 │   │                                                                                     │
│    821 │   │   encoded = []                                                                      │
│ ❱  822 │   │   for v in value:                                                                   │
│    823 │   │   │   if not isinstance(v, str):                                                    │
│    824 │   │   │   │   raise TypeError("%r not str" % v)                                         │
│    825                                                                                           │
│                                                                                                  │
│ ╭───────────── locals ─────────────╮                                                             │
│ │ encoded = []                     │                                                             │
│ │   flags = <AtomDataType.UTF8: 1> │                                                             │
│ │     key = '©alb'                 │                                                             │
│ │    self = {'©nam': 'All Of Me'}  │                                                             │
│ │   value = None                   │                                                             │
│ ╰──────────────────────────────────╯                                                             │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: 'NoneType' object is not iterable```

command run "tidal-dl-ng dl https://tidal.com/browse/track/152668960" 

steps to reproduce: make a python venv and install tidal-dl-ng 
set up config as necessary
try to download a track 

[Feedback] Possibility to use direct links to albums/playlists/tracks

Hello, thank you very much for your effort! It's nice to be able to download Hi-Res tracks!

Would it be possible in a future version to be able to use direct links to albums/playlists/tracks? Example (album): https://tidal.com/browse/album/74414448

We can get these links when we use the "Share" function in Tidal.

Edit: I'm not sure if there is a CLI version, I was referring to the GUI version. If I put the link in the search box and press Enter, it just searches on Tidal:
image

Edit 2 - I also found a CLI version, which is nice. There are some more things that would be nice to have in the GUI:

  • Possibility to cancel the current download
  • Maybe the possibility to queue multiple downloads of tracks/albums/etc. (and having a list where we can see what's in the queue, and the possibility to cancel some of the downloads that are placed in the queue).
  • Some info about all the "elements" we can use in the settings for paths/names (ex. {artist_name} ).

Only downloads upto 48000khz (which i think is mqa). HiRes Lossless (TIDAL MAX) not working.

Hello,

While trying to download 24bit/192khz songs from Tidal it seems like Tidal-dl new gen can only download up to 48khz I think it is MQA (same with Yaronzz's tidal-dl)

Here you can see the track is 24/192
image

after I've downloaded it using your GUI
image

I put it into foobar2000
image

and it shows up as being 48000hz

It would be cool if you could fix up Tidal-dl new gen and support the downloading of Tidal hi-res lossless and not being directed to mqa instead.

If this is a user issue please let me know how to fix it, it'll be greatly appreciated.

How to know what can I set in config

Noob question I guess but I dont know to what can I change quality audio in config on not gui version. It's HIGH now but what else can it be? Info is either not accessible or I dont know how to see it.

M4A

I read it, but I don’t understand why they are asking you to make a FLAC, but you don’t want to and claim that m4a is good. So difficult to save in a FLAC format compatible with many devices? Or just write - I can’t do it any other way, only m4a.

List (Album, Playlist, Mix etc.) item view within the GUI.

If I search, for instance, for playlists I would like to see what their content is within the GUI. It would be great, if the result view in the right half of the GUI could have something like a + button, which would expand the list and show me the items, so I can download only selected items.

Tidal-dl-ng some bugs

I have tested the new ui version, my operating system is windows 10.

and I found these bugs:

  • initially when i put the parameters in hi_res_lossles the program closes suddenly. i have started it again and i have put the value in hi_res and everything went correctly. Although it is not 24B, that is another matter.

  • the album comes out without the album name, instead it says {title}.

  • the file options button doesn't work, I haven't got it to do anything.

I will continue to report any errors I find. thanks for your work.

Error trying to start program.

Getting the below error as are others here starting the program:

Failed to execute script 'gui' due to unhandled exception: cannot access local variable 'settings_json' where it is not associated with a value.

Traceback (most recent call last):
File "tidal_dl_ng\gui.py", line 535, in
File "tidal_dl_ng\gui.py", line 528, in gui_activate
File "tidal_dl_ng\gui.py", line 64, in init
File "tidal_dl_ng\helper\decorator.py", line 19, in call
File "tidal_dl_ng\config.py", line 77, in init
File "tidal_dl_ng\config.py", line 66, in read
UnboundLocalError: cannot access local variable 'settings_json' where it is not associated with a value

Using windows 10 pro 64

401 Client Error

I was downloading from an old playlist, when it ran into a song that has been removed from Tidal, but is still in the playlist itself. It hits this 401 error and stops everything. I think the appropriate action would be to say that the track isn't available and move on to the next song.

Response was <Response [401]>
Response json was {'status': 401, 'subStatus': 4005, 'userMessage': 'Asset is not ready for playback'}

FLAC

Is it possible to add Hi-res FLAC support ? it is downloading in m4a/ALAC though......

Support for artist download

Heya .... currently there is no support for artist download of all singles and albums? Is this something that can be integrated?

Windows client download paths

At the moment it seems unable to change download path for windows client (for tracks)- you can write all you want in download path it stays default.

Regarding video download - so far cant find downloaded files at all, although download process seems to have place. Windows searching gave up on finding these files :)

TAGS

Tag year Is missing on final file. Is posible implement this one?

[REQUEST] Song Organization

Please allow for every media type (playlist, album, track, etc.) to be able to use the same asset tag. Currently downloading individual tracks won't load the "{album_title}". I would like all the songs regardles of asset tag to be downloaded in the same folder structure

{artist_name}/{album_title}/song.extention

This helps keeps things organized

[Help]

I need Help.

It's A safe or not safe?

[CLI] cannot download any tracks at high or hi_res quality.

When attemtping to download tracks using CLI in either high or hi_res quality, the following error occurs.

tidal-dl-ng dl https://listen.tidal.com/mix/0161bc50700b85c9c9d68d4da0147d
Let us check, if you are already logged in... Yep, looks good! You are logged in.
╭───────────────────────────── Download Progress ─────────────────────────────╮
│                                                                             │
│                                                                             │
│  List 'My Daily Discovery' ⠋ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   0%  │
│  Item 'Paint The Town Red'   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100%  │
│                                                                             │
│                                                                             │
╰─────────────────────────────────────────────────────────────────────────────╯
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/cli.py:192 in download                       │
│                                                                                                  │
│   189 │   │   │   │   │   file_template = settings.data.format_mix                               │
│   190 │   │   │   │   │   media_type = MediaType.Mix                                             │
│   191 │   │   │   │                                                                              │
│ ❱ 192 │   │   │   │   dl.list(                                                                   │
│   193 │   │   │   │   │   id_media=id_item,                                                      │
│   194 │   │   │   │   │   media_type=media_type,                                                 │
│   195 │   │   │   │   │   path_base=settings.data.download_base_path,                            │
│                                                                                                  │
│ ╭───────────────────────────────────── locals ──────────────────────────────────────╮            │
│ │            ctx = <click.core.Context object at 0x112a45a50>                       │            │
│ │             dl = <tidal_dl_ng.download.Download object at 0x112a86cd0>            │            │
│ │  file_template = 'Mix/{mix_name}/{artist_name} - {track_title}'                   │            │
│ │      fn_logger = <tidal_dl_ng.helper.wrapper.WrapperLogger object at 0x112b0e310> │            │
│ │        id_item = '0161bc50700b85c9c9d68d4da0147d'                                 │            │
│ │           item = 'https://listen.tidal.com/mix/0161bc50700b85c9c9d68d4da0147d'    │            │
│ │      list_urls = None                                                             │            │
│ │     media_name = 'mix'                                                            │            │
│ │     media_type = <MediaType.Mix: 'mix'>                                           │            │
│ │       progress = <rich.progress.Progress object at 0x112a86e90>                   │            │
│ │ progress_table = <rich.table.Table object at 0x112b0e290>                         │            │
│ │       settings = <tidal_dl_ng.config.Settings object at 0x112a460d0>              │            │
│ │    urls_or_ids = ['https://listen.tidal.com/mix/0161bc50700b85c9c9d68d4da0147d']  │            │
│ ╰───────────────────────────────────────────────────────────────────────────────────╯            │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/download.py:285 in list                      │
│                                                                                                  │
│   282 │   │   │   for media in items:                                                            │
│   283 │   │   │   │   Progress()                                                                 │
│   284 │   │   │   │   # TODO: Handle return value of `track` method.                             │
│ ❱ 285 │   │   │   │   self.item(                                                                 │
│   286 │   │   │   │   │   path_base=path_file,                                                   │
│   287 │   │   │   │   │   file_template=file_name_relative,                                      │
│   288 │   │   │   │   │   media=media,                                                           │
│                                                                                                  │
│ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮        │
│ │     download_delay = True                                                             │        │
│ │ file_name_relative = 'Mix/My Daily Discovery/{artist_name} - {track_title}'           │        │
│ │      file_template = 'Mix/{mix_name}/{artist_name} - {track_title}'                   │        │
│ │          fn_logger = <tidal_dl_ng.helper.wrapper.WrapperLogger object at 0x112b0e310> │        │
│ │           id_media = '0161bc50700b85c9c9d68d4da0147d'                                 │        │
│ │              items = [                                                                │        │
│ │                      │   <tidalapi.media.Track object at 0x112a47f90>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112a6d2d0>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b24190>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b27990>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b247d0>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b47e10>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b50110>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b504d0>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b50650>,                │        │
│ │                      │   <tidalapi.media.Track object at 0x112b507d0>                 │        │
│ │                      ]                                                                │        │
│ │         list_media = <tidalapi.mix.Mix object at 0x112b0e590>                         │        │
│ │    list_media_name = 'My Daily Discovery'                                             │        │
│ │              media = <tidalapi.media.Track object at 0x112a47f90>                     │        │
│ │         media_type = <MediaType.Mix: 'mix'>                                           │        │
│ │            p_task1 = 0                                                                │        │
│ │          path_base = './download/'                                                    │        │
│ │          path_file = './download/'                                                    │        │
│ │           progress = <rich.progress.Progress object at 0x112a86e90>                   │        │
│ │       progress_gui = None                                                             │        │
│ │    progress_stdout = True                                                             │        │
│ │               self = <tidal_dl_ng.download.Download object at 0x112a86cd0>            │        │
│ │     video_download = True                                                             │        │
│ ╰───────────────────────────────────────────────────────────────────────────────────────╯        │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/download.py:167 in item                      │
│                                                                                                  │
│   164 │   │   │   │   │   else:                                                                  │
│   165 │   │   │   │   │   │   tmp_path_file_decrypted = tmp_path_file                            │
│   166 │   │   │   │   │                                                                          │
│ ❱ 167 │   │   │   │   │   self.metadata_write(media, tmp_path_file_decrypted)                    │
│   168 │   │   │   │   elif isinstance(media, Video):                                             │
│   169 │   │   │   │   │   tmp_path_file_decrypted = self._video(media, tmp_path_file)            │
│   170                                                                                            │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │              block_size = 4096                                                               │ │
│ │                    data = b'P*\x012@\xc9@)QBf\xe4\xc2$<0\x84\x94\x0f&J\x05\xa0d\xf8I\x92I\x… │ │
│ │           download_skip = False                                                              │ │
│ │                       f = <_io.BufferedWriter                                                │ │
│ │                           name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x… │ │
│ │          file_extension = '.flac'                                                            │ │
│ │      file_name_relative = 'Mix/My Daily Discovery/Doja Cat - Paint The Town Red'             │ │
│ │           file_template = 'Mix/My Daily Discovery/{artist_name} - {track_title}'             │ │
│ │               fn_logger = <tidal_dl_ng.helper.wrapper.WrapperLogger object at 0x112b0e310>   │ │
│ │                      id = None                                                               │ │
│ │                   media = <tidalapi.media.Track object at 0x112a47f90>                       │ │
│ │              media_type = None                                                               │ │
│ │        needs_decryption = False                                                              │ │
│ │                  p_task = 1                                                                  │ │
│ │               path_base = './download/'                                                      │ │
│ │               path_file = '/Users/will/Code/personal-auto-radio-main/download/Mix/My Daily   │ │
│ │                           Discovery/Doja C'+28                                               │ │
│ │                progress = <rich.progress.Progress object at 0x112a86e90>                     │ │
│ │            progress_gui = None                                                               │ │
│ │         progress_stdout = True                                                               │ │
│ │                       r = <Response [200]>                                                   │ │
│ │                    self = <tidal_dl_ng.download.Download object at 0x112a86cd0>              │ │
│ │                  stream = <tidalapi.media.Stream object at 0x112ae2990>                      │ │
│ │         stream_manifest = {                                                                  │ │
│ │                           │   'mimeType': 'audio/flac',                                      │ │
│ │                           │   'codecs': 'flac',                                              │ │
│ │                           │   'encryptionType': 'NONE',                                      │ │
│ │                           │   'urls': [                                                      │ │
│ │                           │   │                                                              │ │
│ │                           'https://sp-pr-cf.audio.tidal.com/mediatracks/CAEaKRInZmEzZWFiMmE… │ │
│ │                           │   ]                                                              │ │
│ │                           }                                                                  │ │
│ │              stream_url = 'https://sp-pr-cf.audio.tidal.com/mediatracks/CAEaKRInZmEzZWFiMmE… │ │
│ │            tmp_path_dir = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_'     │ │
│ │           tmp_path_file = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/932… │ │
│ │ tmp_path_file_decrypted = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/932… │ │
│ │     total_size_in_bytes = 25605975                                                           │ │
│ │       validation_result = False                                                              │ │
│ │          video_download = True                                                               │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/download.py:227 in metadata_write            │
│                                                                                                  │
│   224 │   │   │   url_cover=self.cover_url(track.album.cover),                                   │
│   225 │   │   )                                                                                  │
│   226 │   │                                                                                      │
│ ❱ 227 │   │   m.save()                                                                           │
│   228 │   │                                                                                      │
│   229 │   │   result = True                                                                      │
│   230                                                                                            │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │   copy_right = ''                                                                            │ │
│ │       lyrics = 'By\nWalk on by\nWalk on by\nWalk on by\nWalk on by\n\nYeah, bitch, I said    │ │
│ │                what I said\n'+3299                                                           │ │
│ │            m = <tidal_dl_ng.metadata.Metadata object at 0x112b61090>                         │ │
│ │    path_file = '/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8-727b-… │ │
│ │ release_date = '2023-08-04'                                                                  │ │
│ │       result = False                                                                         │ │
│ │         self = <tidal_dl_ng.download.Download object at 0x112a86cd0>                         │ │
│ │        track = <tidalapi.media.Track object at 0x112a47f90>                                  │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/tidal_dl_ng/metadata.py:114 in save                      │
│                                                                                                  │
│   111 │   │   │   self.set_mp4()                                                                 │
│   112 │   │                                                                                      │
│   113 │   │   self._cover()                                                                      │
│ ❱ 114 │   │   self.m.save()                                                                      │
│   115 │   │                                                                                      │
│   116 │   │   return True                                                                        │
│   117                                                                                            │
│                                                                                                  │
│ ╭─────────────────────────── locals ───────────────────────────╮                                 │
│ │ self = <tidal_dl_ng.metadata.Metadata object at 0x112b61090> │                                 │
│ ╰──────────────────────────────────────────────────────────────╯                                 │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/_util.py:185 in wrapper                          │
│                                                                                                  │
│    182 │   │   @wraps(func)                                                                      │
│    183 │   │   def wrapper(*args, **kwargs):                                                     │
│    184 │   │   │   try:                                                                          │
│ ❱  185 │   │   │   │   return func(*args, **kwargs)                                              │
│    186 │   │   │   except exc_dest:                                                              │
│    187 │   │   │   │   raise                                                                     │
│    188 │   │   │   except exc_src as err:                                                        │
│                                                                                                  │

│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/_util.py:156 in wrapper                          │
│                                                                                                  │
│    153 │   │   │   │   convert_file_args(args, kwargs)                                           │
│    154 │   │   │   with _openfile(self, filething, filename, fileobj,                            │
│    155 │   │   │   │   │   │      writable, create) as h:                                        │
│ ❱  156 │   │   │   │   return func(self, h, *args, **kwargs)                                     │
│    157 │   │                                                                                     │
│    158 │   │   @wraps(func)                                                                      │
│    159 │   │   def wrapper_func(*args, **kwargs):                                                │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │              args = ()                                                                       │ │
│ │ convert_file_args = <function loadfile.<locals>.convert_file_args at 0x111e75440>            │ │
│ │            create = False                                                                    │ │
│ │          filename = None                                                                     │ │
│ │           fileobj = None                                                                     │ │
│ │         filething = None                                                                     │ │
│ │              func = <function FLAC.save at 0x111e75580>                                      │ │
│ │                 h = FileThing(                                                               │ │
│ │                     │   fileobj=<_io.BufferedRandom                                          │ │
│ │                     name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327… │ │
│ │                     │                                                                        │ │
│ │                     filename='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/… │ │
│ │                     │                                                                        │ │
│ │                     name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327… │ │
│ │                     )                                                                        │ │
│ │            kwargs = {}                                                                       │ │
│ │              self = {'album': ['Paint The Town Red'], 'artist': ['Doja Cat'], 'disctotal':   │ │
│ │                     ['1'], 'albumartist': ['Doja Cat'], 'title': ['Paint The Town Red'],     │ │
│ │                     'date': ['2023-08-04'], 'composer': [''], 'tracktotal': ['1'],           │ │
│ │                     'copyright': [''], 'tracknumber': ['1'], 'isrc': [None], 'lyrics':       │ │
│ │                     ["By\nWalk on by\nWalk on by\nWalk on by\nWalk on by\n\nYeah, bitch, I   │ │
│ │                     said what I said\nI'd rather be famous instead (walk on by)\nI let all   │ │
│ │                     that get to my head\nI don't care, I paint the town red (walk on         │ │
│ │                     by)\nBitch, I said what I said\nI'd rather be famous instead (walk on    │ │
│ │                     by)\nI let all that get to my head\nI don't care, I paint the town red   │ │
│ │                     (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she a rebel     │ │
│ │                     (walk on by)\nShe put her foot to the pedal\nIt'll take a whole lot for  │ │
│ │                     me to settle (walk on by)\nMm, she the devil\nShe a bad lil' bitch, she  │ │
│ │                     a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take a whole  │ │
│ │                     lot for me (yeah) to settle (walk on by)\n\nYeah, said my happiness is   │ │
│ │                     all of your misery\nI put good dick all in my kidneys (walk on by)\nThis │ │
│ │                     Margiel' don't come with no jealousy\nMy illness don't come with no      │ │
│ │                     remedy (walk on by)\nI am so much fun without Hennessy\nThey just want   │ │
│ │                     my love and my energy (walk on by)\nYou can't talk no shit without       │ │
│ │                     penalties\nBitch, I'm in yo' shit if you send for me (walk on by)\n\nI'm │ │
│ │                     going to glow up one more time\nTrust me, I have magical foresight (walk │ │
│ │                     on by)\nYou gon' see me sleepin' in courtside\nYou gon' see me eatin'    │ │
│ │                     ten more times (walk on by)\nUgh, you can't take that bitch              │ │
│ │                     nowhere\nUgh, I look better with no hair (walk on by)\nUgh, ain't no     │ │
│ │                     sign I can't smoke here\nUgh (yeah), gimme the chance and I'll go there  │ │
│ │                     (walk on by)\n\nYeah, bitch, I said what I said\nI'd rather be famous    │ │
│ │                     instead (walk on by)\nI let all that get to my head\nI don't care, I     │ │
│ │                     paint the town red (walk on by)\nBitch, I said what I said\nI'd rather   │ │
│ │                     be famous instead (walk on by)\nI let all that get to my head\nI don't   │ │
│ │                     care, I paint the town red (walk on by)\n\nMm, she the devil\nShe a bad  │ │
│ │                     lil' bitch, she a rebel (walk on by)\nShe put her foot to the            │ │
│ │                     pedal\nIt'll take a whole lot for me to settle (walk on by)\nMm, she the │ │
│ │                     devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her foot  │ │
│ │                     to the pedal\nIt'll take a whole lot (yeah) for me to settle (walk on    │ │
│ │                     by)\n\nYeah, said pop make money, now you try, bitch\nYou could use a    │ │
│ │                     revamp with a new vibe, sis (walk on by)\nI don't need a big feature or  │ │
│ │                     a new sidekick\nI don't need a new fan 'cause my boo like it (walk on    │ │
│ │                     by)\nI don't need to wear a wig to make you like it\nI'm a two-time      │ │
│ │                     bitch, you ain't knew I'd win? (Walk on by)\nThrow a shot like you tryna │ │
│ │                     have a food fight then\nAll my opps waitin' for me to be you, I bet      │ │
│ │                     (walk on by)\n\nSaid I got drive, I don't need a car\nMoney really all   │ │
│ │                     that we fiendin' for (walk on by)\nI'm doin' things they ain't seen      │ │
│ │                     before\nFans ain't dumb, but extremists are (walk on by)\nI'm a demon    │ │
│ │                     lord\nFall off what? I ain't seen the horse (walk on by)\nCalled your    │ │
│ │                     bluff, better cite the source\nFame ain't somethin' that I need no more  │ │
│ │                     (walk on by)\n\n'Cause, bitch, I said what I said\nI'd rather be famous  │ │
│ │                     instead (walk on by)\nI let all that get to my head\nI don't care, I     │ │
│ │                     paint the town red (walk on by)\nBitch, I said what I said\nI'd rather   │ │
│ │                     be famous instead (walk on by)\nI let all that get to my head\nI don't   │ │
│ │                     care, I paint the town red (walk on by)\n\nMm, she the devil\nShe a bad  │ │
│ │                     lil' bitch, she a rebel (walk on by)\nShe put her foot to the            │ │
│ │                     pedal\nIt'll take a whole lot for me to settle (walk on by)\nMm, she the │ │
│ │                     devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her foot  │ │
│ │                     to the pedal\nIt'll take a whole lot for me to settle (walk on           │ │
│ │                     by)\n\nWalk on by\nWalk on by\nWalk on by\nWalk on by"], 'discnumber':   │ │
│ │                     ['1']}                                                                   │ │
│ │          writable = True                                                                     │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:859 in save                              │
│                                                                                                  │
│   856 │   │   │   │   raise ValueError("Invalid seektable object type!")                         │
│   857 │   │   │   self.metadata_blocks.append(self.seektable)                                    │
│   858 │   │                                                                                      │
│ ❱ 859 │   │   self._save(filething, self.metadata_blocks, deleteid3, padding)                    │
│   860 │                                                                                          │
│   861 │   def _save(self, filething, metadata_blocks, deleteid3, padding):                       │
│   862 │   │   f = StrictFileObject(filething.fileobj)                                            │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ deleteid3 = False                                                                            │ │
│ │ filething = FileThing(                                                                       │ │
│ │             │   fileobj=<_io.BufferedRandom                                                  │ │
│ │             name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8-727… │ │
│ │             │                                                                                │ │
│ │             filename='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8… │ │
│ │             │                                                                                │ │
│ │             name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cdc8-727… │ │
│ │             )                                                                                │ │
│ │   padding = None                                                                             │ │
│ │      self = {'album': ['Paint The Town Red'], 'artist': ['Doja Cat'], 'disctotal': ['1'],    │ │
│ │             'albumartist': ['Doja Cat'], 'title': ['Paint The Town Red'], 'date':            │ │
│ │             ['2023-08-04'], 'composer': [''], 'tracktotal': ['1'], 'copyright': [''],        │ │
│ │             'tracknumber': ['1'], 'isrc': [None], 'lyrics': ["By\nWalk on by\nWalk on        │ │
│ │             by\nWalk on by\nWalk on by\n\nYeah, bitch, I said what I said\nI'd rather be     │ │
│ │             famous instead (walk on by)\nI let all that get to my head\nI don't care, I      │ │
│ │             paint the town red (walk on by)\nBitch, I said what I said\nI'd rather be famous │ │
│ │             instead (walk on by)\nI let all that get to my head\nI don't care, I paint the   │ │
│ │             town red (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she a rebel    │ │
│ │             (walk on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me to    │ │
│ │             settle (walk on by)\nMm, she the devil\nShe a bad lil' bitch, she a rebel (walk  │ │
│ │             on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me (yeah) to   │ │
│ │             settle (walk on by)\n\nYeah, said my happiness is all of your misery\nI put good │ │
│ │             dick all in my kidneys (walk on by)\nThis Margiel' don't come with no            │ │
│ │             jealousy\nMy illness don't come with no remedy (walk on by)\nI am so much fun    │ │
│ │             without Hennessy\nThey just want my love and my energy (walk on by)\nYou can't   │ │
│ │             talk no shit without penalties\nBitch, I'm in yo' shit if you send for me (walk  │ │
│ │             on by)\n\nI'm going to glow up one more time\nTrust me, I have magical foresight │ │
│ │             (walk on by)\nYou gon' see me sleepin' in courtside\nYou gon' see me eatin' ten  │ │
│ │             more times (walk on by)\nUgh, you can't take that bitch nowhere\nUgh, I look     │ │
│ │             better with no hair (walk on by)\nUgh, ain't no sign I can't smoke here\nUgh     │ │
│ │             (yeah), gimme the chance and I'll go there (walk on by)\n\nYeah, bitch, I said   │ │
│ │             what I said\nI'd rather be famous instead (walk on by)\nI let all that get to my │ │
│ │             head\nI don't care, I paint the town red (walk on by)\nBitch, I said what I      │ │
│ │             said\nI'd rather be famous instead (walk on by)\nI let all that get to my        │ │
│ │             head\nI don't care, I paint the town red (walk on by)\n\nMm, she the devil\nShe  │ │
│ │             a bad lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll │ │
│ │             take a whole lot for me to settle (walk on by)\nMm, she the devil\nShe a bad     │ │
│ │             lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take  │ │
│ │             a whole lot (yeah) for me to settle (walk on by)\n\nYeah, said pop make money,   │ │
│ │             now you try, bitch\nYou could use a revamp with a new vibe, sis (walk on by)\nI  │ │
│ │             don't need a big feature or a new sidekick\nI don't need a new fan 'cause my boo │ │
│ │             like it (walk on by)\nI don't need to wear a wig to make you like it\nI'm a      │ │
│ │             two-time bitch, you ain't knew I'd win? (Walk on by)\nThrow a shot like you      │ │
│ │             tryna have a food fight then\nAll my opps waitin' for me to be you, I bet (walk  │ │
│ │             on by)\n\nSaid I got drive, I don't need a car\nMoney really all that we         │ │
│ │             fiendin' for (walk on by)\nI'm doin' things they ain't seen before\nFans ain't   │ │
│ │             dumb, but extremists are (walk on by)\nI'm a demon lord\nFall off what? I ain't  │ │
│ │             seen the horse (walk on by)\nCalled your bluff, better cite the source\nFame     │ │
│ │             ain't somethin' that I need no more (walk on by)\n\n'Cause, bitch, I said what I │ │
│ │             said\nI'd rather be famous instead (walk on by)\nI let all that get to my        │ │
│ │             head\nI don't care, I paint the town red (walk on by)\nBitch, I said what I      │ │
│ │             said\nI'd rather be famous instead (walk on by)\nI let all that get to my        │ │
│ │             head\nI don't care, I paint the town red (walk on by)\n\nMm, she the devil\nShe  │ │
│ │             a bad lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll │ │
│ │             take a whole lot for me to settle (walk on by)\nMm, she the devil\nShe a bad     │ │
│ │             lil' bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take  │ │
│ │             a whole lot for me to settle (walk on by)\n\nWalk on by\nWalk on by\nWalk on     │ │
│ │             by\nWalk on by"], 'discnumber': ['1']}                                           │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:875 in _save                             │
│                                                                                                  │
│   872 │   │                                                                                      │
│   873 │   │   content_size = get_size(f) - audio_offset                                          │
│   874 │   │   assert content_size >= 0                                                           │
│ ❱ 875 │   │   data = MetadataBlock._writeblocks(                                                 │
│   876 │   │   │   metadata_blocks, available, content_size, padding)                             │
│   877 │   │   data_size = len(data)                                                              │
│   878                                                                                            │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │    audio_offset = 478                                                                        │ │
│ │       available = 474                                                                        │ │
│ │    content_size = 25605497                                                                   │ │
│ │       deleteid3 = False                                                                      │ │
│ │               f = <mutagen.flac.StrictFileObject object at 0x112b64750>                      │ │
│ │       filething = FileThing(                                                                 │ │
│ │                   │   fileobj=<_io.BufferedRandom                                            │ │
│ │                   name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cd… │ │
│ │                   │                                                                          │ │
│ │                   filename='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/93… │ │
│ │                   │                                                                          │ │
│ │                   name='/var/folders/t6/zwqptyxx6k1ggnvyf4fjvf7h0000gn/T/tmp_wxo00x_/9327cd… │ │
│ │                   )                                                                          │ │
│ │          header = 4                                                                          │ │
│ │ metadata_blocks = [                                                                          │ │
│ │                   │   <mutagen.flac.StreamInfo object at 0x112b74110>,                       │ │
│ │                   │   <SeekTable seekpoints=[(0, 0, 4096), (442368, 682783, 4096), (884736,  │ │
│ │                   1448766, 4096), (1327104, 2566497, 4096), (1769472, 3743395, 4096),        │ │
│ │                   (2211840, 5029764, 4096), (2654208, 6301888, 4096), (3096576, 7392502,     │ │
│ │                   4096), (3538944, 8475871, 4096), (3981312, 9559462, 4096), (4423680,       │ │
│ │                   10677017, 4096), (4866048, 11822337, 4096), (5308416, 13027215, 4096),     │ │
│ │                   (5750784, 14314076, 4096), (6193152, 15533291, 4096), (6635520, 16683240,  │ │
│ │                   4096), (7077888, 17799734, 4096), (7520256, 18910079, 4096), (7962624,     │ │
│ │                   20036396, 4096), (8404992, 21190777, 4096), (8847360, 22454406, 4096),     │ │
│ │                   (9289728, 23751243, 4096), (9732096, 24704583, 4096), (10174464, 25601407, │ │
│ │                   4096)]>,                                                                   │ │
│ │                   │   [                                                                      │ │
│ │                   │   │   ('title', 'Paint The Town Red'),                                   │ │
│ │                   │   │   ('album', 'Paint The Town Red'),                                   │ │
│ │                   │   │   ('albumartist', 'Doja Cat'),                                       │ │
│ │                   │   │   ('artist', 'Doja Cat'),                                            │ │
│ │                   │   │   ('copyright', ''),                                                 │ │
│ │                   │   │   ('tracknumber', '1'),                                              │ │
│ │                   │   │   ('tracktotal', '1'),                                               │ │
│ │                   │   │   ('discnumber', '1'),                                               │ │
│ │                   │   │   ('disctotal', '1'),                                                │ │
│ │                   │   │   ('date', '2023-08-04'),                                            │ │
│ │                   │   │   ... +3                                                             │ │
│ │                   │   ],                                                                     │ │
│ │                   │   <Picture 'image/jpeg' (10402 bytes)>                                   │ │
│ │                   ]                                                                          │ │
│ │         padding = None                                                                       │ │
│ │            self = {'album': ['Paint The Town Red'], 'artist': ['Doja Cat'], 'disctotal':     │ │
│ │                   ['1'], 'albumartist': ['Doja Cat'], 'title': ['Paint The Town Red'],       │ │
│ │                   'date': ['2023-08-04'], 'composer': [''], 'tracktotal': ['1'],             │ │
│ │                   'copyright': [''], 'tracknumber': ['1'], 'isrc': [None], 'lyrics':         │ │
│ │                   ["By\nWalk on by\nWalk on by\nWalk on by\nWalk on by\n\nYeah, bitch, I     │ │
│ │                   said what I said\nI'd rather be famous instead (walk on by)\nI let all     │ │
│ │                   that get to my head\nI don't care, I paint the town red (walk on           │ │
│ │                   by)\nBitch, I said what I said\nI'd rather be famous instead (walk on      │ │
│ │                   by)\nI let all that get to my head\nI don't care, I paint the town red     │ │
│ │                   (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she a rebel (walk │ │
│ │                   on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me to    │ │
│ │                   settle (walk on by)\nMm, she the devil\nShe a bad lil' bitch, she a rebel  │ │
│ │                   (walk on by)\nShe put her foot to the pedal\nIt'll take a whole lot for me │ │
│ │                   (yeah) to settle (walk on by)\n\nYeah, said my happiness is all of your    │ │
│ │                   misery\nI put good dick all in my kidneys (walk on by)\nThis Margiel'      │ │
│ │                   don't come with no jealousy\nMy illness don't come with no remedy (walk on │ │
│ │                   by)\nI am so much fun without Hennessy\nThey just want my love and my      │ │
│ │                   energy (walk on by)\nYou can't talk no shit without penalties\nBitch, I'm  │ │
│ │                   in yo' shit if you send for me (walk on by)\n\nI'm going to glow up one    │ │
│ │                   more time\nTrust me, I have magical foresight (walk on by)\nYou gon' see   │ │
│ │                   me sleepin' in courtside\nYou gon' see me eatin' ten more times (walk on   │ │
│ │                   by)\nUgh, you can't take that bitch nowhere\nUgh, I look better with no    │ │
│ │                   hair (walk on by)\nUgh, ain't no sign I can't smoke here\nUgh (yeah),      │ │
│ │                   gimme the chance and I'll go there (walk on by)\n\nYeah, bitch, I said     │ │
│ │                   what I said\nI'd rather be famous instead (walk on by)\nI let all that get │ │
│ │                   to my head\nI don't care, I paint the town red (walk on by)\nBitch, I said │ │
│ │                   what I said\nI'd rather be famous instead (walk on by)\nI let all that get │ │
│ │                   to my head\nI don't care, I paint the town red (walk on by)\n\nMm, she the │ │
│ │                   devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her foot to │ │
│ │                   the pedal\nIt'll take a whole lot for me to settle (walk on by)\nMm, she   │ │
│ │                   the devil\nShe a bad lil' bitch, she a rebel (walk on by)\nShe put her     │ │
│ │                   foot to the pedal\nIt'll take a whole lot (yeah) for me to settle (walk on │ │
│ │                   by)\n\nYeah, said pop make money, now you try, bitch\nYou could use a      │ │
│ │                   revamp with a new vibe, sis (walk on by)\nI don't need a big feature or a  │ │
│ │                   new sidekick\nI don't need a new fan 'cause my boo like it (walk on by)\nI │ │
│ │                   don't need to wear a wig to make you like it\nI'm a two-time bitch, you    │ │
│ │                   ain't knew I'd win? (Walk on by)\nThrow a shot like you tryna have a food  │ │
│ │                   fight then\nAll my opps waitin' for me to be you, I bet (walk on           │ │
│ │                   by)\n\nSaid I got drive, I don't need a car\nMoney really all that we      │ │
│ │                   fiendin' for (walk on by)\nI'm doin' things they ain't seen before\nFans   │ │
│ │                   ain't dumb, but extremists are (walk on by)\nI'm a demon lord\nFall off    │ │
│ │                   what? I ain't seen the horse (walk on by)\nCalled your bluff, better cite  │ │
│ │                   the source\nFame ain't somethin' that I need no more (walk on              │ │
│ │                   by)\n\n'Cause, bitch, I said what I said\nI'd rather be famous instead     │ │
│ │                   (walk on by)\nI let all that get to my head\nI don't care, I paint the     │ │
│ │                   town red (walk on by)\nBitch, I said what I said\nI'd rather be famous     │ │
│ │                   instead (walk on by)\nI let all that get to my head\nI don't care, I paint │ │
│ │                   the town red (walk on by)\n\nMm, she the devil\nShe a bad lil' bitch, she  │ │
│ │                   a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take a whole    │ │
│ │                   lot for me to settle (walk on by)\nMm, she the devil\nShe a bad lil'       │ │
│ │                   bitch, she a rebel (walk on by)\nShe put her foot to the pedal\nIt'll take │ │
│ │                   a whole lot for me to settle (walk on by)\n\nWalk on by\nWalk on by\nWalk  │ │
│ │                   on by\nWalk on by"], 'discnumber': ['1']}                                  │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:153 in _writeblocks                      │
│                                                                                                  │
│   150 │   │   for block in blocks:                                                               │
│   151 │   │   │   if isinstance(block, Padding):                                                 │
│   152 │   │   │   │   continue                                                                   │
│ ❱ 153 │   │   │   data += cls._writeblock(block)                                                 │
│   154 │   │   blockssize = len(data)                                                             │
│   155 │   │                                                                                      │
│   156 │   │   # take the padding overhead into account. we always add one                        │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │    available = 474                                                                           │ │
│ │        block = [                                                                             │ │
│ │                │   ('title', 'Paint The Town Red'),                                          │ │
│ │                │   ('album', 'Paint The Town Red'),                                          │ │
│ │                │   ('albumartist', 'Doja Cat'),                                              │ │
│ │                │   ('artist', 'Doja Cat'),                                                   │ │
│ │                │   ('copyright', ''),                                                        │ │
│ │                │   ('tracknumber', '1'),                                                     │ │
│ │                │   ('tracktotal', '1'),                                                      │ │
│ │                │   ('discnumber', '1'),                                                      │ │
│ │                │   ('disctotal', '1'),                                                       │ │
│ │                │   ('date', '2023-08-04'),                                                   │ │
│ │                │   ... +3                                                                    │ │
│ │                ]                                                                             │ │
│ │       blocks = [                                                                             │ │
│ │                │   <mutagen.flac.StreamInfo object at 0x112b74110>,                          │ │
│ │                │   <SeekTable seekpoints=[(0, 0, 4096), (442368, 682783, 4096), (884736,     │ │
│ │                1448766, 4096), (1327104, 2566497, 4096), (1769472, 3743395, 4096), (2211840, │ │
│ │                5029764, 4096), (2654208, 6301888, 4096), (3096576, 7392502, 4096), (3538944, │ │
│ │                8475871, 4096), (3981312, 9559462, 4096), (4423680, 10677017, 4096),          │ │
│ │                (4866048, 11822337, 4096), (5308416, 13027215, 4096), (5750784, 14314076,     │ │
│ │                4096), (6193152, 15533291, 4096), (6635520, 16683240, 4096), (7077888,        │ │
│ │                17799734, 4096), (7520256, 18910079, 4096), (7962624, 20036396, 4096),        │ │
│ │                (8404992, 21190777, 4096), (8847360, 22454406, 4096), (9289728, 23751243,     │ │
│ │                4096), (9732096, 24704583, 4096), (10174464, 25601407, 4096)]>,               │ │
│ │                │   [                                                                         │ │
│ │                │   │   ('title', 'Paint The Town Red'),                                      │ │
│ │                │   │   ('album', 'Paint The Town Red'),                                      │ │
│ │                │   │   ('albumartist', 'Doja Cat'),                                          │ │
│ │                │   │   ('artist', 'Doja Cat'),                                               │ │
│ │                │   │   ('copyright', ''),                                                    │ │
│ │                │   │   ('tracknumber', '1'),                                                 │ │
│ │                │   │   ('tracktotal', '1'),                                                  │ │
│ │                │   │   ('discnumber', '1'),                                                  │ │
│ │                │   │   ('disctotal', '1'),                                                   │ │
│ │                │   │   ('date', '2023-08-04'),                                               │ │
│ │                │   │   ... +3                                                                │ │
│ │                │   ],                                                                        │ │
│ │                │   <Picture 'image/jpeg' (10402 bytes)>                                      │ │
│ │                ]                                                                             │ │
│ │          cls = <class 'mutagen.flac.MetadataBlock'>                                          │ │
│ │    cont_size = 25605497                                                                      │ │
│ │         data = bytearray(b'\x00\x00\x00"\x10\x00\x10\x00\x00\x00\x0e\x005M\n\xc4B\xf0\x00\x… │ │
│ │                \x8b\x7f\x10\x00\x00\x00\x00\x00\x00y\x80\x00\x00\x00\x00\x00\x011\xbb,\x10\… │ │
│ │ padding_func = None                                                                          │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:125 in _writeblock                       │
│                                                                                                  │
│   122 │   │                                                                                      │
│   123 │   │   data = bytearray()                                                                 │
│   124 │   │   code = (block.code | 128) if is_last else block.code                               │
│ ❱ 125 │   │   datum = block.write()                                                              │
│   126 │   │   size = len(datum)                                                                  │
│   127 │   │   if size > cls._MAX_SIZE:                                                           │
│   128 │   │   │   if block._distrust_size and block._invalid_overflow_size != -1:                │
│                                                                                                  │
│ ╭──────────────────── locals ────────────────────╮                                               │
│ │   block = [                                    │                                               │
│ │           │   (                                │                                               │
│ │           │   │   'title',                     │                                               │
│ │           │   │   'Paint The Town Red'         │                                               │
│ │           │   ),                               │                                               │
│ │           │   (                                │                                               │
│ │           │   │   'album',                     │                                               │
│ │           │   │   'Paint The Town Red'         │                                               │
│ │           │   ),                               │                                               │
│ │           │   ('albumartist', 'Doja Cat'),     │                                               │
│ │           │   ('artist', 'Doja Cat'),          │                                               │
│ │           │   ('copyright', ''),               │                                               │
│ │           │   ('tracknumber', '1'),            │                                               │
│ │           │   ('tracktotal', '1'),             │                                               │
│ │           │   ('discnumber', '1'),             │                                               │
│ │           │   ('disctotal', '1'),              │                                               │
│ │           │   ('date', '2023-08-04'),          │                                               │
│ │           │   ... +3                           │                                               │
│ │           ]                                    │                                               │
│ │     cls = <class 'mutagen.flac.MetadataBlock'> │                                               │
│ │    code = 4                                    │                                               │
│ │    data = bytearray(b'')                       │                                               │
│ │ is_last = False                                │                                               │
│ ╰────────────────────────────────────────────────╯                                               │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/flac.py:356 in write                             │
│                                                                                                  │
│   353 │   │   super(VCFLACDict, self).load(data, errors=errors, framing=framing)                 │
│   354 │                                                                                          │
│   355 │   def write(self, framing=False):                                                        │
│ ❱ 356 │   │   return super(VCFLACDict, self).write(framing=framing)                              │
│   357                                                                                            │
│   358                                                                                            │
│   359 class CueSheetTrackIndex(tuple):                                                           │
│                                                                                                  │
│ ╭──────────────────── locals ────────────────────╮                                               │
│ │ framing = False                                │                                               │
│ │    self = [                                    │                                               │
│ │           │   (                                │                                               │
│ │           │   │   'title',                     │                                               │
│ │           │   │   'Paint The Town Red'         │                                               │
│ │           │   ),                               │                                               │
│ │           │   (                                │                                               │
│ │           │   │   'album',                     │                                               │
│ │           │   │   'Paint The Town Red'         │                                               │
│ │           │   ),                               │                                               │
│ │           │   ('albumartist', 'Doja Cat'),     │                                               │
│ │           │   ('artist', 'Doja Cat'),          │                                               │
│ │           │   ('copyright', ''),               │                                               │
│ │           │   ('tracknumber', '1'),            │                                               │
│ │           │   ('tracktotal', '1'),             │                                               │
│ │           │   ('discnumber', '1'),             │                                               │
│ │           │   ('disctotal', '1'),              │                                               │
│ │           │   ('date', '2023-08-04'),          │                                               │
│ │           │   ... +3                           │                                               │
│ │           ]                                    │                                               │
│ ╰────────────────────────────────────────────────╯                                               │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/_vorbis.py:177 in write                          │
│                                                                                                  │
│   174 │   │   │   framing (bool): if true, append a framing bit (see load)                       │
│   175 │   │   """                                                                                │
│   176 │   │                                                                                      │
│ ❱ 177 │   │   self.validate()                                                                    │
│   178 │   │                                                                                      │
│   179 │   │   def _encode(value):                                                                │
│   180 │   │   │   if not isinstance(value, bytes):                                               │
│                                                                                                  │
│ ╭──────────────────── locals ────────────────────╮                                               │
│ │ framing = False                                │                                               │
│ │    self = [                                    │                                               │
│ │           │   (                                │                                               │
│ │           │   │   'title',                     │                                               │
│ │           │   │   'Paint The Town Red'         │                                               │
│ │           │   ),                               │                                               │
│ │           │   (                                │                                               │
│ │           │   │   'album',                     │                                               │
│ │           │   │   'Paint The Town Red'         │                                               │
│ │           │   ),                               │                                               │
│ │           │   ('albumartist', 'Doja Cat'),     │                                               │
│ │           │   ('artist', 'Doja Cat'),          │                                               │
│ │           │   ('copyright', ''),               │                                               │
│ │           │   ('tracknumber', '1'),            │                                               │
│ │           │   ('tracktotal', '1'),             │                                               │
│ │           │   ('discnumber', '1'),             │                                               │
│ │           │   ('disctotal', '1'),              │                                               │
│ │           │   ('date', '2023-08-04'),          │                                               │
│ │           │   ... +3                           │                                               │
│ │           ]                                    │                                               │
│ ╰────────────────────────────────────────────────╯                                               │
│                                                                                                  │
│ /usr/local/lib/python3.11/site-packages/mutagen/_vorbis.py:157 in validate                       │
│                                                                                                  │
│   154 │   │   │                                                                                  │
│   155 │   │   │   if not isinstance(value, str):                                                 │
│   156 │   │   │   │   err = "%r needs to be str for key %r" % (value, key)                       │
│ ❱ 157 │   │   │   │   raise ValueError(err)                                                      │
│   158 │   │                                                                                      │
│   159 │   │   return True                                                                        │
│   160                                                                                            │
│                                                                                                  │
│ ╭─────────────────── locals ────────────────────╮                                                │
│ │   err = "None needs to be str for key 'isrc'" │                                                │
│ │   key = 'isrc'                                │                                                │
│ │  self = [                                     │                                                │
│ │         │   ('title', 'Paint The Town Red'),  │                                                │
│ │         │   ('album', 'Paint The Town Red'),  │                                                │
│ │         │   ('albumartist', 'Doja Cat'),      │                                                │
│ │         │   ('artist', 'Doja Cat'),           │                                                │
│ │         │   ('copyright', ''),                │                                                │
│ │         │   ('tracknumber', '1'),             │                                                │
│ │         │   ('tracktotal', '1'),              │                                                │
│ │         │   ('discnumber', '1'),              │                                                │
│ │         │   ('disctotal', '1'),               │                                                │
│ │         │   ('date', '2023-08-04'),           │                                                │
│ │         │   ... +3                            │                                                │
│ │         ]                                     │                                                │
│ │ value = None                                  │                                                │
│ ╰───────────────────────────────────────────────╯                                                │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ValueError: None needs to be str for key 'isrc'

PKCE authentication option

Hi @exislow,
I see that you already contributed to python-tidal project by adding the option to authenticate via PKCE method. Well done!
Are you planning to add this option in your own project?

Cheers

TIDAL-Downloader-NG.exe Crash

OS: Windows 11 23H2
TIDAL-Downloader-NG.exe - v0.4.31

Seems to randomly crash; sometimes at launch, sometimes when trying to download a file (and then re-launching & downloading same file doesn't crash).

Not sure if there is a log file with more info to include?
Event Viewer shows faulting module is different each time. Seems a mix of Qt6Gui.dll, ntdll.dll, VCRuntime140.dll

TIDAL-Downloader-NG.exe - Stuck when clicking download

OS: Windows 11
Tidal-Downloader-NG.exe release 0.4.31

Haven't found a reliable way to reproduce this, however a few times now when downloading (has happened on Video, and also audio). When you select the track & then click download, it will get stuck showing 0% complete and make no progress.

Rest of UI seems responsive still, however cannot start any new downloads until you close & re-open.

Seems to occur more often with Video (selecting 1080p) and Lossless audio... Wonder if its maybe something to do with trying to get a 1080p video, or flac audio when source isn't available... If thats the case, would it be possible to have GUI indicate versions available for selected track.

[Bug] album artist tag messed up and download speed the same no matter the quality

What happened?

Album artist tag has track name in it example 1st song "artist1 - track1name", 2nd song "artist1 - track2name" instead of just artist name across every album track making every track a new album (in musicbee for example) and even when im downloading songs in lowest quality (2-3MB file) it takes as long as downloading highest but im not sure if it depends on u or tidal

Version

0.8.2

What operating system are you seeing the problem on?

Windows

Relevant log output

No response

Your settings

{"skip_existing": "exact", "lyrics_embed": false, "lyrics_file": false, "video_download": true, "download_delay": false, "download_base_path": "C:\\Users\\Admin\\Music", "quality_audio": "LOW", "quality_video": 360, "format_album": "Albums/{artist_name} - {album_title}/{track_num}. {artist_name} - {track_title}", "format_playlist": "Playlists/{playlist_name}/{artist_name} - {track_title}", "format_mix": "Mix/{mix_name}/{artist_name} - {track_title}", "format_track": "Tracks/{artist_name} - {track_title}", "format_video": "Videos/{artist_name} - {track_title}", "video_convert_mp4": true, "metadata_cover_dimension": "1280x1280"}

Ability to ignore file extensions

Currently, when we download a playlist, the program will check if the file already exists in the playlist folder. It would be nice to have a config field that just checks the name of the file and not the extension.

USE CASE: As a DJ, you might want to convert all your downloaded files to a different format within the same folder to avoid unnecessary copies, having this feature will allow us to maintain a unified directory for downloading and consumption, ultimately being able to download only new songs in that playlist regardless of file extension.

Help

I copy the url but it still won't let me log in?
Екранна снимка 2024-02-02 152325

M4A

The m4a file format is not recognized by the ROON program and many digital transports/streamers. We have to convert it to the FLAC format. Make the save in the default FLAC format. What is not clear here. Rather, it is strange why it is stored in m4a, which has nothing to do with Tidal and HD FLAC.

Should only use delay if the file doesn't already exist

Currently, it seems like when we download a playlist, the program will have human-like delays before it downloads a track, which is what we want. But, there is also a case where you can have 1000 tracks out 1010 total downloaded already, in which case it applies the delay to every song even if it already exists. Ideally, it should check is a file for the requested track already exists, and if it does, then skip delay and move to the next request.

cc: @exislow

QUESTION: WHY M4A?

I have tested the latest version, and it works great. But testing the latest quality (hiress_lossles) and the (hires), the file extension is M4A, is everything ok? It is no longer FLAC?

Adding Lyrics to stand-alone .lrc file

I'd like to have the ability to send the timed lyrics to dedicated file with the idnetial song name, just a different extension (.lrc)

ex: 01-song.flac
01-song.lrc

contents of the file is like:
[00:12.00]Line 1 lyrics
[00:17.20]Line 2 lyrics

These timed lyrics are already being pulled from tidal-dl-ng, just need to write it to the file, and add a config option for "lyricsfile : true/false" in the json config

M4A and search by TIDAL link

Make default conservation in the format of a flac or selection of format. When using files in ROON, M4A is not supported and has to be converted, doing unnecessary work, not all digital transports also support M4A. Also, if the maintenance of the release in the MQA is chosen, then there should be an identification mark of the format, it does not need to be redrawn, but leave as it is. The choice of 16/44.1 or HD-flac should only be for files in the HD-flac format.
It’s also a good idea to add a search using a link from Tidal; searching by name is very inconvenient.
Thank you.

[question] run commands via python

im making a python script to automatically download all my liked songs and i can get the urls via tidalapi.
Is there any way i can use tidal-dl-ng in the python script without having to use subprocess.run.Iif you can how would you send cli commands via python?

Ability to use custom API Instance

Current Situation

Problem : Tidal only available for few countries and some people can't buy (Geo Restrict / Payment Issues / etc.)

Suggestion / Feature Request

Note : If you don't have any interest, feel free to leave, no problem.

If you can add this API (like external adapter) it will be great, and it's totally free and open source.

Solution : https://github.com/sachinsenal0x64/hifi-tui?tab=readme-ov-file#-api-documentation

Goal : Free Access Without Any Subscription and We DO NOT encourage piracy

Question: why Hi-Res-Lossless quality is only available for a limited time

Hi @exislow ,
I have a question.
When I login and authenticate via PKCE method I'm able to download at HI_RES_LOSSLESS quality with no issues.
But after several hours (<24hrs) the best quality I can get with exatcly the same settings is 44/16.
When I delete the token.json and re-login, I'm again able to download at MAX quality.
Why is this happening?
Is there any workaround?
Thanks in advance for your help.

Cheers

Question: how to set new value to configuration parameters

Hello,
I'm struggling to pass new values of configuration paramaters via CLI.
Following your instructions I tried every possible methods I could think of but couldn't pass a new value to certain parameter.
Please see one of the ways I tried to pass the respective arguments to set a new value to download folder parameter.
Can you provide an example to pass multiple values for multiple parametrs in one line?
Also, is it possible to combine dl command and cfg in one CLI command?

Many thanks in advance.

The CLI command:
tidal-dl-ng cfg --names download_base_path "/mnt/test/"

Error:
Got unexpected extra argument (/mnt/test/)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.