mirror of
https://github.com/maxdorninger/MediaManager.git
synced 2025-12-23 22:18:19 -05:00
refactor: change folder structure
This commit is contained in:
5
.env
5
.env
@@ -1,5 +0,0 @@
|
||||
# See the documentation for more information: https://pocket-id.org/docs/configuration/environment-variables
|
||||
APP_URL=http://localhost:1411
|
||||
TRUST_PROXY=false
|
||||
PUID=1000
|
||||
PGID=1000
|
||||
8
.gitignore
vendored
8
.gitignore
vendored
@@ -1,8 +1,6 @@
|
||||
.idea
|
||||
venv
|
||||
MediaManager.iml
|
||||
backend/res
|
||||
backend/res/.env
|
||||
docker-compose.yml
|
||||
data/*
|
||||
movie/*
|
||||
@@ -10,8 +8,10 @@ torrent/*
|
||||
tv/*
|
||||
log.txt
|
||||
res/*
|
||||
/backend/src/indexer/indexers/prowlarr.http
|
||||
/web/cache/
|
||||
media_manager/indexer/indexers/prowlarr.http
|
||||
|
||||
|
||||
web/cache/
|
||||
web/node_modules
|
||||
|
||||
# Output
|
||||
|
||||
@@ -32,12 +32,12 @@ if config.config_file_name is not None:
|
||||
# from myapp import mymodel
|
||||
# target_metadata = mymodel.Base.metadata
|
||||
|
||||
from backend.src.auth.db import User, OAuthAccount
|
||||
from backend.src.indexer.models import IndexerQueryResult
|
||||
from backend.src.torrent.models import Torrent
|
||||
from backend.src.tv.models import Show, Season, Episode, SeasonFile, SeasonRequest
|
||||
from media_manager.auth.db import User, OAuthAccount
|
||||
from media_manager.indexer.models import IndexerQueryResult
|
||||
from media_manager.torrent.models import Torrent
|
||||
from media_manager.tv.models import Show, Season, Episode, SeasonFile, SeasonRequest
|
||||
|
||||
from backend.src.database import Base
|
||||
from media_manager.database import Base
|
||||
target_metadata = Base.metadata
|
||||
|
||||
# this is to keep pycharm from complaining about/optimizing unused imports
|
||||
@@ -1,12 +0,0 @@
|
||||
import logging
|
||||
|
||||
from backend.src.indexer.config import ProwlarrConfig
|
||||
from backend.src.indexer.indexers.generic import GenericIndexer, IndexerQueryResult
|
||||
from backend.src.indexer.indexers.prowlarr import Prowlarr
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
indexers: list[GenericIndexer] = []
|
||||
|
||||
if ProwlarrConfig().enabled:
|
||||
indexers.append(Prowlarr())
|
||||
@@ -9,8 +9,8 @@ from fastapi_users.db import (
|
||||
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
|
||||
from sqlalchemy.orm import Mapped, relationship
|
||||
|
||||
from backend.src.database import Base
|
||||
from backend.src.database import db_url
|
||||
from media_manager.database import Base
|
||||
from media_manager.database import db_url
|
||||
|
||||
|
||||
class OAuthAccount(SQLAlchemyBaseOAuthAccountTableUUID, Base):
|
||||
@@ -2,12 +2,12 @@ from fastapi import APIRouter, Depends
|
||||
from fastapi import status
|
||||
from sqlalchemy import select
|
||||
|
||||
from auth.config import OAuth2Config
|
||||
from auth.db import User
|
||||
from auth.schemas import UserRead
|
||||
from auth.users import current_superuser
|
||||
from database import DbSessionDependency
|
||||
from auth.users import oauth_client
|
||||
from media_manager.auth.config import OAuth2Config
|
||||
from media_manager.auth.db import User
|
||||
from media_manager.auth.schemas import UserRead
|
||||
from media_manager.auth.users import current_superuser
|
||||
from media_manager.database import DbSessionDependency
|
||||
from media_manager.auth.users import oauth_client
|
||||
|
||||
users_router = APIRouter()
|
||||
auth_metadata_router = APIRouter()
|
||||
@@ -16,10 +16,10 @@ from httpx_oauth.oauth2 import OAuth2
|
||||
from fastapi.responses import RedirectResponse, Response
|
||||
from starlette import status
|
||||
|
||||
from backend.src.auth.config import AuthConfig, OAuth2Config
|
||||
from backend.src.auth.db import User, get_user_db
|
||||
from backend.src.auth.schemas import UserUpdate
|
||||
from backend.src.config import BasicConfig
|
||||
from media_manager.auth.config import AuthConfig, OAuth2Config
|
||||
from media_manager.auth.db import User, get_user_db
|
||||
from media_manager.auth.schemas import UserUpdate
|
||||
from media_manager.config import BasicConfig
|
||||
|
||||
config = AuthConfig()
|
||||
SECRET = config.token_secret
|
||||
@@ -4,10 +4,11 @@ from contextvars import ContextVar
|
||||
from typing import Annotated, Any, Generator
|
||||
|
||||
from fastapi import Depends
|
||||
from jsonschema.validators import extend
|
||||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import Session, declarative_base, sessionmaker
|
||||
|
||||
from backend.src.database.config import DbConfig
|
||||
from media_manager.database.config import DbConfig
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
config = DbConfig()
|
||||
12
media_manager/indexer/__init__.py
Normal file
12
media_manager/indexer/__init__.py
Normal file
@@ -0,0 +1,12 @@
|
||||
import logging
|
||||
|
||||
from media_manager.indexer.config import ProwlarrConfig
|
||||
from media_manager.indexer.indexers.generic import GenericIndexer, IndexerQueryResult
|
||||
from media_manager.indexer.indexers.prowlarr import Prowlarr
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
indexers: list[GenericIndexer] = []
|
||||
|
||||
if ProwlarrConfig().enabled:
|
||||
indexers.append(Prowlarr())
|
||||
@@ -1,4 +1,4 @@
|
||||
from backend.src.indexer.schemas import IndexerQueryResult
|
||||
from media_manager.indexer.schemas import IndexerQueryResult
|
||||
|
||||
|
||||
class GenericIndexer(object):
|
||||
@@ -2,9 +2,9 @@ import logging
|
||||
|
||||
import requests
|
||||
|
||||
from backend.src.indexer import GenericIndexer
|
||||
from backend.src.indexer.config import ProwlarrConfig
|
||||
from backend.src.indexer.schemas import IndexerQueryResult
|
||||
from media_manager.indexer import GenericIndexer
|
||||
from media_manager.indexer.config import ProwlarrConfig
|
||||
from media_manager.indexer.schemas import IndexerQueryResult
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -2,9 +2,9 @@ from sqlalchemy import String, Integer
|
||||
from sqlalchemy.dialects.postgresql import ARRAY
|
||||
from sqlalchemy.orm import Mapped, mapped_column
|
||||
|
||||
from backend.src.database import Base
|
||||
from backend.src.indexer.schemas import IndexerQueryResultId
|
||||
from backend.src.torrent.schemas import Quality
|
||||
from media_manager.database import Base
|
||||
from media_manager.indexer.schemas import IndexerQueryResultId
|
||||
from media_manager.torrent.schemas import Quality
|
||||
|
||||
|
||||
class IndexerQueryResult(Base):
|
||||
@@ -1,7 +1,7 @@
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from indexer.models import IndexerQueryResult
|
||||
from indexer.schemas import (
|
||||
from media_manager.indexer.models import IndexerQueryResult
|
||||
from media_manager.indexer.schemas import (
|
||||
IndexerQueryResultId,
|
||||
IndexerQueryResult as IndexerQueryResultSchema,
|
||||
)
|
||||
@@ -5,7 +5,7 @@ from uuid import UUID, uuid4
|
||||
import pydantic
|
||||
from pydantic import BaseModel, computed_field, ConfigDict
|
||||
|
||||
from backend.src.torrent.models import Quality
|
||||
from media_manager.torrent.models import Quality
|
||||
|
||||
IndexerQueryResultId = typing.NewType("IndexerQueryResultId", UUID)
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
import indexer.repository
|
||||
from indexer import IndexerQueryResult, log, indexers
|
||||
from indexer.repository import save_result
|
||||
from indexer.schemas import IndexerQueryResultId
|
||||
from media_manager.indexer import IndexerQueryResult, log, indexers
|
||||
from media_manager.indexer.repository import save_result
|
||||
from media_manager.indexer.schemas import IndexerQueryResultId
|
||||
|
||||
|
||||
def search(query: str, db: Session) -> list[IndexerQueryResult]:
|
||||
@@ -45,30 +45,29 @@ logging.basicConfig(
|
||||
)
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
from backend.src.database import init_db
|
||||
import tv.router
|
||||
import torrent.router
|
||||
|
||||
from media_manager.database import init_db
|
||||
import media_manager.tv.router as tv_router
|
||||
import media_manager.torrent.router as torrent_router
|
||||
init_db()
|
||||
log.info("Database initialized")
|
||||
|
||||
from auth.users import oauth_client
|
||||
import auth.users
|
||||
from config import BasicConfig
|
||||
from media_manager.auth.users import oauth_client
|
||||
from media_manager.auth.users import SECRET as AUTH_USERS_SECRET
|
||||
from media_manager.config import BasicConfig
|
||||
|
||||
import uvicorn
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from auth.schemas import UserCreate, UserRead, UserUpdate
|
||||
from auth.users import (
|
||||
from media_manager.auth.schemas import UserCreate, UserRead, UserUpdate
|
||||
from media_manager.auth.users import (
|
||||
bearer_auth_backend,
|
||||
fastapi_users,
|
||||
cookie_auth_backend,
|
||||
oauth_cookie_auth_backend,
|
||||
)
|
||||
from auth.router import users_router as custom_users_router
|
||||
from auth.router import auth_metadata_router
|
||||
from media_manager.auth.router import users_router as custom_users_router
|
||||
from media_manager.auth.router import auth_metadata_router
|
||||
|
||||
basic_config = BasicConfig()
|
||||
if basic_config.DEVELOPMENT:
|
||||
@@ -137,7 +136,7 @@ if oauth_client is not None:
|
||||
fastapi_users.get_oauth_router(
|
||||
oauth_client,
|
||||
oauth_cookie_auth_backend,
|
||||
auth.users.SECRET,
|
||||
AUTH_USERS_SECRET,
|
||||
associate_by_email=True,
|
||||
is_verified_by_default=True,
|
||||
),
|
||||
@@ -145,8 +144,8 @@ if oauth_client is not None:
|
||||
tags=["oauth"],
|
||||
)
|
||||
|
||||
app.include_router(tv.router.router, prefix="/tv", tags=["tv"])
|
||||
app.include_router(torrent.router.router, prefix="/torrent", tags=["torrent"])
|
||||
app.include_router(tv_router.router, prefix="/tv", tags=["tv"])
|
||||
app.include_router(torrent_router.router, prefix="/torrent", tags=["torrent"])
|
||||
|
||||
# static file routers
|
||||
app.mount(
|
||||
@@ -3,9 +3,9 @@ from cachetools import TTLCache, cached
|
||||
|
||||
import metadataProvider.tmdb
|
||||
import metadataProvider.tvdb
|
||||
from metadataProvider.abstractMetaDataProvider import metadata_providers
|
||||
from metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from tv.schemas import Show
|
||||
from media_manager.metadataProvider.abstractMetaDataProvider import metadata_providers
|
||||
from media_manager.metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from media_manager.tv.schemas import Show
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
search_show_cache = TTLCache(maxsize=128, ttl=24 * 60 * 60) # Cache for 24 hours
|
||||
@@ -2,8 +2,8 @@ import logging
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
import config
|
||||
from metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from tv.schemas import Show
|
||||
from media_manager.metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from media_manager.tv.schemas import Show
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -7,12 +7,12 @@ from pydantic_settings import BaseSettings
|
||||
from tmdbsimple import TV, TV_Seasons
|
||||
|
||||
import metadataProvider.utils
|
||||
from metadataProvider.abstractMetaDataProvider import (
|
||||
from media_manager.metadataProvider.abstractMetaDataProvider import (
|
||||
AbstractMetadataProvider,
|
||||
register_metadata_provider,
|
||||
)
|
||||
from metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from tv.schemas import Episode, Season, Show, SeasonNumber, EpisodeNumber
|
||||
from media_manager.metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from media_manager.tv.schemas import Episode, Season, Show, SeasonNumber, EpisodeNumber
|
||||
|
||||
|
||||
class TmdbConfig(BaseSettings):
|
||||
@@ -11,12 +11,12 @@ from pydantic_settings import BaseSettings
|
||||
from tmdbsimple import TV, TV_Seasons
|
||||
|
||||
import metadataProvider.utils
|
||||
from metadataProvider.abstractMetaDataProvider import (
|
||||
from media_manager.metadataProvider.abstractMetaDataProvider import (
|
||||
AbstractMetadataProvider,
|
||||
register_metadata_provider,
|
||||
)
|
||||
from metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from tv.schemas import Episode, Season, Show, SeasonNumber, EpisodeNumber
|
||||
from media_manager.metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from media_manager.tv.schemas import Episode, Season, Show, SeasonNumber, EpisodeNumber
|
||||
|
||||
|
||||
class TvdbConfig(BaseSettings):
|
||||
@@ -2,8 +2,8 @@ from typing import Annotated
|
||||
|
||||
from fastapi import Depends
|
||||
|
||||
from backend.src.database import DbSessionDependency
|
||||
from torrent.service import TorrentService
|
||||
from media_manager.database import DbSessionDependency
|
||||
from media_manager.torrent.service import TorrentService
|
||||
|
||||
|
||||
def get_torrent_service(db: DbSessionDependency) -> TorrentService:
|
||||
@@ -2,8 +2,8 @@ from uuid import UUID
|
||||
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from backend.src.database import Base
|
||||
from backend.src.torrent.schemas import Quality, TorrentStatus
|
||||
from media_manager.database import Base
|
||||
from media_manager.torrent.schemas import Quality, TorrentStatus
|
||||
|
||||
|
||||
class Torrent(Base):
|
||||
@@ -1,10 +1,10 @@
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from torrent.models import Torrent
|
||||
from torrent.schemas import TorrentId, Torrent as TorrentSchema
|
||||
from tv.models import SeasonFile, Show, Season
|
||||
from tv.schemas import SeasonFile as SeasonFileSchema, Show as ShowSchema
|
||||
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
|
||||
|
||||
|
||||
def get_seasons_files_of_torrent(
|
||||
@@ -2,9 +2,9 @@ from fastapi import APIRouter
|
||||
from fastapi import status
|
||||
from fastapi.params import Depends
|
||||
|
||||
from auth.users import current_active_user, current_superuser
|
||||
from torrent.dependencies import TorrentServiceDependency
|
||||
from torrent.schemas import TorrentId, Torrent
|
||||
from media_manager.auth.users import current_active_user, current_superuser
|
||||
from media_manager.torrent.dependencies import TorrentServiceDependency
|
||||
from media_manager.torrent.schemas import TorrentId, Torrent
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
@@ -16,20 +16,20 @@ import torrent.repository
|
||||
import tv.repository
|
||||
import tv.service
|
||||
from config import BasicConfig
|
||||
from indexer import IndexerQueryResult
|
||||
from torrent.repository import (
|
||||
from media_manager.indexer import IndexerQueryResult
|
||||
from media_manager.torrent.repository import (
|
||||
get_seasons_files_of_torrent,
|
||||
get_show_of_torrent,
|
||||
save_torrent,
|
||||
)
|
||||
from torrent.schemas import Torrent, TorrentStatus, TorrentId
|
||||
from torrent.utils import (
|
||||
from media_manager.torrent.schemas import Torrent, TorrentStatus, TorrentId
|
||||
from media_manager.torrent.utils import (
|
||||
list_files_recursively,
|
||||
get_torrent_filepath,
|
||||
import_file,
|
||||
extract_archives,
|
||||
)
|
||||
from tv.schemas import SeasonFile, Show
|
||||
from media_manager.tv.schemas import SeasonFile, Show
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -5,7 +5,7 @@ from pathlib import Path
|
||||
import patoolib
|
||||
|
||||
from config import BasicConfig
|
||||
from torrent.schemas import Torrent
|
||||
from media_manager.torrent.schemas import Torrent
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@@ -3,9 +3,9 @@ from uuid import UUID
|
||||
from sqlalchemy import ForeignKey, PrimaryKeyConstraint, UniqueConstraint
|
||||
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
||||
|
||||
from backend.src.auth.db import User
|
||||
from backend.src.database import Base
|
||||
from backend.src.torrent.models import Quality
|
||||
from media_manager.auth.db import User
|
||||
from media_manager.database import Base
|
||||
from media_manager.torrent.models import Quality
|
||||
|
||||
|
||||
class Show(Base):
|
||||
@@ -2,11 +2,11 @@ from sqlalchemy import select, delete
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.orm import Session, joinedload
|
||||
|
||||
from torrent.models import Torrent
|
||||
from torrent.schemas import TorrentId, Torrent as TorrentSchema
|
||||
from tv import log
|
||||
from tv.models import Season, Show, Episode, SeasonRequest, SeasonFile
|
||||
from tv.schemas import (
|
||||
from media_manager.torrent.models import Torrent
|
||||
from media_manager.torrent.schemas import TorrentId, Torrent as TorrentSchema
|
||||
from media_manager.tv import log
|
||||
from media_manager.tv.models import Season, Show, Episode, SeasonRequest, SeasonFile
|
||||
from media_manager.tv.schemas import (
|
||||
Season as SeasonSchema,
|
||||
SeasonId,
|
||||
Show as ShowSchema,
|
||||
@@ -5,16 +5,16 @@ from fastapi.responses import JSONResponse
|
||||
|
||||
import tv.repository
|
||||
import tv.service
|
||||
from auth.db import User
|
||||
from auth.schemas import UserRead
|
||||
from auth.users import current_active_user, current_superuser
|
||||
from backend.src.database import DbSessionDependency
|
||||
from indexer.schemas import PublicIndexerQueryResult, IndexerQueryResultId
|
||||
from metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from torrent.schemas import Torrent
|
||||
from tv import log
|
||||
from tv.exceptions import MediaAlreadyExists
|
||||
from tv.schemas import (
|
||||
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.database import DbSessionDependency
|
||||
from media_manager.indexer.schemas import PublicIndexerQueryResult, IndexerQueryResultId
|
||||
from media_manager.metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from media_manager.torrent.schemas import Torrent
|
||||
from media_manager.tv import log
|
||||
from media_manager.tv.exceptions import MediaAlreadyExists
|
||||
from media_manager.tv.schemas import (
|
||||
Show,
|
||||
SeasonRequest,
|
||||
ShowId,
|
||||
@@ -5,9 +5,9 @@ from uuid import UUID
|
||||
from pydantic import BaseModel, Field, ConfigDict, model_validator
|
||||
from tvdb_v4_official import Request
|
||||
|
||||
from auth.schemas import UserRead
|
||||
from torrent.models import Quality
|
||||
from torrent.schemas import TorrentId, TorrentStatus
|
||||
from media_manager.auth.schemas import UserRead
|
||||
from media_manager.torrent.models import Quality
|
||||
from media_manager.torrent.schemas import TorrentId, TorrentStatus
|
||||
|
||||
ShowId = typing.NewType("ShowId", UUID)
|
||||
SeasonId = typing.NewType("SeasonId", UUID)
|
||||
@@ -5,16 +5,16 @@ import indexer.service
|
||||
import metadataProvider
|
||||
import torrent.repository
|
||||
import tv.repository
|
||||
from indexer import IndexerQueryResult
|
||||
from indexer.schemas import IndexerQueryResultId
|
||||
from metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from torrent.repository import get_seasons_files_of_torrent
|
||||
from torrent.schemas import Torrent
|
||||
from torrent.service import TorrentService
|
||||
from tv import log
|
||||
from tv.exceptions import MediaAlreadyExists
|
||||
from tv.repository import add_season_file, get_season_files_by_season_id
|
||||
from tv.schemas import (
|
||||
from media_manager.indexer import IndexerQueryResult
|
||||
from media_manager.indexer.schemas import IndexerQueryResultId
|
||||
from media_manager.metadataProvider.schemas import MetaDataProviderShowSearchResult
|
||||
from media_manager.torrent.repository import get_seasons_files_of_torrent
|
||||
from media_manager.torrent.schemas import Torrent
|
||||
from media_manager.torrent.service import TorrentService
|
||||
from media_manager.tv import log
|
||||
from media_manager.tv.exceptions import MediaAlreadyExists
|
||||
from media_manager.tv.repository import add_season_file, get_season_files_by_season_id
|
||||
from media_manager.tv.schemas import (
|
||||
Show,
|
||||
ShowId,
|
||||
SeasonRequest,
|
||||
Reference in New Issue
Block a user