ChandimaPrabath commited on
Commit
fdcd21d
·
1 Parent(s): fb99609

genre list

Browse files
Files changed (2) hide show
  1. app.py +6 -6
  2. 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 a specified genre with an optional media type filter and a limit on the number of results.
88
 
89
- :param genre: The genre 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 genre and media type
95
- entries = genre_list.get_sorted_entries(genre, media_type=media_type)
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(genres, 'Series Title', 2022, 'Series Description', 'series_image_link_here', 'series')
134
- # sorted_comedy_movies = genre_list.get_sorted_entries('Comedy', media_type='movie')
135
- # sorted_comedy_series = genre_list.get_sorted_entries('Comedy')
136
- # print(sorted_comedy_movies)
137
- # print(sorted_comedy_series)
 
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'