Commit Graph

459 Commits

Author SHA1 Message Date
Oskar Dudziński 9abf141411 🐛 Fixed missing releaseDate in albums (fix #260) 2026-04-29 14:00:43 +02:00
Oskar Dudziński 477b4b4635 🐛 Files are no longer written with restrictive permissions (#347)
* add chmod mask after file download (fix #265)

* 🚀 Bump version to 3.4.0a4
v3.4.0a4
2026-04-29 13:49:44 +02:00
Oskar Dudziński debca2fc1d 🚀 Bump version from 3.4.0a2 to 3.4.0a3 v3.4.0a3 2026-04-28 22:46:43 +02:00
Oskar Dudziński d830a8ed73 Updated auth credentials (#344)
* fix search command error

* update auth credentials

* log debug path at `add_flac_metadata`

* extract flac from high and max quality

* add --force option to auth logout
2026-04-28 22:46:08 +02:00
Oskar Dudziński 33b1e6c826 🔥 Removed unused print 2026-04-28 21:30:16 +02:00
Oskar Dudziński e32fde7794 🚀 Bump version from 3.4.0a1 to 3.4.0a2 v3.4.0a2 2026-04-28 21:28:09 +02:00
Oskar Dudziński 99804c0304 🐛 Credits entries in metadata are now safe (#343) 2026-04-28 21:27:31 +02:00
Oskar Dudziński 410146bdcf ♻️ Refactored search command 2026-04-28 16:49:36 +02:00
Reyth 859d50772d Added search command (#315)
* feat: search command

* fix: top match resource type

* fix: top hit resource type parsing logic

* fix: SearchArtist as non-nested class
2026-04-28 16:43:04 +02:00
Reyth 79c21f7842 🐛 Fixed album/playlist validation errors (#338) 2026-04-25 16:03:53 +02:00
Oskar Dudziński 0f76845c35 🚀 Bump version to 3.4.0a1 v3.4.0a1 2026-04-25 00:55:38 +02:00
Piotr Karbowski b1e28a8ae6 Added match_existing_path_case option (#335)
When enabled, existing path components are reused even if Tidal returns
different casing. This avoids creating separate paths on case-sensitive
filesystems that would conflict later when moved to case-insensitive systems.
For example, if "FooBar" already exists and the API returns "foobar",
downloads will continue under "FooBar".

Co-authored-by: Piotr Karbowski <git.throwaway941@simplelogin.com>
2026-04-25 00:55:02 +02:00
Francesco 658e4a81ab 🐛 Stream codec is now honored when picking track file extension (#336) 2026-04-25 00:35:45 +02:00
Oskar Dudziński 4b6b23225a 🚀 Bump version from 3.2.3 to 3.3.0 v3.3.0 2026-04-23 23:03:02 +02:00
Mijael Viricochea ed9a05c666 Added option to write LRC file (#308) 2026-04-23 22:59:38 +02:00
xiliourt 8a2c30feaf 🐬 Remove hidden directories in Dockerfile (#326)
* Update Dockerfile

* Clears entire directory after install

Hidden folders such as .git, .vscode, etc were remaining in the docker build unintentionally. This update clears all files once tiddl is installed.
2026-04-13 22:35:38 +02:00
Oskar Dudziński cda1dc6a7a 🐛 Fixed missing metadata when downloading a single track 2026-04-11 17:04:17 +02:00
Oskar Dudziński 7de23cee1b Bump version from 3.2.3a1 to 3.2.3 v3.2.3 2026-04-11 11:27:38 +02:00
Oskar Dudziński 89e4d5c08e ♻️ Skipping errors is now a default behaviour 2026-04-09 20:57:04 +02:00
Oskar Dudziński a1deba92cc Add tiddl version field to bug report template
Added a field for specifying the installed tiddl version.
2026-04-08 12:55:49 +02:00
Oskar Dudziński 0b11c63eba 📝 Added link fallbacks in main cli call 2026-04-06 19:04:33 +02:00
Oskar Dudziński fc074543d1 Bump version to 3.2.3a1 v3.2.3a1 2026-04-06 09:44:21 +02:00
Magnetkopf d9e2314447 Added no browser opening option for authenticating command (#317)
* feat(auth): add no browser mode

* chore: merge print statements
2026-04-06 09:42:51 +02:00
Magnetkopf c3dd2d0606 Artist tag is now a list (#316) 2026-04-05 10:54:46 +02:00
xoconoch 401313cd27 Changed artist separator to ";"
* chore: change separator to "; "

* chore: finishing changin separators

* chore: continue changing separators

---------

Co-authored-by: Ohjne <er@le.com>
2026-04-05 10:48:16 +02:00
Oskar Dudziński b6ddd6b64e Bump version from 3.2.1 to 3.2.2 v3.2.2 2026-03-08 07:53:39 +01:00
nikudaorg 3948c79412 🐛 Fixed auth errors (#300)
Resolves issue #299.

int | str is used instead of updating the type to only "str" because the API change appears to have been introduced quietly and may revert in the future. Since the exact type of these fields is not critical for the library, supporting both types provides a safer and more resilient approach.
2026-03-08 07:53:05 +01:00
Oskar Dudziński ee7e079a27 🚀 Bump version from 3.2.0 to 3.2.1 v3.2.1 2026-02-26 14:42:48 +01:00
TooYoungTooSimp 3d1314e198 Enable trust_env in aiohttp.ClientSession (#294) 2026-02-26 14:41:56 +01:00
Filip Voska cf0d1cd362 fix: handle null/missing fields in Video API responses (#295)
* fix: handle null/missing fields in Video API responses

Tidal's API returns some Video objects (lyric/visualiser videos on
artist pages) with fields that don't match the current strict models:

- `imageId` can be null instead of a string
- The nested `album` object can be present but missing `id`, `title`,
  and `cover`

These validation failures cause the entire `ArtistVideosItems` page
to be rejected by Pydantic before any video can be parsed, resulting
in 0 downloads when targeting an artist with `--videos`.

A second independent bug causes an `AttributeError` on every video:
the default template `{album.artist}/{album.title}/{item.title}` is
shared with videos, but many videos have no album. When `album=None`
is passed to `format_template`, Python's `str.format()` evaluates
`None.artist` and raises `AttributeError: 'NoneType' object has no
attribute 'artist'`, which is caught and printed as an error for
every single video.

Fix:
- `resources.py`: make `Video.imageId` and `Video.Album.{id,title,
  cover}` optional so incomplete API responses pass validation
- `format.py`: give `AlbumTemplate` field defaults so it can be
  instantiated empty; use `AlbumTemplate()` as fallback instead of
  `None` when no album is present, so `{album.*}` tokens render as
  empty strings rather than raising AttributeError
- `download/__init__.py`: guard `video.album.id` accesses against
  `None` (now possible after the model fix) in both video code paths

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test: add tests for Video model null fields and AlbumTemplate fallback

Covers the two bugs fixed in the previous commit:

- Video model accepts null/missing imageId and partial album objects
- format_template does not raise AttributeError when album is None
  and the template references {album.*} tokens

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-26 14:35:33 +01:00
Oskar Dudziński 381003097f 🚀 Bump version from 3.1.5 to 3.2.0 v3.2.0 2026-01-18 17:38:08 +01:00
hexx.one 06f9d940d9 Added --skip-errors flag to skip unavailable items during download (#274)
* feat: Add `--skip-errors` flag to skip unavailable items during download

* feat: skip-error handling for unavailable items in albums, artists & mixes; fix some missing template variables

* fixes #267
2026-01-18 17:35:54 +01:00
M1chal3k28 fbf79d70e6 📝 Rename 'embed_lyrics' to 'lyrics' in example config (#280) 2026-01-18 17:31:42 +01:00
Oskar Dudziński 9f7d3aec1e 🐛 Album/artist download errors related to templates are now handled (#257)
* refactor variable name in _clean_segment function for clarity

* Add error handling documentation for format_template function

* Add error handling for album template formatting in download_callback
2025-12-05 14:11:47 +01:00
Oskar Dudziński c5d5b365c8 🚀 Bump version from 3.1.4 to 3.1.5 v3.1.5 2025-12-03 01:12:23 +01:00
Oskar Dudziński f691c7ba0a 🐛 Fixed cover that can be None. 2025-12-03 01:12:07 +01:00
Oskar Dudziński 82c4ce0c37 🐛 Fixed covers that were fetched unnecessarily #245 (#254)
* fetch cover only when item is about to be downloaded

* rename cover method to `fetch_data`

* 🚀 Bump version from 3.1.4a3 to 3.1.4
v3.1.4
2025-12-01 19:05:46 +01:00
Oskar Dudziński 145a776b63 🚀 Bump version from 3.1.4a2 to 3.1.4a3 v3.1.4a3 2025-12-01 01:14:40 +01:00
Oskar Dudziński cf0ef2d304 Sort credits contributors surname alphabetically #247 2025-12-01 01:13:59 +01:00
Oskar Dudziński 2332708326 🚀 Bump version from 3.1.4a1 to 3.1.4a2 v3.1.4a2 2025-11-29 22:59:16 +01:00
Oskar Dudziński cbcb55d14a 🐛 Item's path segments are now cleaned #251 2025-11-29 22:57:10 +01:00
Oskar Dudziński 1480be4aed 🏷️ Make audio properties optional in TrackStream model, closes #252 2025-11-29 19:07:07 +01:00
Oskar Dudziński 789fc6bb4a Bump version to 3.1.4a1 v3.1.4a1 2025-11-24 21:04:19 +01:00
Oskar Dudziński a794fa0673 🐛 Fixed cover fetching 2025-11-24 20:00:35 +01:00
Oskar Dudziński d56398168e Revert " Added album lyrics download to .lrc file (#241)" (#248)
This reverts commit f2ee4f8fad.
2025-11-24 19:49:25 +01:00
Daniele Russo f2ee4f8fad Added album lyrics download to .lrc file (#241)
* adding flag for download lyrics

* adding sum debug info

* adding configuration part

* Update config.example.toml

* refactor: move lyrics to utility and apply code review feedback

* refactor: optimize lyrics download and apply code review feedback

- Pass album_items directly to lyrics function to avoid redundant API calls
- Remove unused Path import from api.py
- Remove duplicate debug logging already covered elsewhere
- Use last_album_items reference instead of fetching data again
- Move lyrics download logic to separate utility function in core.utils.lyrics
- Keep lyrics configuration only in docs/config.example.toml without modifying other settings

This optimization reduces API calls by reusing already fetched album items data instead of making new requests for lyrics download.
2025-11-24 19:25:13 +01:00
Oskar Dudziński b9f586574a 🚀 Bump to 3.1.3 v3.1.3 2025-11-23 13:11:09 +01:00
Oskar Dudziński 94db88bd08 🚀 bump to 3.1.3a1 v3.1.3a1 2025-11-22 23:18:18 +01:00
Oskar Dudziński d978e87641 🐛 Fixed invalid track covers when downloading playlist #244 2025-11-22 23:17:41 +01:00
Oskar Dudziński f605c628da 🚀 bump to 3.1.2 v3.1.2 2025-11-21 22:17:24 +01:00