import studioData from '@/../_data/_studio.json'
type ImageSize = 'small' | 'medium' | 'large' | 'full'
type ImageResult = {
url: string
width: number
height: number
}
interface Dimensions {
w: number
h: number
}
type MetaEntry = {
o?: Dimensions
sm?: Dimensions
md?: Dimensions
lg?: Dimensions
f?: Dimensions
c?: number
}
interface FullMeta {
_cdns?: string[]
[key: string]: MetaEntry | string[] | undefined
}
const studio = studioData as FullMeta
const cdnUrls = studio._cdns || []
const SIZE_MAP: Record<
ImageSize,
{ key: 'sm' | 'md' | 'lg' | 'f'; suffix: string }
> = {
small: { key: 'sm', suffix: '-sm' },
medium: { key: 'md', suffix: '-md' },
large: { key: 'lg', suffix: '-lg' },
full: { key: 'f', suffix: '' },
}
function isProcessed(entry: MetaEntry | undefined): boolean {
if (!entry) return false
return !!(entry.f || entry.lg || entry.md || entry.sm)
}
function getStudioLookupKey(src: string): string {
let key = src.startsWith('/') ? src : `/${src}`
if (key.startsWith('/images/')) {
key = key.slice(7)
}
key = key.replace(/-(sm|md|lg)\.(jpg|jpeg|png|webp)$/i, '.$2')
return key
}
function getThumbnailPath(originalPath: string, size: ImageSize): string {
const ext = originalPath.match(/\.\w+$/)?.[0] || '.jpg'
const base = originalPath.replace(/\.\w+$/, '')
const outputExt = ext.toLowerCase() === '.png' ? '.png' : '.jpg'
const suffix = SIZE_MAP[size].suffix
return `/images${base}${suffix}${outputExt}`
}
export function getStudioImage(
url: string | undefined,
size: ImageSize = 'large'
): ImageResult | undefined {
if (!url) {
return undefined
}
try {
const lookupKey = getStudioLookupKey(url)
if (lookupKey.startsWith('_')) return undefined
const value = studio[lookupKey]
if (!value || Array.isArray(value)) return undefined
const entry = value as MetaEntry
const cdnUrl = entry.c !== undefined ? cdnUrls[entry.c] : undefined
const entryIsProcessed = isProcessed(entry)
const sizeConfig = SIZE_MAP[size]
if (size === 'full' || !entryIsProcessed) {
const fullDims = entry.f || entry.o
if (!fullDims) return undefined
const imageUrl = cdnUrl
? `${cdnUrl}${getThumbnailPath(lookupKey, 'full')}`
: getThumbnailPath(lookupKey, 'full')
return {
url: imageUrl,
width: fullDims.w,
height: fullDims.h,
}
}
const fallbackOrder: Array<'sm' | 'md' | 'lg' | 'f'> = [
'sm',
'md',
'lg',
'f',
]
const startIndex = Math.max(0, fallbackOrder.indexOf(sizeConfig.key))
for (let i = startIndex; i < fallbackOrder.length; i++) {
const key = fallbackOrder[i]
if (!key) continue
const sizeDims = entry[key]
if (sizeDims) {
const sizeForPath =
key === 'sm'
? 'small'
: key === 'md'
? 'medium'
: key === 'lg'
? 'large'
: 'full'
const imageUrl = cdnUrl
? `${cdnUrl}${getThumbnailPath(lookupKey, sizeForPath)}`
: getThumbnailPath(lookupKey, sizeForPath)
return {
url: imageUrl,
width: sizeDims.w,
height: sizeDims.h,
}
}
}
if (entry.o) {
const imageUrl = cdnUrl ? `${cdnUrl}${lookupKey}` : lookupKey
return {
url: imageUrl,
width: entry.o.w,
height: entry.o.h,
}
}
return undefined
} catch (error) {
console.warn(`Failed to get studio image for ${url}:`, error)
return undefined
}
}
export function studioUrl(src: string, size: ImageSize = 'large'): string {
if (!src) return src
const lookupKey = getStudioLookupKey(src)
if (lookupKey.startsWith('_')) return src
const value = studio[lookupKey]
if (!value || Array.isArray(value)) return src
const entry = value as MetaEntry
const cdnUrl = entry.c !== undefined ? cdnUrls[entry.c] : undefined
const entryIsProcessed = isProcessed(entry)
const baseUrl = cdnUrl || ''
if (!entryIsProcessed) {
return cdnUrl ? `${cdnUrl}${lookupKey}` : src
}
const sizeConfig = SIZE_MAP[size]
const fallbackOrder: Array<'sm' | 'md' | 'lg' | 'f'> = ['sm', 'md', 'lg', 'f']
const startIndex = Math.max(0, fallbackOrder.indexOf(sizeConfig.key))
for (let i = startIndex; i < fallbackOrder.length; i++) {
const key = fallbackOrder[i]
if (!key) continue
if (entry[key]) {
const sizeForPath =
key === 'sm'
? 'small'
: key === 'md'
? 'medium'
: key === 'lg'
? 'large'
: 'full'
const imagePath = getThumbnailPath(lookupKey, sizeForPath)
return `${baseUrl}${imagePath}`
}
}
const imagePath = getThumbnailPath(lookupKey, 'full')
return `${baseUrl}${imagePath}`
}