diff --git a/providers/Melon/__snapshots__/mod.test.ts.snap b/providers/Melon/__snapshots__/mod.test.ts.snap new file mode 100644 index 0000000..9702db2 --- /dev/null +++ b/providers/Melon/__snapshots__/mod.test.ts.snap @@ -0,0 +1,1318 @@ +export const snapshot = {}; + +snapshot[`Melon provider > release lookup > Regular (정규) album with unavailable CD-only tracks 1`] = ` +{ + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + availableIn: [ + "KR", + ], + excludedFrom: [], + externalLinks: [ + { + types: [ + "paid streaming", + ], + url: "https://www.melon.com/album/detail.htm?albumId=13691104", + }, + ], + images: [ + { + thumbUrl: "https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_1000.jpg?d542b23e161ca5823a59711812184deb", + types: [ + "front", + ], + url: "https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_org.jpg", + }, + ], + info: { + messages: [], + providers: [ + { + apiUrl: "https://m2.melon.com/m6/v3/album/info.json?albumId=13691104", + id: "13691104", + internalName: "melon", + lookup: { + method: "id", + value: "13691104", + }, + name: "Melon", + url: "https://www.melon.com/album/detail.htm?albumId=13691104", + }, + ], + }, + labels: [ + { + name: "BLUEBROWN RECORDS", + }, + ], + media: [ + { + format: "Digital Media", + number: 1, + tracklist: [ + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 148000, + number: 1, + recording: { + externalIds: [ + { + id: "602102736", + provider: "melon", + type: "song", + }, + ], + }, + title: "ALIVE", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 177000, + number: 2, + recording: { + externalIds: [ + { + id: "602102737", + provider: "melon", + type: "song", + }, + ], + }, + title: "SHOW H.O.W", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 188000, + number: 3, + recording: { + externalIds: [ + { + id: "602102738", + provider: "melon", + type: "song", + }, + ], + }, + title: "Told U So", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 159000, + number: 4, + recording: { + externalIds: [ + { + id: "602102739", + provider: "melon", + type: "song", + }, + ], + }, + title: "TEA", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 156000, + number: 5, + recording: { + externalIds: [ + { + id: "602102740", + provider: "melon", + type: "song", + }, + ], + }, + title: "My Vision", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 84000, + number: 6, + recording: { + externalIds: [ + { + id: "602102741", + provider: "melon", + type: "song", + }, + ], + }, + title: "Skit.exe", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 154000, + number: 7, + recording: { + externalIds: [ + { + id: "602102742", + provider: "melon", + type: "song", + }, + ], + }, + title: "나를 잃지 않는 방법 (Lost in Proof)", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 163000, + number: 8, + recording: { + externalIds: [ + { + id: "602102743", + provider: "melon", + type: "song", + }, + ], + }, + title: "달라 (\$.\$)", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 160000, + number: 9, + recording: { + externalIds: [ + { + id: "602102744", + provider: "melon", + type: "song", + }, + ], + }, + title: "Close To Me", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 130000, + number: 10, + recording: { + externalIds: [ + { + id: "602102745", + provider: "melon", + type: "song", + }, + ], + }, + title: "One Beat", + }, + { + artists: [ + { + creditedName: "HEART OF WOMAN (하트오브우먼)", + externalIds: [ + { + id: "4974032", + provider: "melon", + type: "artist", + }, + ], + name: "HEART OF WOMAN (하트오브우먼)", + }, + ], + length: 175000, + number: 11, + recording: { + externalIds: [ + { + id: "602102746", + provider: "melon", + type: "song", + }, + ], + }, + title: "Dive With Me", + }, + ], + }, + ], + packaging: "None", + releaseDate: { + date: { + day: 28, + month: 5, + year: 2026, + }, + quality: "assumed-valid", + }, + status: "Official", + title: "Heart Byte : LEGACY", + types: [ + "Album", + ], +} +`; + +snapshot[`Melon provider > release lookup > Regular (정규) album with multiple discs and multiple artists 1`] = ` +{ + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + availableIn: [ + "KR", + ], + excludedFrom: [], + externalLinks: [ + { + types: [ + "paid streaming", + ], + url: "https://www.melon.com/album/detail.htm?albumId=10000727", + }, + ], + images: [ + { + thumbUrl: "https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_1000.jpg", + types: [ + "front", + ], + url: "https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_org.jpg", + }, + ], + info: { + messages: [], + providers: [ + { + apiUrl: "https://m2.melon.com/m6/v3/album/info.json?albumId=10000727", + id: "10000727", + internalName: "melon", + lookup: { + method: "id", + value: "10000727", + }, + name: "Melon", + url: "https://www.melon.com/album/detail.htm?albumId=10000727", + }, + ], + }, + labels: [ + { + name: "크롬엔터테인먼트", + }, + ], + media: [ + { + format: "Digital Media", + number: 1, + tracklist: [ + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 180000, + number: 1, + recording: { + externalIds: [ + { + id: "30004162", + provider: "melon", + type: "song", + }, + ], + }, + title: "부릉부릉 (Vroom Vroom)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 182000, + number: 2, + recording: { + externalIds: [ + { + id: "30004163", + provider: "melon", + type: "song", + }, + ], + }, + title: "Too Much", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 190000, + number: 3, + recording: { + externalIds: [ + { + id: "30004164", + provider: "melon", + type: "song", + }, + ], + }, + title: "두둠칫 (Doo Doom Chit)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 213000, + number: 4, + recording: { + externalIds: [ + { + id: "30004165", + provider: "melon", + type: "song", + }, + ], + }, + title: "부기우기 (Boogie Woogie)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 212000, + number: 5, + recording: { + externalIds: [ + { + id: "30004166", + provider: "melon", + type: "song", + }, + ], + }, + title: "Tonight", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 179000, + number: 6, + recording: { + externalIds: [ + { + id: "30004167", + provider: "melon", + type: "song", + }, + ], + }, + title: "다가와 (Get It Here)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 189000, + number: 7, + recording: { + externalIds: [ + { + id: "30004168", + provider: "melon", + type: "song", + }, + ], + }, + title: "스케치북 (Sketch Book)", + }, + { + artists: [ + { + creditedName: "소율", + externalIds: [ + { + id: "685916", + provider: "melon", + type: "artist", + }, + ], + name: "소율", + }, + ], + length: 207000, + number: 8, + recording: { + externalIds: [ + { + id: "30004169", + provider: "melon", + type: "song", + }, + ], + }, + title: "Love Couple (Feat. The Zoo)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 180000, + number: 9, + recording: { + externalIds: [ + { + id: "30004170", + provider: "melon", + type: "song", + }, + ], + }, + title: "부릉부릉 (Vroom Vroom) (Inst.)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 190000, + number: 10, + recording: { + externalIds: [ + { + id: "30004171", + provider: "melon", + type: "song", + }, + ], + }, + title: "두둠칫 (Doo Doom Chit) (Inst.)", + }, + ], + }, + { + format: "Digital Media", + number: 2, + tracklist: [ + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 179000, + number: 1, + recording: { + externalIds: [ + { + id: "30004172", + provider: "melon", + type: "song", + }, + ], + }, + title: "빠빠빠 (Bar Bar Bar)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 193000, + number: 2, + recording: { + externalIds: [ + { + id: "30004173", + provider: "melon", + type: "song", + }, + ], + }, + title: "어이 (UH-EE)", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 200000, + number: 3, + recording: { + externalIds: [ + { + id: "30004174", + provider: "melon", + type: "song", + }, + ], + }, + title: "Dancing Queen 2.0", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 186000, + number: 4, + recording: { + externalIds: [ + { + id: "30004175", + provider: "melon", + type: "song", + }, + ], + }, + title: "Bing Bing", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 221000, + number: 5, + recording: { + externalIds: [ + { + id: "30004176", + provider: "melon", + type: "song", + }, + ], + }, + title: "FM", + }, + { + artists: [ + { + creditedName: "크레용팝", + externalIds: [ + { + id: "685904", + provider: "melon", + type: "artist", + }, + ], + name: "크레용팝", + }, + ], + length: 187000, + number: 6, + recording: { + externalIds: [ + { + id: "30004177", + provider: "melon", + type: "song", + }, + ], + }, + title: "Saturday Night", + }, + { + artists: [ + { + creditedName: "웨이 (크레용팝)", + externalIds: [ + { + id: "685918", + provider: "melon", + type: "artist", + }, + ], + name: "웨이 (크레용팝)", + }, + { + creditedName: "초아 (크레용팝)", + externalIds: [ + { + id: "685917", + provider: "melon", + type: "artist", + }, + ], + name: "초아 (크레용팝)", + }, + ], + length: 223000, + number: 7, + recording: { + externalIds: [ + { + id: "30004178", + provider: "melon", + type: "song", + }, + ], + }, + title: "Hello", + }, + ], + }, + ], + packaging: "None", + releaseDate: { + date: { + day: 26, + month: 9, + year: 2016, + }, + quality: "assumed-valid", + }, + status: "Official", + title: "Evolution Pop_Vol.1", + types: [ + "Album", + ], +} +`; + +snapshot[`Melon provider > release lookup > EP (미니) album 1`] = ` +{ + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + availableIn: [ + "KR", + ], + excludedFrom: [], + externalLinks: [ + { + types: [ + "paid streaming", + ], + url: "https://www.melon.com/album/detail.htm?albumId=13693526", + }, + ], + images: [ + { + thumbUrl: "https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_1000.jpg?41b5d7a536bb19d0c982ac5b9d8b505c", + types: [ + "front", + ], + url: "https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_org.jpg", + }, + ], + info: { + messages: [], + providers: [ + { + apiUrl: "https://m2.melon.com/m6/v3/album/info.json?albumId=13693526", + id: "13693526", + internalName: "melon", + lookup: { + method: "id", + value: "13693526", + }, + name: "Melon", + url: "https://www.melon.com/album/detail.htm?albumId=13693526", + }, + ], + }, + labels: [ + { + name: "모드하우스", + }, + ], + media: [ + { + format: "Digital Media", + number: 1, + tracklist: [ + { + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + length: 162000, + number: 1, + recording: { + externalIds: [ + { + id: "602111503", + provider: "melon", + type: "song", + }, + ], + }, + title: "Sad Girls Schemin'", + }, + { + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + length: 61000, + number: 2, + recording: { + externalIds: [ + { + id: "602111504", + provider: "melon", + type: "song", + }, + ], + }, + title: "Peer", + }, + { + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + length: 188000, + number: 3, + recording: { + externalIds: [ + { + id: "602111505", + provider: "melon", + type: "song", + }, + ], + }, + title: "Baby Flower", + }, + { + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + length: 189000, + number: 4, + recording: { + externalIds: [ + { + id: "602111506", + provider: "melon", + type: "song", + }, + ], + }, + title: "Type of Girl", + }, + { + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + length: 151000, + number: 5, + recording: { + externalIds: [ + { + id: "602111507", + provider: "melon", + type: "song", + }, + ], + }, + title: "Sleek", + }, + { + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + length: 136000, + number: 6, + recording: { + externalIds: [ + { + id: "602111508", + provider: "melon", + type: "song", + }, + ], + }, + title: "I Like That", + }, + { + artists: [ + { + creditedName: "tripleS (트리플에스)", + externalIds: [ + { + id: "3137294", + provider: "melon", + type: "artist", + }, + ], + name: "tripleS (트리플에스)", + }, + ], + length: 139000, + number: 7, + recording: { + externalIds: [ + { + id: "602111509", + provider: "melon", + type: "song", + }, + ], + }, + title: "Me Myself Mode", + }, + ], + }, + ], + packaging: "None", + releaseDate: { + date: { + day: 1, + month: 6, + year: 2026, + }, + quality: "assumed-valid", + }, + status: "Official", + title: " pt.1", + types: [ + "EP", + ], +} +`; + +snapshot[`Melon provider > release lookup > Single (싱글) album 1`] = ` +{ + artists: [ + { + creditedName: "하슬 (ARTMS)", + externalIds: [ + { + id: "1273010", + provider: "melon", + type: "artist", + }, + ], + name: "하슬 (ARTMS)", + }, + ], + availableIn: [ + "KR", + ], + excludedFrom: [], + externalLinks: [ + { + types: [ + "paid streaming", + ], + url: "https://www.melon.com/album/detail.htm?albumId=13732020", + }, + ], + images: [ + { + thumbUrl: "https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_1000.jpg?6dfaa6d8ce62309cfe5304f7f6205bc2", + types: [ + "front", + ], + url: "https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_org.jpg", + }, + ], + info: { + messages: [], + providers: [ + { + apiUrl: "https://m2.melon.com/m6/v3/album/info.json?albumId=13732020", + id: "13732020", + internalName: "melon", + lookup: { + method: "id", + value: "13732020", + }, + name: "Melon", + url: "https://www.melon.com/album/detail.htm?albumId=13732020", + }, + ], + }, + labels: [ + { + name: "㈜노느니특공대엔터테인먼트", + }, + ], + media: [ + { + format: "Digital Media", + number: 1, + tracklist: [ + { + artists: [ + { + creditedName: "하슬 (ARTMS)", + externalIds: [ + { + id: "1273010", + provider: "melon", + type: "artist", + }, + ], + name: "하슬 (ARTMS)", + }, + ], + length: 227000, + number: 1, + recording: { + externalIds: [ + { + id: "602249438", + provider: "melon", + type: "song", + }, + ], + }, + title: "Again", + }, + ], + }, + ], + packaging: "None", + releaseDate: { + date: { + day: 14, + month: 6, + year: 2026, + }, + quality: "assumed-valid", + }, + status: "Official", + title: "Again", + types: [ + "Single", + ], +} +`; diff --git a/providers/Melon/api_types.ts b/providers/Melon/api_types.ts new file mode 100644 index 0000000..7c36ff6 --- /dev/null +++ b/providers/Melon/api_types.ts @@ -0,0 +1,55 @@ +export interface MelonAlbumInfoResponse { + response: { + ALBUMINFO: MelonAlbumInfo; + /** The type of the album, e.g. "정규", "EP", "싱글" */ + ALBUMTYPE?: string; + /** The agency/label name (기획사) */ + PLANCNPY?: string; + /** The distributor/publisher (발매사) */ + SELLCNPY?: string; + }; +} + +export interface MelonAlbumInfo { + ALBUMID: string; + ALBUMNAME: string; + /** The album's release date, formatted as YYYY.MM.DD */ + ISSUEDATE: string; + /** 500px thumbnail CDN URL with query string */ + ALBUMIMG: string; + /** 1000px CDN URL with query string */ + ALBUMIMGLARGE: string; + ISSERVICE: boolean; + ARTISTLIST: MelonArtist[]; +} + +export interface MelonArtist { + ARTISTID: string; + ARTISTNAME: string; +} + +export interface MelonSongListResponse { + response: { + CDLIST: MelonDisc[]; + }; +} + +export interface MelonDisc { + /** Disc number as a string, e.g. "1" */ + CDNO: string; + SONGLIST: MelonSong[]; +} + +export interface MelonSong { + SONGID: string; + SONGNAME: string; + ARTISTLIST: MelonArtist[]; + /** Duration in seconds as a string */ + PLAYTIME: string; + /** Track number as a string */ + TRACKNO: string; + ISSERVICE: boolean; + /** Whether the song is marked as a title song, which is usually actively promoted, has an MV, and/or was previously released as a single. */ + ISTITLESONG: boolean; + ISHOLDBACK: boolean; +} diff --git a/providers/Melon/mod.test.ts b/providers/Melon/mod.test.ts new file mode 100644 index 0000000..088f6bc --- /dev/null +++ b/providers/Melon/mod.test.ts @@ -0,0 +1,94 @@ +import type { ReleaseOptions } from '@/harmonizer/types.ts'; +import { describeProvider, makeProviderOptions } from '@/providers/test_spec.ts'; +import { stubProviderLookups } from '@/providers/test_stubs.ts'; +import { afterAll, describe } from '@std/testing/bdd'; +import { assertSnapshot } from '@std/testing/snapshot'; +import { assert, assertEquals } from 'std/assert/mod.ts'; + +import MelonProvider from './mod.ts'; + +describe('Melon provider', () => { + const melon = new MelonProvider(makeProviderOptions()); + const stubs = [stubProviderLookups(melon)]; + + const releaseOptions: ReleaseOptions = { + withISRC: false, + withAllTrackArtists: true, + }; + + describeProvider(melon, { + urls: [{ + description: 'album page', + url: new URL('https://www.melon.com/album/detail.htm?albumId=13693526'), + id: { type: 'album', id: '13693526' }, + isCanonical: true, + }, { + description: 'artist page', + url: new URL('https://www.melon.com/artist/detail.htm?artistId=1273010'), + id: { type: 'artist', id: '1273010' }, + isCanonical: true, + }, { + description: 'song page', + url: new URL('https://www.melon.com/song/detail.htm?songId=602111505'), + id: { type: 'song', id: '602111505' }, + isCanonical: true, + }, { + description: 'search page (unsupported)', + url: new URL('https://www.melon.com/search/total/index.htm?q=test'), + id: undefined, + }], + invalidIds: ['abc', 'not-a-number', '123abc'], + releaseLookup: [{ + description: 'Regular (정규) album with unavailable CD-only tracks', + release: new URL('https://www.melon.com/album/detail.htm?albumId=13691104'), + options: releaseOptions, + assert: async (release, ctx) => { + await assertSnapshot(ctx, release); + assertEquals(release.media.length, 1, 'Should have one disc'); + assertEquals(release.media[0].tracklist.length, 11, 'Should have 11 tracks (without the two CD-only tracks)'); + assert(release.types?.includes('Album'), 'Should be classified as Album'); + }, + }, { + description: 'Regular (정규) album with multiple discs and multiple artists', + release: new URL('https://www.melon.com/album/detail.htm?albumId=10000727'), + options: releaseOptions, + assert: async (release, ctx) => { + await assertSnapshot(ctx, release); + assertEquals(release.media.length, 2, 'Should have two discs'); + assertEquals(release.media[0].tracklist.length, 10, 'Disc 1 should have 10 tracks'); + assertEquals(release.media[1].tracklist.length, 7, 'Disc 2 should have 7 tracks'); + assert(release.types?.includes('Album'), 'Should be classified as Album'); + const lastTrack = release.media[1].tracklist.at(-1)!; + assertEquals( + lastTrack.artists?.map((a) => a.name), + ['웨이 (크레용팝)', '초아 (크레용팝)'], + 'Track with multiple artists should have correct artists', + ); + }, + }, { + description: 'EP (미니) album', + release: new URL('https://www.melon.com/album/detail.htm?albumId=13693526'), + options: releaseOptions, + assert: async (release, ctx) => { + await assertSnapshot(ctx, release); + assertEquals(release.media.length, 1, 'Should have one disc'); + assertEquals(release.media[0].tracklist.length, 7, 'Should have 7 tracks'); + assert(release.types?.includes('EP'), 'Should be classified as EP'); + }, + }, { + description: 'Single (싱글) album', + release: new URL('https://www.melon.com/album/detail.htm?albumId=13732020'), + options: releaseOptions, + assert: async (release, ctx) => { + await assertSnapshot(ctx, release); + assertEquals(release.media.length, 1, 'Should have one disc'); + assertEquals(release.media[0].tracklist.length, 1, 'Should have 1 track'); + assert(release.types?.includes('Single'), 'Should be classified as Single'); + }, + }], + }); + + afterAll(() => { + stubs.forEach((s) => s.restore()); + }); +}); diff --git a/providers/Melon/mod.ts b/providers/Melon/mod.ts new file mode 100644 index 0000000..4cfeb4b --- /dev/null +++ b/providers/Melon/mod.ts @@ -0,0 +1,231 @@ +import { type ApiQueryOptions, type CacheEntry, MetadataApiProvider, ReleaseApiLookup } from '@/providers/base.ts'; +import { DurationPrecision, FeatureQuality, type FeatureQualityMap } from '@/providers/features.ts'; +import type { ProviderCategory } from '@/providers/categories.ts'; +import type { PartialDate } from '@/utils/date.ts'; +import { ProviderError } from '@/utils/errors.ts'; +import type { + ArtistCreditName, + Artwork, + EntityId, + HarmonyMedium, + HarmonyRelease, + HarmonyTrack, + Label, + LinkType, + ReleaseGroupType, +} from '@/harmonizer/types.ts'; +import type { + MelonAlbumInfo, + MelonAlbumInfoResponse, + MelonArtist, + MelonDisc, + MelonSong, + MelonSongListResponse, +} from './api_types.ts'; + +const API_BASE = 'https://m2.melon.com/m6'; + +export default class MelonProvider extends MetadataApiProvider { + readonly name = 'Melon'; + + readonly supportedUrls = new URLPattern({ + hostname: 'www.melon.com', + pathname: String.raw`/:type(album|song|artist)/detail.htm\?\1Id=:id(\d+)`, + }); + + override readonly categories = new Set(['digital']); + + override readonly features: FeatureQualityMap = { + 'cover size': 2000, + 'duration precision': DurationPrecision.SECONDS, + 'GTIN lookup': FeatureQuality.MISSING, + 'MBID resolving': FeatureQuality.PRESENT, + 'release label': FeatureQuality.PRESENT, + }; + + readonly entityTypeMap = { + artist: 'artist', + release: 'album', + recording: 'song', + }; + + override readonly availableRegions = new Set(['KR']); + + readonly releaseLookup = MelonReleaseLookup; + + override readonly launchDate: PartialDate = { + year: 2004, + month: 11, + }; + + override extractEntityFromUrl(url: URL): EntityId | undefined { + if (!this.supportsDomain(url)) return undefined; + + const albumId = url.searchParams.get('albumId'); + if (albumId && url.pathname.startsWith('/album/')) { + return { type: 'album', id: albumId }; + } + + const artistId = url.searchParams.get('artistId'); + if (artistId && url.pathname.startsWith('/artist/')) { + return { type: 'artist', id: artistId }; + } + + const songId = url.searchParams.get('songId'); + if (songId && url.pathname.startsWith('/song/')) { + return { type: 'song', id: songId }; + } + } + + constructUrl(entity: EntityId): URL { + return new URL(`https://www.melon.com/${entity.type}/detail.htm?${entity.type}Id=${entity.id}`); + } + + override getLinkTypesForEntity(): LinkType[] { + return ['paid streaming', 'paid download']; + } + + query(apiUrl: URL, options?: ApiQueryOptions): Promise> { + return this.fetchJSON(apiUrl, { + policy: { maxTimestamp: options?.snapshotMaxTimestamp }, + }); + } +} + +export class MelonReleaseLookup extends ReleaseApiLookup { + constructReleaseApiUrl(): URL { + const url = new URL(`${API_BASE}/v3/album/info.json`); + url.searchParams.set('albumId', this.lookup.value); + return url; + } + + protected async getRawRelease(): Promise { + if (this.lookup.method === 'gtin') { + throw new ProviderError(this.provider.name, 'GTIN lookups are not supported'); + } + + const albumId = this.lookup.value; + + const infoUrl = this.constructReleaseApiUrl(); + const songListUrl = new URL(`${API_BASE}/v2/album/song/list.json`); + songListUrl.searchParams.set('albumId', albumId); + + const snapshotMaxTimestamp = this.options.snapshotMaxTimestamp; + const [infoEntry, songListEntry] = await Promise.all([ + this.provider.query(infoUrl, { snapshotMaxTimestamp }), + this.provider.query(songListUrl, { snapshotMaxTimestamp }), + ]); + + this.updateCacheTime(infoEntry.timestamp); + this.updateCacheTime(songListEntry.timestamp); + + const albumInfo = infoEntry.content.response.ALBUMINFO; + const albumType = infoEntry.content.response.ALBUMTYPE; + const planCnpy = infoEntry.content.response.PLANCNPY; + const cdList = songListEntry.content.response.CDLIST; + + return { + albumInfo, + albumType, + planCnpy, + cdList, + }; + } + + protected convertRawRelease(raw: MelonRawRelease): HarmonyRelease { + this.entity = { type: 'album', id: raw.albumInfo.ALBUMID }; + + return { + title: raw.albumInfo.ALBUMNAME, + artists: raw.albumInfo.ARTISTLIST.map((a) => this.convertRawArtist(a)), + releaseDate: this.convertReleaseDate(parseISSUEDATE(raw.albumInfo.ISSUEDATE)), + labels: this.extractLabels(raw.planCnpy), + images: [this.coverArtwork(raw.albumInfo.ALBUMIMGLARGE)], + types: mapReleaseType(raw.albumType), + availableIn: ['KR'], + status: 'Official', + packaging: 'None', + media: this.buildMedia(raw.cdList), + // TODO: check if we can check for download availability + externalLinks: raw.albumInfo.ISSERVICE + ? [{ url: this.provider.constructUrl(this.entity).toString(), types: ['paid streaming'] }] + : [], + info: this.generateReleaseInfo(), + }; + } + + private convertRawArtist(artist: MelonArtist): ArtistCreditName { + return { + name: artist.ARTISTNAME, + creditedName: artist.ARTISTNAME, + externalIds: this.provider.makeExternalIds({ type: 'artist', id: artist.ARTISTID }), + }; + } + + private extractLabels(planCnpy?: string): Label[] { + if (!planCnpy) return []; + return planCnpy.split(', ').map((name) => ({ name: name.trim() })); + } + + private coverArtwork(largeUrl: string): Artwork { + const originalUrl = largeUrl.replace( + /(images\/.*\/[^/_]*)((_[^/.]*)_)?(_?[^/._]*)?(\.[^/.?]*)(?:[?/].*)?$/, + '$1$3_org$5', + ); + return { + url: originalUrl, + thumbUrl: largeUrl, + types: ['front'], + }; + } + + private buildMedia(cdList: MelonDisc[]): HarmonyMedium[] { + return cdList.map((disc) => ({ + number: parseInt(disc.CDNO), + format: 'Digital Media', + tracklist: disc.SONGLIST + .filter((song) => song.ISSERVICE) + .map((song) => this.convertRawTrack(song)), + })); + } + + private convertRawTrack(song: MelonSong): HarmonyTrack { + return { + title: song.SONGNAME, + artists: song.ARTISTLIST.map((a) => this.convertRawArtist(a)), + number: parseInt(song.TRACKNO), + length: parseInt(song.PLAYTIME) * 1000, + recording: { + externalIds: this.provider.makeExternalIds({ type: 'song', id: song.SONGID }), + }, + }; + } +} + +interface MelonRawRelease { + albumInfo: MelonAlbumInfo; + albumType?: string; + planCnpy?: string; + cdList: MelonDisc[]; +} + +function parseISSUEDATE(date: string): PartialDate { + const match = date.match(/^(\d{4})\.(\d{2})\.(\d{2})$/); + if (!match) return {}; + return { + year: parseInt(match[1]), + month: parseInt(match[2]), + day: parseInt(match[3]), + }; +} + +function mapReleaseType(albumType?: string): ReleaseGroupType[] | undefined { + if (!albumType) return undefined; + if (albumType === '싱글') return ['Single']; + if (albumType === '정규') return ['Album']; + if (albumType === 'EP') return ['EP']; + if (albumType === '옴니버스') return ['Compilation']; + if (albumType === 'OST') return ['Soundtrack']; + if (albumType === '리믹스') return ['Single', 'Remix']; + return undefined; +} diff --git a/providers/mod.ts b/providers/mod.ts index b27b8ca..72133da 100644 --- a/providers/mod.ts +++ b/providers/mod.ts @@ -15,6 +15,7 @@ import TidalProvider from './Tidal/mod.ts'; import MoraProvider from './Mora/mod.ts'; import QobuzProvider from './Qobuz/mod.ts'; import BugsProvider from './Bugs/mod.ts'; +import MelonProvider from './Melon/mod.ts'; /** Registry with all supported providers. */ export const providers = new ProviderRegistry({ @@ -36,6 +37,7 @@ providers.addMultiple( MoraProvider, OtotoyProvider, BugsProvider, + MelonProvider, ); /** Internal names of providers which are enabled by default (for GTIN lookups). */ diff --git a/server/components/ProviderIcon.tsx b/server/components/ProviderIcon.tsx index a3346c9..b0a69b3 100644 --- a/server/components/ProviderIcon.tsx +++ b/server/components/ProviderIcon.tsx @@ -9,6 +9,7 @@ const providerIconMap: Record = { deezer: 'brand-deezer', discogs: 'brand-discogs', itunes: 'brand-apple', + melon: 'brand-melon', musicbrainz: 'brand-metabrainz', mora: 'brand-mora', ototoy: 'brand-ototoy', diff --git a/server/icons/BrandMelon.tsx b/server/icons/BrandMelon.tsx new file mode 100644 index 0000000..a588e76 --- /dev/null +++ b/server/icons/BrandMelon.tsx @@ -0,0 +1,22 @@ +export default function IconBrandMelon({ + size = 24, + color = 'currentColor', + ...props +}) { + return ( + + + + ); +} diff --git a/server/routes/icon-sprite.svg.tsx b/server/routes/icon-sprite.svg.tsx index 518f48c..632ac9c 100644 --- a/server/routes/icon-sprite.svg.tsx +++ b/server/routes/icon-sprite.svg.tsx @@ -5,6 +5,7 @@ import IconBrandMetaBrainz from '@/server/icons/BrandMetaBrainz.tsx'; import IconBrandOtotoy from '@/server/icons/BrandOtotoy.tsx'; import IconBrandBugs from '@/server/icons/BrandBugs.tsx'; import IconBrandMora from '@/server/icons/BrandMora.tsx'; +import IconBrandMelon from '@/server/icons/BrandMelon.tsx'; import IconBrandApple from 'tabler-icons/brand-apple.tsx'; import IconBrandBandcamp from 'tabler-icons/brand-bandcamp.tsx'; import IconBrandDeezer from 'tabler-icons/brand-deezer.tsx'; @@ -66,6 +67,7 @@ const icons: Icon[] = [ IconBrandGit, IconBrandIfpi, IconBrandMetaBrainz, + IconBrandMelon, IconBrandMora, IconBrandOtotoy, IconBrandQobuz, diff --git a/server/static/harmony.css b/server/static/harmony.css index f51963b..c3033aa 100644 --- a/server/static/harmony.css +++ b/server/static/harmony.css @@ -33,6 +33,7 @@ --bugs: #ff3d33; --deezer: #a238ff; --discogs: #121212; + --melon: #00cd3c; --mora: #02082a; --musicbrainz: #ba478f; --ototoy: #e07e01; @@ -472,6 +473,9 @@ label.discogs, td.discogs { label.itunes, td.itunes { background-color: var(--apple); } +label.melon, td.melon { + background-color: var(--melon); +} label.mora, td.mora { background-color: var(--mora); } diff --git a/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=10000727 b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=10000727 new file mode 100644 index 0000000..0f6d3f9 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=10000727 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"ISCLASSIC":"N","RESULTCODE":"0","RESPONSE":"albumListSong","CPLANCODE":"0","MENUID":"1000000461","CDLIST":[{"CDNO":"1","SONGLIST":[{"SONGID":"30004162","SONGNAME":"부릉부릉 (Vroom Vroom)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"180","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":true,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"1"},{"SONGID":"30004163","SONGNAME":"Too Much","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"182","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"2"},{"SONGID":"30004164","SONGNAME":"두둠칫 (Doo Doom Chit)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"190","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":true,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":true,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"3"},{"SONGID":"30004165","SONGNAME":"부기우기 (Boogie Woogie)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"213","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"4"},{"SONGID":"30004166","SONGNAME":"Tonight","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"212","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"5"},{"SONGID":"30004167","SONGNAME":"다가와 (Get It Here)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"179","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"6"},{"SONGID":"30004168","SONGNAME":"스케치북 (Sketch Book)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"189","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"GENRECODE":"GC0085","GENRENAME":"발라드 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0092","GENRENAME":"아이돌 발라드"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"7"},{"SONGID":"30004169","SONGNAME":"Love Couple (Feat. The Zoo)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685916","ARTISTNAME":"소율"}],"PLAYTIME":"207","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"8"},{"SONGID":"30004170","SONGNAME":"부릉부릉 (Vroom Vroom) (Inst.)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"180","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"9"},{"SONGID":"30004171","SONGNAME":"두둠칫 (Doo Doom Chit) (Inst.)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"190","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"10"}]},{"CDNO":"2","SONGLIST":[{"SONGID":"30004172","SONGNAME":"빠빠빠 (Bar Bar Bar)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"179","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"1"},{"SONGID":"30004173","SONGNAME":"어이 (UH-EE)","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"193","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"2"},{"SONGID":"30004174","SONGNAME":"Dancing Queen 2.0","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"200","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"3"},{"SONGID":"30004175","SONGNAME":"Bing Bing","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"186","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"4"},{"SONGID":"30004176","SONGNAME":"FM","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"221","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"5"},{"SONGID":"30004177","SONGNAME":"Saturday Night","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝"}],"PLAYTIME":"187","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0089","GENRENAME":"댄스 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"6"},{"SONGID":"30004178","SONGNAME":"Hello","ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ARTISTLIST":[{"ARTISTID":"685918","ARTISTNAME":"웨이 (크레용팝)"},{"ARTISTID":"685917","ARTISTNAME":"초아 (크레용팝)"}],"PLAYTIME":"223","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"GENRECODE":"GC0085","GENRENAME":"발라드 10‘~"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0092","GENRENAME":"아이돌 발라드"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"7"}]}],"TOTSONGCNT":"17","TOTPLAYTIME":"55분 11초"},"httpDomain":"http://m2.melon.com"} \ No newline at end of file diff --git a/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13691104 b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13691104 new file mode 100644 index 0000000..26a0ce2 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13691104 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"ISCLASSIC":"N","RESULTCODE":"0","RESPONSE":"albumListSong","CPLANCODE":"0","MENUID":"1000000461","CDLIST":[{"CDNO":"1","SONGLIST":[{"SONGID":"602102736","SONGNAME":"ALIVE","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"148","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"1"},{"SONGID":"602102737","SONGNAME":"SHOW H.O.W","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"177","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"2"},{"SONGID":"602102738","SONGNAME":"Told U So","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"188","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"3"},{"SONGID":"602102739","SONGNAME":"TEA","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"159","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"4"},{"SONGID":"602102740","SONGNAME":"My Vision","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"156","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"5"},{"SONGID":"602102741","SONGNAME":"Skit.exe","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"84","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"}],"ISMV":true,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"6"},{"SONGID":"602102742","SONGNAME":"나를 잃지 않는 방법 (Lost in Proof)","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"154","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":true,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":true,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"7"},{"SONGID":"602102743","SONGNAME":"달라 ($.$)","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"163","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":true,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"8"},{"SONGID":"602102744","SONGNAME":"Close To Me","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"160","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"},{"GENRECODE":"GC0187","GENRENAME":"R&B / Soul 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"9"},{"SONGID":"602102745","SONGNAME":"One Beat","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"130","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"},{"GENRECODE":"GC0187","GENRENAME":"R&B / Soul 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"10"},{"SONGID":"602102746","SONGNAME":"Dive With Me","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"175","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"},{"GENRECODE":"GC0187","GENRENAME":"R&B / Soul 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"11"},{"SONGID":"602102747","SONGNAME":"북극성 (Daydreaming)","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":false,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"12"},{"SONGID":"602102748","SONGNAME":"Life is a game","ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)"}],"PLAYTIME":"","GENRELIST":[{"GENRECODE":"GC0035","GENRENAME":"Rock"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":false,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"13"}]}],"TOTSONGCNT":"13","TOTPLAYTIME":"28분 14초"},"httpDomain":"http://m2.melon.com"} \ No newline at end of file diff --git a/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13693526 b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13693526 new file mode 100644 index 0000000..1a01651 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13693526 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"ISCLASSIC":"N","RESULTCODE":"0","RESPONSE":"albumListSong","CPLANCODE":"0","MENUID":"1000000461","CDLIST":[{"CDNO":"1","SONGLIST":[{"SONGID":"602111503","SONGNAME":"Sad Girls Schemin'","ALBUMID":"13693526","ALBUMNAME":" pt.1","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)"}],"PLAYTIME":"162","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"1"},{"SONGID":"602111504","SONGNAME":"Peer","ALBUMID":"13693526","ALBUMNAME":" pt.1","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)"}],"PLAYTIME":"61","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"2"},{"SONGID":"602111505","SONGNAME":"Baby Flower","ALBUMID":"13693526","ALBUMNAME":" pt.1","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)"}],"PLAYTIME":"188","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":true,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":true,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"3"},{"SONGID":"602111506","SONGNAME":"Type of Girl","ALBUMID":"13693526","ALBUMNAME":" pt.1","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)"}],"PLAYTIME":"189","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"4"},{"SONGID":"602111507","SONGNAME":"Sleek","ALBUMID":"13693526","ALBUMNAME":" pt.1","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)"}],"PLAYTIME":"151","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"5"},{"SONGID":"602111508","SONGNAME":"I Like That","ALBUMID":"13693526","ALBUMNAME":" pt.1","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)"}],"PLAYTIME":"136","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"6"},{"SONGID":"602111509","SONGNAME":"Me Myself Mode","ALBUMID":"13693526","ALBUMNAME":" pt.1","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)"}],"PLAYTIME":"139","GENRELIST":[{"GENRECODE":"GC0011","GENRENAME":"Dance"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0093","GENRENAME":"아이돌 댄스"},{"GENRECODE":"GC0167","GENRENAME":"댄스 20'"}],"ISMV":false,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":false,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"7"}]}],"TOTSONGCNT":"7","TOTPLAYTIME":"17분 6초"},"httpDomain":"http://m2.melon.com"} \ No newline at end of file diff --git a/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13732020 b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13732020 new file mode 100644 index 0000000..d646db2 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=13732020 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"ISCLASSIC":"N","RESULTCODE":"0","RESPONSE":"albumListSong","CPLANCODE":"0","MENUID":"1000000461","CDLIST":[{"CDNO":"1","SONGLIST":[{"SONGID":"602249438","SONGNAME":"Again","ALBUMID":"13732020","ALBUMNAME":"Again","ARTISTLIST":[{"ARTISTID":"1273010","ARTISTNAME":"하슬 (ARTMS)"}],"PLAYTIME":"227","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0092","GENRENAME":"아이돌 발라드"},{"GENRECODE":"GC0166","GENRENAME":"발라드 20'"}],"ISMV":true,"ISADULT":false,"ISFREE":false,"ISHITSONG":false,"ISHOLDBACK":false,"ISTITLESONG":true,"ISSERVICE":true,"ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_500.jpg?6dfaa6d8ce62309cfe5304f7f6205bc2/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_500.jpg?6dfaa6d8ce62309cfe5304f7f6205bc2/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_500.jpg?6dfaa6d8ce62309cfe5304f7f6205bc2/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_500.jpg?6dfaa6d8ce62309cfe5304f7f6205bc2/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"1"}]}],"TOTSONGCNT":"1","TOTPLAYTIME":"3분 47초"},"httpDomain":"http://m2.melon.com"} \ No newline at end of file diff --git a/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=10000727 b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=10000727 new file mode 100644 index 0000000..fb5f4e9 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=10000727 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"RESULTCODE":"0","RESPONSE":"albumInfo","CPLANCODE":"0","MENUID":"1000000461","ALBUMINFO":{"ISSERVICE":true,"ALBUMID":"10000727","ALBUMNAME":"Evolution Pop_Vol.1","ISSUEDATE":"2016.09.26","ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_1000.jpg","SONGCNT":"17","CTYPE":"2","CONTSTYPECODE":"N10002","ARTISTLIST":[{"ARTISTID":"685904","ARTISTNAME":"크레용팝","ACTTYPENAME":null,"DEBUTDAY":null,"BIRTHDAY":null,"ARTISTIMG":"https://cdnimg.melon.co.kr/cm/artistcrop/images/006/85/904/685904_500.jpg?b8cd31e75c5f4f9c5c81a7519b88d80e/melon/resize/220/optimize/90","IMAGETYPE":"S","CONTSTYPECODE":"N10006"}]},"TOTAVRGSCOREINFO":{"TITLE":"평점 부여 권한","TEXT":"클린한 평점 환경을 위해\r\n24시간 이내에\r\n다운로드 받은 파일 재생,\r\n스트리밍으로 감상한 경우에만\r\n평점 부여가 가능합니다.\r\n참고하여 서비스 이용 바랍니다.\r\n\r\n* 접속자가 많은 경우\r\n평점주기가 지연 될 수 있습니다.","TOTAVRGSCORE":"3.4","PTCPNMPRCO":"2286"},"LIKECNT":"1361","ISDOLBYATMOS":false,"ISMASTERPIECE":false,"BOOKLETIMGLIST":null,"ALBUMPRICE":"","ALBUMPRICEFLAC16":"","ALBUMPRICEFLAC24":"","ALBUMFLACINFO":"","ALBUMMESSAGE":"","BBSCHANNELSEQ":"102","BBSCONTSREFVALUE":"10000727","POSTIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/optimize/90","POSTEDITIMG":"https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.jpg/melon/resize/144/optimize/90","TITLESONGINFO":{"SONGID":"30004164","SONGNAME":"두둠칫 (Doo Doom Chit)"},"ARTISTNOTEINFO":null,"ARTISTNOTEALLBUTTONFLAG":false,"GENRELIST":[{"GENRECODE":"GN0200","GENRENAME":"댄스"},{"GENRECODE":"GN0100","GENRENAME":"발라드"}],"ISSUEDATE":"2016.09.26","REPORT":"Crayon Pop 1ST ALBUM [Evolution pop_Vol.1]\n크레용팝이 데뷔 이후 첫 정규 앨범 [Evolution pop_Vol.1] 으로 컴백!\n크레용팝, 타이틀곡 \"두둠칫\" [Doo Doom Chit]\n \n크레용팝 전원이 정규앨범 제작에 참여해, 1년 6개월만의 공백을 깨고, 크레용팝의 모든것을 담아낸 스폐셜 에디션 앨범을 발표하며 컴백한다.\n \n앨범 타이틀 \"Evolution pop_Vol 1\"은 새롭게 변화하고 발전하는 크레용팝의 결과물이 담겨져 있으며, 직접 정규 앨범 작업에 참여하여 완성도를 높인 이번 앨범의 \n선공개곡인 \"부릉부릉\" 공개한 후 한층 더 성숙한 모습과 다양한 음악을 선보이기 위해 레트로 음악과 디스코 댄스를 현대적으로 재해석한 첫 정규 앨범은 \n크레용팝에게도 특별함이 담겨져 있어, 크레용팝만의 색깔이 들어간 새로운 음악으로 만들어낸 앨범을 통해 다양한 음악을 수록하고 2CD로 구성되어 있어,\n기대하고 있는 리스너들에게 눈과 귀를 즐겁게 해 줄 앨범이다.\n \n1CD\n01. 부릉부릉(Vroom Vroom) \n작사: 웨이(크레용팝), 오유원 작곡: 웨이(크레용팝), 유상균 , 어깨깡패 편곡: 유상균, 어깨깡패\n선공개된 '부릉부릉'은 웨이가 작사,작곡에 참여한 곡이며, 신디사이저, 기타 사운드가 더해져 한층 더 신나는 느낌을 주는 곡이다.\n \n02. Too Much\n작사: 도나,신승익,데니스서 작곡: 도나,신승익,데니스서 편곡: 도나,신승익,데니스서\nChorus : 김태연  Drum : 도나  Bass : 신승익   \n \n03. 두둠칫 (Doo Doom Chit)\n작사: 오창훈,박성호 작곡: 오창훈,박성호 편곡: 오창훈,박성호\n이번 앨범의 타이틀곡인 \"두둠칫\"은 레트로와 디스코가 적절히 섞인 브라스가 일품인 곡이다.\n \n04. 부기우기 (Boogie Woogie)\n작사: 은종태, 빨간머리앤 작곡: 은종태 편곡: 최천곤\n \n05. Tonight \n작사: 송지훈  작곡: 송지훈  편곡: 송지훈  Chorus 김현아 (KIM HYUNA)\n \n06. 다가와 (Get It Here)\n작사: 박상준,김희락,윤호기,이용청  작곡: 박상준,김희락,윤호기,이용청  편곡:박상준,김희락,윤호기,이용청\n \n07. 스케치북 (Sketch Book)\n작사: 김해나  작곡: 김해나,JIBE 편곡: DUDU\n \n08. Love Couple (feat.The Zoo)\n작사: 은종태, The Zoo 작곡: 은종태 편곡: 최천곤\n \n2CD\n01. 빠빠빠 (Bar Bar Bar)\n작사: 김유민,이다경 작곡: 김유민 편곡: 김유민,이승엽\n \n02. 어이 (UH-EE)\n작사: 강진우 작곡: 강진우\n \n03. Dancing Queen\n작사: 덤앤더머2,덤앤더머1 작곡: 덤앤더머2,덤앤더머1 편곡: 덤앤더머2,덤앤더머1\n \n04. Bing Bing\n작사: 강진우,송지훈  작곡: 강진우,송지훈  편곡: 이종승,송지훈\n \n05. FM\n작사: 신사동호랭이,몬스터팩토리  작곡: 신사동호랭이,몬스터팩토리\n \n06. Saturday Night\n작사: 송지훈, 강진우 작곡: 송지훈, 강진우 편곡: 송지훈, 강진우\n \n07. Hello\n 작사: 은종태, 이승민 작곡: 은종태 편곡: 최천곤\n","ALBUMTYPE":"정규","SELLCNPY":"LUNE","PLANCNPY":"크롬엔터테인먼트","CREDITLIST":null,"REPORTPREVIEW":"Crayon Pop 1ST ALBUM [Evolution pop_Vol.1]크레용팝이 데뷔 이후 첫 정규 앨범 [Evolution pop_Vol.1] 으로 컴백!크레용팝, 타이틀곡 \"두둠칫\" [Doo Doom Chit] 크레용팝 전원이 정규앨범 제작에 참여해, 1년 6개월만의 공백을 깨고, 크레용팝의 모든것을 담아낸 스폐셜 에디션 앨범을 발표하며 컴백한다. 앨범 타이틀 \"Evolution pop_Vol 1\"은 새롭게 변화하고 발전하는 크레용팝의 결과물이 담겨져 있으며, 직접 정규 앨범 작업에 참여하여 완성도를 높인 이번 앨범의 선공개곡인 \"부릉부릉\" 공개한 후 한층 더 성숙한 모습과 다양한 음악을 선보이기 위해 레트로 음악과 디스코 댄스를 현대적으로 재해석한 첫 정규 앨범은 크레용팝에게도 특별함이 담겨져 있어, 크레용팝만의 색깔이 들어간 새로운 음악으로 만들어낸 앨범을 통해 다양한 음악을 수록하고 2CD로 구성되어 있어,기대하고 있는 리스너들에게 눈과 귀를 즐겁게 해 줄 앨범이다. 1CD01. 부릉부릉(Vroom Vroom) 작사: 웨이(크레용팝), 오유원 작곡: 웨이(크레용팝), 유상균 , 어깨깡패 편곡: 유상균, 어깨깡패선공개된 '부릉부릉'은 웨이가 작사,작곡에 참여한 곡이며, 신디사이저, 기타 사운드가 더해져 한층 더 신나는 느낌을 주는 곡이다. 02. Too Much작사: 도나,신승익,데니스서 작곡: 도나,신승익,데니스서 편곡: 도나,신승익,데니스서Chorus : 김태연  Drum : 도나  Bass : 신승익    03. 두둠칫 (Doo Doom Chit)작사: 오창훈,박성호 작곡: 오창훈,박성호 편곡: 오창훈,박성호이번 앨범의 타이틀곡인 \"두둠칫\"은 레트로와 디스코가 적절히 섞인 브라스가 일품인 곡이다. 04. 부기우기 (Boogie Woogie)작사: 은종태, 빨간머리앤 작곡: 은종태 편곡: 최천곤 05. Tonight 작사: 송지훈  작곡: 송지훈  편곡: 송지훈  Chorus 김현아 (KIM HYUNA) 06. 다가와 (Get It Here)작사: 박상준,김희락,윤호기,이용청  작곡: 박상준,김희락,윤호기,이용청  편곡:박상준,김희락,윤호기,이용청 07. 스케치북 (Sketch Book)작사: 김해나  작곡: 김해나,JIBE 편곡: DUDU 08. Love Couple (feat.The Zoo)작사: 은종태, The Zoo 작곡: 은종태 편곡: 최천곤 2CD01. 빠빠빠 (Bar Bar Bar)작사: 김유민,이다경 작곡: 김유민 편곡: 김유민,이승엽 02. 어이 (UH-EE)작사: 강진우 작곡: 강진우 03. Dancing Queen작사: 덤앤더머2,덤앤더머1 작곡: 덤앤더머2,덤앤더머1 편곡: 덤앤더머2,덤앤더머1 04. Bing Bing작사: 강진우,송지훈  작곡: 강진우,송지훈  편곡: 이종승,송지훈 05. FM작사: 신사동호랭이,몬스터팩토리  작곡: 신사동호랭이,몬스터팩토리 06. Saturday Night작사: 송지훈, 강진우 작곡: 송지훈, 강진우 편곡: 송지훈, 강진우 07. Hello 작사: 은종태, 이승민 작곡: 은종태 편곡: 최천곤","SPOTLIGHTBUTTONFLAG":"N","HIRISINGBUTTONFLAG":"N","DUMMYTEXT":"9#_Xd4We5Vf6Ug7Th8Si9Rj0Qk!Pl@_g7Th8Si9Rj0Qk!Pl@OmN#nM$oL%p","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","TLOG":{"MENUID":"1000000461","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","CONTSTYPECODE":"N10002","CONTSTYPENAME":"앨범","CONTSID":"10000727","CONTSNAME":"Evolution Pop_Vol.1"}},"httpDomain":"http://m2.melon.com"} \ No newline at end of file diff --git a/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13691104 b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13691104 new file mode 100644 index 0000000..a6d2ba0 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13691104 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"RESULTCODE":"0","RESPONSE":"albumInfo","CPLANCODE":"0","MENUID":"1000000461","ALBUMINFO":{"ISSERVICE":true,"ALBUMID":"13691104","ALBUMNAME":"Heart Byte : LEGACY","ISSUEDATE":"2026.05.28","ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg?d542b23e161ca5823a59711812184deb","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_1000.jpg?d542b23e161ca5823a59711812184deb","SONGCNT":"13","CTYPE":"2","CONTSTYPECODE":"N10002","ARTISTLIST":[{"ARTISTID":"4974032","ARTISTNAME":"HEART OF WOMAN (하트오브우먼)","ACTTYPENAME":null,"DEBUTDAY":null,"BIRTHDAY":null,"ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/049/74/032/4974032_20260520103838_500.jpg?80ad8b45844ffb2455951c122be619aa/melon/resize/220/optimize/90","IMAGETYPE":"S","CONTSTYPECODE":"N10006"}]},"TOTAVRGSCOREINFO":{"TITLE":"평점 부여 권한","TEXT":"클린한 평점 환경을 위해\r\n24시간 이내에\r\n다운로드 받은 파일 재생,\r\n스트리밍으로 감상한 경우에만\r\n평점 부여가 가능합니다.\r\n참고하여 서비스 이용 바랍니다.\r\n\r\n* 접속자가 많은 경우\r\n평점주기가 지연 될 수 있습니다.","TOTAVRGSCORE":"4.8","PTCPNMPRCO":"106"},"LIKECNT":"416","ISDOLBYATMOS":false,"ISMASTERPIECE":false,"BOOKLETIMGLIST":null,"ALBUMPRICE":"","ALBUMPRICEFLAC16":"","ALBUMPRICEFLAC24":"","ALBUMFLACINFO":"FLAC","ALBUMMESSAGE":"","BBSCHANNELSEQ":"102","BBSCONTSREFVALUE":"13691104","POSTIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg/melon/optimize/90","POSTEDITIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/91/104/13691104_20260527151547_500.jpg/melon/resize/144/optimize/90","TITLESONGINFO":{"SONGID":"602102742","SONGNAME":"나를 잃지 않는 방법 (Lost in Proof)"},"ARTISTNOTEINFO":{"ALBUMID":"13691104","ARTISTID":"4974198","ARTISTNOTE":"안녕하세요, HEART OF WOMAN의 지현입니다! 모두의 가장 빛나던 시간들과 진심을 담아낸 첫 데뷔 앨범이 드디어 발매되었습니다! 멤버 모두가 한 곡 한 곡 진심을 담아 정성껏 준비했으니 많이 들어주세요❣️ 저희의 시작을 알리는 이 음악들이 여러분의 하루에 작은 힘과 위로가 되기를 바랍니다!","ARTISTNAME":"지현 (HEART OF WOMAN)","ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/049/74/198/4974198_20260520103632.jpg?a241f3ee197e0519d093102185c20fae","ISSUEDATE":"2026.05.28"},"ARTISTNOTEALLBUTTONFLAG":true,"GENRELIST":[{"GENRECODE":"GN0200","GENRENAME":"댄스"},{"GENRECODE":"GN0400","GENRENAME":"R&B/Soul"},{"GENRECODE":"GN0600","GENRENAME":"록/메탈"}],"ISSUEDATE":"2026.05.28","REPORT":"HEART OF WOMAN (하트오브우먼)  \nTHE 1st ALBUM [Heart Byte : LEGACY] \n \n“하나로 모인 꿈과 가장 빛나던 시간이 만나다.” \n \n[Heart Byte : LEGACY]는 하나의 꿈으로 모인 하트오브우먼의 가슴 벅찬 시작을 담아낸 첫 정규 앨범이다. \n13개의 트랙에는 잃고 싶지 않은 것들에 대한 진심과,  \n새로운 흐름으로 나아가는 도전의 서사가 맞물려 흐른다. \n \nR&B 특유의 깊은 감성과 노스텔지어적 정서를 H.O.W만의 방식으로 풀어내며, \n우리가 간직하고 싶은 기억을 섬세하게 어루만지고,  \n각자의 순간을 모두의 소중한 시간으로 이어낸다. \n \n이번 앨범은 레이블의 정통성을 계승하며, \n깊고 강렬한 박동을 지닌 하트오브우먼의 시간 (Golden Era)을 향해 나아가는 출발점이다. \n \n모든 순간에 진심을 담아, 가장 H.O.W답게.","ALBUMTYPE":"정규","SELLCNPY":"카카오엔터테인먼트","PLANCNPY":"BLUEBROWN RECORDS","CREDITLIST":null,"REPORTPREVIEW":"HEART OF WOMAN (하트오브우먼)  THE 1st ALBUM [Heart Byte : LEGACY] “하나로 모인 꿈과 가장 빛나던 시간이 만나다.” [Heart Byte : LEGACY]는 하나의 꿈으로 모인 하트오브우먼의 가슴 벅찬 시작을 담아낸 첫 정규 앨범이다. 13개의 트랙에는 잃고 싶지 않은 것들에 대한 진심과,  새로운 흐름으로 나아가는 도전의 서사가 맞물려 흐른다. R&B 특유의 깊은 감성과 노스텔지어적 정서를 H.O.W만의 방식으로 풀어내며, 우리가 간직하고 싶은 기억을 섬세하게 어루만지고,  각자의 순간을 모두의 소중한 시간으로 이어낸다. 이번 앨범은 레이블의 정통성을 계승하며, 깊고 강렬한 박동을 지닌 하트오브우먼의 시간 (Golden Era)을 향해 나아가는 출발점이다. 모든 순간에 진심을 담아, 가장 H.O.W답게.","SPOTLIGHTBUTTONFLAG":"N","HIRISINGBUTTONFLAG":"N","DUMMYTEXT":"9#_Xd4We5Vf6Ug7Th8Si9Rj0Qk!Pl@_6Ug7Th8Si9Rj0Qk!Pl@O","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","TLOG":{"MENUID":"1000000461","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","CONTSTYPECODE":"N10002","CONTSTYPENAME":"앨범","CONTSID":"13691104","CONTSNAME":"Heart Byte : LEGACY"}},"httpDomain":"http://m2.melon.com"} \ No newline at end of file diff --git a/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13693526 b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13693526 new file mode 100644 index 0000000..fee6356 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13693526 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"RESULTCODE":"0","RESPONSE":"albumInfo","CPLANCODE":"0","MENUID":"1000000461","ALBUMINFO":{"ISSERVICE":true,"ALBUMID":"13693526","ALBUMNAME":" pt.1","ISSUEDATE":"2026.06.01","ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg?41b5d7a536bb19d0c982ac5b9d8b505c","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_1000.jpg?41b5d7a536bb19d0c982ac5b9d8b505c","SONGCNT":"7","CTYPE":"2","CONTSTYPECODE":"N10002","ARTISTLIST":[{"ARTISTID":"3137294","ARTISTNAME":"tripleS (트리플에스)","ACTTYPENAME":null,"DEBUTDAY":null,"BIRTHDAY":null,"ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/031/37/294/3137294_20260528163933_500.jpg?b36a8d057f668c346a1fea36a745d732/melon/resize/220/optimize/90","IMAGETYPE":"S","CONTSTYPECODE":"N10006"}]},"TOTAVRGSCOREINFO":{"TITLE":"평점 부여 권한","TEXT":"클린한 평점 환경을 위해\r\n24시간 이내에\r\n다운로드 받은 파일 재생,\r\n스트리밍으로 감상한 경우에만\r\n평점 부여가 가능합니다.\r\n참고하여 서비스 이용 바랍니다.\r\n\r\n* 접속자가 많은 경우\r\n평점주기가 지연 될 수 있습니다.","TOTAVRGSCORE":"4.8","PTCPNMPRCO":"273"},"LIKECNT":"1288","ISDOLBYATMOS":true,"ISMASTERPIECE":false,"BOOKLETIMGLIST":null,"ALBUMPRICE":"","ALBUMPRICEFLAC16":"","ALBUMPRICEFLAC24":"","ALBUMFLACINFO":"FLAC","ALBUMMESSAGE":"","BBSCHANNELSEQ":"102","BBSCONTSREFVALUE":"13693526","POSTIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg/melon/optimize/90","POSTEDITIMG":"https://cdnimg.melon.co.kr/cm2/album/images/136/93/526/13693526_20260528115553_500.jpg/melon/resize/144/optimize/90","TITLESONGINFO":{"SONGID":"602111505","SONGNAME":"Baby Flower"},"ARTISTNOTEINFO":{"ALBUMID":"13693526","ARTISTID":"3139877","ARTISTNOTE":"Baby Flower 들으면서 앞으로 피워나갈 힘을 받으시길 바래요..!","ARTISTNAME":"윤서연","ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/031/39/877/3139877_20260528163936.jpg?d599aba6295542f4ac5cf4251e5a62ff","ISSUEDATE":"2026.06.01"},"ARTISTNOTEALLBUTTONFLAG":true,"GENRELIST":[{"GENRECODE":"GN0200","GENRENAME":"댄스"}],"ISSUEDATE":"2026.06.01","REPORT":"tripleS pt.1 \nNote \n \n세상엔 수많은 소녀들이 살고 있습니다. \n우리는 그 소녀들을 작은 s라고 부릅니다. \n자신의 가능성을 아직 발견하지 못한 채, 믿지 못한 채 살아가고 있는 작은 존재들. \n \n때로는 웃고, 울고, 상처받고, 일어서는 과정속에서 그 작은 s들은 성장 해나가고 큰 S가 되어갑니다. \n \n우리는 이제 작은 s들에게 손을 내밀어 보려고 합니다. \n \n상처, 고난 또 눈물. \n이제 고개를 들고. \n우리는 힘을 합쳐 세상을 향해 나아가려고 합니다. \n \n \n일반적으로 첫 번째 트랙을 인트로 곡으로 생각했을 텐데 1번 곡을 인트로 곡이 아닌 ‘Sad Girls Schemin’’을 넣은 이유가 있다. 타이틀 ‘Baby Flower’가 tripleS 24명이 한꺼번에 모였을 때의 메시지와 의미를 담았다면 이번 pt.1의 첫 번째 곡 ‘Sad Girls Schemin’’은 앨범의 전체적인 컨셉을 담아내고 있다. 풀어 말하면 “슬픈 소녀들의 작당 모의”라고 할 수 있는 이 제목은 이번 앨범에서 tripleS가 들려주고 싶은 얘기이다. 사춘기라면 모두가 다 겪고 있고, 겪었을 법한 감정. 슬픈 소녀들이 모여 비밀 이야기를 시작하는데 흘러나오는 BGM이 너무 신나서 고민은커녕 어느새 같이 춤추고 놀고 하는 그런 분위기로 뒤바뀌는 그런 엉망진창의 감정 표현. \n \n제목 ‘Peer’는 중의적이다. 본래는 ‘또래’라는 의미를 갖고 있다. tripleS가 하나하나 작은 s들이 모여 자신의 능력을 각성하고 큰 S가 되어 만난 팀이라는 뜻이라는 걸 이제 팬들도 너무 잘 알고 있는 것처럼 여전히 어딘가에서 작은 개인으로 살고있는 s들에게 보내는 메시지 같은 인트로라서 ‘Peer’라고 지었다. 그리고 또 하나, 한글 발음으로 하면 ‘피어’인데 이게 꽃이 피어난다는 이야기로 곧 이어진다. \n \ntripleS는 개인 혹은 유닛에서는 수많은 다양한 장르의 음악을 담아낼 수 있지만 전체 24명이 모였을 때는 확고한 메시지를 전달해야 한다고 믿고 있다. 요즘 시대가 점점 더 꿈꾸는 것에 대해 냉소적이고, K-POP 음악엔 자극적인 숏츠 같은 음악이 가득하지만, 여전히 꿈에 대해서 이야기하는 팀이 적어도 K-POP에서 한 팀 정도는 있어야 한다고 믿고 있다. \n‘Baby Flower’ 역시 ‘Girls Never Die’와 ‘깨어’처럼, 어린 성장통을 겪고 있는 소녀들에게 “너만 그런 게 아니라, 우리도 다 똑같으니까 이제 꽃처럼 피어나자”는 이야기를 담고 있다. 그리고 서울 소녀뿐만이 아닌 아시아에 같은 고민을 하고 있는 소녀들에게 전달하고 싶은 마음에 뮤직비디오를 4개의 도시에서 공을 들여 찍었다. 이 ‘어린 꽃’이 누구에게 언제 어떻게 닿을지 몰라도 위로와 용기가 될 수 있기를. \n \n‘Type of Girl’은 정해진 틀과 똑같은 패턴 속에서도 자신만의 방식으로 앞으로 나아가는 소녀들의 태도를 담은 곡이다. Tropical House 장르의 곡으로 이번 앨범이 관통하는 것처럼 소녀들의 다양한 삶의 방식 가운데에서 오늘을 살고 있는 태도에 대해서 노래한다. \n \n‘Sleek’은 남들이 정해준 기준이나 ‘보통’이라는 틀을 거부하고, 나만의 개성을 당당하게 드러내자는 외침을 담은 곡이다. 특히 멤버 박소현이 곡 작업에 직접 참여하여 트리플에스만의 개성을 더욱 캐치하게 담아냈다. 시크한 분위기 속에서 반복되는 “Sleek”이라는 훅은 강렬한 중독성을 느낄 수 있다. 세상을 보는 시선을 조금만 틀어 자신만의 특별한 무드를 완성하라는 자신감 넘치는 메시지를 전한다. \n \n동시대를 살고 있는 소녀들의 생각, 고민, 태도 등을 담고 있는 pt.1에서도 ‘I Like That’이야말로 제목처럼 소녀들의 취향에 대해서 노래한다. 때로는 어른스러운 것들을 동경하기도 하면서, 그렇다고 또 빨리 나이를 먹고 싶지는 않은 마음. 주목받고 싶으면서도, 또 지나치게 주목받는 건 부담스러운 기분. 그게 tripleS만의 I Like That 아닐까. \n \n앨범 pt.1의 마지막 곡은 나에 대한 이야기로 마친다. 그 타인의 판단이나 유행이라는 것에 휩쓸리지 않고 나만의 것을 찾자는 주체적인 이야기이다. “입으라는 옷 대신 / 나를 좀 더 이해해”라는 문장은 이 곡의 핵심 메시지이자, 타인의 기준보다 자신의 감각을 믿고 앞으로 나아가는 tripleS라는 팀의 정체성을 상징한다. \n'Me Myself Mode'는 누군가처럼 되기 위한 노래가 아니라, 아직 완성되지 않았더라도 계속 새로운 ‘나’를 발견해 가는 순간들을 가장 빛나는 방식으로 기록한 트랙이다. \n \n \n \n \n1. Sad Girls Schemin’ \nComposed by Kurtz, bby Nasdaqüe, gyuahh \nLyrics by gyuahh, Sungwoo Kim, Kurtz, XD, ynghardy, bby Nasdaqüe, niü \nArranged by Kurtz, bby Nasdaqüe \nBass by Kurtz \nDrums by Kurtz \nKeyboard by bby Nasdaqüe \nSynthesizer by bby Nasdaqüe \nBackground Vocals by gyuahh \nVocals Directed by Kurtz, gyuahh, bby Nasdaqüe \nDigitally Edited by 김주형, Kurtz \nRecorded by 여민수 @ Ingrid Studio, 민성환 @ The VIBE Studio \nMixed by 이태섭 @ gateway studio \nMastered by 권남우 @ 821 Sound Mastering \n \n2. Peer \nComposed by BADD \nLyrics by Jaden Jeong \nArranged by BADD \nVocal Directed by BADD \nBass by BADD \nDrums by BADD \nKeyboard by BADD \nSynthesizer by BADD \nDigitally Edited by BADD \nRecorded BADD @ 토끼농장 \nMixed by 이태섭 @ gateway studio \nMastered by 권남우 @ 821 Sound Mastering \n \n3. Baby Flower \nComposed by EL CAPITXN, Vendors (KAYTZ), Vendors (Zenur), Vendors (Kyaku), Vendors (Louis), Jongsoo Kim \nLyrics by Jaden Jeong \nArranged by EL CAPITXN, Vendors (KAYTZ), Vendors (Zenur), Vendors (Kyaku), Vendors (Louis) \nVocals Directed by Vendors (YOUHA) \nBass by EL CAPITXN, Vendors (ZENUR), Vendors (KYATZ) \nDrums by EL CAPITXN, Vendors (Kyaku), Vendors (Zenur) \nGuitars by Vendors (ZENUR) \nStrings by Vendors (Louis) \nBackground Vocals by Vendors (YOUHA) \nDigitally Edited by 강선영 \nRecorded by 민성환 @ The VIBE Studio \nMixed by 신봉원 (Assist. 박남준) @ GLAB Studios \nMastered by 권남우 @ 821 Sound Mastering \n \n4. Type of Girl \nComposed by Dino Medanhodzic, Ellen Berg, YNGA, Nirob Islam \nLyrics by 서용원 (153/Joombas), 하다원 (153/Joombas), 라경민 (153/Joombas), 엄세정 (153/Joombas), 강지혜 (153/Joombas), Jaden Jeong \nArranged by Dino Medanhodzic \nVocals Directed by LUA \nBackground Vocals by LUA \nDigitally Edited by 김주형 \nRecorded by 유재범 @ doobdoob studio \nMixed by 정진 @ J's Atelier \nMastered by 권남우 @ 821 Sound Mastering \n \n5. Sleek \nComposed by Park SoHyun, GDLO (MonoTree), YELO (MonoTree) \nLyrics by Park SoHyun, GDLO (MonoTree), Jaden Jeong \nArranged by Park SoHyun, GDLO (MonoTree) \nVocal Directed by Park SoHyun, GDLO, YELO \nBackground Vocals by YELO \nDrums by GDLO \nSynthesizer by Park SoHyun, GDLO \nDigital Edited by GDLO \nRecorded by 유재범 @ doobdoob studio, 민성환 @ The VIBE Studio \nMixed by 정진 @ J's Atelier \nMastered by 권남우 @ 821 Sound Mastering \n \n6. I Like That \nComposed by BADD, G-high (MonoTree), Sophia Pae \nLyrics by G-high (MonoTree), BADD \nArranged by BADD \nVocals Directed by G-high \nBackground Vocals by Sophia Pae \nBass by BADD \nDrums by BADD \nKeyboard by BADD \nSynthesizer by BADD \nDigitally Edited by 주우영, G-high \nRecorded 민성환 @ The VIBE Studio, 이강현 @ vibe_music606 \nMixed by 이태섭 @ gateway studio \nMastered by 권남우 @ 821 Sound Mastering \n \n \n7. Me Myself Mode \nComposed by BADD, GDLO (MonoTree), HOUZY, 주우영 \nLyrics by Jaden Jeong, GDLO (MonoTree) \nArranged by BADD, HOUZY \nVocals Directed by BADD, HOUZY \nBackground Vocals by 권애진 \nBass by 박순철, BADD, HOUZY \nDrums by BADD, HOUZY \nKeyboard by 장준호, BADD, HOUZY \nSynthesizer by BADD, HOUZY \nDigitally Edited by 주우영, GDLO \nRecorded 민성환 @ The VIBE Studio \nMixed by 이태섭 @ gateway studio \nMastered by 권남우 @ 821 Sound Mastering","ALBUMTYPE":"EP","SELLCNPY":"카카오엔터테인먼트","PLANCNPY":"모드하우스","CREDITLIST":null,"REPORTPREVIEW":"tripleS pt.1 Note 세상엔 수많은 소녀들이 살고 있습니다. 우리는 그 소녀들을 작은 s라고 부릅니다. 자신의 가능성을 아직 발견하지 못한 채, 믿지 못한 채 살아가고 있는 작은 존재들. 때로는 웃고, 울고, 상처받고, 일어서는 과정속에서 그 작은 s들은 성장 해나가고 큰 S가 되어갑니다. 우리는 이제 작은 s들에게 손을 내밀어 보려고 합니다. 상처, 고난 또 눈물. 이제 고개를 들고. 우리는 힘을 합쳐 세상을 향해 나아가려고 합니다. 일반적으로 첫 번째 트랙을 인트로 곡으로 생각했을 텐데 1번 곡을 인트로 곡이 아닌 ‘Sad Girls Schemin’’을 넣은 이유가 있다. 타이틀 ‘Baby Flower’가 tripleS 24명이 한꺼번에 모였을 때의 메시지와 의미를 담았다면 이번 pt.1의 첫 번째 곡 ‘Sad Girls Schemin’’은 앨범의 전체적인 컨셉을 담아내고 있다. 풀어 말하면 “슬픈 소녀들의 작당 모의”라고 할 수 있는 이 제목은 이번 앨범에서 tripleS가 들려주고 싶은 얘기이다. 사춘기라면 모두가 다 겪고 있고, 겪었을 법한 감정. 슬픈 소녀들이 모여 비밀 이야기를 시작하는데 흘러나오는 BGM이 너무 신나서 고민은커녕 어느새 같이 춤추고 놀고 하는 그런 분위기로 뒤바뀌는 그런 엉망진창의 감정 표현. 제목 ‘Peer’는 중의적이다. 본래는 ‘또래’라는 의미를 갖고 있다. tripleS가 하나하나 작은 s들이 모여 자신의 능력을 각성하고 큰 S가 되어 만난 팀이라는 뜻이라는 걸 이제 팬들도 너무 잘 알고 있는 것처럼 여전히 어딘가에서 작은 개인으로 살고있는 s들에게 보내는 메시지 같은 인트로라서 ‘Peer’라고 지었다. 그리고 또 하나, 한글 발음으로 하면 ‘피어’인데 이게 꽃이 피어난다는 이야기로 곧 이어진다. tripleS는 개인 혹은 유닛에서는 수많은 다양한 장르의 음악을 담아낼 수 있지만 전체 24명이 모였을 때는 확고한 메시지를 전달해야 한다고 믿고 있다. 요즘 시대가 점점 더 꿈꾸는 것에 대해 냉소적이고, K-POP 음악엔 자극적인 숏츠 같은 음악이 가득하지만, 여전히 꿈에 대해서 이야기하는 팀이 적어도 K-POP에서 한 팀 정도는 있어야 한다고 믿고 있다. ‘Baby Flower’ 역시 ‘Girls Never Die’와 ‘깨어’처럼, 어린 성장통을 겪고 있는 소녀들에게 “너만 그런 게 아니라, 우리도 다 똑같으니까 이제 꽃처럼 피어나자”는 이야기를 담고 있다. 그리고 서울 소녀뿐만이 아닌 아시아에 같은 고민을 하고 있는 소녀들에게 전달하고 싶은 마음에 뮤직비디오를 4개의 도시에서 공을 들여 찍었다. 이 ‘어린 꽃’이 누구에게 언제 어떻게 닿을지 몰라도 위로와 용기가 될 수 있기를. ‘Type of Girl’은 정해진 틀과 똑같은 패턴 속에서도 자신만의 방식으로 앞으로 나아가는 소녀들의 태도를 담은 곡이다. Tropical House 장르의 곡으로 이번 앨범이 관통하는 것처럼 소녀들의 다양한 삶의 방식 가운데에서 오늘을 살고 있는 태도에 대해서 노래한다. ‘Sleek’은 남들이 정해준 기준이나 ‘보통’이라는 틀을 거부하고, 나만의 개성을 당당하게 드러내자는 외침을 담은 곡이다. 특히 멤버 박소현이 곡 작업에 직접 참여하여 트리플에스만의 개성을 더욱 캐치하게 담아냈다. 시크한 분위기 속에서 반복되는 “Sleek”이라는 훅은 강렬한 중독성을 느낄 수 있다. 세상을 보는 시선을 조금만 틀어 자신만의 특별한 무드를 완성하라는 자신감 넘치는 메시지를 전한다. 동시대를 살고 있는 소녀들의 생각, 고민, 태도 등을 담고 있는 pt.1에서도 ‘I Like That’이야말로 제목처럼 소녀들의 취향에 대해서 노래한다. 때로는 어른스러운 것들을 동경하기도 하면서, 그렇다고 또 빨리 나이를 먹고 싶지는 않은 마음. 주목받고 싶으면서도, 또 지나치게 주목받는 건 부담스러운 기분. 그게 tripleS만의 I Like That 아닐까. 앨범 pt.1의 마지막 곡은 나에 대한 이야기로 마친다. 그 타인의 판단이나 유행이라는 것에 휩쓸리지 않고 나만의 것을 찾자는 주체적인 이야기이다. “입으라는 옷 대신 / 나를 좀 더 이해해”라는 문장은 이 곡의 핵심 메시지이자, 타인의 기준보다 자신의 감각을 믿고 앞으로 나아가는 tripleS라는 팀의 정체성을 상징한다. 'Me Myself Mode'는 누군가처럼 되기 위한 노래가 아니라, 아직 완성되지 않았더라도 계속 새로운 ‘나’를 발견해 가는 순간들을 가장 빛나는 방식으로 기록한 트랙이다. 1. Sad Girls Schemin’ Composed by Kurtz, bby Nasdaqüe, gyuahh Lyrics by gyuahh, Sungwoo Kim, Kurtz, XD, ynghardy, bby Nasdaqüe, niü Arranged by Kurtz, bby Nasdaqüe Bass by Kurtz Drums by Kurtz Keyboard by bby Nasdaqüe Synthesizer by bby Nasdaqüe Background Vocals by gyuahh Vocals Directed by Kurtz, gyuahh, bby Nasdaqüe Digitally Edited by 김주형, Kurtz Recorded by 여민수 @ Ingrid Studio, 민성환 @ The VIBE Studio Mixed by 이태섭 @ gateway studio Mastered by 권남우 @ 821 Sound Mastering 2. Peer Composed by BADD Lyrics by Jaden Jeong Arranged by BADD Vocal Directed by BADD Bass by BADD Drums by BADD Keyboard by BADD Synthesizer by BADD Digitally Edited by BADD Recorded BADD @ 토끼농장 Mixed by 이태섭 @ gateway studio Mastered by 권남우 @ 821 Sound Mastering 3. Baby Flower Composed by EL CAPITXN, Vendors (KAYTZ), Vendors (Zenur), Vendors (Kyaku), Vendors (Louis), Jongsoo Kim Lyrics by Jaden Jeong Arranged by EL CAPITXN, Vendors (KAYTZ), Vendors (Zenur), Vendors (Kyaku), Vendors (Louis) Vocals Directed by Vendors (YOUHA) Bass by EL CAPITXN, Vendors (ZENUR), Vendors (KYATZ) Drums by EL CAPITXN, Vendors (Kyaku), Vendors (Zenur) Guitars by Vendors (ZENUR) Strings by Vendors (Louis) Background Vocals by Vendors (YOUHA) Digitally Edited by 강선영 Recorded by 민성환 @ The VIBE Studio Mixed by 신봉원 (Assist. 박남준) @ GLAB Studios Mastered by 권남우 @ 821 Sound Mastering 4. Type of Girl Composed by Dino Medanhodzic, Ellen Berg, YNGA, Nirob Islam Lyrics by 서용원 (153/Joombas), 하다원 (153/Joombas), 라경민 (153/Joombas), 엄세정 (153/Joombas), 강지혜 (153/Joombas), Jaden Jeong Arranged by Dino Medanhodzic Vocals Directed by LUA Background Vocals by LUA Digitally Edited by 김주형 Recorded by 유재범 @ doobdoob studio Mixed by 정진 @ J's Atelier Mastered by 권남우 @ 821 Sound Mastering 5. Sleek Composed by Park SoHyun, GDLO (MonoTree), YELO (MonoTree) Lyrics by Park SoHyun, GDLO (MonoTree), Jaden Jeong Arranged by Park SoHyun, GDLO (MonoTree) Vocal Directed by Park SoHyun, GDLO, YELO Background Vocals by YELO Drums by GDLO Synthesizer by Park SoHyun, GDLO Digital Edited by GDLO Recorded by 유재범 @ doobdoob studio, 민성환 @ The VIBE Studio Mixed by 정진 @ J's Atelier Mastered by 권남우 @ 821 Sound Mastering 6. I Like That Composed by BADD, G-high (MonoTree), Sophia Pae Lyrics by G-high (MonoTree), BADD Arranged by BADD Vocals Directed by G-high Background Vocals by Sophia Pae Bass by BADD Drums by BADD Keyboard by BADD Synthesizer by BADD Digitally Edited by 주우영, G-high Recorded 민성환 @ The VIBE Studio, 이강현 @ vibe_music606 Mixed by 이태섭 @ gateway studio Mastered by 권남우 @ 821 Sound Mastering 7. Me Myself Mode Composed by BADD, GDLO (MonoTree), HOUZY, 주우영 Lyrics by Jaden Jeong, GDLO (MonoTree) Arranged by BADD, HOUZY Vocals Directed by BADD, HOUZY Background Vocals by 권애진 Bass by 박순철, BADD, HOUZY Drums by BADD, HOUZY Keyboard by 장준호, BADD, HOUZY Synthesizer by BADD, HOUZY Digitally Edited by 주우영, GDLO Recorded 민성환 @ The VIBE Studio Mixed by 이태섭 @ gateway studio Mastered by 권남우 @ 821 Sound Mastering","SPOTLIGHTBUTTONFLAG":"N","HIRISINGBUTTONFLAG":"N","MILLIONSINFO":{"HISTDATA":131749,"ISSUEDATE":"202606011800","HISTINFO":"ST","ISNOW":"N","ISCOUNTING":"N","REACHINGINFO":"","ACCUMDATA":"131749","LINK":{"LINKTYPE":"ZA","LINKURL":""}},"DUMMYTEXT":"9#_Xd4We5Vf6Ug7Th8Si9Rj0Qk!Pl@_6Ug7Th8Si9Rj0Qk!Pl@O","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","TLOG":{"MENUID":"1000000461","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","CONTSTYPECODE":"N10002","CONTSTYPENAME":"앨범","CONTSID":"13693526","CONTSNAME":" pt.1"}},"httpDomain":"http://m2.melon.com"} \ No newline at end of file diff --git a/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13732020 b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13732020 new file mode 100644 index 0000000..29d82a5 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=13732020 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"RESULTCODE":"0","RESPONSE":"albumInfo","CPLANCODE":"0","MENUID":"1000000461","ALBUMINFO":{"ISSERVICE":true,"ALBUMID":"13732020","ALBUMNAME":"Again","ISSUEDATE":"2026.06.14","ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_500.jpg?6dfaa6d8ce62309cfe5304f7f6205bc2","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_1000.jpg?6dfaa6d8ce62309cfe5304f7f6205bc2","SONGCNT":"1","CTYPE":"2","CONTSTYPECODE":"N10002","ARTISTLIST":[{"ARTISTID":"1273010","ARTISTNAME":"하슬 (ARTMS)","ACTTYPENAME":null,"DEBUTDAY":null,"BIRTHDAY":null,"ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/012/73/010/1273010_20250612191316_500.jpg?c46e28d594ddb7f3f09977d4b792031b/melon/resize/220/optimize/90","IMAGETYPE":"S","CONTSTYPECODE":"N10006"}]},"TOTAVRGSCOREINFO":{"TITLE":"평점 부여 권한","TEXT":"클린한 평점 환경을 위해\r\n24시간 이내에\r\n다운로드 받은 파일 재생,\r\n스트리밍으로 감상한 경우에만\r\n평점 부여가 가능합니다.\r\n참고하여 서비스 이용 바랍니다.\r\n\r\n* 접속자가 많은 경우\r\n평점주기가 지연 될 수 있습니다.","TOTAVRGSCORE":"4.5","PTCPNMPRCO":"17"},"LIKECNT":"78","ISDOLBYATMOS":false,"ISMASTERPIECE":false,"BOOKLETIMGLIST":null,"ALBUMPRICE":"","ALBUMPRICEFLAC16":"","ALBUMPRICEFLAC24":"","ALBUMFLACINFO":"FLAC","ALBUMMESSAGE":"","BBSCHANNELSEQ":"102","BBSCONTSREFVALUE":"13732020","POSTIMG":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_500.jpg/melon/optimize/90","POSTEDITIMG":"https://cdnimg.melon.co.kr/cm2/album/images/137/32/020/13732020_20260612150041_500.jpg/melon/resize/144/optimize/90","TITLESONGINFO":{"SONGID":"602249438","SONGNAME":"Again"},"ARTISTNOTEINFO":null,"ARTISTNOTEALLBUTTONFLAG":false,"GENRELIST":[{"GENRECODE":"GN0100","GENRENAME":"발라드"}],"ISSUEDATE":"2026.06.14","REPORT":"풍부한 가창력과 섬세한 감정선으로 완성한 ARTMS 하슬의 발라드 솔로곡이다. 담백하면서도 깊이 있는 보컬이 곡의 분위기를 이끌며, 잔잔한 감성과 여운을 전한다. \n \n〈Credit〉 \n \nComposed by 김형석 \nLyrics by 김형석 \nArranged by 김형석, 전자맨 \n \nMixed by 김정승 @ Studio 203 \nMastered by 박정언 @ Honey Butter Studio","ALBUMTYPE":"싱글","SELLCNPY":"지니뮤직","PLANCNPY":"㈜노느니특공대엔터테인먼트","CREDITLIST":null,"REPORTPREVIEW":"풍부한 가창력과 섬세한 감정선으로 완성한 ARTMS 하슬의 발라드 솔로곡이다. 담백하면서도 깊이 있는 보컬이 곡의 분위기를 이끌며, 잔잔한 감성과 여운을 전한다. 〈Credit〉 Composed by 김형석 Lyrics by 김형석 Arranged by 김형석, 전자맨 Mixed by 김정승 @ Studio 203 Mastered by 박정언 @ Honey Butter Studio","SPOTLIGHTBUTTONFLAG":"N","HIRISINGBUTTONFLAG":"N","DUMMYTEXT":"9#_Xd4We5Vf6Ug7Th8Si9Rj0Qk!Pl@_g7Th8Si9Rj0Qk!Pl@OmN#nM$oL%p","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","TLOG":{"MENUID":"1000000461","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","CONTSTYPECODE":"N10002","CONTSTYPENAME":"앨범","CONTSID":"13732020","CONTSNAME":"Again"}},"httpDomain":"http://m2.melon.com"} \ No newline at end of file