diff --git a/streamrip/client/__init__.py b/streamrip/client/__init__.py new file mode 100644 index 0000000..022a1bc --- /dev/null +++ b/streamrip/client/__init__.py @@ -0,0 +1,16 @@ +from .client import Client +from .deezer_client import DeezerClient +from .downloadable import BasicDownloadable, Downloadable +from .qobuz_client import QobuzClient +from .soundcloud_client import SoundcloudClient +from .tidal_client import TidalClient + +__all__ = [ + "Client", + "DeezerClient", + "TidalClient", + "QobuzClient", + "SoundcloudClient", + "Downloadable", + "BasicDownloadable", +] diff --git a/streamrip/client.py b/streamrip/client/client.py similarity index 89% rename from streamrip/client.py rename to streamrip/client/client.py index 3ab7213..0648c01 100644 --- a/streamrip/client.py +++ b/streamrip/client/client.py @@ -1,9 +1,7 @@ """The clients that interact with the streaming service APIs.""" -import asyncio import logging from abc import ABC, abstractmethod -from typing import Optional, Union import aiohttp import aiolimiter @@ -42,7 +40,7 @@ class Client(ABC): @staticmethod def get_rate_limiter( requests_per_min: int, - ) -> Optional[aiolimiter.AsyncLimiter]: + ) -> aiolimiter.AsyncLimiter | None: return ( aiolimiter.AsyncLimiter(requests_per_min, 60) if requests_per_min > 0 @@ -50,7 +48,7 @@ class Client(ABC): ) @staticmethod - async def get_session(headers: Optional[dict] = None) -> aiohttp.ClientSession: + async def get_session(headers: dict | None = None) -> aiohttp.ClientSession: if headers is None: headers = {} return aiohttp.ClientSession( diff --git a/streamrip/deezer_client.py b/streamrip/client/deezer_client.py similarity index 97% rename from streamrip/deezer_client.py rename to streamrip/client/deezer_client.py index a9277a2..0d185c1 100644 --- a/streamrip/deezer_client.py +++ b/streamrip/client/deezer_client.py @@ -4,10 +4,10 @@ import hashlib import deezer from Cryptodome.Cipher import AES +from ..config import Config +from ..exceptions import AuthenticationError, MissingCredentials, NonStreamable from .client import Client -from .config import Config from .downloadable import DeezerDownloadable -from .exceptions import AuthenticationError, MissingCredentials, NonStreamable class DeezerClient(Client): diff --git a/streamrip/downloadable.py b/streamrip/client/downloadable.py similarity index 99% rename from streamrip/downloadable.py rename to streamrip/client/downloadable.py index 96c21d2..f4ac0dd 100644 --- a/streamrip/downloadable.py +++ b/streamrip/client/downloadable.py @@ -17,8 +17,8 @@ import aiohttp import m3u8 from Cryptodome.Cipher import Blowfish -from . import converter -from .exceptions import NonStreamable +from .. import converter +from ..exceptions import NonStreamable def generate_temp_path(url: str): diff --git a/streamrip/qobuz_client.py b/streamrip/client/qobuz_client.py similarity index 99% rename from streamrip/qobuz_client.py rename to streamrip/client/qobuz_client.py index f4b2c33..c76054c 100644 --- a/streamrip/qobuz_client.py +++ b/streamrip/client/qobuz_client.py @@ -5,10 +5,8 @@ import re import time from typing import AsyncGenerator, Optional -from .client import Client -from .config import Config -from .downloadable import BasicDownloadable, Downloadable -from .exceptions import ( +from ..config import Config +from ..exceptions import ( AuthenticationError, IneligibleError, InvalidAppIdError, @@ -16,6 +14,8 @@ from .exceptions import ( MissingCredentials, NonStreamable, ) +from .client import Client +from .downloadable import BasicDownloadable, Downloadable from .qobuz_spoofer import QobuzSpoofer logger = logging.getLogger("streamrip") diff --git a/streamrip/qobuz_spoofer.py b/streamrip/client/qobuz_spoofer.py similarity index 100% rename from streamrip/qobuz_spoofer.py rename to streamrip/client/qobuz_spoofer.py diff --git a/streamrip/soundcloud_client.py b/streamrip/client/soundcloud_client.py similarity index 99% rename from streamrip/soundcloud_client.py rename to streamrip/client/soundcloud_client.py index 306e646..ee650d4 100644 --- a/streamrip/soundcloud_client.py +++ b/streamrip/client/soundcloud_client.py @@ -3,10 +3,10 @@ import itertools import logging import re +from ..config import Config +from ..exceptions import NonStreamable from .client import Client -from .config import Config from .downloadable import SoundcloudDownloadable -from .exceptions import NonStreamable BASE = "https://api-v2.soundcloud.com" SOUNDCLOUD_USER_ID = "672320-86895-162383-801513" diff --git a/streamrip/tidal_client.py b/streamrip/client/tidal_client.py similarity index 99% rename from streamrip/tidal_client.py rename to streamrip/client/tidal_client.py index d406028..230d1d1 100644 --- a/streamrip/tidal_client.py +++ b/streamrip/client/tidal_client.py @@ -1,8 +1,8 @@ import base64 import time +from ..config import Config from .client import Client -from .config import Config BASE = "https://api.tidalhifi.com/v1" AUTH_URL = "https://auth.tidal.com/v1/oauth2" diff --git a/streamrip/cli.py b/streamrip/legacy/cli.py similarity index 100% rename from streamrip/cli.py rename to streamrip/legacy/cli.py diff --git a/streamrip/core.py b/streamrip/legacy/core.py similarity index 100% rename from streamrip/core.py rename to streamrip/legacy/core.py diff --git a/streamrip/media/__init__.py b/streamrip/media/__init__.py new file mode 100644 index 0000000..9aa0f6b --- /dev/null +++ b/streamrip/media/__init__.py @@ -0,0 +1,21 @@ +from .album import Album, PendingAlbum +from .artist import Artist, PendingArtist +from .label import Label, PendingLabel +from .media import Media +from .playlist import PendingPlaylist, PendingPlaylistTrack, Playlist +from .track import PendingTrack, Track + +__all__ = [ + "Album", + "Artist", + "Label", + "Media", + "PendingAlbum", + "PendingArtist", + "PendingLabel", + "PendingPlaylist", + "PendingPlaylistTrack", + "PendingTrack", + "Playlist", + "Track", +] diff --git a/streamrip/album.py b/streamrip/media/album.py similarity index 91% rename from streamrip/album.py rename to streamrip/media/album.py index 071d4b3..542b271 100644 --- a/streamrip/album.py +++ b/streamrip/media/album.py @@ -3,15 +3,15 @@ import logging import os from dataclasses import dataclass -from . import progress +from .. import progress +from ..client import Client +from ..config import Config +from ..db import Database +from ..exceptions import NonStreamable +from ..metadata import AlbumMetadata +from ..metadata.util import get_album_track_ids from .artwork import download_artwork -from .client import Client -from .config import Config -from .db import Database -from .exceptions import NonStreamable from .media import Media, Pending -from .metadata import AlbumMetadata -from .metadata.util import get_album_track_ids from .track import PendingTrack logger = logging.getLogger("streamrip") diff --git a/streamrip/album_list.py b/streamrip/media/album_list.py similarity index 95% rename from streamrip/album_list.py rename to streamrip/media/album_list.py index a717f00..739e0f6 100644 --- a/streamrip/album_list.py +++ b/streamrip/media/album_list.py @@ -1,9 +1,9 @@ import asyncio from dataclasses import dataclass +from ..client import Client +from ..config import Config from .album import PendingAlbum -from .client import Client -from .config import Config from .media import Media diff --git a/streamrip/artist.py b/streamrip/media/artist.py similarity index 84% rename from streamrip/artist.py rename to streamrip/media/artist.py index 732e30b..f460a14 100644 --- a/streamrip/artist.py +++ b/streamrip/media/artist.py @@ -1,12 +1,12 @@ from dataclasses import dataclass +from ..client import Client +from ..config import Config +from ..db import Database +from ..metadata import ArtistMetadata from .album import PendingAlbum from .album_list import AlbumList -from .client import Client -from .config import Config -from .db import Database from .media import Pending -from .metadata import ArtistMetadata class Artist(AlbumList): diff --git a/streamrip/artwork.py b/streamrip/media/artwork.py similarity index 97% rename from streamrip/artwork.py rename to streamrip/media/artwork.py index f3648dc..69c4187 100644 --- a/streamrip/artwork.py +++ b/streamrip/media/artwork.py @@ -6,9 +6,9 @@ import shutil import aiohttp from PIL import Image -from .config import ArtworkConfig -from .downloadable import BasicDownloadable -from .metadata import Covers +from ..client import BasicDownloadable +from ..config import ArtworkConfig +from ..metadata import Covers _artwork_tempdirs: set[str] = set() diff --git a/streamrip/label.py b/streamrip/media/label.py similarity index 84% rename from streamrip/label.py rename to streamrip/media/label.py index e7f9775..16eb53d 100644 --- a/streamrip/label.py +++ b/streamrip/media/label.py @@ -1,12 +1,12 @@ from dataclasses import dataclass +from ..client import Client +from ..config import Config +from ..db import Database +from ..metadata import LabelMetadata from .album import PendingAlbum from .album_list import AlbumList -from .client import Client -from .config import Config -from .db import Database from .media import Pending -from .metadata import LabelMetadata class Label(AlbumList): diff --git a/streamrip/media.py b/streamrip/media/media.py similarity index 100% rename from streamrip/media.py rename to streamrip/media/media.py diff --git a/streamrip/playlist.py b/streamrip/media/playlist.py similarity index 93% rename from streamrip/playlist.py rename to streamrip/media/playlist.py index 65e6004..83fe3fb 100644 --- a/streamrip/playlist.py +++ b/streamrip/media/playlist.py @@ -3,14 +3,14 @@ import logging import os from dataclasses import dataclass -from . import progress +from .. import progress +from ..client import Client +from ..config import Config +from ..db import Database +from ..filepath_utils import clean_filename +from ..metadata import AlbumMetadata, Covers, PlaylistMetadata, TrackMetadata from .artwork import download_artwork -from .client import Client -from .config import Config -from .db import Database -from .filepath_utils import clean_filename from .media import Media, Pending -from .metadata import AlbumMetadata, Covers, PlaylistMetadata, TrackMetadata from .track import Track logger = logging.getLogger("streamrip") diff --git a/streamrip/semaphore.py b/streamrip/media/semaphore.py similarity index 96% rename from streamrip/semaphore.py rename to streamrip/media/semaphore.py index d82b650..4edc1aa 100644 --- a/streamrip/semaphore.py +++ b/streamrip/media/semaphore.py @@ -1,6 +1,6 @@ import asyncio -from .config import DownloadsConfig +from ..config import DownloadsConfig INF = 9999 diff --git a/streamrip/track.py b/streamrip/media/track.py similarity index 94% rename from streamrip/track.py rename to streamrip/media/track.py index 5856cbe..ccbab72 100644 --- a/streamrip/track.py +++ b/streamrip/media/track.py @@ -3,18 +3,16 @@ import logging import os from dataclasses import dataclass -from . import converter +from .. import converter +from ..client import Client, Downloadable +from ..config import Config +from ..db import Database +from ..filepath_utils import clean_filename +from ..metadata import AlbumMetadata, Covers, TrackMetadata, tag_file +from ..progress import get_progress_callback from .artwork import download_artwork -from .client import Client -from .config import Config -from .db import Database -from .downloadable import Downloadable -from .filepath_utils import clean_filename from .media import Media, Pending -from .metadata import AlbumMetadata, Covers, TrackMetadata -from .progress import get_progress_callback from .semaphore import global_download_semaphore -from .tagger import tag_file logger = logging.getLogger("streamrip") diff --git a/streamrip/metadata/__init__.py b/streamrip/metadata/__init__.py index 1d9d087..4e33cb4 100644 --- a/streamrip/metadata/__init__.py +++ b/streamrip/metadata/__init__.py @@ -5,6 +5,7 @@ from .artist_metadata import ArtistMetadata from .covers import Covers from .label_metadata import LabelMetadata from .playlist_metadata import PlaylistMetadata +from .tagger import tag_file from .track_metadata import TrackMetadata __all__ = [ @@ -14,5 +15,6 @@ __all__ = [ "TrackMetadata", "PlaylistMetadata", "Covers", + "tag_file", "util", ] diff --git a/streamrip/tagger.py b/streamrip/metadata/tagger.py similarity index 99% rename from streamrip/tagger.py rename to streamrip/metadata/tagger.py index 4c095c0..ca25e3b 100644 --- a/streamrip/tagger.py +++ b/streamrip/metadata/tagger.py @@ -9,7 +9,7 @@ from mutagen.id3 import APIC # type: ignore from mutagen.id3 import ID3 from mutagen.mp4 import MP4, MP4Cover -from .metadata import TrackMetadata +from . import TrackMetadata logger = logging.getLogger("streamrip") diff --git a/streamrip/metadata/track_metadata.py b/streamrip/metadata/track_metadata.py index a48dec0..6f9768f 100644 --- a/streamrip/metadata/track_metadata.py +++ b/streamrip/metadata/track_metadata.py @@ -3,7 +3,6 @@ from __future__ import annotations from dataclasses import dataclass from typing import Optional -from ..exceptions import NonStreamable from .album_metadata import AlbumMetadata from .util import safe_get, typed diff --git a/streamrip/rip/__init__.py b/streamrip/rip/__init__.py new file mode 100644 index 0000000..2060ea1 --- /dev/null +++ b/streamrip/rip/__init__.py @@ -0,0 +1,3 @@ +from .cli import rip + +__all__ = ["rip"] diff --git a/streamrip/cli2.py b/streamrip/rip/cli.py similarity index 100% rename from streamrip/cli2.py rename to streamrip/rip/cli.py diff --git a/streamrip/main.py b/streamrip/rip/main.py similarity index 100% rename from streamrip/main.py rename to streamrip/rip/main.py diff --git a/streamrip/universal_url.py b/streamrip/rip/parse_url.py similarity index 100% rename from streamrip/universal_url.py rename to streamrip/rip/parse_url.py diff --git a/streamrip/prompter.py b/streamrip/rip/prompter.py similarity index 100% rename from streamrip/prompter.py rename to streamrip/rip/prompter.py diff --git a/streamrip/user_paths.py b/streamrip/rip/user_paths.py similarity index 100% rename from streamrip/user_paths.py rename to streamrip/rip/user_paths.py diff --git a/streamrip/validation_regexps.py b/streamrip/rip/validation_regexps.py similarity index 100% rename from streamrip/validation_regexps.py rename to streamrip/rip/validation_regexps.py