diff --git a/models/playlist.ts b/models/playlist.ts new file mode 100644 index 0000000..b2a260e --- /dev/null +++ b/models/playlist.ts @@ -0,0 +1,14 @@ +import { User } from './user'; +import { Track } from './track'; + +export interface Playlist { + id?: string; + description: string; + num_followers: number; + original_name: string; + owner: User; + snapshot_id: string; + tracks: Track[]; + unique_name: string; + url: string; +} diff --git a/models/track.ts b/models/track.ts new file mode 100644 index 0000000..933eb2c --- /dev/null +++ b/models/track.ts @@ -0,0 +1,16 @@ +import { User } from './user'; + +export interface Track { + added_at: string; + album: { + name: string; + url: string; + }; + artists: User[]; + duration_ms: number; + name: string; + url: string; + date_added: string; + date_added_asterisk: boolean; + date_removed: string | null; +} diff --git a/models/user.ts b/models/user.ts new file mode 100644 index 0000000..d8e94be --- /dev/null +++ b/models/user.ts @@ -0,0 +1,4 @@ +export interface User { + name: string; + url: string; +} diff --git a/pages/index.vue b/pages/index.vue new file mode 100644 index 0000000..6b3af91 --- /dev/null +++ b/pages/index.vue @@ -0,0 +1,141 @@ + + + + + diff --git a/utils/getPlaylistIdFromUrl.ts b/utils/getPlaylistIdFromUrl.ts new file mode 100644 index 0000000..b05c707 --- /dev/null +++ b/utils/getPlaylistIdFromUrl.ts @@ -0,0 +1,17 @@ +export const getPlaylistIdFromUrl = (url: string) => { + try { + const urlObject = new URL(url); + const [collectionName, playlistId] = urlObject.pathname + .split('/') + .filter(Boolean); + + const isValidPlaylistUrl = + urlObject.hostname === 'open.spotify.com' && + collectionName === 'playlist' && + playlistId; + + return isValidPlaylistUrl ? playlistId : null; + } catch { + return null; + } +};