From 076f33d6b78f29584021a85ead00234e7c4256f5 Mon Sep 17 00:00:00 2001 From: tapframe Date: Fri, 12 Dec 2025 15:33:39 +0530 Subject: [PATCH] added tmdb attribution --- src/screens/TMDBSettingsScreen.tsx | 200 ++++++++++++++++------------- 1 file changed, 111 insertions(+), 89 deletions(-) diff --git a/src/screens/TMDBSettingsScreen.tsx b/src/screens/TMDBSettingsScreen.tsx index e39e93ae..1af11904 100644 --- a/src/screens/TMDBSettingsScreen.tsx +++ b/src/screens/TMDBSettingsScreen.tsx @@ -28,7 +28,7 @@ import { logger } from '../utils/logger'; import { useTheme } from '../contexts/ThemeContext'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import CustomAlert from '../components/CustomAlert'; -// (duplicate import removed) +import TMDBIcon from '../components/icons/TMDBIcon'; const TMDB_API_KEY_STORAGE_KEY = 'tmdb_api_key'; const USE_CUSTOM_TMDB_API_KEY = 'use_custom_tmdb_api_key'; @@ -36,27 +36,27 @@ const TMDB_API_KEY = '439c478a771f35c05022f9feabcca01c'; // Define example shows with their IMDB IDs and TMDB IDs const EXAMPLE_SHOWS = [ - { - name: 'Breaking Bad', - imdbId: 'tt0903747', + { + name: 'Breaking Bad', + imdbId: 'tt0903747', tmdbId: '1396', type: 'tv' as const }, - { - name: 'Friends', - imdbId: 'tt0108778', + { + name: 'Friends', + imdbId: 'tt0108778', tmdbId: '1668', type: 'tv' as const }, - { - name: 'Stranger Things', - imdbId: 'tt4574334', + { + name: 'Stranger Things', + imdbId: 'tt4574334', tmdbId: '66732', type: 'tv' as const }, - { - name: 'Avatar', - imdbId: 'tt0499549', + { + name: 'Avatar', + imdbId: 'tt0499549', tmdbId: '19995', type: 'movie' as const }, @@ -82,7 +82,7 @@ const TMDBSettingsScreen = () => { const { settings, updateSetting } = useSettings(); const [languagePickerVisible, setLanguagePickerVisible] = useState(false); const [languageSearch, setLanguageSearch] = useState(''); - + // Logo preview state const [selectedShow, setSelectedShow] = useState(EXAMPLE_SHOWS[0]); const [tmdbLogo, setTmdbLogo] = useState(null); @@ -126,7 +126,7 @@ const TMDBSettingsScreen = () => { try { const keys = await mmkvStorage.getAllKeys(); const tmdbKeys = keys.filter(key => key.startsWith('tmdb_cache_')); - + let totalSize = 0; for (const key of tmdbKeys) { const value = mmkvStorage.getString(key); @@ -134,7 +134,7 @@ const TMDBSettingsScreen = () => { totalSize += value.length; } } - + // Convert to KB/MB let sizeStr = ''; if (totalSize < 1024) { @@ -144,7 +144,7 @@ const TMDBSettingsScreen = () => { } else { sizeStr = `${(totalSize / (1024 * 1024)).toFixed(2)} MB`; } - + setCacheSize(sizeStr); } catch (error) { logger.error('[TMDBSettingsScreen] Error calculating cache size:', error); @@ -187,17 +187,17 @@ const TMDBSettingsScreen = () => { mmkvStorage.getItem(TMDB_API_KEY_STORAGE_KEY), mmkvStorage.getItem(USE_CUSTOM_TMDB_API_KEY) ]); - + logger.log('[TMDBSettingsScreen] API key status:', savedKey ? 'Found' : 'Not found'); logger.log('[TMDBSettingsScreen] Use custom API setting:', savedUseCustomKey); - + if (savedKey) { setApiKey(savedKey); setIsKeySet(true); } else { setIsKeySet(false); } - + setUseCustomKey(savedUseCustomKey === 'true'); } catch (error) { logger.error('[TMDBSettingsScreen] Failed to load settings:', error); @@ -212,7 +212,7 @@ const TMDBSettingsScreen = () => { const saveApiKey = async () => { logger.log('[TMDBSettingsScreen] Starting API key save'); Keyboard.dismiss(); - + try { const trimmedKey = apiKey.trim(); if (!trimmedKey) { @@ -299,27 +299,27 @@ const TMDBSettingsScreen = () => { try { await mmkvStorage.setItem(USE_CUSTOM_TMDB_API_KEY, value ? 'true' : 'false'); setUseCustomKey(value); - + if (!value) { // If switching to built-in key, show confirmation logger.log('[TMDBSettingsScreen] Switching to built-in API key'); - setTestResult({ - success: true, - message: 'Now using the built-in TMDb API key.' + setTestResult({ + success: true, + message: 'Now using the built-in TMDb API key.' }); } else if (apiKey && isKeySet) { // If switching to custom key and we have a key logger.log('[TMDBSettingsScreen] Switching to custom API key'); - setTestResult({ - success: true, - message: 'Now using your custom TMDb API key.' + setTestResult({ + success: true, + message: 'Now using your custom TMDb API key.' }); } else { // If switching to custom key but don't have a key yet logger.log('[TMDBSettingsScreen] No custom key available yet'); - setTestResult({ - success: false, - message: 'Please enter and save your custom TMDb API key.' + setTestResult({ + success: false, + message: 'Please enter and save your custom TMDb API key.' }); } } catch (error) { @@ -355,27 +355,27 @@ const TMDBSettingsScreen = () => { setLoadingLogos(true); setTmdbLogo(null); setTmdbBanner(null); - + try { const tmdbId = show.tmdbId; const contentType = show.type; - + logger.log(`[TMDBSettingsScreen] Fetching ${show.name} with TMDB ID: ${tmdbId}`); - + const preferredTmdbLanguage = settings.tmdbLanguagePreference || 'en'; - + const apiKey = TMDB_API_KEY; const endpoint = contentType === 'tv' ? 'tv' : 'movie'; const response = await fetch(`https://api.themoviedb.org/3/${endpoint}/${tmdbId}/images?api_key=${apiKey}`); const imagesData = await response.json(); - + if (imagesData.logos && imagesData.logos.length > 0) { let logoPath: string | null = null; let logoLanguage = preferredTmdbLanguage; - + // Try to find logo in preferred language const preferredLogo = imagesData.logos.find((logo: { iso_639_1: string; file_path: string }) => logo.iso_639_1 === preferredTmdbLanguage); - + if (preferredLogo) { logoPath = preferredLogo.file_path; logoLanguage = preferredTmdbLanguage; @@ -383,7 +383,7 @@ const TMDBSettingsScreen = () => { } else { // Fallback to English const englishLogo = imagesData.logos.find((logo: { iso_639_1: string; file_path: string }) => logo.iso_639_1 === 'en'); - + if (englishLogo) { logoPath = englishLogo.file_path; logoLanguage = 'en'; @@ -395,7 +395,7 @@ const TMDBSettingsScreen = () => { setIsPreviewFallback(true); } } - + if (logoPath) { setTmdbLogo(`https://image.tmdb.org/t/p/original${logoPath}`); setPreviewLanguage(logoLanguage); @@ -407,7 +407,7 @@ const TMDBSettingsScreen = () => { setPreviewLanguage(''); setIsPreviewFallback(false); } - + // Get TMDB banner (backdrop) if (imagesData.backdrops && imagesData.backdrops.length > 0) { const backdropPath = imagesData.backdrops[0].file_path; @@ -415,7 +415,7 @@ const TMDBSettingsScreen = () => { } else { const detailsResponse = await fetch(`https://api.themoviedb.org/3/${endpoint}/${tmdbId}?api_key=${apiKey}`); const details = await detailsResponse.json(); - + if (details.backdrop_path) { setTmdbBanner(`https://image.tmdb.org/t/p/original${details.backdrop_path}`); } @@ -444,17 +444,17 @@ const TMDBSettingsScreen = () => { ); } - + return ( - {logo && ( - { if (__DEV__) console.error('Error loading selected show:', e); } }; - + loadSelectedShow(); }, []); @@ -512,7 +512,7 @@ const TMDBSettingsScreen = () => { } return ( - + @@ -520,7 +520,7 @@ const TMDBSettingsScreen = () => { style={styles.backButton} onPress={() => navigation.goBack()} > - + Settings @@ -602,7 +602,7 @@ const TMDBSettingsScreen = () => { {/* Logo Preview */} - + Logo Preview Preview shows how localized logos will appear in the selected language. @@ -610,8 +610,8 @@ const TMDBSettingsScreen = () => { {/* Show selector */} Example: - { onPress={() => handleShowSelect(show)} activeOpacity={0.7} > - { {/* Cache Management Section */} - + Cache Size @@ -823,6 +823,14 @@ const TMDBSettingsScreen = () => { + {/* TMDB Attribution Section */} + + + + This product uses the TMDB API but is not endorsed or certified by TMDB. + + + {/* Language Picker Modal */} { return ( <> {filteredLanguages.map(({ code, label, native }) => ( - { updateSetting('tmdbLanguagePreference', code); setLanguagePickerVisible(false); }} - style={[ - styles.languageItem, - settings.tmdbLanguagePreference === code && styles.selectedLanguageItem - ]} - activeOpacity={0.7} - > - - - - {native} - - - {label} • {code.toUpperCase()} - - - {settings.tmdbLanguagePreference === code && ( - - - - )} - + { updateSetting('tmdbLanguagePreference', code); setLanguagePickerVisible(false); }} + style={[ + styles.languageItem, + settings.tmdbLanguagePreference === code && styles.selectedLanguageItem + ]} + activeOpacity={0.7} + > + + + + {native} + + + {label} • {code.toUpperCase()} + + + {settings.tmdbLanguagePreference === code && ( + + + + )} + ))} {languageSearch.length > 0 && filteredLanguages.length === 0 && ( @@ -1519,6 +1527,20 @@ const styles = StyleSheet.create({ fontSize: 11, marginTop: 6, }, + attributionContainer: { + alignItems: 'center', + justifyContent: 'center', + padding: 24, + marginBottom: 20, + opacity: 0.8, + }, + attributionText: { + fontSize: 12, + textAlign: 'center', + marginTop: 12, + maxWidth: '80%', + lineHeight: 18, + }, }); export default TMDBSettingsScreen; \ No newline at end of file