diff --git a/src/components/ContentPanel.tsx b/src/components/ContentPanel.tsx index 0dc5b04f..6070a03d 100644 --- a/src/components/ContentPanel.tsx +++ b/src/components/ContentPanel.tsx @@ -31,6 +31,7 @@ import { import AuthorCard from './AuthorCard' import { faBooks } from '../icons/customIcons' import { classifyUrl } from '../utils/helpers' +import { buildNativeVideoUrl } from '../utils/videoHelpers' interface ContentPanelProps { loading: boolean @@ -204,34 +205,6 @@ const ContentPanel: React.FC = ({ } // Video actions - const buildNativeVideoUrl = (url: string): string | null => { - try { - const u = new URL(url) - const host = u.hostname - if (host.includes('youtube.com')) { - const id = u.searchParams.get('v') - return id ? `youtube://watch?v=${id}` : `youtube://${u.pathname}${u.search}` - } - if (host === 'youtu.be') { - const id = u.pathname.replace('/', '') - return id ? `youtube://watch?v=${id}` : 'youtube://' - } - if (host.includes('vimeo.com')) { - const id = u.pathname.split('/').filter(Boolean)[0] - return id ? `vimeo://app.vimeo.com/videos/${id}` : 'vimeo://' - } - if (host.includes('dailymotion.com') || host === 'dai.ly') { - // dailymotion.com/video/ or dai.ly/ - const parts = u.pathname.split('/').filter(Boolean) - const id = host === 'dai.ly' ? parts[0] : (parts[1] || '') - return id ? `dailymotion://video/${id}` : 'dailymotion://' - } - return null - } catch { - return null - } - } - const handleOpenVideoExternal = () => { if (selectedUrl) window.open(selectedUrl, '_blank', 'noopener,noreferrer') setShowVideoMenu(false) diff --git a/src/utils/videoHelpers.ts b/src/utils/videoHelpers.ts new file mode 100644 index 00000000..65a5cf6b --- /dev/null +++ b/src/utils/videoHelpers.ts @@ -0,0 +1,36 @@ +/** + * Build native app deep link URL for video platforms + * Returns null if the platform doesn't have a known native app URL scheme + */ +export function buildNativeVideoUrl(url: string): string | null { + try { + const u = new URL(url) + const host = u.hostname + + if (host.includes('youtube.com')) { + const id = u.searchParams.get('v') + return id ? `youtube://watch?v=${id}` : `youtube://${u.pathname}${u.search}` + } + + if (host === 'youtu.be') { + const id = u.pathname.replace('/', '') + return id ? `youtube://watch?v=${id}` : 'youtube://' + } + + if (host.includes('vimeo.com')) { + const id = u.pathname.split('/').filter(Boolean)[0] + return id ? `vimeo://app.vimeo.com/videos/${id}` : 'vimeo://' + } + + if (host.includes('dailymotion.com') || host === 'dai.ly') { + const parts = u.pathname.split('/').filter(Boolean) + const id = host === 'dai.ly' ? parts[0] : (parts[1] || '') + return id ? `dailymotion://video/${id}` : 'dailymotion://' + } + + return null + } catch { + return null + } +} +