import { cdnUrl, thumborUrl } from '../config' const URL_CONFIG = { cdnUrl: cdnUrl, thumborUrl: `${thumborUrl}/unsafe/`, audioSubfolder: 'audio', imageSubfolder: 'image', productionFolder: 'production/' } const AUDIO_EXTENSIONS = new Set(['wav', 'mp3', 'ogg', 'aif', 'flac']) const isAudioFile = (filename: string): boolean => { const extension = filename.split('.').pop()?.toLowerCase() return AUDIO_EXTENSIONS.has(extension ?? '') } const getLastSegment = (url: string): string => url.toLowerCase().split('/').pop() || '' const buildSizePart = (width?: number, height?: number, includeSize = true): string => { if (!includeSize) return '' const widthPart = width ? width.toString() : '' const heightPart = height ? height.toString() : '' return widthPart || heightPart ? `${widthPart}x${heightPart}/` : '' } export const getImageUrl = ( src: string, options: { width?: number; height?: number; noSizeUrlPart?: boolean } = {} ): string => { if (!src.includes('discours.io') && src.includes('http')) { return src } const filename = getLastSegment(src) const base = isAudioFile(filename) ? URL_CONFIG.cdnUrl : URL_CONFIG.thumborUrl const suffix = options.noSizeUrlPart ? '' : buildSizePart(options.width, options.height) const subfolder = isAudioFile(filename) ? URL_CONFIG.audioSubfolder : URL_CONFIG.imageSubfolder return `${base}${suffix}${URL_CONFIG.productionFolder}${subfolder}/${filename}` } export const getOpenGraphImageUrl = ( src: string, options: { topic: string title: string author: string width?: number height?: number } ): string => { const sizeUrlPart = buildSizePart(options.width, options.height) const filtersPart = `filters:discourstext('${encodeURIComponent(options.topic)}','${encodeURIComponent( options.author )}','${encodeURIComponent(options.title)}')/` if (src.startsWith(URL_CONFIG.thumborUrl)) { const thumborKey = src.replace(URL_CONFIG.thumborUrl, '') return `${URL_CONFIG.thumborUrl}${sizeUrlPart}${filtersPart}${thumborKey}` } return `${URL_CONFIG.thumborUrl}${sizeUrlPart}${filtersPart}${src}` }