Commit
·
fdcd21d
1
Parent(s):
fb99609
genre list
Browse files- app.py +6 -6
- services.py +49 -5
app.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
from fastapi import FastAPI,HTTPException, Request, Query
|
| 2 |
from fastapi.responses import JSONResponse
|
| 3 |
-
from typing import Optional
|
| 4 |
from LoadBalancer import LoadBalancer
|
| 5 |
import logging
|
| 6 |
import os
|
|
@@ -82,17 +82,17 @@ async def get_recent_items(limit: int = 5):
|
|
| 82 |
})
|
| 83 |
|
| 84 |
@app.get("/api/get/genre")
|
| 85 |
-
async def get_genre_items(genre: str, media_type: Optional[str] = None, limit: int = 5):
|
| 86 |
"""
|
| 87 |
-
Get recent items from
|
| 88 |
|
| 89 |
-
:param genre: The
|
| 90 |
:param media_type: Optional. Filter by media type ('movie' or 'series').
|
| 91 |
:param limit: The maximum number of items to return.
|
| 92 |
:return: A JSON response containing the filtered items.
|
| 93 |
"""
|
| 94 |
-
# Get sorted entries based on
|
| 95 |
-
entries = genre_list.
|
| 96 |
|
| 97 |
# Slice the list to only return the desired number of items
|
| 98 |
limited_entries = entries[:limit]
|
|
|
|
| 1 |
from fastapi import FastAPI,HTTPException, Request, Query
|
| 2 |
from fastapi.responses import JSONResponse
|
| 3 |
+
from typing import Optional, List
|
| 4 |
from LoadBalancer import LoadBalancer
|
| 5 |
import logging
|
| 6 |
import os
|
|
|
|
| 82 |
})
|
| 83 |
|
| 84 |
@app.get("/api/get/genre")
|
| 85 |
+
async def get_genre_items(genre: List[str] = Query(...), media_type: Optional[str] = None, limit: int = 5):
|
| 86 |
"""
|
| 87 |
+
Get recent items from specified genres with an optional media type filter and a limit on the number of results.
|
| 88 |
|
| 89 |
+
:param genre: The genres to filter by (e.g., 'Comedy').
|
| 90 |
:param media_type: Optional. Filter by media type ('movie' or 'series').
|
| 91 |
:param limit: The maximum number of items to return.
|
| 92 |
:return: A JSON response containing the filtered items.
|
| 93 |
"""
|
| 94 |
+
# Get sorted entries based on genres and media type
|
| 95 |
+
entries = genre_list.get_entries_by_multiple_genres(genre, media_type=media_type)
|
| 96 |
|
| 97 |
# Slice the list to only return the desired number of items
|
| 98 |
limited_entries = entries[:limit]
|
services.py
CHANGED
|
@@ -44,6 +44,8 @@ class RecentList:
|
|
| 44 |
# Get sorted series with details
|
| 45 |
return [(title, -year, self.series[title][1], self.series[title][2]) for year, title in self.sorted_series]
|
| 46 |
|
|
|
|
|
|
|
| 47 |
class GenreList:
|
| 48 |
def __init__(self):
|
| 49 |
# Initialize a dictionary to store genres and their associated data
|
|
@@ -110,6 +112,42 @@ class GenreList:
|
|
| 110 |
else:
|
| 111 |
return []
|
| 112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
def remove_genre(self, genre_name):
|
| 114 |
"""Remove a genre entirely from the list."""
|
| 115 |
if genre_name in self.genres:
|
|
@@ -122,6 +160,7 @@ class GenreList:
|
|
| 122 |
del self.genres[genre_name]['entries'][title]
|
| 123 |
self.genres[genre_name]['sorted_entries'].remove((-old_year, title))
|
| 124 |
|
|
|
|
| 125 |
# Example usage:
|
| 126 |
# genre_list = GenreList()
|
| 127 |
# genres = [
|
|
@@ -129,9 +168,14 @@ class GenreList:
|
|
| 129 |
# {"id": 17, "name": "Animation", "slug": "animation"},
|
| 130 |
# {"id": 27, "name": "Anime", "slug": "anime"}
|
| 131 |
# ]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
# genre_list.add_entry(genres, 'Movie Title', 2023, 'Description here', 'image_link_here', 'movie')
|
| 133 |
-
# genre_list.add_entry(
|
| 134 |
-
|
| 135 |
-
#
|
| 136 |
-
#
|
| 137 |
-
# print(
|
|
|
|
| 44 |
# Get sorted series with details
|
| 45 |
return [(title, -year, self.series[title][1], self.series[title][2]) for year, title in self.sorted_series]
|
| 46 |
|
| 47 |
+
import bisect
|
| 48 |
+
|
| 49 |
class GenreList:
|
| 50 |
def __init__(self):
|
| 51 |
# Initialize a dictionary to store genres and their associated data
|
|
|
|
| 112 |
else:
|
| 113 |
return []
|
| 114 |
|
| 115 |
+
def get_entries_by_multiple_genres(self, genre_names, media_type=None):
|
| 116 |
+
"""
|
| 117 |
+
Get entries that are present in all specified genres.
|
| 118 |
+
|
| 119 |
+
:param genre_names: A list of genre names.
|
| 120 |
+
:param media_type: Optional. Filter by media type ('movie' or 'series').
|
| 121 |
+
:return: A list of tuples containing title, year, description, image_link, and media_type.
|
| 122 |
+
"""
|
| 123 |
+
if not genre_names:
|
| 124 |
+
return []
|
| 125 |
+
|
| 126 |
+
# Get entries for the first genre
|
| 127 |
+
common_entries = set(self.genres[genre_names[0]]['entries'].keys()) if genre_names[0] in self.genres else set()
|
| 128 |
+
|
| 129 |
+
# Intersect with entries of the remaining genres
|
| 130 |
+
for genre_name in genre_names[1:]:
|
| 131 |
+
if genre_name in self.genres:
|
| 132 |
+
common_entries.intersection_update(self.genres[genre_name]['entries'].keys())
|
| 133 |
+
else:
|
| 134 |
+
return []
|
| 135 |
+
|
| 136 |
+
# Collect the sorted entries for the common titles
|
| 137 |
+
sorted_entries = []
|
| 138 |
+
for title in common_entries:
|
| 139 |
+
year = self.genres[genre_names[0]]['entries'][title][0]
|
| 140 |
+
description = self.genres[genre_names[0]]['entries'][title][1]
|
| 141 |
+
image_link = self.genres[genre_names[0]]['entries'][title][2]
|
| 142 |
+
media_type_entry = self.genres[genre_names[0]]['entries'][title][3]
|
| 143 |
+
if media_type is None or media_type_entry == media_type:
|
| 144 |
+
sorted_entries.append((title, year, description, image_link, media_type_entry))
|
| 145 |
+
|
| 146 |
+
# Sort the entries by year (descending)
|
| 147 |
+
sorted_entries.sort(key=lambda x: -x[1])
|
| 148 |
+
|
| 149 |
+
return sorted_entries
|
| 150 |
+
|
| 151 |
def remove_genre(self, genre_name):
|
| 152 |
"""Remove a genre entirely from the list."""
|
| 153 |
if genre_name in self.genres:
|
|
|
|
| 160 |
del self.genres[genre_name]['entries'][title]
|
| 161 |
self.genres[genre_name]['sorted_entries'].remove((-old_year, title))
|
| 162 |
|
| 163 |
+
|
| 164 |
# Example usage:
|
| 165 |
# genre_list = GenreList()
|
| 166 |
# genres = [
|
|
|
|
| 168 |
# {"id": 17, "name": "Animation", "slug": "animation"},
|
| 169 |
# {"id": 27, "name": "Anime", "slug": "anime"}
|
| 170 |
# ]
|
| 171 |
+
# genres2 = [
|
| 172 |
+
# {"id": 15, "name": "Comedy", "slug": "comedy"},
|
| 173 |
+
# {"id": 17, "name": "Animation", "slug": "animation"},
|
| 174 |
+
# {"id": 27, "name": "Anime", "slug": "anime"}
|
| 175 |
+
# ]
|
| 176 |
# genre_list.add_entry(genres, 'Movie Title', 2023, 'Description here', 'image_link_here', 'movie')
|
| 177 |
+
# genre_list.add_entry(genres2, 'Series Title', 2022, 'Series Description', 'series_image_link_here', 'movie')
|
| 178 |
+
|
| 179 |
+
# # Fetch entries that belong to both 'Comedy' and 'Animation'
|
| 180 |
+
# sorted_entries = genre_list.get_entries_by_multiple_genres(['Comedy', 'Animation'], media_type='movie')
|
| 181 |
+
# print(sorted_entries) # This should return only 'Movie Title' which is in both 'Comedy' and 'Animation'
|