refactor: change folder structure

This commit is contained in:
maxDorninger
2025-05-29 14:30:39 +02:00
parent a51716db7d
commit 206df8b150
48 changed files with 120 additions and 125 deletions

5
.env
View File

@@ -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
View File

@@ -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

View File

View File

View File

@@ -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

View File

@@ -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())

View File

@@ -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):

View File

@@ -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()

View File

@@ -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

View File

@@ -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()

View 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())

View File

@@ -1,4 +1,4 @@
from backend.src.indexer.schemas import IndexerQueryResult
from media_manager.indexer.schemas import IndexerQueryResult
class GenericIndexer(object):

View File

@@ -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__)

View File

@@ -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):

View File

@@ -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,
)

View File

@@ -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)

View File

@@ -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]:

View File

@@ -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(

View File

@@ -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

View File

@@ -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__)

View File

@@ -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):

View File

@@ -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):

View File

@@ -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:

View File

@@ -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):

View File

@@ -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(

View File

@@ -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()

View File

@@ -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__)

View File

@@ -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__)

View File

@@ -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):

View File

@@ -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,

View File

@@ -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,

View File

@@ -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)

View File

@@ -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,