nathom / streamrip

A scriptable music downloader for Qobuz, Tidal, SoundCloud, and Deezer
GNU General Public License v3.0
2.34k stars 209 forks source link

[BUG] (Dev Branch) Forbidden Access errors thrown on deezer playlists cause FileNotFound / Mutagen errors down the line #701

Open PaladinOfHonour opened 3 weeks ago

PaladinOfHonour commented 3 weeks ago

Describe the bug

This is a followup to BUG #677 w.r.t. the fix for it on the dev branch

For unknown reasons certain tracks in my public deezer playlists throw 403: Forbidden errors upon attempting to download them (first attempting to decrypt). This issue presents itself on all playlists I've tried so far, although I was able to download some albums without issue. Furthermore, downloading the problem song singular via search also works! My understanding is that after skipping the download of a forbidden song, its reference is not removed/hidden from the list of tracks in the playlist used later on in the process to delete temporary files. Causing an initial FileNotFoundError which then cascades to sometimes mutagen file manipulation errors or something else (coroutine never awaited). This error always occurs when Removing dirs set() is called within artwork.py:19, even if having disabelled the embedding of art in the config file

Command Used

rip url "https://www.deezer.com/en/playlist/[public playlist]"

Debug Traceback

**Relevant Traceback:**

           ERROR    Error downloading track 'Spring', retrying: 403, message='Forbidden',                                                                                                                                 track.py:52
                    url=URL('https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b14422
                    3ddc5c9c300e3a2afca94bd5f6dacc53a9391e96d6818b')
           DEBUG    Deezer file (id 1560170922) at                                                                                                                                                                downloadable.py:167
                    https://cdnt-proxy-b.dzcdn.net/media/1/e521f9d3190b25c7c7a7490214f996a5a524721317e87aec232ce8718a8e1f082099de3b434f758c4820155eddc3b4d3371e5bca018a8d771c2eafd217a39ac739e1a98fb43252d6211dba
                    65f22755bf?hdnea=exp=1718188280~acl=/media/1/e521f9d3190b25c7c7a7490214f996a5a524721317e87aec232ce8718a8e1f082099de3b434f758c4820155eddc3b4d3371e5bca018a8d771c2eafd217a39ac739e1a98fb43252d6
                    211dba65f22755bf*~data=user_id=6113304941~hmac=de7d5290aaacca9eb993f9953c9f3f94fd3c25b4b840e31b5ad03b8c9f787bd9 is encrypted. Decrypting with b'aaehbe{72 ua:dbe'
           ERROR    Persistent error downloading track 'Spring', skipping: 403, message='Forbidden',                                                                                                                      track.py:68
                    url=URL('https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b14422
                    3ddc5c9c300e3a2afca94bd5f6dacc53a9391e96d6818b')
           DEBUG    Executing INSERT INTO failed_downloads (source, media_type, id) VALUES (?, ?, ?)                                                                                                                        db.py:124
           DEBUG    Items to add: ('deezer', 'track', '644309822')                                                                                                                                                          db.py:125
           DEBUG    UNIQUE constraint failed: failed_downloads.id                                                                                                                                                           db.py:132
──────────────────────────────────────────────────────────────────────────────────────────────────── Downloading Glow Weird Wubs ────────────────────────────────────────────────────────────────────────────────────────────────────
Track 1  - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.8% • 324.7 kB/s • 0:01:23
Track 5  - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.8% • 613.3 kB/s • 0:00:31
Track 8  - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.9% • 358.4 kB/s • 0:01:01
Track 2  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 0.0% • ?          • -:--:--
Track 4  -- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.3% • 504.3 kB/s • 0:00:47
Track 10 - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.7% • 322.8 kB/s • 0:01:42
Track 17 - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.5% • 645.6 kB/s • 0:00:47
Track 7  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 0.0% • ?          • -:--:--
           DEBUG    Removing dirs set()                                                                                                                                                                                 artwork.py:19
┌─────────────────────────────── Traceback (most recent call last) ────────────────────────────────┐
│ C:\Users\TimBr\Music Curation\streamrip_dev\.venv\Lib\site-packages\mutagen\_util.py:251 in      │
│ _openfile                                                                                        │
│                                                                                                  │
│    248 │   │                                                                                     │
│    249 │   │   inmemory_fileobj = False                                                          │
│    250 │   │   try:                                                                              │
│ >  251 │   │   │   fileobj = open(filename, "rb+" if writable else "rb")                         │
│    252 │   │   except IOError as e:                                                              │
│    253 │   │   │   if writable and e.errno == errno.EOPNOTSUPP:                                  │
│    254 │   │   │   │   # Some file systems (gvfs over fuse) don't support opening                │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │           create = False                                                                     │ │
│ │         filename = 'C:\\Users\\TimBr\\Music                                                  │ │
│ │                    Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\0'+21       │ │
│ │          fileobj = None                                                                      │ │
│ │        filething = 'C:\\Users\\TimBr\\Music                                                  │ │
│ │                    Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\0'+21       │ │
│ │ inmemory_fileobj = False                                                                     │ │
│ │         instance = {}                                                                        │ │
│ │         writable = False                                                                     │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\TimBr\\Music Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\09. Flume - Spring.mp3'

**Full Traceback:**

[16:40:28] DEBUG    Showing all debug logs                                                                                                                                                                                 cli.py:102
[16:40:29] DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                             db.py:108
           DEBUG    Fetching deezer url with token                                                                                                                                                                      deezer.py:167
                    [Redacted]
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           DEBUG    dz track info: {'ALB_ID': '63479062', 'ALB_PICTURE': '0d0c58599f05dd1d13319f31be53cf6e', 'ALB_TITLE': 'BB-8 / Barbarossa', 'ARTISTS': [{'ART_ID': '4054895', 'ROLE_ID': '0', 'ARTISTS_SONGS_ORDER': deezer.py:190
                    '1', 'ART_NAME': 'K-Lone', 'ARTIST_IS_DUMMY': False, 'ART_PICTURE': '8c2d8de7b77595bc855ac912b607e351', 'RANK': '324464', 'LOCALES': [], 'SMARTRADIO': 1, '__TYPE__': 'artist'}], 'ART_ID':
                    '4054895', 'ART_NAME': 'K-Lone', 'ARTIST_IS_DUMMY': False, 'DIGITAL_RELEASE_DATE': '2018-05-25', 'DISK_NUMBER': '1', 'DURATION': '301', 'EXPLICIT_LYRICS': '0', 'EXPLICIT_TRACK_CONTENT':
                    {'EXPLICIT_LYRICS_STATUS': 0, 'EXPLICIT_COVER_STATUS': 2}, 'GENRE_ID': '0', 'HIERARCHICAL_TITLE': '', 'ISRC': 'GBHLW1801226', 'LYRICS_ID': 0, 'PHYSICAL_RELEASE_DATE': '2018-05-25', 'PROVIDER_ID':
                    '556', 'RANK': '201002', 'SMARTRADIO': 1, 'SNG_CONTRIBUTORS': {'mainartist': ['K-Lone'], 'musicpublisher': ['Wych']}, 'SNG_ID': '499488532', 'SNG_TITLE': 'Barbarossa', 'STATUS': 1,
                    'TRACK_NUMBER': '2', 'USER_ID': 0, 'MD5_ORIGIN': '93d9abdfcbaddeeb57d428ba13f58848', 'FILESIZE_AAC_64': '0', 'FILESIZE_MP3_64': '0', 'FILESIZE_MP3_128': '4828263', 'FILESIZE_MP3_256': '0',
                    'FILESIZE_MP3_320': '12070660', 'FILESIZE_FLAC': '27138841', 'FILESIZE': '4828263', 'GAIN': '-8.8', 'MEDIA_VERSION': '3', 'TRACK_TOKEN':
                    'AAAAAWZoYeFmaXshCsMe1KSxkNt-3r82qV93y71GXCe_M2kUAi-fGURFvZP6q0kej2M3pdvYlwBJ2k68Ef2s1Z4oppMwxoBQOaKdKuwhNuuEXySauRVNZgLnR0_afN9qGM2F6JqCHTAMF41SkzLvOweLLzJ_x-nT6T0Tj1qSNxG9SFr0GcdAh91UwGHlcoTjqd
                    0VRlaldoGaimWVQfPhk8qU0B6-Je3OXZeHdwh3l5YgGswKa2Mz-QfgKn8gzHtw6Kz4-bwfm9DlnIRtZb3-Ufje2ryUVswx_rgQEAC2GJ-jqvNGfHzzgbdrTGfA8q_ssp9fQlmmseKUd_fGmg', 'TRACK_TOKEN_EXPIRE': 1718188833, 'MEDIA':
                    [{'TYPE': 'preview', 'HREF': 'http://cdn-preview-3.deezer.com/stream/c-357bf01a8681cadd5ab2f2b86ff1109b-3.mp3'}], 'RIGHTS': {'STREAM_ADS_AVAILABLE': True, 'STREAM_ADS': '2000-01-01',
                    'STREAM_SUB_AVAILABLE': True, 'STREAM_SUB': '2000-01-01'}, '__TYPE__': 'song'}
           DEBUG    Deezer info for downloadable: {'quality': 2, 'id': '499488532', 'quality_to_size': [4828263, 12070660, 27138841], 'url':                                                                      downloadable.py:123
                    'https://e-cdnt-proxy-9.dzcdn.net/media/1/88355dce75956db4d892e2a0bc83d773d0818185a3d10df0eee010ae33939e3034bc877e0e05c94b45b9c35517db394ef1f455e03596991282dd36bffed7d687452d1a0706c0c972353
                    5b16d7cfa3fc7?pz9AgFPdwnN1e-034768_QX0VnXStaBIFg4Al69-QwEFyOtntXzGCiLd4_j29BVKsWh_Z_Hs4DlQaEMymMEUwF0J0exzKPjnQO8kzGJnvXK5UYVCbkL5AM3T847S8SPvuPTsA4a2ac6Z6k8yC1_n6LS96oifd1QAyqvM3XxXH4kmgdv
                    NxKNPpZn3uyQVLDPQEzxIifkN-fNsJEJ729tyGYg8zUcSEwm4Zi5O0gSo8n30zWWxgf0t74xQGOgnpzVokFAg37lTusttgpKtYVDoHHumSE2xrd-xjuZMjNIaR5ptzSfIlrB20kRUMMoN2OQYhAksvDmmb4lOyw'}
           ERROR    Error fetching album of track 644309822: DataException: album/89513762 no data                                                                                                                       deezer.py:80
[16:40:30] ERROR    Error fetching album of track 916601802: DataException: album/138890842/tracks no data                                                                                                               deezer.py:80
           DEBUG    Fetching deezer url with token                                                                                                                                                                      deezer.py:167
                    [Redacted]
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                    connectionpool.py:330
           [Succesful track logs removed]
           DEBUG    Fetching deezer url with token                                                                                                                                                                      deezer.py:167
                    [Redacted]
           DEBUG    Unable to fetch URL. Trying encryption method.                                                                                                                                                      deezer.py:199
           DEBUG    Encrypted file path                                                                                                                                                                                 deezer.py:223
                    https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b144223ddc5c9
                    c300e3a2afca94bd5f6dacc53a9391e96d6818b
           DEBUG    dz track info: {'ALB_ID': '89513762', 'ALB_PICTURE': '3ed769241d5c714fc5a9a5ec3e2327bf', 'ALB_TITLE': 'Hi This Is Flume (Mixtape)', 'ARTISTS': [{'ART_ID': '1164295', 'ROLE_ID': '0',               deezer.py:190
                    'ARTISTS_SONGS_ORDER': '1', 'ART_NAME': 'Flume', 'ARTIST_IS_DUMMY': False, 'ART_PICTURE': '88985ef4ee04371eeca38040ac5dbb53', 'RANK': '646720', 'LOCALES': {'lang_ja-hrkt': {'name': 'Flume'},
                    'lang_en': {'name': 'Flume'}, 'lang_ja-jpan': {'name': 'Flume'}}, 'SMARTRADIO': 1, '__TYPE__': 'artist'}, {'ART_ID': '392951', 'ROLE_ID': '0', 'ARTISTS_SONGS_ORDER': '2', 'ART_NAME': 'Eprom',
                    'ARTIST_IS_DUMMY': False, 'ART_PICTURE': '06a321a6d0ae2026917b89b45e718b1e', 'RANK': '232776', 'LOCALES': {'lang_en': {'name': 'Eprom'}}, 'SMARTRADIO': 1, '__TYPE__': 'artist'}], 'ART_ID':
                    '1164295', 'ART_NAME': 'Flume', 'ARTIST_IS_DUMMY': False, 'DIGITAL_RELEASE_DATE': '2019-03-22', 'DISK_NUMBER': '1', 'DURATION': '217', 'EXPLICIT_LYRICS': '0', 'EXPLICIT_TRACK_CONTENT':
                    {'EXPLICIT_LYRICS_STATUS': 0, 'EXPLICIT_COVER_STATUS': 2}, 'FALLBACK': {'ALB_ID': '458874495', 'ALB_PICTURE': '7d3b8c86bae447c57a394647731ba1d7', 'ALB_TITLE': 'Hi This Is Flume (Mixtape)',
                    'ARTISTS': [{'ART_ID': '1164295', 'ROLE_ID': '0', 'ARTISTS_SONGS_ORDER': '2', 'ART_NAME': 'Flume', 'ARTIST_IS_DUMMY': False, 'ART_PICTURE': '88985ef4ee04371eeca38040ac5dbb53', 'RANK': '646720',
                    'LOCALES': {'lang_ja-hrkt': {'name': 'Flume'}, 'lang_en': {'name': 'Flume'}, 'lang_ja-jpan': {'name': 'Flume'}}, 'SMARTRADIO': 1, '__TYPE__': 'artist'}, {'ART_ID': '392951', 'ROLE_ID': '0',
                    'ARTISTS_SONGS_ORDER': '3', 'ART_NAME': 'Eprom', 'ARTIST_IS_DUMMY': False, 'ART_PICTURE': '06a321a6d0ae2026917b89b45e718b1e', 'RANK': '232776', 'LOCALES': {'lang_en': {'name': 'Eprom'}},
                    'SMARTRADIO': 1, '__TYPE__': 'artist'}], 'ART_ID': '1164295', 'ART_NAME': 'Flume', 'ARTIST_IS_DUMMY': False, 'DIGITAL_RELEASE_DATE': '2019-03-23', 'DISK_NUMBER': '1', 'DURATION': '217',
                    'EXPLICIT_LYRICS': '0', 'EXPLICIT_TRACK_CONTENT': {'EXPLICIT_LYRICS_STATUS': 0, 'EXPLICIT_COVER_STATUS': 1}, 'GENRE_ID': '0', 'HIERARCHICAL_TITLE': '', 'ISRC': 'AUFF01900045', 'LYRICS_ID': 0,
                    'PHYSICAL_RELEASE_DATE': '2019-03-22', 'PROVIDER_ID': '49', 'RANK': '237319', 'SMARTRADIO': 1, 'SNG_CONTRIBUTORS': {'main_artist': ['Flume', 'Eprom'], 'composer': ['Harley Streten', 'Alexander
                    Dennis'], 'author': ['Harley Streten', 'Alexander Dennis']}, 'SNG_ID': '2347016525', 'SNG_TITLE': 'Spring', 'STATUS': 1, 'TRACK_NUMBER': '17', 'USER_ID': 0, 'VERSION': '', 'MD5_ORIGIN':
                    'ba25b66e1c5c93ae9350280425d27509', 'FILESIZE_AAC_64': '0', 'FILESIZE_MP3_64': '0', 'FILESIZE_MP3_128': '3479509', 'FILESIZE_MP3_256': '0', 'FILESIZE_MP3_320': '8698774', 'FILESIZE_FLAC':
                    '23394334', 'FILESIZE': '3479509', 'GAIN': '-9', 'MEDIA_VERSION': '3', 'TRACK_TOKEN':
                    'AAAAAWZoYeJmaXsiK3WWxWlQUSHq9L1Wsr94AWROtMMmtZHP0RXbKMPdLeXlVKEj7L0YT5z0Gdyq1HZlI7I_Z28gxXxVGwhWAekibor3FsS8NVmUDHwMmXOzjPkg3EuJOcfgsq0uj95VSpDjwwcW58l81BnH13HbtCcwWtWs2YLKAlHYqAUVsG-OGaomtz8jy-
                    SdER6vYqUJi1_TSAF_o4I5vRs2IVxKHgDjVtXk7RXRzcz7PUOG3d0eoxLZYqjoI8T2C0lLHerRDLbZT9dMpwq8lvpnZtsBoA', 'TRACK_TOKEN_EXPIRE': 1718188834, 'MEDIA': [{'TYPE': 'preview', 'HREF':
                    'http://cdn-preview-9.deezer.com/stream/c-9564e2087383214833c3eea82ddd61a5-3.mp3'}], 'RIGHTS': {'STREAM_ADS_AVAILABLE': True, 'STREAM_ADS': '2000-01-01', 'STREAM_SUB_AVAILABLE': True,
                    'STREAM_SUB': '2000-01-01'}, '__TYPE__': 'song'}, 'GENRE_ID': '0', 'HIERARCHICAL_TITLE': '', 'ISRC': 'AUFF01900045', 'LYRICS_ID': 0, 'PHYSICAL_RELEASE_DATE': '2019-03-22', 'PROVIDER_ID': '552',
                    'RANK': '8945', 'SMARTRADIO': 1, 'SNG_CONTRIBUTORS': {'main_artist': ['Flume', 'Eprom'], 'music publisher': ['Future Classic [APRA] / Kobalt Music Services America'], 'composer': ['Harley
                    Streten', 'Alexander Dennis']}, 'SNG_ID': '644309822', 'SNG_TITLE': 'Spring', 'STATUS': 3, 'TRACK_NUMBER': '17', 'USER_ID': 0, 'VERSION': '', 'MD5_ORIGIN': 'aecbf62d68a405bdb0d5ec951b82cf36',
                    'FILESIZE_AAC_64': '0', 'FILESIZE_MP3_64': '0', 'FILESIZE_MP3_128': '3479509', 'FILESIZE_MP3_256': '0', 'FILESIZE_MP3_320': '0', 'FILESIZE_FLAC': '0', 'FILESIZE': '3479509', 'GAIN': '-9',
                    'MEDIA_VERSION': '5', 'TRACK_TOKEN':
                    'AAAAAWZoYeJmaXsiUn0lavNyCyoQei1RJxJ9tQCsnmYDMkNwkdwWaguxSgBoMr8wKIJHOznxTS1q-6Q2G8FoHhx4fDq81uVcp6EDPyYwegNHzgrdithatAT-juTJDNaha7J7R3gzX6x_QHB-qACcbpjmt4QKcKGlmmiYK-rImbgKO3WENvT5VDkmKxaDSVXnLb
                    T_uaI-N7oocem26T-sieUxKqwKiajcFeia050A6TYDsYQoj0xy7i5z3-XMljWnaZDu7SpfIiGqr_xzHeLDtrdI0vnnKqdNgCLXNU131bjRFp6dwcxsTMby7xa0n6LFPlK1Db46jGShCR_n6Y_LvA', 'TRACK_TOKEN_EXPIRE': 1718188834, 'MEDIA':
                    [{'TYPE': 'preview', 'HREF': 'http://cdn-preview-4.deezer.com/stream/c-424ddd3dfb90bbd5b7dc16322365ce08-5.mp3'}], 'RIGHTS': {}, '__TYPE__': 'song'}
           DEBUG    Deezer info for downloadable: {'quality': 2, 'id': '644309822', 'quality_to_size': [3479509, 0, 0], 'url':                                                                                    downloadable.py:123
                    'https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b14422
                    3ddc5c9c300e3a2afca94bd5f6dacc53a9391e96d6818b'}
[Succesful track logs removed]
           DEBUG    Fetching deezer url with token                                                                                                                                                                      deezer.py:167
                    [Redacted]
                    chQNetT63rQctX4a8TWzxCuWYhLAx2HYkALbNYyuwfPWIUVsyWSKQf0jpGCovXlcsEWXLumS7sxQMpvwQ7fCIKMo23JKCTKud4Pa8pVbx6EsTTtLzGeBwxvXaAvQ5yKzqHVSO6w8BImKXeQ3WCrYUrQ
[Succesful track logs removed]
                    4c8a17776851625fa*~data=user_id=6113304941~hmac=afb7fa1e52c07fff705b87434294fffe88471ba88ffba649ac87b2abf0087a07'}
[16:40:33] DEBUG    Deezer file (id 1560170922) at                                                                                                                                                                downloadable.py:167
                    https://e-cdnt-proxy-b.dzcdn.net/media/1/e521f9d3190b25c7c7a7490214f996a5a524721317e87aec232ce8718a8e1f082099de3b434f758c4820155eddc3b4d3371e5bca018a8d771c2eafd217a39ac739e1a98fb43252d6211d
                    ba65f22755bf?zY0QZky4CLAWEPDMEBwcSb0npxGj4NLRHYK_u78jYBCa1RpdMi36-T7PYtpngeAwGVtV_H88uVHeLVb_AHXdQENXgUi2stJRlPcdMKgQdvV_Ka6qDMhe4nzbwcKsIozcTUklcS-PHmfLK3P3Wr_I9hXxzeaFXtoCzCXmCNkYBZ0LGAm4
                    7FSs5zOapDaw7nXNoZ82jdrMGbfe5_oHfaz5E2Ne6AKHPTz9kfYxrrUEr5xFZ6rXr9Rz5yHSMeoQpG-oBm9Zv57vOQOMDsg_j-4vYcswdL2RLt3uFQf4CrRX13OvBfo1cgDH-2sdMj4svfLDn-uM8IJPeFOmtw is encrypted. Decrypting with
                    b'aaehbe{72 ua:dbe'
           DEBUG    Deezer file (id 499488532) at                                                                                                                                                                 downloadable.py:167
                    https://e-cdnt-proxy-9.dzcdn.net/media/1/88355dce75956db4d892e2a0bc83d773d0818185a3d10df0eee010ae33939e3034bc877e0e05c94b45b9c35517db394ef1f455e03596991282dd36bffed7d687452d1a0706c0c9723535
                    b16d7cfa3fc7?pz9AgFPdwnN1e-034768_QX0VnXStaBIFg4Al69-QwEFyOtntXzGCiLd4_j29BVKsWh_Z_Hs4DlQaEMymMEUwF0J0exzKPjnQO8kzGJnvXK5UYVCbkL5AM3T847S8SPvuPTsA4a2ac6Z6k8yC1_n6LS96oifd1QAyqvM3XxXH4kmgdvN
                    xKNPpZn3uyQVLDPQEzxIifkN-fNsJEJ729tyGYg8zUcSEwm4Zi5O0gSo8n30zWWxgf0t74xQGOgnpzVokFAg37lTusttgpKtYVDoHHumSE2xrd-xjuZMjNIaR5ptzSfIlrB20kRUMMoN2OQYhAksvDmmb4lOyw is encrypted. Decrypting with
                    b';02:oo 9c|u53<2`'
           DEBUG    Deezer file (id 724008872) at                                                                                                                                                                 downloadable.py:167
                    https://e-cdnt-proxy-6.dzcdn.net/media/1/2c5283339df22423e5f55a13b33f4c02e1baa664332ea0d83c4c445e61a5dcda4368a43ede42dad10409d1af124d933427493e2dee1aa4356cd18a7692e93f50d89ed7f5e6e44800e9b7
                    1a697b3f4d47?hFKAVULUY7Dlj6LDGOOgghDK6Sd-7ZUD-91aLw9dC4i2in1ra7EI0Z3XbMZNnAMn_hMFUqRo1dgdo3SetlSEUJ6VtEXQ0qpJCR6-2zJ7BwiBTDoK3KGcuMihRSGGL0_9lkhcd2w-jVp9sFzeuEsgxAJCUzFXvtfJV94fyf66geNuiesX
                    WM5LuJDW669pTnhYqlPbZXU2EON1AcJ0fA-m51TP8cD0UFWMzLBQjr-ovWmDUXkfkD6lT4LbYykrVFLdbRvGlX1APRVH5lGD8Hca85ylNrfm-ftKBFzFcHpx4rOEhtnnZtb66hK6RQHnWjH4cA8FZHxz3iMapw is encrypted. Decrypting with
                    b'66oj0<&17.rgb<o7'
           DEBUG    Deezer file (id 693793872) at                                                                                                                                                                 downloadable.py:167
                    https://e-cdnt-proxy-9.dzcdn.net/media/1/8a14829a60337c682499a81e8cbaf463719573b2cfe06e176c4b148164758a2d2656e570568e7d4b63ee67be82b82d7627ef3716c4601e02fec0dce754128d30b45c315d78143867ae88
                    e6bb962e3578?cdPh6vcHUiU_VufJV6xom6wT6chhgYs0OIFoeQayMCRR0aPx1NGHAacNNiGE-kQE3_HESNnYVk5e4vcrOf0_tYov1fhTl-IN5fjd93l9aCCkfmCBx5YjmkEsC0G6ND4dXLz5MA06OWRdzdRkgrdfMp6IlLwHQl9tHxjAKUFCNXpMriDO
                    gzca79KJWAbRlAWSd1kYrgfcvy913OZOTPvqg2jPH-jU05NBiKTpmd4Q_8JexnhDThUf2RecPFPWb2Wq_-eXp9kf2xy2Pd-7h_ENHN5PX--VZUdvszWo7yFTo18fbCyr4ly_zvMlaL1WSCQJFE6n-aAs3EWmEA is encrypted. Decrypting with
                    b'db=8<ks=>|qbo=b>'
           DEBUG    Deezer file (id 693793842) at                                                                                                                                                                 downloadable.py:167
                    https://e-cdnt-proxy-1.dzcdn.net/media/1/666a62d1bcf0103f3890ad574873a7bb478983633ce7a98a344f96c2386cce9bab543ab2c73bacfaa14c754fd929ce01efa5d57d2a8210e6bd67ab83ea97384864bcc76c05392f05e9b6
                    ba16f5eaee6d?FeTVyZLV4AD8hbv4MIKSjUoQrtq9PoNkLt5TDH3Uv9ftIGnJ7yozaSS4yh3kelg5qIM4HM9enWZ4SLQajZhVopyWa1trkLa_4OKjUxz_2jCUEcv3vyTF4zuBFof2BnqVYOBCjVMpfkebc-_uTClc4R3sFnNVJv02669SwT1zNUmsVWbH
                    uku6AwgO90iPk82usdvTD4FFNl5VtF8tfFTrh9-oOcEOpuSKfO4qITe_XHL2imrzRvl7l_GzGhj3YxzTYPDrYhjho4ov1Ii0sYnPVYECFrVndcS0Gp7wPcwnpOt7f1yI3SbLVww3ckEVX9H-Oz90pcAxuZIBEA is encrypted. Decrypting with
                    b'f4gb5i b9x#iln4b'
           DEBUG    Deezer file (id 3133950) at                                                                                                                                                                   downloadable.py:167
                    https://cdnt-proxy-f.dzcdn.net/media/1/3b94549d9716c60fd5e8aa2573c8619838bc304bfbb1eb5f8db61fda34838296504e3e359f0b79c1ea46f575f4fb359e17ed4c7e910587feb16672c524ed2e0b66f38fc0e33cea870dc2f4
                    1432936306?hdnea=exp=1718188833~acl=/media/1/3b94549d9716c60fd5e8aa2573c8619838bc304bfbb1eb5f8db61fda34838296504e3e359f0b79c1ea46f575f4fb359e17ed4c7e910587feb16672c524ed2e0b66f38fc0e33cea87
                    0dc2f41432936306*~data=user_id=6113304941~hmac=ebf95d7820de55327342cac247d2acac99a9ba38625010aa7a5477bd5be8d55a is encrypted. Decrypting with b'fa6acj!jbpq3?>`6'
           DEBUG    Deezer file (id 890588682) at                                                                                                                                                                 downloadable.py:167
                    https://cdnt-proxy-4.dzcdn.net/media/1/cf39c3ab5b553818e0af67266b5f0b511aa74f7d878c3cc5dbc6e77299928684289a4e9131b88207b4834fb8382084c09837dd3561d82df0a4bbb3a98ed5e404ce5e512379d169db8e31c0
                    132ef8dee7?hdnea=exp=1718188835~acl=/media/1/cf39c3ab5b553818e0af67266b5f0b511aa74f7d878c3cc5dbc6e77299928684289a4e9131b88207b4834fb8382084c09837dd3561d82df0a4bbb3a98ed5e404ce5e512379d169db
                    8e31c0132ef8dee7*~data=user_id=6113304941~hmac=ab3207c6645bb1f4843bc98419e11519646da7be9ff95a408358a12e6da11700 is encrypted. Decrypting with b'0b`;`ivb7/ub1inj'
           ERROR    Error downloading track 'Spring', retrying: 403, message='Forbidden',                                                                                                                                 track.py:52
                    url=URL('https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b14422
                    3ddc5c9c300e3a2afca94bd5f6dacc53a9391e96d6818b')
           ERROR    Persistent error downloading track 'Spring', skipping: 403, message='Forbidden',                                                                                                                      track.py:68
                    url=URL('https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b14422
                    3ddc5c9c300e3a2afca94bd5f6dacc53a9391e96d6818b')
           DEBUG    Executing INSERT INTO failed_downloads (source, media_type, id) VALUES (?, ?, ?)                                                                                                                        db.py:124
           DEBUG    Items to add: ('deezer', 'track', '644309822')                                                                                                                                                          db.py:125
           DEBUG    UNIQUE constraint failed: failed_downloads.id                                                                                                                                                           db.py:132
──────────────────────────────────────────────────────────────────────────────────────────────────── Downloading Glow Weird Wubs ────────────────────────────────────────────────────────────────────────────────────────────────────
Track 1  -- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.1% • 508.0 kB/s • 0:00:53
Track 5   ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.5% • 289.0 kB/s • 0:01:06
Track 2  - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.7% • 652.2 kB/s • 0:01:11
Track 8   ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.3% • 528.5 kB/s • 0:00:42
Track 3  - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.6% • 448.9 kB/s • 0:01:19
Track 6  - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 1.0% • 540.5 kB/s • 0:00:51
Track 20 - ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.8% • 1.3 MB/s   • 0:00:17
Track 7  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 0.0% • ?          • -:--:--
           DEBUG    Removing dirs set()                                                                                                                                                                                 artwork.py:19
┌─────────────────────────────── Traceback (most recent call last) ────────────────────────────────┐
│ C:\Users\TimBr\Music Curation\streamrip_dev\.venv\Lib\site-packages\mutagen\_util.py:251 in      │
│ _openfile                                                                                        │
│                                                                                                  │
│    248 │   │                                                                                     │
│    249 │   │   inmemory_fileobj = False                                                          │
│    250 │   │   try:                                                                              │
│ >  251 │   │   │   fileobj = open(filename, "rb+" if writable else "rb")                         │
│    252 │   │   except IOError as e:                                                              │
│    253 │   │   │   if writable and e.errno == errno.EOPNOTSUPP:                                  │
│    254 │   │   │   │   # Some file systems (gvfs over fuse) don't support opening                │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │           create = False                                                                     │ │
│ │         filename = 'C:\\Users\\TimBr\\Music                                                  │ │
│ │                    Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\0'+21       │ │
│ │          fileobj = None                                                                      │ │
│ │        filething = 'C:\\Users\\TimBr\\Music                                                  │ │
│ │                    Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\0'+21       │ │
│ │ inmemory_fileobj = False                                                                     │ │
│ │         instance = {}                                                                        │ │
│ │         writable = False                                                                     │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\TimBr\\Music Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\09. Flume - Spring.mp3'

During handling of the above exception, another exception occurred:

┌─────────────────────────────── Traceback (most recent call last)                                                                         │
│                                                                                                  │
│ ┌───────────────────────────────── locals ──────────────────────────────────┐                    │
│                    Irrelevant traceback cascade removed; too long
│ └───────────────────────────────────────────────────────────────────────────┘                    │
│                                                                                                  │
│ C:\Users\TimBr\Music Curation\streamrip_dev\.venv\Lib\site-packages\mutagen\_util.py:272 in      │
│ _openfile                                                                                        │
│                                                                                                  │
│    269 │   │   │   │   except IOError as e2:                                                     │
│    270 │   │   │   │   │   raise MutagenError(e2)                                                │
│    271 │   │   │   else:                                                                         │
│ >  272 │   │   │   │   raise MutagenError(e)                                                     │
│    273 │   │                                                                                     │
│    274 │   │   with fileobj as fileobj:                                                          │
│    275 │   │   │   yield FileThing(fileobj, filename, filename)                                  │
│                                                                                                  │
│ ┌─────────────────────────────────────────── locals ───────────────────────────────────────────┐ │
│ │           create = False                                                                     │ │
│ │         filename = 'C:\\Users\\TimBr\\Music                                                  │ │
│ │                    Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\0'+21       │ │
│ │          fileobj = None                                                                      │ │
│ │        filething = 'C:\\Users\\TimBr\\Music                                                  │ │
│ │                    Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\0'+21       │ │
│ │ inmemory_fileobj = False                                                                     │ │
│ │         instance = {}                                                                        │ │
│ │         writable = False                                                                     │ │
│ └──────────────────────────────────────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
MutagenError: [Errno 2] No such file or directory: 'C:\\Users\\TimBr\\Music Curation\\streamrip_dev\\StreamripDownloads\\Glow Weird Wubs\\09. Flume - Spring.mp3'
sys:1: RuntimeWarning: coroutine 'Playlist.download.<locals>._resolve_download' was never awaited

Config File

[downloads]
# Folder where tracks are downloaded to
folder = "C:\\Users\\TimBr\\Music Curation\\streamrip_dev\\StreamripDownloads"
# Put Qobuz albums in a 'Qobuz' folder, Tidal albums in 'Tidal' etc.
source_subdirectories = false
# Put tracks in an album with 2 or more discs into a subfolder named `Disc N` 
disc_subdirectories = true
# Download (and convert) tracks all at once, instead of sequentially. 
# If you are converting the tracks, or have fast internet, this will 
# substantially improve processing speed.
concurrency = true
# The maximum number of tracks to download at once
# If you have very fast internet, you will benefit from a higher value,
# A value that is too high for your bandwidth may cause slowdowns
# Set to -1 for no limit
max_connections = 8
# Max number of API requests per source to handle per minute
# Set to -1 for no limit
requests_per_minute = 60

[qobuz]
# 1: 320kbps MP3, 2: 16/44.1, 3: 24/<=96, 4: 24/>=96
quality = 3
# This will download booklet pdfs that are included with some albums
download_booklets = true

# Authenticate to Qobuz using auth token? Value can be true/false only
use_auth_token = false
# Enter your userid if the above use_auth_token is set to true, else enter your email
email_or_userid = ""
# Enter your auth token if the above use_auth_token is set to true, else enter the md5 hash of your plaintext password
password_or_token = ""
# Do not change
app_id = ""
# Do not change
secrets = []

[tidal]
# 0: 256kbps AAC, 1: 320kbps AAC, 2: 16/44.1 "HiFi" FLAC, 3: 24/44.1 "MQA" FLAC
quality = 3
# This will download videos included in Video Albums.
download_videos = true

# Do not change any of the fields below
user_id = ""
country_code = ""
access_token = ""
refresh_token = ""
# Tokens last 1 week after refresh. This is the Unix timestamp of the expiration
# time. If you haven't used streamrip in more than a week, you may have to log
# in again using `rip config --tidal`
token_expiry = ""

[deezer]
# 0, 1, or 2
# This only applies to paid Deezer subscriptions. Those using deezloader
# are automatically limited to quality = 1
quality = 2
# An authentication cookie that allows streamrip to use your Deezer account
# See https://github.com/nathom/streamrip/wiki/Finding-Your-Deezer-ARL-Cookie
# for instructions on how to find this
arl = ""
# This allows for free 320kbps MP3 downloads from Deezer
# If an arl is provided, deezloader is never used
use_deezloader = false
# This warns you when the paid deezer account is not logged in and rip falls
# back to deezloader, which is unreliable
deezloader_warnings = true

[soundcloud]
# Only 0 is available for now
quality = 0
# This changes periodically, so it needs to be updated
client_id = ""
app_version = ""

[youtube]
# Only 0 is available for now
quality = 0
# Download the video along with the audio
download_videos = false
# The path to download the videos to
video_downloads_folder = "C:\\Users\\TimBr\\Music Curation\\streamrip_dev\\StreamripDownloads\\YouTubeVideos"

[database]
# Create a database that contains all the track IDs downloaded so far
# Any time a track logged in the database is requested, it is skipped
# This can be disabled temporarily with the --no-db flag
downloads_enabled = true
# Path to the downloads database 
downloads_path = "C:\\Users\\TimBr\\AppData\\Roaming\\streamrip\\downloads.db"
# If a download fails, the item ID is stored here. Then, `rip repair` can be
# called to retry the downloads
failed_downloads_enabled = true
failed_downloads_path = "C:\\Users\\TimBr\\AppData\\Roaming\\streamrip\\failed_downloads.db"

# Convert tracks to a codec after downloading them.
[conversion]
enabled = true
# FLAC, ALAC, OPUS, MP3, VORBIS, or AAC
codec = "MP3"
# In Hz. Tracks are downsampled if their sampling rate is greater than this. 
# Value of 48000 is recommended to maximize quality and minimize space
sampling_rate = 48000
# Only 16 and 24 are available. It is only applied when the bit depth is higher
# than this value.
bit_depth = 24
# Only applicable for lossy codecs
lossy_bitrate = 320

# Filter a Qobuz artist's discography. Set to 'true' to turn on a filter.
# This will also be applied to other sources, but is not guaranteed to work correctly
[qobuz_filters]
# Remove Collectors Editions, live recordings, etc.
extras = false
# Picks the highest quality out of albums with identical titles.
repeats = false
# Remove EPs and Singles
non_albums = false
# Remove albums whose artist is not the one requested
features = false
# Skip non studio albums
non_studio_albums = false
# Only download remastered albums
non_remaster = false

[artwork]
# Write the image to the audio file
embed = false
# The size of the artwork to embed. Options: thumbnail, small, large, original.
# "original" images can be up to 30MB, and may fail embedding. 
# Using "large" is recommended.
embed_size = "large"
# If this is set to a value > 0, max(width, height) of the embedded art will be set to this value in pixels
# Proportions of the image will remain the same
embed_max_width = -1
# Save the cover image at the highest quality as a seperate jpg file
save_artwork = true
# If this is set to a value > 0, max(width, height) of the saved art will be set to this value in pixels
# Proportions of the image will remain the same
saved_max_width = -1

[metadata]
# Sets the value of the 'ALBUM' field in the metadata to the playlist's name. 
# This is useful if your music library software organizes tracks based on album name.
set_playlist_to_album = true
# If part of a playlist, sets the `tracknumber` field in the metadata to the track's 
# position in the playlist instead of its position in its album
renumber_playlist_tracks = true
# The following metadata tags won't be applied
# See https://github.com/nathom/streamrip/wiki/Metadata-Tag-Names for more info
exclude = ["albumartist"]

# Changes the folder and file names generated by streamrip.
[filepaths]
# Create folders for single tracks within the downloads directory using the folder_format
# template
add_singles_to_folder = false
# Available keys: "albumartist", "title", "year", "bit_depth", "sampling_rate",
# "id", and "albumcomposer"
folder_format = "{albumartist} - {title} ({year}) [{container}] [{bit_depth}B-{sampling_rate}kHz]"
# Available keys: "tracknumber", "artist", "albumartist", "composer", "title",
# and "albumcomposer", "explicit"
track_format = "{tracknumber:02}. {artist} - {title}{explicit}"
# Only allow printable ASCII characters in filenames.
restrict_characters = false
# Truncate the filename if it is greater than this number of characters
# Setting this to false may cause downloads to fail on some systems
truncate_to = 120

# Last.fm playlists are downloaded by searching for the titles of the tracks
[lastfm]
# The source on which to search for the tracks.
source = "qobuz"
# If no results were found with the primary source, the item is searched for 
# on this one.
fallback_source = ""

[cli]
# Print "Downloading {Album name}" etc. to screen
text_output = true
# Show resolve, download progress bars
progress_bars = true
# The maximum number of search results to show in the interactive menu
max_search_results = 100

[misc]
# Metadata to identify this config file. Do not change.
version = "2.0.6"
# Print a message if a new version of streamrip is available 
check_for_updates = true

Operating System

Windows 11

streamrip version

2.0.5

Screenshots and recordings

No response

Additional context

Example playlist which throws error: "https://www.deezer.com/en/playlist/12798749361"

I transferred all my playlists yesterday from spotify to deezer with their transfer tool.

I'm not too familiar with the codebase, but going based off the errors and a quick perusal of some of the code. I assume the error handling of a forbidden track needs to pass/alter the state of expected tracks on which later functions rely

PaladinOfHonour commented 3 weeks ago

Temporary solution as of writing: Remove or download individually any track giving an error so it gets added to the database and will be skipped upon downloading the playlist

PaladinOfHonour commented 3 weeks ago

Temporary solution as of writing: Remove or download individually any track giving an error so it gets added to the database and will be skipped upon downloading the playlist image

nathom commented 3 weeks ago

Can you show the full traceback with rip -v <broken url>

mortalis13 commented 3 weeks ago

Should be reproducible anywhere with the provided example playlist.
Checked with the new venv in python 3.11.
I think you missed the first lines, maybe not so relevant, but better to have the full log just in case. It says that album data cannot be retrieved, so that could be part of the problem.

Basically these tracks should be skipped I guess, by capturing 403. It's weird, I saw a fix with if code == 403 somewhere here recently, but cannot find it now...

(Don't mind the .\\ in my paths, just downloading to a local directory instead of the default one)

[19:59:38] WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                           connectionpool.py:330
           WARNING  Connection pool is full, discarding connection: api.deezer.com. Connection pool size: 10                                                                                                           connectionpool.py:330
           ERROR    Error fetching album of track 644309822: DataException: album/89513762/tracks no data                                                                                                                       deezer.py:80
           ERROR    Error fetching album of track 916601802: DataException: album/138890842/tracks no data                                                                                                                      deezer.py:80
[19:59:43] ERROR    Error downloading track 'Spring', retrying: 403, message='Forbidden',                                                                                                                                        track.py:52
                    url=URL('https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b144223ddc5c9
                    c300e3a2afca94bd5f6dacc53a9391e96d6818b')
           ERROR    Persistent error downloading track 'Spring', skipping: 403, message='Forbidden',                                                                                                                             track.py:68
                    url=URL('https://e-cdns-proxy-a.dzcdn.net/mobile/1/cc75c6e244783e53305ebfffa37d76c6c6aea38af4cb5a4b1fd2cec889ea104baae942bfc41d4631237739deef68b3132d3aa1f79270caef7b182ce1d14fab9142fadf0b2fe9b144223ddc5c9
                    c300e3a2afca94bd5f6dacc53a9391e96d6818b')
─────────────────────────────────────────────────────────────────────────────────────────────────────── Downloading Glow Weird Wubs ────────────────────────────────────────────────────────────────────────────────────────────────────────
Track 3 ----------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 11.7% • 16.5 MB/s • 0:00:02
Track 1 -------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4.2%  • 4.5 MB/s  • 0:00:06
Track 2 ----------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 11.7% • 16.4 MB/s • 0:00:03
Track 4 ----- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 2.8%  • 3.1 MB/s  • 0:00:08
Track 6  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.3%  • ?         • -:--:--
Track 5 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 0.0%  • ?         • -:--:--
┌─────────────────────────────── Traceback (most recent call last) ────────────────────────────────┐
│ d:\01\venv\Lib\site-packages\mutagen\_util.py:251 in _openfile                                   │
│                                                                                                  │
│    248 │   │                                                                                     │
│    249 │   │   inmemory_fileobj = False                                                          │
│    250 │   │   try:                                                                              │
│ >  251 │   │   │   fileobj = open(filename, "rb+" if writable else "rb")                         │
│    252 │   │   except IOError as e:                                                              │
│    253 │   │   │   if writable and e.errno == errno.EOPNOTSUPP:                                  │
│    254 │   │   │   │   # Some file systems (gvfs over fuse) don't support opening                │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
FileNotFoundError: [Errno 2] No such file or directory: '.\\Glow Weird Wubs\\09. Flume - Spring.mp3'

During handling of the above exception, another exception occurred:

┌─────────────────────────────── Traceback (most recent call last) ────────────────────────────────┐
│ in _run_module_as_main:198                                                                       │
│ in _run_code:88                                                                                  │
│                                                                                                  │
│                                     ... 26 frames hidden ...                                     │
│                                                                                                  │
│ d:\Program Files\Python311\Lib\contextlib.py:137 in __enter__                                    │
│                                                                                                  │
│   134 │   │   # they are only needed for recreation, which is not possible anymore               │
│   135 │   │   del self.args, self.kwds, self.func                                                │
│   136 │   │   try:                                                                               │
│ > 137 │   │   │   return next(self.gen)                                                          │
│   138 │   │   except StopIteration:                                                              │
│   139 │   │   │   raise RuntimeError("generator didn't yield") from None                         │
│   140                                                                                            │
│                                                                                                  │
│ d:\01\venv\Lib\site-packages\mutagen\_util.py:272 in _openfile                                   │
│                                                                                                  │
│    269 │   │   │   │   except IOError as e2:                                                     │
│    270 │   │   │   │   │   raise MutagenError(e2)                                                │
│    271 │   │   │   else:                                                                         │
│ >  272 │   │   │   │   raise MutagenError(e)                                                     │
│    273 │   │                                                                                     │
│    274 │   │   with fileobj as fileobj:                                                          │
│    275 │   │   │   yield FileThing(fileobj, filename, filename)                                  │
└──────────────────────────────────────────────────────────────────────────────────────────────────┘
MutagenError: [Errno 2] No such file or directory: '.\\Glow Weird Wubs\\09. Flume - Spring.mp3'
sys:1: RuntimeWarning: coroutine 'Playlist.download.<locals>._resolve_download' was never awaited
mortalis13 commented 3 weeks ago

More info: tried downloading the tracks one by one and 2 of them, Spring and Blurred, give the same 403 error. It seems that the track link in the playlist is invalid, because I tool the shared link for Spring and in browser it resulted in page not found. But going to the album and taking link from there, it opened the track. And they have different IDs, if you pay attention.

btw, you can check the track links and other info using API link like this: https://api.deezer.com/playlist/12798749361/tracks

Somewhere in the issues here or in another project I saw someone mentioned that Deezer changes track IDs frequently and it brakes the funcionality of course.

So download errorred tracks separately is not a workaround basically, it's a solution for broken links in playlists. The only thing is that this code should skip such weird tracks and continue with the healthy ones.

mortalis13 commented 3 weeks ago

So if you publish the debug log for 1 of those invalid tracks it would be a bit shorter that for the whole playlist.

B1zguy commented 2 weeks ago

I also switched over to the dev branch due to this error. However, I'm finding that streamrip is seeing the individually downloaded track (ie. the link copied when clicking to the song outside of my playlist) as different to what's in the playlist - despite same track being played.

To note, the track that downloads from the direct link copied outside the playlist works yet not in the intended playlist's directory of course. In addition to the different iD issue, it seems to have a different name when trying (well, failing) via the usual playlist link vs via streamrip search and direct track link, both working fine.

Nevertheless, I can't seem to make streamrip skip the errored playlist track after successfully running streamrip for the URL or its search command.

Could the different track names being picked-up be why the suggested workaround isn't working? I hope I missed something obvious! I neither could find anything in the manpage regarding editing the downloads and failed databases via streamrip.