mirror of
https://github.com/nathom/streamrip.git
synced 2025-05-28 22:16:06 -04:00
Clean up file structure
This commit is contained in:
parent
3e6284b04d
commit
df79746c71
30 changed files with 90 additions and 53 deletions
16
streamrip/client/__init__.py
Normal file
16
streamrip/client/__init__.py
Normal file
|
@ -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",
|
||||||
|
]
|
|
@ -1,9 +1,7 @@
|
||||||
"""The clients that interact with the streaming service APIs."""
|
"""The clients that interact with the streaming service APIs."""
|
||||||
|
|
||||||
import asyncio
|
|
||||||
import logging
|
import logging
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from typing import Optional, Union
|
|
||||||
|
|
||||||
import aiohttp
|
import aiohttp
|
||||||
import aiolimiter
|
import aiolimiter
|
||||||
|
@ -42,7 +40,7 @@ class Client(ABC):
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_rate_limiter(
|
def get_rate_limiter(
|
||||||
requests_per_min: int,
|
requests_per_min: int,
|
||||||
) -> Optional[aiolimiter.AsyncLimiter]:
|
) -> aiolimiter.AsyncLimiter | None:
|
||||||
return (
|
return (
|
||||||
aiolimiter.AsyncLimiter(requests_per_min, 60)
|
aiolimiter.AsyncLimiter(requests_per_min, 60)
|
||||||
if requests_per_min > 0
|
if requests_per_min > 0
|
||||||
|
@ -50,7 +48,7 @@ class Client(ABC):
|
||||||
)
|
)
|
||||||
|
|
||||||
@staticmethod
|
@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:
|
if headers is None:
|
||||||
headers = {}
|
headers = {}
|
||||||
return aiohttp.ClientSession(
|
return aiohttp.ClientSession(
|
|
@ -4,10 +4,10 @@ import hashlib
|
||||||
import deezer
|
import deezer
|
||||||
from Cryptodome.Cipher import AES
|
from Cryptodome.Cipher import AES
|
||||||
|
|
||||||
|
from ..config import Config
|
||||||
|
from ..exceptions import AuthenticationError, MissingCredentials, NonStreamable
|
||||||
from .client import Client
|
from .client import Client
|
||||||
from .config import Config
|
|
||||||
from .downloadable import DeezerDownloadable
|
from .downloadable import DeezerDownloadable
|
||||||
from .exceptions import AuthenticationError, MissingCredentials, NonStreamable
|
|
||||||
|
|
||||||
|
|
||||||
class DeezerClient(Client):
|
class DeezerClient(Client):
|
|
@ -17,8 +17,8 @@ import aiohttp
|
||||||
import m3u8
|
import m3u8
|
||||||
from Cryptodome.Cipher import Blowfish
|
from Cryptodome.Cipher import Blowfish
|
||||||
|
|
||||||
from . import converter
|
from .. import converter
|
||||||
from .exceptions import NonStreamable
|
from ..exceptions import NonStreamable
|
||||||
|
|
||||||
|
|
||||||
def generate_temp_path(url: str):
|
def generate_temp_path(url: str):
|
|
@ -5,10 +5,8 @@ import re
|
||||||
import time
|
import time
|
||||||
from typing import AsyncGenerator, Optional
|
from typing import AsyncGenerator, Optional
|
||||||
|
|
||||||
from .client import Client
|
from ..config import Config
|
||||||
from .config import Config
|
from ..exceptions import (
|
||||||
from .downloadable import BasicDownloadable, Downloadable
|
|
||||||
from .exceptions import (
|
|
||||||
AuthenticationError,
|
AuthenticationError,
|
||||||
IneligibleError,
|
IneligibleError,
|
||||||
InvalidAppIdError,
|
InvalidAppIdError,
|
||||||
|
@ -16,6 +14,8 @@ from .exceptions import (
|
||||||
MissingCredentials,
|
MissingCredentials,
|
||||||
NonStreamable,
|
NonStreamable,
|
||||||
)
|
)
|
||||||
|
from .client import Client
|
||||||
|
from .downloadable import BasicDownloadable, Downloadable
|
||||||
from .qobuz_spoofer import QobuzSpoofer
|
from .qobuz_spoofer import QobuzSpoofer
|
||||||
|
|
||||||
logger = logging.getLogger("streamrip")
|
logger = logging.getLogger("streamrip")
|
|
@ -3,10 +3,10 @@ import itertools
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from ..config import Config
|
||||||
|
from ..exceptions import NonStreamable
|
||||||
from .client import Client
|
from .client import Client
|
||||||
from .config import Config
|
|
||||||
from .downloadable import SoundcloudDownloadable
|
from .downloadable import SoundcloudDownloadable
|
||||||
from .exceptions import NonStreamable
|
|
||||||
|
|
||||||
BASE = "https://api-v2.soundcloud.com"
|
BASE = "https://api-v2.soundcloud.com"
|
||||||
SOUNDCLOUD_USER_ID = "672320-86895-162383-801513"
|
SOUNDCLOUD_USER_ID = "672320-86895-162383-801513"
|
|
@ -1,8 +1,8 @@
|
||||||
import base64
|
import base64
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
from ..config import Config
|
||||||
from .client import Client
|
from .client import Client
|
||||||
from .config import Config
|
|
||||||
|
|
||||||
BASE = "https://api.tidalhifi.com/v1"
|
BASE = "https://api.tidalhifi.com/v1"
|
||||||
AUTH_URL = "https://auth.tidal.com/v1/oauth2"
|
AUTH_URL = "https://auth.tidal.com/v1/oauth2"
|
21
streamrip/media/__init__.py
Normal file
21
streamrip/media/__init__.py
Normal file
|
@ -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",
|
||||||
|
]
|
|
@ -3,15 +3,15 @@ import logging
|
||||||
import os
|
import os
|
||||||
from dataclasses import dataclass
|
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 .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 .media import Media, Pending
|
||||||
from .metadata import AlbumMetadata
|
|
||||||
from .metadata.util import get_album_track_ids
|
|
||||||
from .track import PendingTrack
|
from .track import PendingTrack
|
||||||
|
|
||||||
logger = logging.getLogger("streamrip")
|
logger = logging.getLogger("streamrip")
|
|
@ -1,9 +1,9 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
from ..client import Client
|
||||||
|
from ..config import Config
|
||||||
from .album import PendingAlbum
|
from .album import PendingAlbum
|
||||||
from .client import Client
|
|
||||||
from .config import Config
|
|
||||||
from .media import Media
|
from .media import Media
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
from dataclasses import dataclass
|
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 import PendingAlbum
|
||||||
from .album_list import AlbumList
|
from .album_list import AlbumList
|
||||||
from .client import Client
|
|
||||||
from .config import Config
|
|
||||||
from .db import Database
|
|
||||||
from .media import Pending
|
from .media import Pending
|
||||||
from .metadata import ArtistMetadata
|
|
||||||
|
|
||||||
|
|
||||||
class Artist(AlbumList):
|
class Artist(AlbumList):
|
|
@ -6,9 +6,9 @@ import shutil
|
||||||
import aiohttp
|
import aiohttp
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
from .config import ArtworkConfig
|
from ..client import BasicDownloadable
|
||||||
from .downloadable import BasicDownloadable
|
from ..config import ArtworkConfig
|
||||||
from .metadata import Covers
|
from ..metadata import Covers
|
||||||
|
|
||||||
_artwork_tempdirs: set[str] = set()
|
_artwork_tempdirs: set[str] = set()
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
from dataclasses import dataclass
|
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 import PendingAlbum
|
||||||
from .album_list import AlbumList
|
from .album_list import AlbumList
|
||||||
from .client import Client
|
|
||||||
from .config import Config
|
|
||||||
from .db import Database
|
|
||||||
from .media import Pending
|
from .media import Pending
|
||||||
from .metadata import LabelMetadata
|
|
||||||
|
|
||||||
|
|
||||||
class Label(AlbumList):
|
class Label(AlbumList):
|
|
@ -3,14 +3,14 @@ import logging
|
||||||
import os
|
import os
|
||||||
from dataclasses import dataclass
|
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 .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 .media import Media, Pending
|
||||||
from .metadata import AlbumMetadata, Covers, PlaylistMetadata, TrackMetadata
|
|
||||||
from .track import Track
|
from .track import Track
|
||||||
|
|
||||||
logger = logging.getLogger("streamrip")
|
logger = logging.getLogger("streamrip")
|
|
@ -1,6 +1,6 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
from .config import DownloadsConfig
|
from ..config import DownloadsConfig
|
||||||
|
|
||||||
INF = 9999
|
INF = 9999
|
||||||
|
|
|
@ -3,18 +3,16 @@ import logging
|
||||||
import os
|
import os
|
||||||
from dataclasses import dataclass
|
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 .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 .media import Media, Pending
|
||||||
from .metadata import AlbumMetadata, Covers, TrackMetadata
|
|
||||||
from .progress import get_progress_callback
|
|
||||||
from .semaphore import global_download_semaphore
|
from .semaphore import global_download_semaphore
|
||||||
from .tagger import tag_file
|
|
||||||
|
|
||||||
logger = logging.getLogger("streamrip")
|
logger = logging.getLogger("streamrip")
|
||||||
|
|
|
@ -5,6 +5,7 @@ from .artist_metadata import ArtistMetadata
|
||||||
from .covers import Covers
|
from .covers import Covers
|
||||||
from .label_metadata import LabelMetadata
|
from .label_metadata import LabelMetadata
|
||||||
from .playlist_metadata import PlaylistMetadata
|
from .playlist_metadata import PlaylistMetadata
|
||||||
|
from .tagger import tag_file
|
||||||
from .track_metadata import TrackMetadata
|
from .track_metadata import TrackMetadata
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
@ -14,5 +15,6 @@ __all__ = [
|
||||||
"TrackMetadata",
|
"TrackMetadata",
|
||||||
"PlaylistMetadata",
|
"PlaylistMetadata",
|
||||||
"Covers",
|
"Covers",
|
||||||
|
"tag_file",
|
||||||
"util",
|
"util",
|
||||||
]
|
]
|
||||||
|
|
|
@ -9,7 +9,7 @@ from mutagen.id3 import APIC # type: ignore
|
||||||
from mutagen.id3 import ID3
|
from mutagen.id3 import ID3
|
||||||
from mutagen.mp4 import MP4, MP4Cover
|
from mutagen.mp4 import MP4, MP4Cover
|
||||||
|
|
||||||
from .metadata import TrackMetadata
|
from . import TrackMetadata
|
||||||
|
|
||||||
logger = logging.getLogger("streamrip")
|
logger = logging.getLogger("streamrip")
|
||||||
|
|
|
@ -3,7 +3,6 @@ from __future__ import annotations
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from ..exceptions import NonStreamable
|
|
||||||
from .album_metadata import AlbumMetadata
|
from .album_metadata import AlbumMetadata
|
||||||
from .util import safe_get, typed
|
from .util import safe_get, typed
|
||||||
|
|
||||||
|
|
3
streamrip/rip/__init__.py
Normal file
3
streamrip/rip/__init__.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from .cli import rip
|
||||||
|
|
||||||
|
__all__ = ["rip"]
|
Loading…
Add table
Add a link
Reference in a new issue