podcast episodes
This commit is contained in:
parent
d6e00b253c
commit
fe1c54ef76
4 changed files with 70 additions and 1 deletions
|
@ -25,6 +25,8 @@ from .models import (
|
||||||
PerformanceProductionSchema,
|
PerformanceProductionSchema,
|
||||||
PerformanceSchema,
|
PerformanceSchema,
|
||||||
Podcast,
|
Podcast,
|
||||||
|
PodcastEpisode,
|
||||||
|
PodcastEpisodeSchema,
|
||||||
PodcastSchema,
|
PodcastSchema,
|
||||||
TVEpisode,
|
TVEpisode,
|
||||||
TVEpisodeSchema,
|
TVEpisodeSchema,
|
||||||
|
@ -35,6 +37,8 @@ from .models import (
|
||||||
)
|
)
|
||||||
from .search.models import enqueue_fetch, get_fetch_lock, query_index
|
from .search.models import enqueue_fetch, get_fetch_lock, query_index
|
||||||
|
|
||||||
|
PAGE_SIZE = 20
|
||||||
|
|
||||||
|
|
||||||
class SearchResult(Schema):
|
class SearchResult(Schema):
|
||||||
data: List[
|
data: List[
|
||||||
|
@ -46,11 +50,18 @@ class SearchResult(Schema):
|
||||||
| PodcastSchema
|
| PodcastSchema
|
||||||
| GameSchema
|
| GameSchema
|
||||||
| PerformanceSchema
|
| PerformanceSchema
|
||||||
|
| PodcastEpisodeSchema
|
||||||
]
|
]
|
||||||
pages: int
|
pages: int
|
||||||
count: int
|
count: int
|
||||||
|
|
||||||
|
|
||||||
|
class EpisodeList(Schema):
|
||||||
|
data: List[PodcastEpisodeSchema]
|
||||||
|
pages: int
|
||||||
|
count: int
|
||||||
|
|
||||||
|
|
||||||
class SearchableItemCategory(Enum):
|
class SearchableItemCategory(Enum):
|
||||||
Book = "book"
|
Book = "book"
|
||||||
Movie = "movie"
|
Movie = "movie"
|
||||||
|
@ -221,6 +232,39 @@ def get_podcast(request, uuid: str, response: HttpResponse):
|
||||||
return _get_item(Podcast, uuid, response)
|
return _get_item(Podcast, uuid, response)
|
||||||
|
|
||||||
|
|
||||||
|
@api.get(
|
||||||
|
"/podcast/episode/{uuid}",
|
||||||
|
response={200: PodcastEpisodeSchema, 302: RedirectedResult, 404: Result},
|
||||||
|
auth=None,
|
||||||
|
tags=["catalog"],
|
||||||
|
)
|
||||||
|
def get_podcast_episode(request, uuid: str, response: HttpResponse):
|
||||||
|
return _get_item(PodcastEpisode, uuid, response)
|
||||||
|
|
||||||
|
|
||||||
|
@api.get(
|
||||||
|
"/podcast/{uuid}/episode/",
|
||||||
|
response={200: EpisodeList, 302: RedirectedResult, 404: Result},
|
||||||
|
auth=None,
|
||||||
|
tags=["catalog"],
|
||||||
|
)
|
||||||
|
def get_episodes_in_podcast(
|
||||||
|
request, uuid: str, response: HttpResponse, page: int = 1, guid: str | None = None
|
||||||
|
):
|
||||||
|
podcast = _get_item(Podcast, uuid, response)
|
||||||
|
if not isinstance(podcast, Podcast):
|
||||||
|
return podcast
|
||||||
|
episodes = podcast.child_items.filter(is_deleted=False, merged_to_item=None)
|
||||||
|
if guid:
|
||||||
|
episodes = episodes.filter(guid=guid)
|
||||||
|
r = {
|
||||||
|
"data": list(episodes)[(page - 1) * PAGE_SIZE : page * PAGE_SIZE],
|
||||||
|
"pages": (episodes.count() + PAGE_SIZE - 1) // PAGE_SIZE,
|
||||||
|
"count": episodes.count(),
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
|
||||||
|
|
||||||
@api.get(
|
@api.get(
|
||||||
"/album/{uuid}",
|
"/album/{uuid}",
|
||||||
response={200: AlbumSchema, 302: RedirectedResult, 404: Result},
|
response={200: AlbumSchema, 302: RedirectedResult, 404: Result},
|
||||||
|
|
|
@ -26,7 +26,13 @@ from .performance.models import (
|
||||||
PerformanceProductionSchema,
|
PerformanceProductionSchema,
|
||||||
PerformanceSchema,
|
PerformanceSchema,
|
||||||
)
|
)
|
||||||
from .podcast.models import Podcast, PodcastEpisode, PodcastInSchema, PodcastSchema
|
from .podcast.models import (
|
||||||
|
Podcast,
|
||||||
|
PodcastEpisode,
|
||||||
|
PodcastEpisodeSchema,
|
||||||
|
PodcastInSchema,
|
||||||
|
PodcastSchema,
|
||||||
|
)
|
||||||
from .tv.models import (
|
from .tv.models import (
|
||||||
TVEpisode,
|
TVEpisode,
|
||||||
TVEpisodeSchema,
|
TVEpisodeSchema,
|
||||||
|
@ -133,6 +139,7 @@ __all__ = [
|
||||||
"PerformanceSchema",
|
"PerformanceSchema",
|
||||||
"Podcast",
|
"Podcast",
|
||||||
"PodcastEpisode",
|
"PodcastEpisode",
|
||||||
|
"PodcastEpisodeSchema",
|
||||||
"PodcastInSchema",
|
"PodcastInSchema",
|
||||||
"PodcastSchema",
|
"PodcastSchema",
|
||||||
"TVEpisode",
|
"TVEpisode",
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
from datetime import datetime
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
@ -28,6 +29,18 @@ class PodcastSchema(PodcastInSchema, BaseSchema):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class PodcastEpisodeInSchema(ItemInSchema):
|
||||||
|
guid: str | None = None
|
||||||
|
pub_date: datetime | None = None
|
||||||
|
media_url: str | None = None
|
||||||
|
link: str | None = None
|
||||||
|
duration: int | None = None
|
||||||
|
|
||||||
|
|
||||||
|
class PodcastEpisodeSchema(PodcastEpisodeInSchema, BaseSchema):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
class Podcast(Item):
|
class Podcast(Item):
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
episodes: models.QuerySet["PodcastEpisode"]
|
episodes: models.QuerySet["PodcastEpisode"]
|
||||||
|
|
|
@ -61,6 +61,7 @@ class TVShowInSchema(ItemInSchema):
|
||||||
year: int | None = None
|
year: int | None = None
|
||||||
site: str | None = None
|
site: str | None = None
|
||||||
episode_count: int | None = None
|
episode_count: int | None = None
|
||||||
|
season_uuids: list[str]
|
||||||
|
|
||||||
|
|
||||||
class TVShowSchema(TVShowInSchema, BaseSchema):
|
class TVShowSchema(TVShowInSchema, BaseSchema):
|
||||||
|
@ -244,6 +245,10 @@ class TVShow(Item):
|
||||||
def child_items(self):
|
def child_items(self):
|
||||||
return self.all_seasons
|
return self.all_seasons
|
||||||
|
|
||||||
|
@property
|
||||||
|
def season_uuids(self):
|
||||||
|
return [x.uuid for x in self.all_seasons]
|
||||||
|
|
||||||
def get_season_count(self):
|
def get_season_count(self):
|
||||||
return self.season_count or self.seasons.all().count()
|
return self.season_count or self.seasons.all().count()
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue