mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
fix(media): classify mp4-formatted gif previews as video
This commit is contained in:
@@ -128,6 +128,7 @@ describe('media-utils', () => {
|
|||||||
url: 'https://ibb.co/abc123',
|
url: 'https://ibb.co/abc123',
|
||||||
});
|
});
|
||||||
expect(getLinkMediaInfo('https://example.com/file.gif')).toMatchObject({ type: 'gif' });
|
expect(getLinkMediaInfo('https://example.com/file.gif')).toMatchObject({ type: 'gif' });
|
||||||
|
expect(getLinkMediaInfo('https://external-preview.redd.it/example.gif?width=480&format=mp4')).toMatchObject({ type: 'video' });
|
||||||
expect(getLinkMediaInfo('https://example.com/file.png')).toMatchObject({ type: 'image' });
|
expect(getLinkMediaInfo('https://example.com/file.png')).toMatchObject({ type: 'image' });
|
||||||
expect(getLinkMediaInfo('https://example.com/file.mp4')).toMatchObject({ type: 'video' });
|
expect(getLinkMediaInfo('https://example.com/file.mp4')).toMatchObject({ type: 'video' });
|
||||||
expect(getLinkMediaInfo('https://example.com/file.mp3')).toMatchObject({ type: 'audio' });
|
expect(getLinkMediaInfo('https://example.com/file.mp3')).toMatchObject({ type: 'audio' });
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ const getPatternThumbnailUrl = (url: URL): string | undefined => {
|
|||||||
const KNOWN_IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico', 'tiff'];
|
const KNOWN_IMAGE_EXTENSIONS = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'svg', 'bmp', 'ico', 'tiff'];
|
||||||
const KNOWN_VIDEO_EXTENSIONS = ['mp4', 'webm', 'mov', 'avi', 'mkv', 'flv', 'wmv', 'm4v'];
|
const KNOWN_VIDEO_EXTENSIONS = ['mp4', 'webm', 'mov', 'avi', 'mkv', 'flv', 'wmv', 'm4v'];
|
||||||
const KNOWN_AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'wma'];
|
const KNOWN_AUDIO_EXTENSIONS = ['mp3', 'wav', 'ogg', 'flac', 'aac', 'm4a', 'wma'];
|
||||||
|
const KNOWN_MEDIA_EXTENSIONS = new Set([...KNOWN_IMAGE_EXTENSIONS, ...KNOWN_VIDEO_EXTENSIONS, ...KNOWN_AUDIO_EXTENSIONS]);
|
||||||
|
|
||||||
// some sites don't show thumbnails, so the backend-side thumbnail fetching needs to be disabled, or it might fetch non-thumbnails such as emojis
|
// some sites don't show thumbnails, so the backend-side thumbnail fetching needs to be disabled, or it might fetch non-thumbnails such as emojis
|
||||||
const THUMBNAIL_BLACKLISTED_DOMAINS = ['twitter.com', 'x.com'];
|
const THUMBNAIL_BLACKLISTED_DOMAINS = ['twitter.com', 'x.com'];
|
||||||
@@ -114,6 +115,16 @@ const getAllowedThumbnailUrl = (value: string, baseUrl: string): string | undefi
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getDirectMediaExtension = (url: URL): string => {
|
||||||
|
const format = url.searchParams.get('format')?.toLowerCase() ?? '';
|
||||||
|
if (KNOWN_MEDIA_EXTENSIONS.has(format)) {
|
||||||
|
return format;
|
||||||
|
}
|
||||||
|
|
||||||
|
const pathParts = url.pathname.toLowerCase().split('.');
|
||||||
|
return pathParts.length > 1 ? pathParts[pathParts.length - 1] : '';
|
||||||
|
};
|
||||||
|
|
||||||
export const getLinkMediaInfo = memoize(
|
export const getLinkMediaInfo = memoize(
|
||||||
(link: string): CommentMediaInfo | undefined => {
|
(link: string): CommentMediaInfo | undefined => {
|
||||||
if (!isValidURL(link)) {
|
if (!isValidURL(link)) {
|
||||||
@@ -134,9 +145,7 @@ export const getLinkMediaInfo = memoize(
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Extract file extension
|
const extension = getDirectMediaExtension(url);
|
||||||
const pathParts = url.pathname.toLowerCase().split('.');
|
|
||||||
const extension = pathParts.length > 1 ? pathParts[pathParts.length - 1] : '';
|
|
||||||
|
|
||||||
// Only classify as media if we explicitly know the extension
|
// Only classify as media if we explicitly know the extension
|
||||||
if (KNOWN_IMAGE_EXTENSIONS.includes(extension)) {
|
if (KNOWN_IMAGE_EXTENSIONS.includes(extension)) {
|
||||||
@@ -148,10 +157,6 @@ export const getLinkMediaInfo = memoize(
|
|||||||
}
|
}
|
||||||
// Unknown extensions remain as 'webpage'
|
// Unknown extensions remain as 'webpage'
|
||||||
|
|
||||||
if (!url.pathname.includes('.')) {
|
|
||||||
type = 'webpage';
|
|
||||||
}
|
|
||||||
|
|
||||||
if (canEmbed(url) || url.host.startsWith('yt.')) {
|
if (canEmbed(url) || url.host.startsWith('yt.')) {
|
||||||
type = 'iframe';
|
type = 'iframe';
|
||||||
patternThumbnailUrl = getPatternThumbnailUrl(url);
|
patternThumbnailUrl = getPatternThumbnailUrl(url);
|
||||||
|
|||||||
Reference in New Issue
Block a user