diff --git a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index f175dec..87e436a 100644 --- a/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/node_modules/react-native-video/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -726,7 +726,7 @@ public class ReactExoplayerView extends FrameLayout implements DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(getContext()) - .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF) + .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER) .setEnableDecoderFallback(true) .forceEnableMediaCodecAsynchronousQueueing(); diff --git a/package-lock.json b/package-lock.json index 23eda0c..e426ea9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,7 +80,7 @@ "react-native-reanimated-carousel": "^4.0.3", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0", - "react-native-svg": "15.12.1", + "react-native-svg": "^15.12.1", "react-native-url-polyfill": "^2.0.0", "react-native-vector-icons": "^10.3.0", "react-native-video": "^6.17.0", diff --git a/package.json b/package.json index 7d580a4..9e8a526 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "react-native-reanimated-carousel": "^4.0.3", "react-native-safe-area-context": "~5.6.0", "react-native-screens": "~4.16.0", - "react-native-svg": "15.12.1", + "react-native-svg": "^15.12.1", "react-native-url-polyfill": "^2.0.0", "react-native-vector-icons": "^10.3.0", "react-native-video": "^6.17.0", diff --git a/src/components/home/ContentItem.tsx b/src/components/home/ContentItem.tsx index da3b985..6787a2e 100644 --- a/src/components/home/ContentItem.tsx +++ b/src/components/home/ContentItem.tsx @@ -388,8 +388,8 @@ const styles = StyleSheet.create({ shadowOffset: { width: 0, height: 1 }, shadowOpacity: 0.05, shadowRadius: 1, - borderWidth: 0.5, - borderColor: 'rgba(255,255,255,0.12)', + borderWidth: 1.5, + borderColor: 'rgba(255,255,255,0.15)', marginBottom: 8, }, contentItemContainer: { diff --git a/src/components/home/HeroCarousel.tsx b/src/components/home/HeroCarousel.tsx index 468b7fe..9ac167c 100644 --- a/src/components/home/HeroCarousel.tsx +++ b/src/components/home/HeroCarousel.tsx @@ -710,6 +710,7 @@ const CarouselCard: React.FC = memo(({ item, colors, logoFail + ) : ( <> diff --git a/src/components/metadata/MoreLikeThisSection.tsx b/src/components/metadata/MoreLikeThisSection.tsx index 13ae71c..b09044d 100644 --- a/src/components/metadata/MoreLikeThisSection.tsx +++ b/src/components/metadata/MoreLikeThisSection.tsx @@ -185,6 +185,8 @@ const styles = StyleSheet.create({ poster: { borderRadius: 8, // overridden responsively marginBottom: 8, + borderWidth: 1, + borderColor: 'rgba(255,255,255,0.15)', }, title: { fontSize: 13, // overridden responsively diff --git a/src/components/player/subtitles/CustomSubtitles.tsx b/src/components/player/subtitles/CustomSubtitles.tsx index 44d38ef..c8c4ada 100644 --- a/src/components/player/subtitles/CustomSubtitles.tsx +++ b/src/components/player/subtitles/CustomSubtitles.tsx @@ -85,11 +85,6 @@ export const CustomSubtitles: React.FC = ({ const displayFontSize = subtitleSize * inverseScale; const displayLineHeight = subtitleSize * lineHeightMultiplier * inverseScale; const svgHeight = lines.length * displayLineHeight; - // Roughly estimate text width to size SVG snugly (avoids overly wide background) - const charWidthFactor = 0.48; // even tighter average width per character - const estimatedLineWidths = lines.map(line => Math.max(1, line.length * displayFontSize * charWidthFactor)); - const maxEstimatedLineWidth = estimatedLineWidths.length > 0 ? Math.max(...estimatedLineWidths) : displayFontSize * 2; - const svgWidth = Math.max(displayFontSize * 2, Math.ceil(maxEstimatedLineWidth + displayFontSize * 0.25)); // Helper to render formatted segments const renderFormattedText = (segments: SubtitleSegment[], lineIndex: number, keyPrefix: string, isRTL?: boolean, customLetterSpacing?: number) => { @@ -145,19 +140,14 @@ export const CustomSubtitles: React.FC = ({ backgroundColor: bgColor, position: 'relative', alignItems: 'center', - alignSelf: 'center', - maxWidth: '90%', - paddingHorizontal: 4, - paddingVertical: 4, - transform: [{ scale: inverseScale }], } ]}> {useCrispSvgOutline ? ( // Crisp outline using react-native-svg (stroke under, fill on top) {(() => { @@ -169,10 +159,10 @@ export const CustomSubtitles: React.FC = ({ if (isRTL) { // For RTL, always use 'end' anchor to position from right edge anchor = 'end'; - x = svgWidth; + x = 1000; } else { anchor = align === 'center' ? 'middle' : align === 'left' ? 'start' : 'end'; - x = align === 'center' ? svgWidth / 2 : (align === 'left' ? 0 : svgWidth); + x = align === 'center' ? 500 : (align === 'left' ? 0 : 1000); } const baseFontSize = displayFontSize; @@ -258,6 +248,7 @@ export const CustomSubtitles: React.FC = ({ letterSpacing: effectiveLetterSpacing, fontSize: subtitleSize * inverseScale, lineHeight: subtitleSize * lineHeightMultiplier * inverseScale, + transform: [{ scale: inverseScale }], }, shadowStyle, ]}> diff --git a/src/screens/LibraryScreen.tsx b/src/screens/LibraryScreen.tsx index f016c2b..d5aa50f 100644 --- a/src/screens/LibraryScreen.tsx +++ b/src/screens/LibraryScreen.tsx @@ -1136,6 +1136,8 @@ const styles = StyleSheet.create({ shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.2, shadowRadius: 8, + borderWidth: 1, + borderColor: 'rgba(255,255,255,0.15)', }, poster: { width: '100%', diff --git a/src/screens/MetadataScreen.tsx b/src/screens/MetadataScreen.tsx index 8046ee0..610790e 100644 --- a/src/screens/MetadataScreen.tsx +++ b/src/screens/MetadataScreen.tsx @@ -1260,14 +1260,6 @@ const MetadataScreen: React.FC = () => { /> )} - {/* Recommendations Section with skeleton when loading - Lazy loaded */} - {type === 'movie' && shouldLoadSecondaryData && ( - - )} - {/* Series/Movie Content with episode skeleton when loading */} {Object.keys(groupedEpisodes).length > 0 ? ( { )} + + {/* Recommendations Section with skeleton when loading - Shown at bottom for shows */} + {shouldLoadSecondaryData && ( + + )}