Spaces:
Running
Running
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 }; | |