ruff: enable I lint

This commit is contained in:
Marcel Hellwig
2026-01-05 19:20:58 +01:00
parent 42502c93fc
commit ff013ac76e
68 changed files with 321 additions and 262 deletions

View File

@@ -5,9 +5,12 @@ sys.path = ["", ".."] + sys.path[1:]
from logging.config import fileConfig # noqa: E402
from sqlalchemy import ( # noqa: E402
engine_from_config,
pool,
)
from alembic import context # noqa: E402
from sqlalchemy import engine_from_config # noqa: E402
from sqlalchemy import pool # noqa: E402
# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
@@ -23,14 +26,20 @@ if config.config_file_name is not None:
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
from media_manager.auth.db import User, OAuthAccount # noqa: E402
from media_manager.auth.db import OAuthAccount, User # noqa: E402
from media_manager.config import MediaManagerConfig # noqa: E402
from media_manager.database import Base # noqa: E402
from media_manager.indexer.models import IndexerQueryResult # noqa: E402
from media_manager.torrent.models import Torrent # noqa: E402
from media_manager.tv.models import Show, Season, Episode, SeasonFile, SeasonRequest # noqa: E402
from media_manager.movies.models import Movie, MovieFile, MovieRequest # noqa: E402
from media_manager.notification.models import Notification # noqa: E402
from media_manager.database import Base # noqa: E402
from media_manager.config import MediaManagerConfig # noqa: E402
from media_manager.torrent.models import Torrent # noqa: E402
from media_manager.tv.models import ( # noqa: E402
Episode,
Season,
SeasonFile,
SeasonRequest,
Show,
)
target_metadata = Base.metadata

View File

@@ -8,9 +8,9 @@ Create Date: 2025-12-13 18:47:02.146038
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "16e78af9e5bf"

View File

@@ -8,9 +8,9 @@ Create Date: 2025-07-16 01:09:44.045395
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "1801d9f5a275"

View File

@@ -8,9 +8,9 @@ Create Date: 2025-06-22 13:46:01.973406
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "1f340754640a"

View File

@@ -8,9 +8,9 @@ Create Date: 2025-07-06 10:49:08.814496
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "21a19f0675f9"

View File

@@ -8,9 +8,9 @@ Create Date: 2025-12-23 19:42:09.593945
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "2c61f662ca9e"

View File

@@ -8,9 +8,10 @@ Create Date: 2025-07-09 20:55:42.338629
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "333866afcd2c"
down_revision: Union[str, None] = "aa4689f80796"

View File

@@ -8,9 +8,9 @@ Create Date: 2025-07-16 23:24:37.931188
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "5299dfed220b"

View File

@@ -8,9 +8,9 @@ Create Date: 2025-06-10 21:25:27.871064
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "7508237d5bc2"

View File

@@ -8,10 +8,11 @@ Create Date: 2025-05-27 21:36:18.532068
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "93fb07842385"
down_revision: Union[str, None] = None

View File

@@ -8,9 +8,9 @@ Create Date: 2025-07-06 10:54:19.714809
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "aa4689f80796"

View File

@@ -8,9 +8,9 @@ Create Date: 2025-10-28 21:39:24.480466
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "eb0bd3cc1852"

View File

@@ -1,7 +1,8 @@
from pydantic_settings import BaseSettings
from pydantic import Field
import secrets
from pydantic import Field
from pydantic_settings import BaseSettings
class OpenIdConfig(BaseSettings):
client_id: str = ""

View File

@@ -3,16 +3,16 @@ from typing import Optional
from fastapi import Depends
from fastapi_users.db import (
SQLAlchemyBaseOAuthAccountTableUUID,
SQLAlchemyBaseUserTableUUID,
SQLAlchemyUserDatabase,
SQLAlchemyBaseOAuthAccountTableUUID,
)
from sqlalchemy import String
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from sqlalchemy.orm import Mapped, relationship, mapped_column
from sqlalchemy.orm import Mapped, mapped_column, relationship
from media_manager.database import Base, build_db_url
from media_manager.config import MediaManagerConfig
from media_manager.database import Base, build_db_url
class OAuthAccount(SQLAlchemyBaseOAuthAccountTableUUID, Base):

View File

@@ -1,19 +1,18 @@
from fastapi import APIRouter, Depends
from fastapi import status
from fastapi import APIRouter, Depends, status
from fastapi_users.router import get_oauth_router
from httpx_oauth.oauth2 import OAuth2
from sqlalchemy import select
from media_manager.config import MediaManagerConfig
from media_manager.auth.db import User
from media_manager.auth.schemas import UserRead, AuthMetadata
from media_manager.auth.schemas import AuthMetadata, UserRead
from media_manager.auth.users import (
SECRET,
current_superuser,
fastapi_users,
openid_client,
openid_cookie_auth_backend,
SECRET,
fastapi_users,
)
from media_manager.config import MediaManagerConfig
from media_manager.database import DbSessionDependency
users_router = APIRouter()

View File

@@ -1,9 +1,10 @@
import contextlib
import logging
import uuid
from typing import Optional, Any
from typing import Any, Optional
from fastapi import Depends, Request
from fastapi.responses import RedirectResponse, Response
from fastapi_users import BaseUserManager, FastAPIUsers, UUIDIDMixin, models
from fastapi_users.authentication import (
AuthenticationBackend,
@@ -13,13 +14,12 @@ from fastapi_users.authentication import (
)
from fastapi_users.db import SQLAlchemyUserDatabase
from httpx_oauth.clients.openid import OpenID
from fastapi.responses import RedirectResponse, Response
from sqlalchemy import func, select
from starlette import status
from sqlalchemy import select, func
import media_manager.notification.utils
from media_manager.auth.db import User, get_user_db, get_async_session
from media_manager.auth.schemas import UserUpdate, UserCreate
from media_manager.auth.db import User, get_async_session, get_user_db
from media_manager.auth.schemas import UserCreate, UserUpdate
from media_manager.config import MediaManagerConfig
log = logging.getLogger(__name__)

View File

@@ -1,13 +1,13 @@
import logging
import os
from pathlib import Path
from typing import Type, Tuple
from typing import Tuple, Type
from pydantic import AnyHttpUrl
from pydantic_settings import (
BaseSettings,
SettingsConfigDict,
PydanticBaseSettingsSource,
SettingsConfigDict,
TomlConfigSettingsSource,
)

View File

@@ -1,7 +1,7 @@
from fastapi import Request
from fastapi.responses import JSONResponse
from sqlalchemy.exc import IntegrityError
from psycopg.errors import UniqueViolation
from sqlalchemy.exc import IntegrityError
class MediaManagerException(Exception):

View File

@@ -2,9 +2,9 @@ from typing import Annotated
from fastapi import Depends
from media_manager.database import DbSessionDependency
from media_manager.indexer.repository import IndexerRepository
from media_manager.indexer.service import IndexerService
from media_manager.database import DbSessionDependency
from media_manager.tv.service import TvService

View File

@@ -1,4 +1,4 @@
from abc import abstractmethod, ABC
from abc import ABC, abstractmethod
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.movies.schemas import Movie

View File

@@ -4,10 +4,10 @@ from concurrent.futures.thread import ThreadPoolExecutor
import requests
from media_manager.config import MediaManagerConfig
from media_manager.indexer.indexers.generic import GenericIndexer
from media_manager.indexer.indexers.torznab_mixin import TorznabMixin
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.config import MediaManagerConfig
from media_manager.movies.schemas import Movie
from media_manager.tv.schemas import Show

View File

@@ -3,8 +3,8 @@ from dataclasses import dataclass
from requests import Session
from media_manager.indexer.indexers.generic import GenericIndexer
from media_manager.config import MediaManagerConfig
from media_manager.indexer.indexers.generic import GenericIndexer
from media_manager.indexer.indexers.torznab_mixin import TorznabMixin
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.movies.schemas import Movie

View File

@@ -1,9 +1,9 @@
import logging
import xml.etree.ElementTree as ET
from datetime import datetime, timezone
from email.utils import parsedate_to_datetime
from media_manager.indexer.schemas import IndexerQueryResult
import xml.etree.ElementTree as ET
from email.utils import parsedate_to_datetime
from datetime import datetime, timezone
log = logging.getLogger(__name__)

View File

@@ -1,6 +1,6 @@
from uuid import UUID
from sqlalchemy import String, Integer
from sqlalchemy import Integer, String
from sqlalchemy.dialects.postgresql import ARRAY
from sqlalchemy.orm import Mapped, mapped_column
from sqlalchemy.sql.sqltypes import BigInteger

View File

@@ -4,9 +4,11 @@ from sqlalchemy.orm import Session
from media_manager.indexer.models import IndexerQueryResult
from media_manager.indexer.schemas import (
IndexerQueryResultId,
IndexerQueryResult as IndexerQueryResultSchema,
)
from media_manager.indexer.schemas import (
IndexerQueryResultId,
)
log = logging.getLogger(__name__)

View File

@@ -3,7 +3,7 @@ import typing
from uuid import UUID, uuid4
import pydantic
from pydantic import BaseModel, computed_field, ConfigDict
from pydantic import BaseModel, ConfigDict, computed_field
from media_manager.torrent.models import Quality

View File

@@ -4,8 +4,8 @@ from media_manager.config import MediaManagerConfig
from media_manager.indexer.indexers.generic import GenericIndexer
from media_manager.indexer.indexers.jackett import Jackett
from media_manager.indexer.indexers.prowlarr import Prowlarr
from media_manager.indexer.schemas import IndexerQueryResultId, IndexerQueryResult
from media_manager.indexer.repository import IndexerRepository
from media_manager.indexer.schemas import IndexerQueryResult, IndexerQueryResultId
from media_manager.movies.schemas import Movie
from media_manager.torrent.utils import remove_special_chars_and_parentheses
from media_manager.tv.schemas import Show

View File

@@ -1,10 +1,11 @@
import logging
import os
import sys
from logging.config import dictConfig
from pythonjsonlogger.json import JsonFormatter
from pathlib import Path
from datetime import datetime, timezone
from logging.config import dictConfig
from pathlib import Path
from pythonjsonlogger.json import JsonFormatter
class ISOJsonFormatter(JsonFormatter):

View File

@@ -1,43 +1,47 @@
from media_manager.logging import setup_logging, LOGGING_CONFIG
from media_manager.scheduler import setup_scheduler
from media_manager.filesystem_checks import run_filesystem_checks
from media_manager.config import MediaManagerConfig
import uvicorn
import logging
import os
from fastapi import FastAPI, APIRouter
import uvicorn
from fastapi import APIRouter, FastAPI
from fastapi.middleware.cors import CORSMiddleware
from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware
from fastapi.staticfiles import StaticFiles
from starlette.responses import RedirectResponse, FileResponse, Response
from media_manager.auth.users import (
bearer_auth_backend,
fastapi_users,
cookie_auth_backend,
)
from psycopg.errors import UniqueViolation
from sqlalchemy.exc import IntegrityError
from starlette.responses import FileResponse, RedirectResponse, Response
from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware
import media_manager.movies.router as movies_router
import media_manager.torrent.router as torrent_router
import media_manager.tv.router as tv_router
from media_manager.auth.router import (
users_router as custom_users_router,
auth_metadata_router,
get_openid_router,
)
from media_manager.auth.schemas import UserCreate, UserRead, UserUpdate
from media_manager.exceptions import (
NotFoundError,
not_found_error_exception_handler,
MediaAlreadyExists,
media_already_exists_exception_handler,
InvalidConfigError,
invalid_config_error_exception_handler,
sqlalchemy_integrity_error_handler,
ConflictError,
conflict_error_handler,
from media_manager.auth.router import (
users_router as custom_users_router,
)
from sqlalchemy.exc import IntegrityError
from psycopg.errors import UniqueViolation
import media_manager.torrent.router as torrent_router
import media_manager.movies.router as movies_router
import media_manager.tv.router as tv_router
from media_manager.auth.schemas import UserCreate, UserRead, UserUpdate
from media_manager.auth.users import (
bearer_auth_backend,
cookie_auth_backend,
fastapi_users,
)
from media_manager.config import MediaManagerConfig
from media_manager.exceptions import (
ConflictError,
InvalidConfigError,
MediaAlreadyExists,
NotFoundError,
conflict_error_handler,
invalid_config_error_exception_handler,
media_already_exists_exception_handler,
not_found_error_exception_handler,
sqlalchemy_integrity_error_handler,
)
from media_manager.filesystem_checks import run_filesystem_checks
from media_manager.logging import LOGGING_CONFIG, setup_logging
from media_manager.notification.router import router as notification_router
import logging
from media_manager.scheduler import setup_scheduler
setup_logging()

View File

@@ -1,10 +1,10 @@
import logging
from abc import ABC, abstractmethod
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.tv.schemas import Show
from media_manager.movies.schemas import Movie
from media_manager.config import MediaManagerConfig
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.movies.schemas import Movie
from media_manager.tv.schemas import Show
log = logging.getLogger(__name__)

View File

@@ -1,12 +1,12 @@
from typing import Annotated, Literal
from fastapi import Depends
from fastapi.exceptions import HTTPException
from media_manager.metadataProvider.tmdb import TmdbMetadataProvider
from media_manager.metadataProvider.abstractMetaDataProvider import (
AbstractMetadataProvider,
)
from media_manager.metadataProvider.tmdb import TmdbMetadataProvider
from media_manager.metadataProvider.tvdb import TvdbMetadataProvider

View File

@@ -1,4 +1,5 @@
from pydantic import BaseModel
from media_manager.movies.schemas import MovieId
from media_manager.tv.schemas import ShowId

View File

@@ -8,10 +8,9 @@ from media_manager.metadataProvider.abstractMetaDataProvider import (
AbstractMetadataProvider,
)
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.tv.schemas import Episode, Season, Show, SeasonNumber, EpisodeNumber
from media_manager.movies.schemas import Movie
from media_manager.notification.manager import notification_manager
from media_manager.tv.schemas import Episode, EpisodeNumber, Season, SeasonNumber, Show
ENDED_STATUS = {"Ended", "Canceled"}

View File

@@ -1,14 +1,15 @@
import requests
import logging
import requests
import media_manager.metadataProvider.utils
from media_manager.config import MediaManagerConfig
from media_manager.metadataProvider.abstractMetaDataProvider import (
AbstractMetadataProvider,
)
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.tv.schemas import Episode, Season, Show, SeasonNumber
from media_manager.movies.schemas import Movie
from media_manager.tv.schemas import Episode, Season, SeasonNumber, Show
log = logging.getLogger(__name__)

View File

@@ -1,8 +1,8 @@
from pathlib import Path
from uuid import UUID
from PIL import Image
import requests
from PIL import Image
def get_year_from_date(first_air_date: str | None) -> int | None:

View File

@@ -1,16 +1,15 @@
from typing import Annotated
from fastapi import Depends, Path
from fastapi import Depends, HTTPException, Path
from media_manager.database import DbSessionDependency
from media_manager.exceptions import NotFoundError
from media_manager.indexer.dependencies import indexer_service_dep
from media_manager.movies.repository import MovieRepository
from media_manager.movies.schemas import Movie, MovieId
from media_manager.movies.service import MovieService
from media_manager.exceptions import NotFoundError
from fastapi import HTTPException
from media_manager.indexer.dependencies import indexer_service_dep
from media_manager.torrent.dependencies import torrent_service_dep
from media_manager.notification.dependencies import notification_service_dep
from media_manager.torrent.dependencies import torrent_service_dep
def get_movie_repository(db_session: DbSessionDependency) -> MovieRepository:

View File

@@ -1,22 +1,33 @@
from sqlalchemy import select, delete
import logging
from sqlalchemy import delete, select
from sqlalchemy.exc import (
IntegrityError,
SQLAlchemyError,
)
from sqlalchemy.orm import Session, joinedload
import logging
from media_manager.exceptions import NotFoundError, ConflictError
from media_manager.movies.models import Movie, MovieRequest, MovieFile
from media_manager.exceptions import ConflictError, NotFoundError
from media_manager.movies.models import Movie, MovieFile, MovieRequest
from media_manager.movies.schemas import (
Movie as MovieSchema,
MovieId,
MovieRequest as MovieRequestSchema,
MovieRequestId,
)
from media_manager.movies.schemas import (
MovieFile as MovieFileSchema,
RichMovieRequest as RichMovieRequestSchema,
)
from media_manager.movies.schemas import (
MovieId,
MovieRequestId,
)
from media_manager.movies.schemas import (
MovieRequest as MovieRequestSchema,
)
from media_manager.movies.schemas import (
MovieTorrent as MovieTorrentSchema,
)
from media_manager.movies.schemas import (
RichMovieRequest as RichMovieRequestSchema,
)
from media_manager.torrent.models import Torrent
from media_manager.torrent.schemas import TorrentId

View File

@@ -1,33 +1,33 @@
from pathlib import Path
from typing import Annotated
from fastapi import APIRouter, Depends, status, HTTPException
from fastapi import APIRouter, Depends, HTTPException, status
from media_manager.auth.schemas import UserRead
from media_manager.auth.users import current_active_user, current_superuser
from media_manager.config import LibraryItem, MediaManagerConfig
from media_manager.exceptions import ConflictError
from media_manager.indexer.schemas import (
IndexerQueryResultId,
IndexerQueryResult,
IndexerQueryResultId,
)
from media_manager.metadataProvider.dependencies import metadata_provider_dep
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.movies import log
from media_manager.movies.dependencies import (
movie_service_dep,
movie_dep,
movie_service_dep,
)
from media_manager.movies.schemas import (
CreateMovieRequest,
Movie,
MovieRequest,
RichMovieTorrent,
MovieRequestBase,
MovieRequestId,
PublicMovie,
PublicMovieFile,
CreateMovieRequest,
MovieRequestId,
RichMovieRequest,
MovieRequestBase,
RichMovieTorrent,
)
from media_manager.schemas import MediaImportSuggestion
from media_manager.torrent.schemas import Torrent

View File

@@ -2,7 +2,7 @@ import typing
import uuid
from uuid import UUID
from pydantic import BaseModel, Field, ConfigDict, model_validator
from pydantic import BaseModel, ConfigDict, Field, model_validator
from media_manager.auth.schemas import UserRead
from media_manager.torrent.models import Quality

View File

@@ -6,46 +6,49 @@ from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import Session
from media_manager.config import MediaManagerConfig
from media_manager.database import SessionLocal, get_session
from media_manager.exceptions import InvalidConfigError, NotFoundError
from media_manager.indexer.repository import IndexerRepository
from media_manager.database import SessionLocal, get_session
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.indexer.schemas import IndexerQueryResultId
from media_manager.indexer.utils import evaluate_indexer_query_results
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.notification.service import NotificationService
from media_manager.schemas import MediaImportSuggestion
from media_manager.torrent.schemas import Torrent, TorrentStatus, Quality
from media_manager.torrent.service import TorrentService
from media_manager.movies import log
from media_manager.movies.schemas import (
Movie,
MovieId,
MovieRequest,
MovieFile,
RichMovieTorrent,
PublicMovie,
PublicMovieFile,
MovieRequestId,
RichMovieRequest,
)
from media_manager.torrent.schemas import QualityStrings
from media_manager.movies.repository import MovieRepository
from media_manager.torrent.repository import TorrentRepository
from media_manager.torrent.utils import (
import_file,
get_files_for_import,
remove_special_characters,
get_importable_media_directories,
remove_special_chars_and_parentheses,
extract_external_id_from_string,
)
from media_manager.indexer.schemas import IndexerQueryResult, IndexerQueryResultId
from media_manager.indexer.service import IndexerService
from media_manager.indexer.utils import evaluate_indexer_query_results
from media_manager.metadataProvider.abstractMetaDataProvider import (
AbstractMetadataProvider,
)
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.metadataProvider.tmdb import TmdbMetadataProvider
from media_manager.metadataProvider.tvdb import TvdbMetadataProvider
from media_manager.movies import log
from media_manager.movies.repository import MovieRepository
from media_manager.movies.schemas import (
Movie,
MovieFile,
MovieId,
MovieRequest,
MovieRequestId,
PublicMovie,
PublicMovieFile,
RichMovieRequest,
RichMovieTorrent,
)
from media_manager.notification.service import NotificationService
from media_manager.schemas import MediaImportSuggestion
from media_manager.torrent.repository import TorrentRepository
from media_manager.torrent.schemas import (
Quality,
QualityStrings,
Torrent,
TorrentStatus,
)
from media_manager.torrent.service import TorrentService
from media_manager.torrent.utils import (
extract_external_id_from_string,
get_files_for_import,
get_importable_media_directories,
import_file,
remove_special_characters,
remove_special_chars_and_parentheses,
)
class MovieService:
@@ -158,7 +161,9 @@ class MovieService:
)
for movie_torrent in movie_torrents:
torrent = self.torrent_service.get_torrent_by_id(torrent_id=movie_torrent.torrent_id)
torrent = self.torrent_service.get_torrent_by_id(
torrent_id=movie_torrent.torrent_id
)
try:
self.torrent_service.cancel_download(
torrent=torrent, delete_files=True
@@ -684,7 +689,7 @@ class MovieService:
movie_id=movie.id,
file_path_suffix="IMPORTED",
torrent_id=None,
quality=Quality.unknown
quality=Quality.unknown,
)
)

View File

@@ -4,6 +4,8 @@ Notification Manager - Orchestrates sending notifications through all configured
import logging
from typing import List
from media_manager.config import MediaManagerConfig
from media_manager.notification.schemas import MessageNotification
from media_manager.notification.service_providers.abstractNotificationServiceProvider import (
AbstractNotificationServiceProvider,
@@ -20,7 +22,6 @@ from media_manager.notification.service_providers.ntfy import (
from media_manager.notification.service_providers.pushover import (
PushoverNotificationServiceProvider,
)
from media_manager.config import MediaManagerConfig
logger = logging.getLogger(__name__)

View File

@@ -1,17 +1,20 @@
from sqlalchemy import select, delete, update
import logging
from sqlalchemy import delete, select, update
from sqlalchemy.exc import (
IntegrityError,
SQLAlchemyError,
)
from sqlalchemy.orm import Session
import logging
from media_manager.exceptions import NotFoundError, ConflictError
from media_manager.exceptions import ConflictError, NotFoundError
from media_manager.notification.models import Notification
from media_manager.notification.schemas import (
NotificationId,
Notification as NotificationSchema,
)
from media_manager.notification.schemas import (
NotificationId,
)
log = logging.getLogger(__name__)

View File

@@ -1,8 +1,8 @@
from fastapi import APIRouter, Depends, status
from media_manager.auth.users import current_active_user
from media_manager.notification.schemas import Notification, NotificationId
from media_manager.notification.dependencies import notification_service_dep
from media_manager.notification.schemas import Notification, NotificationId
router = APIRouter()

View File

@@ -3,8 +3,7 @@ import uuid
from datetime import datetime
from uuid import UUID
from pydantic import BaseModel, Field, ConfigDict
from pydantic import BaseModel, ConfigDict, Field
NotificationId = typing.NewType("NotificationId", UUID)

View File

@@ -1,6 +1,6 @@
from media_manager.notification.repository import NotificationRepository
from media_manager.notification.schemas import NotificationId, Notification
from media_manager.notification.manager import notification_manager
from media_manager.notification.repository import NotificationRepository
from media_manager.notification.schemas import Notification, NotificationId
class NotificationService:

View File

@@ -1,4 +1,5 @@
import abc
from media_manager.notification.schemas import MessageNotification

View File

@@ -1,9 +1,9 @@
import media_manager.notification.utils
from media_manager.config import MediaManagerConfig
from media_manager.notification.schemas import MessageNotification
from media_manager.notification.service_providers.abstractNotificationServiceProvider import (
AbstractNotificationServiceProvider,
)
from media_manager.config import MediaManagerConfig
class EmailNotificationServiceProvider(AbstractNotificationServiceProvider):

View File

@@ -1,17 +1,18 @@
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.triggers.cron import CronTrigger
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
import media_manager.database
from media_manager.movies.service import (
auto_download_all_approved_movie_requests,
import_all_movie_torrents,
update_all_movies_metadata,
)
from media_manager.tv.service import (
auto_download_all_approved_season_requests,
import_all_show_torrents,
update_all_non_ended_shows_metadata,
)
from media_manager.movies.service import (
import_all_movie_torrents,
update_all_movies_metadata,
auto_download_all_approved_movie_requests,
)
def setup_scheduler(config, log):

View File

@@ -1,14 +1,14 @@
from typing import Annotated
from fastapi import Depends
from media_manager.exceptions import NotFoundError
from media_manager.database import DbSessionDependency
from media_manager.torrent.service import TorrentService
from media_manager.torrent.repository import TorrentRepository
from media_manager.torrent.schemas import TorrentId, Torrent
from fastapi.exceptions import HTTPException
from media_manager.database import DbSessionDependency
from media_manager.exceptions import NotFoundError
from media_manager.torrent.repository import TorrentRepository
from media_manager.torrent.schemas import Torrent, TorrentId
from media_manager.torrent.service import TorrentService
def get_torrent_repository(db: DbSessionDependency) -> TorrentRepository:
return TorrentRepository(db=db)

View File

@@ -1,7 +1,7 @@
from abc import ABC, abstractmethod
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.torrent.schemas import TorrentStatus, Torrent
from media_manager.torrent.schemas import Torrent, TorrentStatus
class AbstractDownloadClient(ABC):

View File

@@ -8,7 +8,7 @@ from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.torrent.download_clients.abstractDownloadClient import (
AbstractDownloadClient,
)
from media_manager.torrent.schemas import TorrentStatus, Torrent
from media_manager.torrent.schemas import Torrent, TorrentStatus
from media_manager.torrent.utils import get_torrent_hash
log = logging.getLogger(__name__)

View File

@@ -1,12 +1,13 @@
import logging
import sabnzbd_api
from media_manager.config import MediaManagerConfig
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.torrent.download_clients.abstractDownloadClient import (
AbstractDownloadClient,
)
from media_manager.torrent.schemas import Torrent, TorrentStatus
import sabnzbd_api
log = logging.getLogger(__name__)

View File

@@ -1,12 +1,13 @@
import logging
import transmission_rpc
from media_manager.config import MediaManagerConfig
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.torrent.download_clients.abstractDownloadClient import (
AbstractDownloadClient,
)
from media_manager.torrent.schemas import TorrentStatus, Torrent
from media_manager.torrent.schemas import Torrent, TorrentStatus
from media_manager.torrent.utils import get_torrent_hash
log = logging.getLogger(__name__)

View File

@@ -7,10 +7,10 @@ from media_manager.torrent.download_clients.abstractDownloadClient import (
AbstractDownloadClient,
)
from media_manager.torrent.download_clients.qbittorrent import QbittorrentDownloadClient
from media_manager.torrent.download_clients.sabnzbd import SabnzbdDownloadClient
from media_manager.torrent.download_clients.transmission import (
TransmissionDownloadClient,
)
from media_manager.torrent.download_clients.sabnzbd import SabnzbdDownloadClient
from media_manager.torrent.schemas import Torrent, TorrentStatus
log = logging.getLogger(__name__)

View File

@@ -1,16 +1,20 @@
from sqlalchemy import select, delete
from sqlalchemy import delete, select
from media_manager.database import DbSessionDependency
from media_manager.torrent.models import Torrent
from media_manager.torrent.schemas import TorrentId, Torrent as TorrentSchema
from media_manager.tv.models import SeasonFile, Show, Season
from media_manager.tv.schemas import SeasonFile as SeasonFileSchema, Show as ShowSchema
from media_manager.exceptions import NotFoundError
from media_manager.movies.models import Movie, MovieFile
from media_manager.movies.schemas import (
Movie as MovieSchema,
)
from media_manager.movies.schemas import (
MovieFile as MovieFileSchema,
)
from media_manager.torrent.models import Torrent
from media_manager.torrent.schemas import Torrent as TorrentSchema
from media_manager.torrent.schemas import TorrentId
from media_manager.tv.models import Season, SeasonFile, Show
from media_manager.tv.schemas import SeasonFile as SeasonFileSchema
from media_manager.tv.schemas import Show as ShowSchema
class TorrentRepository:

View File

@@ -1,14 +1,12 @@
from fastapi import APIRouter, status
from fastapi.exceptions import HTTPException
from fastapi import APIRouter
from fastapi import status
from fastapi.params import Depends
from media_manager.auth.users import current_active_user, current_superuser
from media_manager.torrent.dependencies import (
torrent_service_dep,
torrent_dep,
torrent_repository_dep,
torrent_service_dep,
)
from media_manager.torrent.schemas import Torrent, TorrentStatus

View File

@@ -2,7 +2,7 @@ import typing
import uuid
from enum import Enum
from pydantic import ConfigDict, BaseModel, Field
from pydantic import BaseModel, ConfigDict, Field
TorrentId = typing.NewType("TorrentId", uuid.UUID)

View File

@@ -1,11 +1,11 @@
import logging
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.movies.schemas import Movie
from media_manager.torrent.manager import DownloadManager
from media_manager.torrent.repository import TorrentRepository
from media_manager.torrent.schemas import Torrent, TorrentId
from media_manager.tv.schemas import SeasonFile, Show
from media_manager.movies.schemas import Movie
log = logging.getLogger(__name__)

View File

@@ -2,13 +2,13 @@ import hashlib
import logging
import mimetypes
import re
from pathlib import Path, UnsupportedOperation
import shutil
from pathlib import Path, UnsupportedOperation
import bencoder
import libtorrent
import patoolib
import requests
import libtorrent
from requests.exceptions import InvalidSchema
from media_manager.config import MediaManagerConfig

View File

@@ -1,16 +1,15 @@
from typing import Annotated
from fastapi import Depends, Path
from fastapi import Depends, HTTPException, Path
from media_manager.database import DbSessionDependency
from media_manager.tv.repository import TvRepository
from media_manager.tv.schemas import Show, ShowId, SeasonId, Season
from media_manager.tv.service import TvService
from media_manager.exceptions import NotFoundError
from fastapi import HTTPException
from media_manager.indexer.dependencies import indexer_service_dep
from media_manager.torrent.dependencies import torrent_service_dep
from media_manager.notification.dependencies import notification_service_dep
from media_manager.torrent.dependencies import torrent_service_dep
from media_manager.tv.repository import TvRepository
from media_manager.tv.schemas import Season, SeasonId, Show, ShowId
from media_manager.tv.service import TvService
def get_tv_repository(db_session: DbSessionDependency) -> TvRepository:

View File

@@ -1,27 +1,40 @@
from sqlalchemy import select, delete, func
from sqlalchemy import delete, func, select
from sqlalchemy.exc import (
IntegrityError,
SQLAlchemyError,
)
from sqlalchemy.orm import Session, joinedload
from media_manager.exceptions import ConflictError, NotFoundError
from media_manager.torrent.models import Torrent
from media_manager.torrent.schemas import TorrentId, Torrent as TorrentSchema
from media_manager.torrent.schemas import Torrent as TorrentSchema
from media_manager.torrent.schemas import TorrentId
from media_manager.tv import log
from media_manager.tv.models import Season, Show, Episode, SeasonRequest, SeasonFile
from media_manager.exceptions import NotFoundError, ConflictError
from media_manager.tv.models import Episode, Season, SeasonFile, SeasonRequest, Show
from media_manager.tv.schemas import (
Season as SeasonSchema,
SeasonId,
Show as ShowSchema,
ShowId,
Episode as EpisodeSchema,
SeasonRequest as SeasonRequestSchema,
SeasonFile as SeasonFileSchema,
)
from media_manager.tv.schemas import (
EpisodeId,
SeasonId,
SeasonNumber,
SeasonRequestId,
ShowId,
)
from media_manager.tv.schemas import (
RichSeasonRequest as RichSeasonRequestSchema,
EpisodeId,
)
from media_manager.tv.schemas import (
Season as SeasonSchema,
)
from media_manager.tv.schemas import (
SeasonFile as SeasonFileSchema,
)
from media_manager.tv.schemas import (
SeasonRequest as SeasonRequestSchema,
)
from media_manager.tv.schemas import (
Show as ShowSchema,
)

View File

@@ -1,16 +1,16 @@
from pathlib import Path
from typing import Annotated
from fastapi import APIRouter, Depends, status, HTTPException
from fastapi import APIRouter, Depends, HTTPException, status
from media_manager.auth.db import User
from media_manager.auth.schemas import UserRead
from media_manager.auth.users import current_active_user, current_superuser
from media_manager.config import MediaManagerConfig, LibraryItem
from media_manager.config import LibraryItem, MediaManagerConfig
from media_manager.exceptions import MediaAlreadyExists
from media_manager.indexer.schemas import (
IndexerQueryResultId,
IndexerQueryResult,
IndexerQueryResultId,
)
from media_manager.metadataProvider.dependencies import metadata_provider_dep
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
@@ -24,17 +24,17 @@ from media_manager.tv.dependencies import (
tv_service_dep,
)
from media_manager.tv.schemas import (
Show,
SeasonRequest,
ShowId,
RichShowTorrent,
PublicShow,
PublicSeasonFile,
CreateSeasonRequest,
SeasonRequestId,
UpdateSeasonRequest,
PublicSeasonFile,
PublicShow,
RichSeasonRequest,
RichShowTorrent,
Season,
SeasonRequest,
SeasonRequestId,
Show,
ShowId,
UpdateSeasonRequest,
)
router = APIRouter()

View File

@@ -2,7 +2,7 @@ import typing
import uuid
from uuid import UUID
from pydantic import BaseModel, Field, ConfigDict, model_validator
from pydantic import BaseModel, ConfigDict, Field, model_validator
from media_manager.auth.schemas import UserRead
from media_manager.torrent.models import Quality

View File

@@ -1,58 +1,62 @@
import pprint
import re
import shutil
from pathlib import Path
from sqlalchemy.exc import IntegrityError
from media_manager.config import MediaManagerConfig
from media_manager.database import get_session
from media_manager.exceptions import InvalidConfigError
from media_manager.exceptions import InvalidConfigError, NotFoundError
from media_manager.indexer.repository import IndexerRepository
from media_manager.indexer.schemas import IndexerQueryResult
from media_manager.indexer.schemas import IndexerQueryResultId
from media_manager.indexer.utils import evaluate_indexer_query_results
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.notification.service import NotificationService
from media_manager.torrent.schemas import Torrent, TorrentStatus, Quality
from media_manager.torrent.service import TorrentService
from media_manager.tv import log
from media_manager.tv.schemas import (
Show,
ShowId,
SeasonRequest,
SeasonFile,
SeasonId,
Season,
RichShowTorrent,
RichSeasonTorrent,
PublicSeason,
PublicShow,
PublicSeasonFile,
SeasonRequestId,
RichSeasonRequest,
EpisodeId,
Episode as EpisodeSchema,
)
from media_manager.torrent.schemas import QualityStrings
from media_manager.tv.repository import TvRepository
from media_manager.exceptions import NotFoundError
import pprint
from pathlib import Path
from media_manager.torrent.repository import TorrentRepository
from media_manager.torrent.utils import (
import_file,
get_files_for_import,
remove_special_characters,
get_importable_media_directories,
extract_external_id_from_string,
remove_special_chars_and_parentheses,
)
from media_manager.indexer.schemas import IndexerQueryResult, IndexerQueryResultId
from media_manager.indexer.service import IndexerService
from media_manager.indexer.utils import evaluate_indexer_query_results
from media_manager.metadataProvider.abstractMetaDataProvider import (
AbstractMetadataProvider,
)
from media_manager.metadataProvider.schemas import MetaDataProviderSearchResult
from media_manager.metadataProvider.tmdb import TmdbMetadataProvider
from media_manager.metadataProvider.tvdb import TvdbMetadataProvider
from media_manager.notification.service import NotificationService
from media_manager.schemas import MediaImportSuggestion
from media_manager.torrent.repository import TorrentRepository
from media_manager.torrent.schemas import (
Quality,
QualityStrings,
Torrent,
TorrentStatus,
)
from media_manager.torrent.service import TorrentService
from media_manager.torrent.utils import (
extract_external_id_from_string,
get_files_for_import,
get_importable_media_directories,
import_file,
remove_special_characters,
remove_special_chars_and_parentheses,
)
from media_manager.tv import log
from media_manager.tv.repository import TvRepository
from media_manager.tv.schemas import (
Episode as EpisodeSchema,
)
from media_manager.tv.schemas import (
EpisodeId,
PublicSeason,
PublicSeasonFile,
PublicShow,
RichSeasonRequest,
RichSeasonTorrent,
RichShowTorrent,
Season,
SeasonFile,
SeasonId,
SeasonRequest,
SeasonRequestId,
Show,
ShowId,
)
class TvService:

View File

@@ -2,8 +2,8 @@ import logging
import os
import tmdbsimple
from tmdbsimple import TV, TV_Seasons, Movies, Trending, Search
from fastapi import APIRouter
from tmdbsimple import TV, Movies, Search, Trending, TV_Seasons
log = logging.getLogger(__name__)

View File

@@ -1,7 +1,7 @@
import logging
import os
import tvdb_v4_official
import logging
from fastapi import APIRouter
log = logging.getLogger(__name__)

View File

@@ -1,9 +1,9 @@
import os
from fastapi import FastAPI
from starlette_exporter import PrometheusMiddleware, handle_metrics
from app.tmdb import router as tmdb_router
from app.tvdb import router as tvdb_router
from fastapi import FastAPI
from starlette_exporter import PrometheusMiddleware, handle_metrics
print("Hello world!")
app = FastAPI(root_path=os.getenv("BASE_PATH"))

View File

@@ -10,7 +10,7 @@ extend-select = [
"C4", "COM",
"E", "EM", "EXE",
"F", "FA", "FAST", "FIX", "FLY", "FURB",
"ICN", "ISC",
"I", "ICN", "ISC",
"LOG",
"PGH", "PT", "PYI",
"Q",