|
8 | 8 | router = APIRouter() |
9 | 9 |
|
10 | 10 |
|
| 11 | +async def fetch_languages_list(): |
| 12 | + """ |
| 13 | + Fetch and format languages list from TMDB. |
| 14 | + Returns a list of language dictionaries with iso_639_1, language, and country. |
| 15 | + """ |
| 16 | + tmdb = get_tmdb_service() |
| 17 | + tasks = [ |
| 18 | + tmdb.get_primary_translations(), |
| 19 | + tmdb.get_languages(), |
| 20 | + tmdb.get_countries(), |
| 21 | + ] |
| 22 | + primary_translations, languages, countries = await asyncio.gather(*tasks) |
| 23 | + |
| 24 | + language_map = {lang["iso_639_1"]: lang["english_name"] for lang in languages} |
| 25 | + country_map = {country["iso_3166_1"]: country["english_name"] for country in countries} |
| 26 | + |
| 27 | + result = [] |
| 28 | + for element in primary_translations: |
| 29 | + # element looks like "en-US" |
| 30 | + parts = element.split("-") |
| 31 | + if len(parts) != 2: |
| 32 | + continue |
| 33 | + |
| 34 | + lang_code, country_code = parts |
| 35 | + language_name = language_map.get(lang_code) |
| 36 | + country_name = country_map.get(country_code) |
| 37 | + |
| 38 | + if language_name and country_name: |
| 39 | + result.append( |
| 40 | + { |
| 41 | + "iso_639_1": element, |
| 42 | + "language": language_name, |
| 43 | + "country": country_name, |
| 44 | + } |
| 45 | + ) |
| 46 | + result.sort(key=lambda x: (x["iso_639_1"] != "en-US", x["language"])) |
| 47 | + return result |
| 48 | + |
| 49 | + |
11 | 50 | @router.get("/api/languages") |
12 | 51 | async def get_languages(): |
13 | 52 | try: |
14 | | - tmdb = get_tmdb_service() |
15 | | - tasks = [ |
16 | | - tmdb.get_primary_translations(), |
17 | | - tmdb.get_languages(), |
18 | | - tmdb.get_countries(), |
19 | | - ] |
20 | | - primary_translations, languages, countries = await asyncio.gather(*tasks) |
21 | | - |
22 | | - language_map = {lang["iso_639_1"]: lang["english_name"] for lang in languages} |
23 | | - |
24 | | - country_map = {country["iso_3166_1"]: country["english_name"] for country in countries} |
25 | | - |
26 | | - result = [] |
27 | | - for element in primary_translations: |
28 | | - # element looks like "en-US" |
29 | | - parts = element.split("-") |
30 | | - if len(parts) != 2: |
31 | | - continue |
32 | | - |
33 | | - lang_code, country_code = parts |
34 | | - |
35 | | - language_name = language_map.get(lang_code) |
36 | | - country_name = country_map.get(country_code) |
37 | | - |
38 | | - if language_name and country_name: |
39 | | - result.append( |
40 | | - { |
41 | | - "iso_639_1": element, |
42 | | - "language": language_name, |
43 | | - "country": country_name, |
44 | | - } |
45 | | - ) |
46 | | - return result |
47 | | - |
| 53 | + languages = await fetch_languages_list() |
| 54 | + return languages |
48 | 55 | except Exception as e: |
49 | 56 | logger.error(f"Failed to fetch languages: {e}") |
50 | 57 | raise HTTPException(status_code=502, detail="Failed to fetch languages from TMDB") |
0 commit comments