mirror of
https://github.com/StepanovPlaton/torrent_backend.git
synced 2026-04-03 20:30:38 +04:00
Add audiobooks
This commit is contained in:
@@ -1,2 +1,4 @@
|
||||
from .games import *
|
||||
from .movies import *
|
||||
from .audiobooks import *
|
||||
from .users import *
|
||||
|
||||
45
database/crud/audiobooks.py
Normal file
45
database/crud/audiobooks.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from time import strftime
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.future import select
|
||||
|
||||
from .. import models as mdl
|
||||
from .. import schemas as sch
|
||||
from ..database import add_transaction
|
||||
|
||||
|
||||
async def get_audiobooks(db: AsyncSession):
|
||||
return (await db.execute(select(mdl.Audiobook))).scalars().all()
|
||||
|
||||
|
||||
async def get_audiobook(db: AsyncSession, audiobook_id: int):
|
||||
return await db.get(mdl.Audiobook, audiobook_id)
|
||||
|
||||
|
||||
async def add_audiobook(db: AsyncSession,
|
||||
audiobook_info: sch.AudiobookCreate,
|
||||
user_id: int):
|
||||
audiobook = mdl.Audiobook(**audiobook_info.model_dump(),
|
||||
update_date=strftime("%Y-%m-%d %H:%M:%S"),
|
||||
upload_date=strftime("%Y-%m-%d %H:%M:%S"),
|
||||
owner_id=user_id)
|
||||
return await add_transaction(db, audiobook)
|
||||
|
||||
|
||||
async def edit_audiobook(db: AsyncSession,
|
||||
audiobook_id: int,
|
||||
audiobook_info: sch.AudiobookCreate):
|
||||
audiobook = await db.get(mdl.Audiobook, audiobook_id)
|
||||
for key, value in vars(audiobook_info).items():
|
||||
if (value and value is not None and getattr(audiobook, key) != value):
|
||||
setattr(audiobook, key, value)
|
||||
setattr(audiobook, "update_date", strftime("%Y-%m-%d %H:%M:%S"))
|
||||
await db.commit()
|
||||
return audiobook
|
||||
|
||||
|
||||
async def delete_audiobook(db: AsyncSession,
|
||||
audiobook_id: int):
|
||||
audiobook = await get_audiobook(db, audiobook_id)
|
||||
await db.delete(audiobook)
|
||||
await db.commit()
|
||||
return audiobook
|
||||
@@ -32,6 +32,7 @@ async def edit_game(db: AsyncSession,
|
||||
for key, value in vars(game_info).items():
|
||||
if (value and value is not None and getattr(game, key) != value):
|
||||
setattr(game, key, value)
|
||||
setattr(game, "update_date", strftime("%Y-%m-%d %H:%M:%S"))
|
||||
await db.commit()
|
||||
return game
|
||||
|
||||
|
||||
45
database/crud/movies.py
Normal file
45
database/crud/movies.py
Normal file
@@ -0,0 +1,45 @@
|
||||
from time import strftime
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy.future import select
|
||||
|
||||
from .. import models as mdl
|
||||
from .. import schemas as sch
|
||||
from ..database import add_transaction
|
||||
|
||||
|
||||
async def get_movies(db: AsyncSession):
|
||||
return (await db.execute(select(mdl.Movie))).scalars().all()
|
||||
|
||||
|
||||
async def get_movie(db: AsyncSession, movie_id: int):
|
||||
return await db.get(mdl.Movie, movie_id)
|
||||
|
||||
|
||||
async def add_movie(db: AsyncSession,
|
||||
movie_info: sch.MovieCreate,
|
||||
user_id: int):
|
||||
movie = mdl.Movie(**movie_info.model_dump(),
|
||||
update_date=strftime("%Y-%m-%d %H:%M:%S"),
|
||||
upload_date=strftime("%Y-%m-%d %H:%M:%S"),
|
||||
owner_id=user_id)
|
||||
return await add_transaction(db, movie)
|
||||
|
||||
|
||||
async def edit_movie(db: AsyncSession,
|
||||
movie_id: int,
|
||||
movie_info: sch.MovieCreate):
|
||||
movie = await db.get(mdl.Movie, movie_id)
|
||||
for key, value in vars(movie_info).items():
|
||||
if (value and value is not None and getattr(movie, key) != value):
|
||||
setattr(movie, key, value)
|
||||
setattr(movie, "update_date", strftime("%Y-%m-%d %H:%M:%S"))
|
||||
await db.commit()
|
||||
return movie
|
||||
|
||||
|
||||
async def delete_movie(db: AsyncSession,
|
||||
movie_id: int):
|
||||
movie = await get_movie(db, movie_id)
|
||||
await db.delete(movie)
|
||||
await db.commit()
|
||||
return movie
|
||||
@@ -1,2 +1,4 @@
|
||||
from .games import Game as Game
|
||||
from .users import User as User
|
||||
from .movies import Movie as Movie
|
||||
from .audiobooks import Audiobook as Audiobook
|
||||
from .users import User as User
|
||||
|
||||
26
database/models/audiobooks.py
Normal file
26
database/models/audiobooks.py
Normal file
@@ -0,0 +1,26 @@
|
||||
from sqlalchemy import Column, ForeignKey, Integer, String
|
||||
|
||||
from ..database import Base
|
||||
|
||||
|
||||
class Audiobook(Base):
|
||||
__tablename__ = "audiobooks"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
|
||||
title = Column(String, nullable=False, unique=True)
|
||||
cover = Column(String)
|
||||
description = Column(String)
|
||||
author = Column(String)
|
||||
|
||||
torrent_file = Column(String, nullable=False)
|
||||
upload_date = Column(String, nullable=False)
|
||||
fragment = Column(String)
|
||||
update_date = Column(String, nullable=False)
|
||||
language = Column(String)
|
||||
release_date = Column(String)
|
||||
download_size = Column(String)
|
||||
duration = Column(String)
|
||||
reader = Column(String)
|
||||
|
||||
owner_id = Column(Integer, ForeignKey("users.id"))
|
||||
@@ -1,5 +1,4 @@
|
||||
from sqlalchemy import Column, ForeignKey, Integer, String
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
from ..database import Base
|
||||
|
||||
|
||||
28
database/models/movies.py
Normal file
28
database/models/movies.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from sqlalchemy import Column, ForeignKey, Integer, String
|
||||
|
||||
from ..database import Base
|
||||
|
||||
|
||||
class Movie(Base):
|
||||
__tablename__ = "movies"
|
||||
|
||||
id = Column(Integer, primary_key=True)
|
||||
|
||||
title = Column(String, nullable=False, unique=True)
|
||||
cover = Column(String)
|
||||
age = Column(String)
|
||||
description = Column(String)
|
||||
|
||||
torrent_file = Column(String, nullable=False)
|
||||
upload_date = Column(String, nullable=False)
|
||||
trailer = Column(String)
|
||||
update_date = Column(String, nullable=False)
|
||||
language = Column(String)
|
||||
subtitles = Column(String)
|
||||
release_date = Column(String)
|
||||
download_size = Column(String)
|
||||
director = Column(String)
|
||||
duration = Column(String)
|
||||
country = Column(String)
|
||||
|
||||
owner_id = Column(Integer, ForeignKey("users.id"))
|
||||
@@ -1,2 +1,4 @@
|
||||
from .games import *
|
||||
from .movies import *
|
||||
from .audiobooks import *
|
||||
from .users import *
|
||||
|
||||
51
database/schemas/audiobooks.py
Normal file
51
database/schemas/audiobooks.py
Normal file
@@ -0,0 +1,51 @@
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class AudiobookCardBase(BaseModel):
|
||||
title: str = Field(examples=["Марсианин"])
|
||||
cover: Optional[str] = \
|
||||
Field(default=None, examples=["cover_filename.jpg"])
|
||||
description: Optional[str] = \
|
||||
Field(default=None,
|
||||
examples=["Главный герой оказался в сложнейшей ситуации."
|
||||
" Его жизнь висела на волоске и зависела от"
|
||||
" нескольких совершенно нелогичных факторов."
|
||||
" Дело в том, что его бросили на Марсе в крайне"
|
||||
" затруднительном для дальнейшей жизни положении."
|
||||
" Рассчитывать стоит лишь на себя и на чудо,"
|
||||
" ведь ультрасовременный скафандр оказался прошит"
|
||||
" антенной, а до прибытия следующей экспедиции"
|
||||
" остается целая вечность."])
|
||||
author: Optional[str] = \
|
||||
Field(default=None, examples=["Вейр Энди"])
|
||||
|
||||
|
||||
class AudiobookCard(AudiobookCardBase):
|
||||
id: int = Field(examples=[1])
|
||||
|
||||
|
||||
class AudiobookBase(AudiobookCardBase):
|
||||
torrent_file: str = Field(examples=["torrent_filename.torrent"])
|
||||
fragment: Optional[str] = \
|
||||
Field(default=None, examples=[
|
||||
"fragment.mp3"])
|
||||
|
||||
language: Optional[str] = Field(default=None, examples=["рус"])
|
||||
release_date: Optional[str] = Field(default=None, examples=["2015"])
|
||||
download_size: Optional[str] = Field(default=None, examples=["300Mb"])
|
||||
duration: Optional[str] = Field(default=None, examples=["12:38"])
|
||||
reader: Optional[str] = Field(default=None, examples=["Дмитрий Хазанович"])
|
||||
|
||||
|
||||
class AudiobookCreate(AudiobookBase):
|
||||
pass
|
||||
|
||||
|
||||
class Audiobook(AudiobookBase):
|
||||
id: int = Field(examples=[1])
|
||||
update_date: str = Field(examples=["2024-06-14 12:00:00"])
|
||||
upload_date: str = Field(examples=["2024-06-14 12:00:00"])
|
||||
owner_id: int = Field(examples=[1])
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
@@ -1,10 +1,9 @@
|
||||
from typing import Optional
|
||||
from fastapi import Body
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class GameCardBase(BaseModel):
|
||||
title: str = Field(examples=["DwarfFortress", "RimWorld"])
|
||||
title: str = Field(examples=["DwarfFortress"])
|
||||
cover: Optional[str] = \
|
||||
Field(default=None, examples=["cover_filename.jpg"])
|
||||
description: Optional[str] = \
|
||||
|
||||
55
database/schemas/movies.py
Normal file
55
database/schemas/movies.py
Normal file
@@ -0,0 +1,55 @@
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class MovieCardBase(BaseModel):
|
||||
title: str = Field(examples=["Интерстеллар"])
|
||||
cover: Optional[str] = \
|
||||
Field(default=None, examples=["cover_filename.jpg"])
|
||||
description: Optional[str] = \
|
||||
Field(default=None,
|
||||
examples=["Когда засуха, пыльные бури и вымирание"
|
||||
" растений приводят человечество к"
|
||||
" продовольственному кризису, коллектив"
|
||||
" исследователей и учёных отправляется"
|
||||
" сквозь червоточину (которая предположительно"
|
||||
" соединяет области пространства-времени"
|
||||
" через большое расстояние) в путешествие,"
|
||||
" чтобы превзойти прежние ограничения для"
|
||||
" космических путешествий человека и найти"
|
||||
" планету с подходящими для человечества условиями."])
|
||||
age: Optional[str] = \
|
||||
Field(default=None, examples=["18+"])
|
||||
|
||||
|
||||
class MovieCard(MovieCardBase):
|
||||
id: int = Field(examples=[1])
|
||||
|
||||
|
||||
class MovieBase(MovieCardBase):
|
||||
torrent_file: str = Field(examples=["torrent_filename.torrent"])
|
||||
trailer: Optional[str] = \
|
||||
Field(default=None, examples=[
|
||||
"https://www.youtube.com/watch?v=6ybBuTETr3U"])
|
||||
|
||||
language: Optional[str] = Field(default=None, examples=["рус"])
|
||||
subtitles: Optional[str] = Field(default=None, examples=["Отсутствуют"])
|
||||
release_date: Optional[str] = Field(default=None, examples=["2014"])
|
||||
download_size: Optional[str] = Field(default=None, examples=["32Gb"])
|
||||
director: Optional[str] = Field(default=None, examples=["Кристофер Нолан"])
|
||||
duration: Optional[str] = Field(default=None, examples=["02:37:58"])
|
||||
country: Optional[str] = \
|
||||
Field(default=None, examples=["США, Великобритания, Канада"])
|
||||
|
||||
|
||||
class MovieCreate(MovieBase):
|
||||
pass
|
||||
|
||||
|
||||
class Movie(MovieBase):
|
||||
id: int = Field(examples=[1])
|
||||
update_date: str = Field(examples=["2024-06-11 12:00:00"])
|
||||
upload_date: str = Field(examples=["2024-06-11 12:00:00"])
|
||||
owner_id: int = Field(examples=[1])
|
||||
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
Reference in New Issue
Block a user