import type { CardDefinition } from '../../types'; import CreateAppleMusicCardModal from './CreateAppleMusicCardModal.svelte'; import AppleMusicCard from './AppleMusicCard.svelte'; const cardType = 'apple-music-embed'; export const AppleMusicCardDefinition = { type: cardType, contentComponent: AppleMusicCard, creationModalComponent: CreateAppleMusicCardModal, createNew: (item) => { item.cardType = cardType; item.cardData = {}; item.w = 4; item.mobileW = 8; item.h = 5; item.mobileH = 10; }, onUrlHandler: (url, item) => { const match = matchAppleMusicUrl(url); if (!match) return null; item.cardData.appleMusicType = match.type; item.cardData.appleMusicId = match.id; item.cardData.appleMusicStorefront = match.storefront; item.cardData.href = url; item.w = 4; item.mobileW = 8; item.h = 5; item.mobileH = 10; return item; }, urlHandlerPriority: 2, name: 'Apple Music Embed', canResize: true, minW: 4, minH: 5, keywords: ['music', 'apple', 'playlist', 'album'], groups: ['Media'], icon: `` } as CardDefinition & { type: typeof cardType }; // Match Apple Music album and playlist URLs // Examples: // https://music.apple.com/us/album/midnights/1649434004 // https://music.apple.com/us/playlist/todays-hits/pl.f4d106fed2bd41149aaacabb233eb5eb function matchAppleMusicUrl( url: string | undefined ): { type: 'album' | 'playlist'; id: string; storefront: string } | null { if (!url) return null; const pattern = /music\.apple\.com\/([a-z]{2})\/(album|playlist)\/[^/]+\/([a-zA-Z0-9.]+)/; const match = url.match(pattern); if (match) { return { storefront: match[1], type: match[2] as 'album' | 'playlist', id: match[3] }; } return null; }