Download only videos from an artist (#181)

* add `getArtistVideos` api endpoint

* add `--only-video` flag

* bump version
This commit is contained in:
Oskar Dudziński
2025-11-03 16:59:54 +01:00
committed by GitHub
parent 0bc8802c0e
commit 1613f85978
4 changed files with 51 additions and 1 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "tiddl"
version = "2.7.0"
version = "2.8.0a1"
description = "Download Tidal tracks with CLI downloader."
readme = "README.md"
requires-python = ">=3.11"
+19
View File
@@ -17,6 +17,7 @@ from tiddl.models.api import (
AlbumItemsCredits,
Artist,
ArtistAlbumsItems,
ArtistVideosItems,
Favorites,
Playlist,
PlaylistItems,
@@ -51,6 +52,7 @@ def ensureLimit(limit: int, max_limit: int) -> int:
class Limits:
ARTIST_ALBUMS = 50
ARTIST_VIDEOS = 50
ALBUM_ITEMS = 10
ALBUM_ITEMS_MAX = 100
PLAYLIST = 50
@@ -177,6 +179,23 @@ class TidalApi:
expire_after=3600,
)
def getArtistVideos(
self,
artist_id: str | int,
limit: int = LIMITS.ARTIST_VIDEOS,
offset: int = 0,
):
return self.fetch(
ArtistVideosItems,
f"artists/{artist_id}/videos",
{
"countryCode": self.country_code,
"limit": limit,
"offset": offset,
},
expire_after=3600,
)
def getMix(
self,
mix_id: str | int,
+28
View File
@@ -99,6 +99,13 @@ logger = logging.getLogger(__name__)
is_flag=True,
help="Enable downloading videos",
)
@click.option(
"--only-video",
"-ov",
"ONLY_VIDEO",
is_flag=True,
help="Download only videos from an artist.",
)
@click.option(
"--scan-path",
"SCAN_PATH",
@@ -123,6 +130,7 @@ def DownloadCommand(
SINGLES_FILTER: SinglesFilter,
EMBED_LYRICS: bool,
DOWNLOAD_VIDEO: bool,
ONLY_VIDEO: bool,
SCAN_PATH: str | None,
SAVE_M3U: bool,
):
@@ -432,6 +440,26 @@ def DownloadCommand(
artist = api.getArtist(resource.id)
logger.info(f"Artist {artist.name!r}")
if ONLY_VIDEO:
offset = 0
while True:
artist_videos = api.getArtistVideos(resource.id, offset=offset)
for video in artist_videos.items:
filename = formatResource(
TEMPLATE or ctx.obj.config.template.video, video
)
submitItem(video, filename)
if offset > artist_videos.totalNumberOfItems:
break
offset += artist_videos.limit
return
def getAllAlbums(singles: bool):
offset = 0
+3
View File
@@ -6,6 +6,7 @@ from tiddl.models.resource import Album, Artist, Playlist, Track, TrackQuality,
__all__ = [
"SessionResponse",
"ArtistAlbumsItems",
"ArtistVideosItems",
"AlbumItems",
"PlaylistItems",
"Favorites",
@@ -39,6 +40,8 @@ class Items(BaseModel):
class ArtistAlbumsItems(Items):
items: List[Album]
class ArtistVideosItems(Items):
items: List[Video]
ItemType = Literal["track", "video"]