|
|
| class LoadBalancerAPI { |
| constructor(baseURL) { |
| this.baseURL = baseURL; |
| this.cache = { |
| filmStore: null, |
| tvStore: null, |
| allMovies: null, |
| allSeries: null, |
| movieMetadata: new Map(), |
| seriesMetadata: new Map(), |
| }; |
| } |
|
|
| async getInstances() { |
| return await this._get('/api/get/instances'); |
| } |
|
|
| async getInstancesHealth() { |
| return await this._get('/api/get/instances/health'); |
| } |
|
|
| async getMovieByTitle(title) { |
| return await this._get(`/api/get/movie/${encodeURIComponent(title)}`); |
| } |
|
|
| async getSeriesEpisode(title, season, episode) { |
| return await this._get(`/api/get/series/${encodeURIComponent(title)}/${season}/${episode}`); |
| } |
|
|
| async getSeriesStore() { |
| if (!this.cache.tvStore) { |
| this.cache.tvStore = await this._get('/api/get/series/store'); |
| } |
| return this.cache.tvStore || {}; |
| } |
|
|
| async getMovieStore() { |
| if (!this.cache.filmStore) { |
| this.cache.filmStore = await this._get('/api/get/movie/store'); |
| } |
| return this.cache.filmStore || {}; |
| } |
|
|
| async getMovieMetadataByTitle(title) { |
| if (!this.cache.movieMetadata.has(title)) { |
| const metadata = await this._get(`/api/get/movie/metadata/${encodeURIComponent(title)}`); |
| this.cache.movieMetadata.set(title, metadata); |
| } |
| return this.cache.movieMetadata.get(title); |
| } |
|
|
| async getMovieCard(title) { |
| return await this._get(`/api/get/movie/card/${encodeURIComponent(title)}`); |
| } |
|
|
| async getSeriesMetadataByTitle(title) { |
| if (!this.cache.seriesMetadata.has(title)) { |
| const metadata = await this._get(`/api/get/series/metadata/${encodeURIComponent(title)}`); |
| this.cache.seriesMetadata.set(title, metadata); |
| } |
| return this.cache.seriesMetadata.get(title); |
| } |
|
|
| async getSeriesCard(title) { |
| return await this._get(`/api/get/series/card/${encodeURIComponent(title)}`); |
| } |
|
|
| async getSeasonMetadataByTitleAndSeason(title, season) { |
| return await this._get(`/api/get/series/metadata/${encodeURIComponent(title)}/${encodeURIComponent(season)}`); |
| } |
|
|
| async getSeasonMetadataBySeriesId(series_id, season) { |
| return await this._get(`/api/get/series/metadata/${series_id}/${season}`); |
| } |
|
|
| async getAllMovies() { |
| if (!this.cache.allMovies) { |
| this.cache.allMovies = await this._get('/api/get/movie/all'); |
| } |
| return this.cache.allMovies; |
| } |
|
|
| async getAllSeriesShows() { |
| if (!this.cache.allSeries) { |
| this.cache.allSeries = await this._get('/api/get/series/all'); |
| } |
| return this.cache.allSeries; |
| } |
|
|
| async getRecent(limit = 10) { |
| return await this._get(`/api/get/recent?limit=${limit}`); |
| } |
|
|
| async getGenreCategories(mediaType) { |
| const url = mediaType |
| ? `/api/get/genre_categories?media_type=${encodeURIComponent(mediaType)}` |
| : '/api/get/genre_categories'; |
| return await this._get(url); |
| } |
| |
| async getGenreItems(genres, mediaType, limit = 5, page = 1) { |
| if (!Array.isArray(genres)) { |
| throw new Error("The 'genres' parameter must be an array."); |
| } |
| const params = new URLSearchParams(); |
| genres.forEach(genre => params.append('genre', genre)); |
| params.append('limit', limit); |
| params.append('page', page); |
| if (mediaType) { |
| params.append('media_type', mediaType); |
| } |
| try { |
| const response = await this._get(`/api/get/genre?${params.toString()}`); |
| console.debug(response); |
| return response; |
| } catch (error) { |
| console.debug("Error fetching genre items:", error); |
| throw error; |
| } |
| } |
|
|
| async getDownloadProgress(url) { |
| return await this._getNoBase(url); |
| } |
|
|
| async _get(endpoint) { |
| return await this._request(`${this.baseURL}${endpoint}`, { method: 'GET' }); |
| } |
|
|
| async _getNoBase(url) { |
| return await this._request(url, { method: 'GET' }); |
| } |
|
|
| async _post(endpoint, body) { |
| return await this._request(`${this.baseURL}${endpoint}`, { |
| method: 'POST', |
| body: JSON.stringify(body) |
| }); |
| } |
|
|
| async _request(url, options) { |
| try { |
| const response = await fetch(url, { |
| headers: { 'Content-Type': 'application/json' }, |
| ...options, |
| }); |
| console.log(`API Request: ${url} with options: ${JSON.stringify(options)}`); |
| return await this._handleResponse(response); |
| } catch (error) { |
| console.debug(`Request error for ${url}:`, error); |
| throw error; |
| } |
| } |
|
|
| async _handleResponse(response) { |
| if (!response.ok) { |
| const errorDetails = await response.text(); |
| throw new Error(`HTTP Error ${response.status}: ${errorDetails}`); |
| } |
| try { |
| return await response.json(); |
| } catch (error) { |
| console.debug('Error parsing JSON response:', error); |
| throw error; |
| } |
| } |
|
|
| clearCache() { |
| this.cache = { |
| filmStore: null, |
| tvStore: null, |
| allMovies: null, |
| allSeries: null, |
| movieMetadata: new Map(), |
| seriesMetadata: new Map(), |
| }; |
| } |
| } |
|
|
| export { LoadBalancerAPI }; |
|
|