diff --git a/backend/server.js b/backend/server.js index 2c1eefb..4148dc5 100644 --- a/backend/server.js +++ b/backend/server.js @@ -396,6 +396,20 @@ function normalizeFacebookPostUrl(rawValue) { parsed.protocol = 'https:'; parsed.port = ''; + const normalizedPathBeforeTrim = parsed.pathname.replace(/\/+$/, '') || '/'; + const lowerPathBeforeTrim = normalizedPathBeforeTrim.toLowerCase(); + const watchId = parsed.searchParams.get('v') || parsed.searchParams.get('video_id'); + if ((lowerPathBeforeTrim === '/watch' || lowerPathBeforeTrim === '/video.php') && watchId) { + parsed.pathname = `/reel/${watchId}/`; + parsed.search = ''; + } else { + const reelMatch = lowerPathBeforeTrim.match(/^\/reel\/([^/]+)$/); + if (reelMatch) { + parsed.pathname = `/reel/${reelMatch[1]}/`; + parsed.search = ''; + } + } + const cleanedParams = new URLSearchParams(); parsed.searchParams.forEach((paramValue, paramKey) => { const lowerKey = paramKey.toLowerCase(); @@ -424,6 +438,11 @@ function normalizeFacebookPostUrl(rawValue) { } } + const normalizedPath = parsed.pathname.replace(/\/+$/, '').toLowerCase(); + if (normalizedPath.startsWith('/hashtag/') || normalizedPath.startsWith('/watch/hashtag/')) { + return null; + } + const search = cleanedParams.toString(); const formatted = `${parsed.origin}${parsed.pathname}${search ? `?${search}` : ''}`; return formatted.replace(/[?&]$/, ''); diff --git a/extension/content.js b/extension/content.js index cbdaa67..4aca282 100644 --- a/extension/content.js +++ b/extension/content.js @@ -1890,6 +1890,20 @@ function normalizeFacebookPostUrl(rawValue) { return ''; } + const normalizedPathBeforeTrim = parsed.pathname.replace(/\/+$/, '') || '/'; + const lowerPathBeforeTrim = normalizedPathBeforeTrim.toLowerCase(); + const watchId = parsed.searchParams.get('v') || parsed.searchParams.get('video_id'); + if ((lowerPathBeforeTrim === '/watch' || lowerPathBeforeTrim === '/video.php') && watchId) { + parsed.pathname = `/reel/${watchId}/`; + parsed.search = ''; + } else { + const reelMatch = lowerPathBeforeTrim.match(/^\/reel\/([^/]+)$/); + if (reelMatch) { + parsed.pathname = `/reel/${reelMatch[1]}/`; + parsed.search = ''; + } + } + const cleanedParams = new URLSearchParams(); parsed.searchParams.forEach((paramValue, paramKey) => { const lowerKey = paramKey.toLowerCase(); @@ -1921,6 +1935,11 @@ function normalizeFacebookPostUrl(rawValue) { } } + const normalizedPath = parsed.pathname.replace(/\/+$/, '').toLowerCase(); + if (normalizedPath.startsWith('/hashtag/') || normalizedPath.startsWith('/watch/hashtag/')) { + return ''; + } + const search = cleanedParams.toString(); const formatted = `${parsed.origin}${parsed.pathname}${search ? `?${search}` : ''}`; return formatted.replace(/[?&]$/, ''); diff --git a/web/app.js b/web/app.js index 3fabf55..204c647 100644 --- a/web/app.js +++ b/web/app.js @@ -626,6 +626,7 @@ function openBookmark(bookmark) { window.open(url, '_blank', 'noopener'); } }); + } async function markBookmarkClick(bookmarkId) { @@ -894,6 +895,7 @@ function toggleBookmarkPanel(forceVisible) { bookmarkPanelVisible = shouldShow; bookmarkPanel.hidden = !bookmarkPanelVisible; + bookmarkPanel.style.display = bookmarkPanelVisible ? 'flex' : 'none'; bookmarkPanel.setAttribute('aria-hidden', bookmarkPanelVisible ? 'false' : 'true'); bookmarkPanelToggle.setAttribute('aria-expanded', bookmarkPanelVisible ? 'true' : 'false'); @@ -993,6 +995,8 @@ function initializeBookmarks() { if (bookmarkPanel) { bookmarkPanel.setAttribute('aria-hidden', 'true'); + bookmarkPanel.hidden = true; + bookmarkPanel.style.display = 'none'; } if (bookmarkPanelToggle) { @@ -1338,6 +1342,20 @@ function normalizeFacebookPostUrl(rawValue) { return null; } + const normalizedPathBeforeTrim = parsed.pathname.replace(/\/+$/, '') || '/'; + const lowerPathBeforeTrim = normalizedPathBeforeTrim.toLowerCase(); + const watchId = parsed.searchParams.get('v') || parsed.searchParams.get('video_id'); + if ((lowerPathBeforeTrim === '/watch' || lowerPathBeforeTrim === '/video.php') && watchId) { + parsed.pathname = `/reel/${watchId}/`; + parsed.search = ''; + } else { + const reelMatch = lowerPathBeforeTrim.match(/^\/reel\/([^/]+)$/); + if (reelMatch) { + parsed.pathname = `/reel/${reelMatch[1]}/`; + parsed.search = ''; + } + } + const cleanedParams = new URLSearchParams(); parsed.searchParams.forEach((paramValue, paramKey) => { const lowerKey = paramKey.toLowerCase(); @@ -1349,6 +1367,11 @@ function normalizeFacebookPostUrl(rawValue) { cleanedParams.append(paramKey, paramValue); }); + const normalizedPath = parsed.pathname.replace(/\/+$/, '').toLowerCase(); + if (normalizedPath.startsWith('/hashtag/') || normalizedPath.startsWith('/watch/hashtag/')) { + return ''; + } + const search = cleanedParams.toString(); const formatted = `${parsed.origin}${parsed.pathname}${search ? `?${search}` : ''}`; return formatted.replace(/[?&]$/, '');