diff --git a/providers/Melon/__snapshots__/mod.test.ts.snap b/providers/Melon/__snapshots__/mod.test.ts.snap new file mode 100644 index 0000000..9920f92 --- /dev/null +++ b/providers/Melon/__snapshots__/mod.test.ts.snap @@ -0,0 +1,1894 @@ +export const snapshot = {}; + +snapshot[`Melon provider > release lookup > Compilation (베스트) album with an unavailable CD-only track 1`] = ` +{ + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + availableIn: [ + "KR", + ], + excludedFrom: [], + externalLinks: [ + { + types: [ + "paid streaming", + "paid download", + ], + url: "https://www.melon.com/album/detail.htm?albumId=12416346", + }, + ], + images: [ + { + thumbUrl: "https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6", + types: [ + "front", + ], + url: "https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_org.jpg", + }, + ], + info: { + messages: [], + providers: [ + { + apiUrl: "https://m2.melon.com/m6/v3/album/info.json?albumId=12416346", + id: "12416346", + internalName: "melon", + lookup: { + method: "id", + value: "12416346", + }, + name: "Melon", + url: "https://www.melon.com/album/detail.htm?albumId=12416346", + }, + ], + }, + labels: [ + { + name: "SM ENTERTAINMENT", + }, + ], + media: [ + { + format: "Digital Media", + number: 1, + tracklist: [ + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 180000, + number: 1, + recording: { + externalIds: [ + { + id: "600604835", + provider: "melon", + type: "song", + }, + ], + }, + title: "인사 (Panorama)", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 185000, + number: 2, + recording: { + externalIds: [ + { + id: "600604836", + provider: "melon", + type: "song", + }, + ], + }, + title: "Letter To Myself", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 256000, + number: 3, + recording: { + externalIds: [ + { + id: "600604837", + provider: "melon", + type: "song", + }, + ], + }, + title: "Time Lapse (2025 Mix)", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 210000, + number: 4, + recording: { + externalIds: [ + { + id: "600604838", + provider: "melon", + type: "song", + }, + ], + }, + title: "Fine", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 205000, + number: 5, + recording: { + externalIds: [ + { + id: "600604839", + provider: "melon", + type: "song", + }, + ], + }, + title: "INVU", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 218000, + number: 6, + recording: { + externalIds: [ + { + id: "600604840", + provider: "melon", + type: "song", + }, + ], + }, + title: "불티 (Spark)", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 158000, + number: 7, + recording: { + externalIds: [ + { + id: "600604841", + provider: "melon", + type: "song", + }, + ], + }, + title: "Set Myself On Fire", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 208000, + number: 8, + recording: { + externalIds: [ + { + id: "600604842", + provider: "melon", + type: "song", + }, + ], + }, + title: "그런 밤 (Some Nights)", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 214000, + number: 9, + recording: { + externalIds: [ + { + id: "600604843", + provider: "melon", + type: "song", + }, + ], + }, + title: "Make Me Love You", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 163000, + number: 10, + recording: { + externalIds: [ + { + id: "600604844", + provider: "melon", + type: "song", + }, + ], + }, + title: "I (Solo Ver.)", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 208000, + number: 11, + recording: { + externalIds: [ + { + id: "600604845", + provider: "melon", + type: "song", + }, + ], + }, + title: "Why", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 234000, + number: 12, + recording: { + externalIds: [ + { + id: "600604846", + provider: "melon", + type: "song", + }, + ], + }, + title: "Weekend", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 171000, + number: 13, + recording: { + externalIds: [ + { + id: "600604847", + provider: "melon", + type: "song", + }, + ], + }, + title: "To. X", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 168000, + number: 14, + recording: { + externalIds: [ + { + id: "600604848", + provider: "melon", + type: "song", + }, + ], + }, + title: "What Do I Call You", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 189000, + number: 15, + recording: { + externalIds: [ + { + id: "600604849", + provider: "melon", + type: "song", + }, + ], + }, + title: "사계 (Four Seasons)", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 191000, + number: 16, + recording: { + externalIds: [ + { + id: "600604850", + provider: "melon", + type: "song", + }, + ], + }, + title: "All For Nothing", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 216000, + number: 17, + recording: { + externalIds: [ + { + id: "600604851", + provider: "melon", + type: "song", + }, + ], + }, + title: "겨울나무 (I'm all ears)", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 229000, + number: 18, + recording: { + externalIds: [ + { + id: "600604852", + provider: "melon", + type: "song", + }, + ], + }, + title: "11:11", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 223000, + number: 19, + recording: { + externalIds: [ + { + id: "600604853", + provider: "melon", + type: "song", + }, + ], + }, + title: "Rain", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 240000, + number: 20, + recording: { + externalIds: [ + { + id: "600604854", + provider: "melon", + type: "song", + }, + ], + }, + title: "Gravity", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 194000, + number: 21, + recording: { + externalIds: [ + { + id: "600604855", + provider: "melon", + type: "song", + }, + ], + }, + title: "Disaster", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 275000, + number: 22, + recording: { + externalIds: [ + { + id: "600604856", + provider: "melon", + type: "song", + }, + ], + }, + title: "U R", + }, + { + artists: [ + { + creditedName: "태연 (TAEYEON)", + externalIds: [ + { + id: "236797", + provider: "melon", + type: "artist", + }, + ], + name: "태연 (TAEYEON)", + }, + ], + length: 226000, + number: 23, + recording: { + externalIds: [ + { + id: "600604857", + provider: "melon", + type: "song", + }, + ], + }, + title: "Ending Credits", + }, + ], + }, + ], + packaging: "None", + releaseDate: { + date: { + day: 1, + month: 12, + year: 2025, + }, + quality: "assumed-valid", + }, + status: "Official", + title: "Panorama : The Best of TAEYEON", + types: [ + "Compilation", + ], +} +`; + +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", + "paid download", + ], + url: "https://www.melon.com/album/detail.htm?albumId=10000727", + }, + ], + images: [ + { + thumbUrl: "https://cdnimg.melon.co.kr/cm/album/images/100/00/727/10000727_500.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", + "paid download", + ], + 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_500.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", + "paid download", + ], + 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_500.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", + ], +} +`; + +snapshot[`Melon provider > release lookup > EP with two labels 1`] = ` +{ + artists: [ + { + creditedName: "Kep1er (케플러)", + externalIds: [ + { + id: "3058246", + provider: "melon", + type: "artist", + }, + ], + name: "Kep1er (케플러)", + }, + ], + availableIn: [ + "KR", + ], + excludedFrom: [], + externalLinks: [ + { + types: [ + "paid streaming", + "paid download", + ], + url: "https://www.melon.com/album/detail.htm?albumId=10830226", + }, + ], + images: [ + { + thumbUrl: "https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300", + types: [ + "front", + ], + url: "https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_org.jpg", + }, + ], + info: { + messages: [], + providers: [ + { + apiUrl: "https://m2.melon.com/m6/v3/album/info.json?albumId=10830226", + id: "10830226", + internalName: "melon", + lookup: { + method: "id", + value: "10830226", + }, + name: "Melon", + url: "https://www.melon.com/album/detail.htm?albumId=10830226", + }, + ], + }, + labels: [ + { + name: "WAKEONE", + }, + { + name: "스윙엔터테인먼트", + }, + ], + media: [ + { + format: "Digital Media", + number: 1, + tracklist: [ + { + artists: [ + { + creditedName: "Kep1er (케플러)", + externalIds: [ + { + id: "3058246", + provider: "melon", + type: "artist", + }, + ], + name: "Kep1er (케플러)", + }, + ], + length: 112000, + number: 1, + recording: { + externalIds: [ + { + id: "34491912", + provider: "melon", + type: "song", + }, + ], + }, + title: "See The Light", + }, + { + artists: [ + { + creditedName: "Kep1er (케플러)", + externalIds: [ + { + id: "3058246", + provider: "melon", + type: "artist", + }, + ], + name: "Kep1er (케플러)", + }, + ], + length: 184000, + number: 2, + recording: { + externalIds: [ + { + id: "34491913", + provider: "melon", + type: "song", + }, + ], + }, + title: "WA DA DA", + }, + { + artists: [ + { + creditedName: "Kep1er (케플러)", + externalIds: [ + { + id: "3058246", + provider: "melon", + type: "artist", + }, + ], + name: "Kep1er (케플러)", + }, + ], + length: 191000, + number: 3, + recording: { + externalIds: [ + { + id: "34491914", + provider: "melon", + type: "song", + }, + ], + }, + title: "MVSK", + }, + { + artists: [ + { + creditedName: "Kep1er (케플러)", + externalIds: [ + { + id: "3058246", + provider: "melon", + type: "artist", + }, + ], + name: "Kep1er (케플러)", + }, + ], + length: 215000, + number: 4, + recording: { + externalIds: [ + { + id: "34491915", + provider: "melon", + type: "song", + }, + ], + }, + title: "Shine (Kep1er Ver.)", + }, + { + artists: [ + { + creditedName: "Kep1er (케플러)", + externalIds: [ + { + id: "3058246", + provider: "melon", + type: "artist", + }, + ], + name: "Kep1er (케플러)", + }, + ], + length: 202000, + number: 5, + recording: { + externalIds: [ + { + id: "34491916", + provider: "melon", + type: "song", + }, + ], + }, + title: "Another Dream (Kep1er Ver.)", + }, + { + artists: [ + { + creditedName: "Kep1er (케플러)", + externalIds: [ + { + id: "3058246", + provider: "melon", + type: "artist", + }, + ], + name: "Kep1er (케플러)", + }, + ], + length: 248000, + number: 6, + recording: { + externalIds: [ + { + id: "34491917", + provider: "melon", + type: "song", + }, + ], + }, + title: "O.O.O (Over&Over&Over) (Kep1er Ver.)", + }, + ], + }, + ], + packaging: "None", + releaseDate: { + date: { + day: 3, + month: 1, + year: 2022, + }, + quality: "assumed-valid", + }, + status: "Official", + title: "FIRST IMPACT", + types: [ + "EP", + ], +} +`; diff --git a/providers/Melon/api_types.ts b/providers/Melon/api_types.ts new file mode 100644 index 0000000..ea8f239 --- /dev/null +++ b/providers/Melon/api_types.ts @@ -0,0 +1,63 @@ +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; + }; + /** Error notification for deleted or nonexistent albums. */ + notification?: { + message: 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[]; + }; + /** Error notification for deleted or nonexistent albums. */ + notification?: { + message: string; + }; +} + +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..85fbe1e --- /dev/null +++ b/providers/Melon/mod.test.ts @@ -0,0 +1,120 @@ +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 { assertArrayIncludes, assertEquals, assertExists } 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: 'album page with additional query parameters', + url: new URL('https://www.melon.com/album/detail.htm?albumId=13693526&ref=share'), + id: { type: 'album', id: '13693526' }, + }, { + description: 'mobile album page', + url: new URL('https://m2.melon.com/album/music.htm?albumId=13816948'), + id: { type: 'album', id: '13816948' }, + }, { + 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: 'Compilation (베스트) album with an unavailable CD-only track', + release: new URL('https://www.melon.com/album/detail.htm?albumId=12416346'), + 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, 23, 'Should have 23 tracks (without the CD-only track)'); + assertExists(release.types, 'Should have a release type'); + assertArrayIncludes(release.types, ['Compilation'], 'Should be classified as Compilation'); + }, + }, { + 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'); + assertExists(release.types, 'Should have a release type'); + assertArrayIncludes(release.types, ['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'); + assertExists(release.types, 'Should have a release type'); + assertArrayIncludes(release.types, ['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'); + assertExists(release.types, 'Should have a release type'); + assertArrayIncludes(release.types, ['Single'], 'Should be classified as Single'); + }, + }, { + description: 'EP with two labels', + release: new URL('https://www.melon.com/album/detail.htm?albumId=10830226'), + 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, 6, 'Should have 6 tracks'); + assertExists(release.types, 'Should have a release type'); + assertArrayIncludes(release.types, ['EP'], 'Should be classified as EP'); + assertExists(release.labels, 'Should have labels'); + const labels = release.labels.map((l) => l.name); + assertEquals(labels, ['WAKEONE', '스윙엔터테인먼트'], 'Should have correct labels'); + }, + }], + }); + + afterAll(() => { + stubs.forEach((s) => s.restore()); + }); +}); diff --git a/providers/Melon/mod.ts b/providers/Melon/mod.ts new file mode 100644 index 0000000..654b74a --- /dev/null +++ b/providers/Melon/mod.ts @@ -0,0 +1,233 @@ +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, + LinkType, + ReleaseGroupType, +} from '@/harmonizer/types.ts'; +import type { + MelonAlbumInfo, + MelonAlbumInfoResponse, + MelonArtist, + MelonDisc, + MelonSong, + MelonSongListResponse, +} from './api_types.ts'; +import { splitLabels } from '@/utils/label.ts'; + +const API_BASE = 'https://m2.melon.com/m6/'; + +export default class MelonProvider extends MetadataApiProvider { + readonly name = 'Melon'; + + readonly supportedUrls = new URLPattern({ + hostname: ':subdomain(www|m2).melon.com', + pathname: '/:type(album|song|artist)/:page(detail|music).htm', + search: ':type(album|song|artist)Id=:id(\\d+){&*}?', + }); + + protected override idPattern = /^\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 { + const match = this.supportedUrls.exec(url); + if (!match) return undefined; + + const { type: pathType } = match.pathname.groups; + const { type: searchType, id } = match.search.groups; + + if (pathType !== searchType || !pathType || !id) { + return undefined; + } + + return { type: pathType, id: id }; + } + + 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('v3/album/info.json', API_BASE); + 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('v2/album/song/list.json', API_BASE); + 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); + + // Deleted or nonexistent albums are indicated by a notification instead of the actual response data. + const infoResponse = infoEntry.content.response; + if (!infoResponse) { + const notification = infoEntry.content.notification; + throw new ProviderError(this.provider.name, notification?.message ?? 'Album not found'); + } + + const cdList = songListEntry.content.response?.CDLIST; + if (!cdList) { + const notification = songListEntry.content.notification; + throw new ProviderError(this.provider.name, notification?.message ?? 'Album song list not found'); + } + + return { + albumInfo: infoResponse.ALBUMINFO, + albumType: infoResponse.ALBUMTYPE, + planCnpy: infoResponse.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: raw.planCnpy ? splitLabels(raw.planCnpy) : [], + images: [this.coverArtwork(raw.albumInfo)], + types: mapReleaseType(raw.albumType), + availableIn: ['KR'], + status: 'Official', + packaging: 'None', + media: this.buildMedia(raw.cdList), + externalLinks: [{ + url: this.provider.constructUrl(this.entity).toString(), + types: raw.albumInfo.ISSERVICE ? ['paid streaming', 'paid download'] : [], + }], + 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 coverArtwork(albumInfo: MelonAlbumInfo): Artwork { + const originalUrl = albumInfo.ALBUMIMGLARGE.replace( + /(images\/.*\/[^/_]*)((_[^/.]*)_)?(_?[^/._]*)?(\.[^/.?]*)(?:[?/].*)?$/, + '$1$3_org$5', + ); + return { + url: originalUrl, + thumbUrl: albumInfo.ALBUMIMG, + 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: song.PLAYTIME ? parseInt(song.PLAYTIME) * 1000 : undefined, + 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 === '베스트' || albumType === '옴니버스') return ['Compilation']; + if (albumType === '라이브') return ['Live']; + if (albumType === '리믹스') return ['Remix']; + if (albumType === 'OST') return ['Soundtrack']; + 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..6e6f0ee --- /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..34e4117 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; @@ -118,14 +119,16 @@ ul.inline > li:not(:last-child)::after { margin-left: 0.5em; } -a:link, a:visited { +a:link, +a:visited { color: var(--link); } a:hover { color: var(--link-accent); } -a.label, span.label { +a.label, +span.label { display: inline-flex; align-items: center; padding: 0.4em; @@ -149,7 +152,8 @@ ul.alt-values { list-style: square; } -span.label svg.icon, ul.alt-values svg.icon { +span.label svg.icon, +ul.alt-values svg.icon { height: 16px; width: 16px; } @@ -202,16 +206,21 @@ input#region-input { width: 14em; } -input[type='submit'], button { +input[type='submit'], +button { color: var(--text); background-color: var(--button-fill); border: 2px outset var(--button-border); border-radius: 0.3em; } -input[type='submit']:active, button:active { +input[type='submit']:active, +button:active { border-style: inset; } -input[type='submit']:focus, button:focus, input[type='submit']:hover, button:hover { +input[type='submit']:focus, +button:focus, +input[type='submit']:hover, +button:hover { background-color: var(--button-focus); cursor: pointer; } @@ -229,7 +238,8 @@ tbody > tr:nth-child(even) { background-color: var(--even-fill); } -td, th { +td, +th { padding: 0.1em 0.2em; } @@ -268,7 +278,8 @@ button.copy:hover { opacity: 0.8; } -td > button.copy:first-child, div.region-list > button.copy { +td > button.copy:first-child, +div.region-list > button.copy { float: right; } @@ -335,7 +346,8 @@ div.action-group { /* MessageBox.tsx, LinkWithMusicBrainz.tsx, actions.tsx */ -div.message, div.action { +div.message, +div.action { display: flex; align-items: center; background-color: var(--theme-fill); @@ -345,7 +357,8 @@ div.message, div.action { border-radius: 5px; } -div.message > svg.icon, div.action > svg.icon { +div.message > svg.icon, +div.action > svg.icon { min-width: fit-content; margin-right: 0.3em; } @@ -355,7 +368,10 @@ div.message span.provider { margin-right: 0.5em; } -div.message p, div.message ul, div.action p, div.action ul { +div.message p, +div.message ul, +div.action p, +div.action ul { margin: 0; } @@ -415,7 +431,8 @@ nav > ul > li > a { align-items: center; } -nav a:link, nav a:visited { +nav a:link, +nav a:visited { color: inherit; text-decoration: none; } @@ -438,7 +455,8 @@ button.open-all-links { font-family: inherit; } -button.open-all-links:focus, button.open-all-links:hover { +button.open-all-links:focus, +button.open-all-links:hover { background-color: var(--button-accent-focus); } @@ -454,40 +472,56 @@ label.provider-input { gap: 0.5em; } -label.bandcamp, td.bandcamp { +label.bandcamp, +td.bandcamp { background-color: var(--bandcamp); } -label.beatport, td.beatport { +label.beatport, +td.beatport { background-color: var(--beatport); } -label.bugs, td.bugs { +label.bugs, +td.bugs { background-color: var(--bugs); } -label.deezer, td.deezer { +label.deezer, +td.deezer { background-color: var(--deezer); } -label.discogs, td.discogs { +label.discogs, +td.discogs { background-color: var(--discogs); } -label.itunes, td.itunes { +label.itunes, +td.itunes { background-color: var(--apple); } -label.mora, td.mora { +label.melon, +td.melon { + background-color: var(--melon); +} +label.mora, +td.mora { background-color: var(--mora); } -label.musicbrainz, td.musicbrainz { +label.musicbrainz, +td.musicbrainz { background-color: var(--musicbrainz); } -label.ototoy, td.ototoy { +label.ototoy, +td.ototoy { background-color: var(--ototoy); } -label.qobuz, td.qobuz { +label.qobuz, +td.qobuz { background-color: var(--qobuz); } -label.spotify, td.spotify { +label.spotify, +td.spotify { background-color: var(--spotify); } -label.tidal, td.tidal { +label.tidal, +td.tidal { background-color: var(--tidal); } @@ -557,7 +591,8 @@ span.tooltip-anchor:hover > div[role='tooltip'] { display: inline-block; } -div[role='tooltip'] > ol, div[role='tooltip'] > ul { +div[role='tooltip'] > ol, +div[role='tooltip'] > ul { margin: 0; padding-inline-start: 1.5em; text-align: left; 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=10830226 b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=10830226 new file mode 100644 index 0000000..fa3f188 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=10830226 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"ISCLASSIC":"N","RESULTCODE":"0","RESPONSE":"albumListSong","CPLANCODE":"0","MENUID":"1000000461","CDLIST":[{"CDNO":"1","SONGLIST":[{"SONGID":"34491912","SONGNAME":"See The Light","ALBUMID":"10830226","ALBUMNAME":"FIRST IMPACT","ARTISTLIST":[{"ARTISTID":"3058246","ARTISTNAME":"Kep1er (케플러)"}],"PLAYTIME":"112","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/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"1"},{"SONGID":"34491913","SONGNAME":"WA DA DA","ALBUMID":"10830226","ALBUMNAME":"FIRST IMPACT","ARTISTLIST":[{"ARTISTID":"3058246","ARTISTNAME":"Kep1er (케플러)"}],"PLAYTIME":"184","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/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"2"},{"SONGID":"34491914","SONGNAME":"MVSK","ALBUMID":"10830226","ALBUMNAME":"FIRST IMPACT","ARTISTLIST":[{"ARTISTID":"3058246","ARTISTNAME":"Kep1er (케플러)"}],"PLAYTIME":"191","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/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"3"},{"SONGID":"34491915","SONGNAME":"Shine (Kep1er Ver.)","ALBUMID":"10830226","ALBUMNAME":"FIRST IMPACT","ARTISTLIST":[{"ARTISTID":"3058246","ARTISTNAME":"Kep1er (케플러)"}],"PLAYTIME":"215","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/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"4"},{"SONGID":"34491916","SONGNAME":"Another Dream (Kep1er Ver.)","ALBUMID":"10830226","ALBUMNAME":"FIRST IMPACT","ARTISTLIST":[{"ARTISTID":"3058246","ARTISTNAME":"Kep1er (케플러)"}],"PLAYTIME":"202","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"GENRECODE":"GC0166","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/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"5"},{"SONGID":"34491917","SONGNAME":"O.O.O (Over&Over&Over) (Kep1er Ver.)","ALBUMID":"10830226","ALBUMNAME":"FIRST IMPACT","ARTISTLIST":[{"ARTISTID":"3058246","ARTISTNAME":"Kep1er (케플러)"}],"PLAYTIME":"248","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/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"6"}]}],"TOTSONGCNT":"6","TOTPLAYTIME":"19분 12초"},"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=12416346 b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=12416346 new file mode 100644 index 0000000..069a208 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v2/album/song/list.json!albumId=12416346 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"ISCLASSIC":"N","RESULTCODE":"0","RESPONSE":"albumListSong","CPLANCODE":"0","MENUID":"1000000461","CDLIST":[{"CDNO":"1","SONGLIST":[{"SONGID":"600604835","SONGNAME":"인사 (Panorama)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"180","GENRELIST":[{"GENRECODE":"GC0035","GENRENAME":"Rock"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"},{"GENRECODE":"GC0169","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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"1"},{"SONGID":"600604836","SONGNAME":"Letter To Myself","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"185","GENRELIST":[{"GENRECODE":"GC0035","GENRENAME":"Rock"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"2"},{"SONGID":"600604837","SONGNAME":"Time Lapse (2025 Mix)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"256","GENRELIST":[{"GENRECODE":"GC0035","GENRENAME":"Rock"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"3"},{"SONGID":"600604838","SONGNAME":"Fine","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"210","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"4"},{"SONGID":"600604839","SONGNAME":"INVU","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"205","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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"5"},{"SONGID":"600604840","SONGNAME":"불티 (Spark)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"218","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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"6"},{"SONGID":"600604841","SONGNAME":"Set Myself On Fire","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"158","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"7"},{"SONGID":"600604842","SONGNAME":"그런 밤 (Some Nights)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"208","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"8"},{"SONGID":"600604843","SONGNAME":"Make Me Love You","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"214","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"9"},{"SONGID":"600604844","SONGNAME":"I (Solo Ver.)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"163","GENRELIST":[{"GENRECODE":"GC0035","GENRENAME":"Rock"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"10"},{"SONGID":"600604845","SONGNAME":"Why","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"208","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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"11"},{"SONGID":"600604846","SONGNAME":"Weekend","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"234","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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"12"},{"SONGID":"600604847","SONGNAME":"To. X","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"171","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"13"},{"SONGID":"600604848","SONGNAME":"What Do I Call You","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"168","GENRELIST":[{"GENRECODE":"GC0033","GENRENAME":"R&B / Soul"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"14"},{"SONGID":"600604849","SONGNAME":"사계 (Four Seasons)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"189","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"15"},{"SONGID":"600604850","SONGNAME":"All For Nothing","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"191","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"16"},{"SONGID":"600604851","SONGNAME":"겨울나무 (I'm all ears)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"216","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"17"},{"SONGID":"600604852","SONGNAME":"11:11","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"229","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"18"},{"SONGID":"600604853","SONGNAME":"Rain","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"223","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"19"},{"SONGID":"600604854","SONGNAME":"Gravity","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"240","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"20"},{"SONGID":"600604855","SONGNAME":"Disaster","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"194","GENRELIST":[{"GENRECODE":"GC0035","GENRENAME":"Rock"},{"GENRECODE":"GC0091","GENRENAME":"아이돌 여자"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"21"},{"SONGID":"600604856","SONGNAME":"U R","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"275","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"22"},{"SONGID":"600604857","SONGNAME":"Ending Credits","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"PLAYTIME":"226","GENRELIST":[{"GENRECODE":"GC0003","GENRENAME":"Ballad"},{"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/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"23"},{"SONGID":"600604858","SONGNAME":"인사 (Panorama) (Live Studio Session) (CD Only)","ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)"}],"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/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGPATH":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/144/optimize/90","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/optimize/90","ALBUMIMGSMALL":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6/melon/resize/50/optimize/90","ISSUEDATE":"-","CTYPE":"1","CONTSTYPECODE":"N10001","TRACKNO":"24"}]}],"TOTSONGCNT":"24","TOTPLAYTIME":"1시간 19분 "},"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=10830226 b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=10830226 new file mode 100644 index 0000000..dd08bf5 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=10830226 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"RESULTCODE":"0","RESPONSE":"albumInfo","CPLANCODE":"0","MENUID":"1000000461","ALBUMINFO":{"ISSERVICE":true,"ALBUMID":"10830226","ALBUMNAME":"FIRST IMPACT","ISSUEDATE":"2022.01.03","ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg?c4219b256d52303bf773968b467cd300","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_1000.jpg?c4219b256d52303bf773968b467cd300","SONGCNT":"6","CTYPE":"2","CONTSTYPECODE":"N10002","ARTISTLIST":[{"ARTISTID":"3058246","ARTISTNAME":"Kep1er (케플러)","ACTTYPENAME":null,"DEBUTDAY":null,"BIRTHDAY":null,"ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/030/58/246/3058246_20260330140029_500.jpg?YUV444/melon/resize/220","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.6","PTCPNMPRCO":"1028"},"LIKECNT":"4357","ISDOLBYATMOS":false,"ISMASTERPIECE":false,"BOOKLETIMGLIST":null,"ALBUMPRICE":"","ALBUMPRICEFLAC16":"","ALBUMPRICEFLAC24":"","ALBUMFLACINFO":"FLAC","ALBUMMESSAGE":"","BBSCHANNELSEQ":"102","BBSCONTSREFVALUE":"10830226","POSTIMG":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg/melon/optimize/90","POSTEDITIMG":"https://cdnimg.melon.co.kr/cm2/album/images/108/30/226/10830226_20211231171127_500.jpg/melon/resize/144/optimize/90","TITLESONGINFO":{"SONGID":"34491913","SONGNAME":"WA DA DA"},"ARTISTNOTEINFO":{"ALBUMID":"10830226","ARTISTID":"3058246","ARTISTNOTE":"Catch your eye, Catch your mind! 안녕하세요, Kep1er 입니다. \n저희의 첫 미니앨범 'FIRST IMPACT'가 드디어 발매되었습니다! \n다채로운 매력을 가진 9명의 멤버들이 모여 처음으로 보여드리는 앨범인 만큼, 'FIRST IMPACT'라는 앨범명처럼 여러분들께 첫 임팩트를 강하게 남기고 싶어요. \n앞으로도 Kep1er 많은 사랑 부탁드립니다!","ARTISTNAME":"Kep1er (케플러)","ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/030/58/246/3058246_20260330140029.jpg?YUV444","ISSUEDATE":"2022.01.03"},"ARTISTNOTEALLBUTTONFLAG":false,"GENRELIST":[{"GENRECODE":"GN0200","GENRENAME":"댄스"},{"GENRECODE":"GN0100","GENRENAME":"발라드"}],"ISSUEDATE":"2022.01.03","REPORT":"[앨범 소개] \n \n글로벌 팬 메이드 그룹 ‘Kep1er’, 데뷔 앨범 ‘FIRST IMPACT’ 발매! \n‘Catch your eye! Catch your mind!’ 글로벌 팬들의 마음을 사로잡으러 출격! \n \n4세대 슈퍼 루키 ‘Kep1er(케플러)’가 2022년 1월 3일 첫 미니 앨범 ‘FIRST IMPACT’를 발표한다. \n \n‘Kep1er’는 2021년 Mnet ‘Girls Planet 999: 소녀 대전’을 통해 선발된 TOP9 멤버들로 구성된 그룹이다. 한·중·일 3개국 출신의 소녀들이 참가해 화제가 되었던 이 프로그램은 전 세계 175개국 팬들이 글로벌 투표에 참여했으며, 방송 시간 누적 투표수 1억 297만 표를 기록했다. 관련 유튜브 영상 또한 전체 누적 조회 수 4억 6천만 뷰를 넘어섰고 최종회는 전 세계 트위터 트렌드 1위에 오르며 ‘글로벌 팬덤이 만든 4세대 슈퍼 루키 그룹’이라는 수식어를 입증했다. \n \n‘Kep1er’는 ‘꿈을 잡았다’는 의미의 ‘Kep’과 아홉 명의 소녀가 하나로 모여 최고가 되겠다는 뜻의 숫자 ‘1’을 결합하여 ‘자신의 꿈을 캐치하고 꿈을 이뤄 최고의 글로벌 걸그룹’이 되겠다는 소녀들의 포부를 담고 있다. 글로벌 팬들의 기대에 부응하여 지속적으로 성장하고 도전하는 모습을 보여주겠다는 소녀들의 의지와도 닿아있다. \n \n‘Kep1er’의 세계관 역시 눈길을 사로잡는다. 꿈을 쟁취하기 위해 모험을 떠난 소녀들이 살고 있는 행성엔 두 개의 태양이 공존한다. 이는 각각 ‘소녀들의 꿈’과 ‘팬들의 사랑’을 뜻한다. 이 두 개의 태양을 원동력 삼아 미지의 세계를 탐험하고 새로운 세상을 향해 적극적으로 떠나는 소녀들. 이 두 개의 태양이 있는 곳이라면 어디든 ‘Kep1er’로 변할 수 있다. \n \n데뷔 앨범 ‘FIRST IMPACT’는 앞으로 펼쳐나갈 ‘Kep1er’의 광대한 세계관과 소녀들의 다채로운 매력이 담긴 6곡으로 구성되어 있다. 에너제틱하고 러블리한 매력이 담긴 타이틀곡 ‘WA DA DA’, 세련되고 스타일리시한 커플링 곡 ’MVSK’, 몽환적인 분위기가 호기심을 자아내는 인트로 곡 ’See The Light’에는 각각 K-Pop을 대표하는 작곡가 프리즘 필터, e.one, 박우상 프로듀서가 참여하여 슈퍼 루키 ‘Kep1er’의 첫 출발을 응원하고 힘을 더했다. \n \n이외에도 ‘Girls Planet 999: 소녀 대전’에서 주인공은 ‘바로 나야!’라는 킬링 파트를 남기며 많은 화제를 모았던 시그널 송 ‘O.O.O (Over&Over&Over)’와 파이널 미션 곡으로 많은 사랑을 받았던 발랄하고 통통 튀는 매력이 돋보이는 댄스 곡 ‘Shine’, 서정적인 멜로디와 감정선으로 팬들의 호응을 얻었던 발라드 곡 ‘Another Dream’을 ‘Kep1er’ 버전으로 재 녹음하여 음반에서 다시 만날 수 있게 되었다. \n \n퀄리티 높은 음악과 함께 화려한 퍼포먼스 또한 글로벌 팬들의 기대를 충족시키기에 충분하다. ‘Kep1er’ 멤버들의 댄스 마스터로 활약했던 국내 최정상 K-Pop 퍼포먼스 메이커 장주희, 백구영 안무가와 다인원 걸그룹 안무 장인 프리마인드 채다솜 안무가가 ‘Kep1er’ 1집 미니 앨범의 코레오그래퍼로 참여하며 한층 더 기대를 고조시키고 있다. \n \n글로벌 팬들의 선택을 통해 하나가 된 9명의 소녀들. 꿈이 현실이 되는 ‘Kep1er’의 모험 이야기는 지금부터 시작이다. \n \n \n[곡소개] \n \n01 See The Light \nComposed by 박우상, 이상원 \nLyrics by 박우상 \nArranged by 박우상, 이상원 \n \n‘Kep1er’ 여정의 첫 시작을 알리는 인트로 트랙 ‘See The Light’. ‘Kep1er’의 세계관을 빛에 빗대어 녹여낸 가사와 어디론가 향하는 빛을 따라 마치 우주를 탐험하는 듯한 스펙터클한 전개가 인상적인 하이브리드 장르의 댄스 곡이다. 몽환적인 신디사이저, 다채로운 그루브 변화, 곳곳에 우주를 연상케하는 일렉트로닉 사운드 소스의 배치가 환상적인 분위기를 자아낸다. 도입부에서는 스타일리시한 내레이션과 싱잉 랩으로 귀를 사로잡고 후렴구의 경쾌한 멜로디, 백킹 트랙에는 시원한 고음을 사용하여 곡 전체에 다이내믹을 더했다. \n \n02 WA DA DA \nComposed by BuildingOwner(PRISMFILTER), Elum(PRISMFILTER), Shannon \nLyrics by BuildingOwner(PRISMFILTER), Elum(PRISMFILTER), Shannon, danke, 황유빈, ODAL PARK, 이스란, KAKO \nArranged by BuildingOwner(PRISMFILTER) \n \n타이틀곡 ‘WA DA DA’는 신나는 빅룸 하우스 장르 기반의 댄스 곡으로 반복되는 베이스 리프 속 다양한 무드 전환을 통해 ‘Kep1er’만의 에너제틱하고 러블리한 매력을 보여주는 곡이다. 랩과 노래를 넘나드는 멤버들의 보컬과 곳곳에 숨어있는 발랄한 애드리브, 중독성 있는 후렴구와 훅의 챈트가 듣는 재미를 한층 더 배가시킨다. 가사에는 ‘Kep 1 going’ ‘꿈들이 이루어지는 모험’ ‘내 숨이 차도 I won’t give up’ ‘누구보다 빨리 달려갈 거야 그려왔던 곳으로’ 등 차세대 최고의 글로벌 걸그룹이 되겠다는 소녀들의 당찬 포부를 보여주고 있으며, 동시에 멤버들의 꿈을 응원하고 지켜준 팬들의 사랑에 좋은 음악과 멋진 퍼포먼스로 보답하여 팬들에게 ’WA DA DA’ 달려가겠다는 다짐을 표현했다. 곡에 걸맞은 파워풀하면서도 걸리시한 ‘Kep1er’표 퍼포먼스 역시 눈을 사로잡으며 깜찍한 페어링 안무를 더해 멤버들의 환상적인 케미를 선사한다. \n \n03 MVSK \nComposed by 정호현(e.one) \nLyrics by 정호현(e.one) \nArranged by 정호현(e.one) \n \n‘MVSK’는 House, Disco, Future 등 여러 장르가 복합적으로 구성된 곡이다. 섹션마다 다른 악기 구성과 완전히 다른 장르로 변화되는 편곡으로 독특하면서도 신비한 분위기로 특별한 매력을 선사한다. 가사는 상상했던 그곳 ‘Kep1er’로 모두를 초대한다는 주제의 이야기로 가면 속 가려져있는 사람들의 진짜 모습과 꿈을 꺼내어 이루어 주고 싶은 ‘Kep1er’의 바램이 담겨있다. MASK 속 숨겨져 있던 본연의 모습을 드러내게 한다는 의미를 담아 M’A’SK의 ‘A’를 뒤집어 ‘V’로 재치 있게 표현하였다. 데뷔 쇼를 통해 선보인 ‘MVSK’ 퍼포먼스 역시 멤버들의 합이 돋보이는 여성스럽고 화려한 군무로 글로벌 팬들의 열광을 이끌어냈다. \n \n04 Shine (Kep1er Ver.) \nComposed by Albi Albertsson(MUSSASHI), Mia Kemppainen, Kanata Okajima, Hautboi Rich, Inner Child(MonoTree), 서하영(MonoTree), Ryan Kim, Peter Chun, Sabrina Salmon \nLyrics by 이스란, Inner Child(MonoTree), 서하영(MonoTree), Albi Albertsson(MUSSASHI), Mia Kemppainen \nArranged by Albi Albertsson(MUSSASHI) \n \n‘Shine’은 언제나 ‘Kep1er’의 꿈을 지켜주고 빛처럼 이끌어준 팬들을 위해, 이제는 ‘Kep1er’가 별이 되고 빛이 되어 고마운 팬들을 비춰주고 싶다는 마음을 담은 곡이다. 마칭 밴드를 연상시키는 경쾌한 드럼 비트와 발랄하고 생동감 넘치는 멜로디, 챈트가 돋보이는 업템포 댄스 팝 곡이다. 펑키한 기타 사운드, 게임에서 나올 법한 귀여운 신디사이저 사운드 등 다양한 사운드 소스가 더해져 한층 더 리드미컬한 느낌을 더한다. \n \n05 Another Dream (Kep1er Ver.) \nComposed by 박수석, 서지은 \nLyrics by 박수석, 서지은, 왕유림 \nArranged by 박수석, 서지은 \n \n‘Another Dream’은 소녀들을 지켜주는 글로벌 음악팬들의 응원과 사랑이 있다면 멀게만 느껴졌던 꿈도 이뤄낼 수 있다는 메시지를 담은 미디엄 팝 발라드 곡이다. 글로벌 걸그룹 데뷔라는 1차 목표를 이룬 ‘Kep1er’ 멤버들이 팬들의 무한 응원과 사랑에 힘입어 앞으로 더 큰 꿈을 이뤄내겠다는 다짐을 담았다. 조화롭게 어우러지는 멤버들의 보컬과 서정적이고 흡입력 있는 멜로디, 몽환적인 신스 사운드와 풍성한 스트링 사운드가 귀를 사로잡는다. \n \n06 O.O.O (Over&Over&Over) (Kep1er Ver.) \nComposed by 정호현(e.one), 황현(MonoTree) \nLyrics by 정호현(e.one), 황현(MonoTree), Girls Planet 999 \nArranged by 정호현(e.one), 황현(MonoTree) \n \n‘O.O.O (Over&Over&Over) (Kep1er Ver.)’는 3개국 9명의 소녀들 각자의 꿈을 다채롭게 표현하기 위해 섹션별로 다른 편곡, 다양한 장르로 구성한 ‘멀티팝’ 장르의 곡이다. 작사·작곡에 e.one의 정호현 작곡가와 모노트리의 황현 작곡가의 역대급 공동작업으로 팬들의 많은 호응을 얻었다. 서로 다른 공간에서 같은 꿈을 꾸는 소녀들이 거대한 우주 안에서 함께 응답하고 연결되는 메시지가 담긴 흥미로운 가사와 꿈을 이루어내는 소녀의 당찬 포부를 보여주는 ‘바로 나야!’라고 외치는 킬링 파트가 매력적인 곡이다. ‘Kep1er’의 서사와 꿈을 향한 개성있는 외침이 담긴 곡이다.","ALBUMTYPE":"EP","SELLCNPY":"지니뮤직, STONE MUSIC","PLANCNPY":"WAKEONE, 스윙엔터테인먼트","CREDITLIST":null,"REPORTPREVIEW":"[앨범 소개] 글로벌 팬 메이드 그룹 ‘Kep1er’, 데뷔 앨범 ‘FIRST IMPACT’ 발매! ‘Catch your eye! Catch your mind!’ 글로벌 팬들의 마음을 사로잡으러 출격! 4세대 슈퍼 루키 ‘Kep1er(케플러)’가 2022년 1월 3일 첫 미니 앨범 ‘FIRST IMPACT’를 발표한다. ‘Kep1er’는 2021년 Mnet ‘Girls Planet 999: 소녀 대전’을 통해 선발된 TOP9 멤버들로 구성된 그룹이다. 한·중·일 3개국 출신의 소녀들이 참가해 화제가 되었던 이 프로그램은 전 세계 175개국 팬들이 글로벌 투표에 참여했으며, 방송 시간 누적 투표수 1억 297만 표를 기록했다. 관련 유튜브 영상 또한 전체 누적 조회 수 4억 6천만 뷰를 넘어섰고 최종회는 전 세계 트위터 트렌드 1위에 오르며 ‘글로벌 팬덤이 만든 4세대 슈퍼 루키 그룹’이라는 수식어를 입증했다. ‘Kep1er’는 ‘꿈을 잡았다’는 의미의 ‘Kep’과 아홉 명의 소녀가 하나로 모여 최고가 되겠다는 뜻의 숫자 ‘1’을 결합하여 ‘자신의 꿈을 캐치하고 꿈을 이뤄 최고의 글로벌 걸그룹’이 되겠다는 소녀들의 포부를 담고 있다. 글로벌 팬들의 기대에 부응하여 지속적으로 성장하고 도전하는 모습을 보여주겠다는 소녀들의 의지와도 닿아있다. ‘Kep1er’의 세계관 역시 눈길을 사로잡는다. 꿈을 쟁취하기 위해 모험을 떠난 소녀들이 살고 있는 행성엔 두 개의 태양이 공존한다. 이는 각각 ‘소녀들의 꿈’과 ‘팬들의 사랑’을 뜻한다. 이 두 개의 태양을 원동력 삼아 미지의 세계를 탐험하고 새로운 세상을 향해 적극적으로 떠나는 소녀들. 이 두 개의 태양이 있는 곳이라면 어디든 ‘Kep1er’로 변할 수 있다. 데뷔 앨범 ‘FIRST IMPACT’는 앞으로 펼쳐나갈 ‘Kep1er’의 광대한 세계관과 소녀들의 다채로운 매력이 담긴 6곡으로 구성되어 있다. 에너제틱하고 러블리한 매력이 담긴 타이틀곡 ‘WA DA DA’, 세련되고 스타일리시한 커플링 곡 ’MVSK’, 몽환적인 분위기가 호기심을 자아내는 인트로 곡 ’See The Light’에는 각각 K-Pop을 대표하는 작곡가 프리즘 필터, e.one, 박우상 프로듀서가 참여하여 슈퍼 루키 ‘Kep1er’의 첫 출발을 응원하고 힘을 더했다. 이외에도 ‘Girls Planet 999: 소녀 대전’에서 주인공은 ‘바로 나야!’라는 킬링 파트를 남기며 많은 화제를 모았던 시그널 송 ‘O.O.O (Over&Over&Over)’와 파이널 미션 곡으로 많은 사랑을 받았던 발랄하고 통통 튀는 매력이 돋보이는 댄스 곡 ‘Shine’, 서정적인 멜로디와 감정선으로 팬들의 호응을 얻었던 발라드 곡 ‘Another Dream’을 ‘Kep1er’ 버전으로 재 녹음하여 음반에서 다시 만날 수 있게 되었다. 퀄리티 높은 음악과 함께 화려한 퍼포먼스 또한 글로벌 팬들의 기대를 충족시키기에 충분하다. ‘Kep1er’ 멤버들의 댄스 마스터로 활약했던 국내 최정상 K-Pop 퍼포먼스 메이커 장주희, 백구영 안무가와 다인원 걸그룹 안무 장인 프리마인드 채다솜 안무가가 ‘Kep1er’ 1집 미니 앨범의 코레오그래퍼로 참여하며 한층 더 기대를 고조시키고 있다. 글로벌 팬들의 선택을 통해 하나가 된 9명의 소녀들. 꿈이 현실이 되는 ‘Kep1er’의 모험 이야기는 지금부터 시작이다. [곡소개] 01 See The Light Composed by 박우상, 이상원 Lyrics by 박우상 Arranged by 박우상, 이상원 ‘Kep1er’ 여정의 첫 시작을 알리는 인트로 트랙 ‘See The Light’. ‘Kep1er’의 세계관을 빛에 빗대어 녹여낸 가사와 어디론가 향하는 빛을 따라 마치 우주를 탐험하는 듯한 스펙터클한 전개가 인상적인 하이브리드 장르의 댄스 곡이다. 몽환적인 신디사이저, 다채로운 그루브 변화, 곳곳에 우주를 연상케하는 일렉트로닉 사운드 소스의 배치가 환상적인 분위기를 자아낸다. 도입부에서는 스타일리시한 내레이션과 싱잉 랩으로 귀를 사로잡고 후렴구의 경쾌한 멜로디, 백킹 트랙에는 시원한 고음을 사용하여 곡 전체에 다이내믹을 더했다. 02 WA DA DA Composed by BuildingOwner(PRISMFILTER), Elum(PRISMFILTER), Shannon Lyrics by BuildingOwner(PRISMFILTER), Elum(PRISMFILTER), Shannon, danke, 황유빈, ODAL PARK, 이스란, KAKO Arranged by BuildingOwner(PRISMFILTER) 타이틀곡 ‘WA DA DA’는 신나는 빅룸 하우스 장르 기반의 댄스 곡으로 반복되는 베이스 리프 속 다양한 무드 전환을 통해 ‘Kep1er’만의 에너제틱하고 러블리한 매력을 보여주는 곡이다. 랩과 노래를 넘나드는 멤버들의 보컬과 곳곳에 숨어있는 발랄한 애드리브, 중독성 있는 후렴구와 훅의 챈트가 듣는 재미를 한층 더 배가시킨다. 가사에는 ‘Kep 1 going’ ‘꿈들이 이루어지는 모험’ ‘내 숨이 차도 I won’t give up’ ‘누구보다 빨리 달려갈 거야 그려왔던 곳으로’ 등 차세대 최고의 글로벌 걸그룹이 되겠다는 소녀들의 당찬 포부를 보여주고 있으며, 동시에 멤버들의 꿈을 응원하고 지켜준 팬들의 사랑에 좋은 음악과 멋진 퍼포먼스로 보답하여 팬들에게 ’WA DA DA’ 달려가겠다는 다짐을 표현했다. 곡에 걸맞은 파워풀하면서도 걸리시한 ‘Kep1er’표 퍼포먼스 역시 눈을 사로잡으며 깜찍한 페어링 안무를 더해 멤버들의 환상적인 케미를 선사한다. 03 MVSK Composed by 정호현(e.one) Lyrics by 정호현(e.one) Arranged by 정호현(e.one) ‘MVSK’는 House, Disco, Future 등 여러 장르가 복합적으로 구성된 곡이다. 섹션마다 다른 악기 구성과 완전히 다른 장르로 변화되는 편곡으로 독특하면서도 신비한 분위기로 특별한 매력을 선사한다. 가사는 상상했던 그곳 ‘Kep1er’로 모두를 초대한다는 주제의 이야기로 가면 속 가려져있는 사람들의 진짜 모습과 꿈을 꺼내어 이루어 주고 싶은 ‘Kep1er’의 바램이 담겨있다. MASK 속 숨겨져 있던 본연의 모습을 드러내게 한다는 의미를 담아 M’A’SK의 ‘A’를 뒤집어 ‘V’로 재치 있게 표현하였다. 데뷔 쇼를 통해 선보인 ‘MVSK’ 퍼포먼스 역시 멤버들의 합이 돋보이는 여성스럽고 화려한 군무로 글로벌 팬들의 열광을 이끌어냈다. 04 Shine (Kep1er Ver.) Composed by Albi Albertsson(MUSSASHI), Mia Kemppainen, Kanata Okajima, Hautboi Rich, Inner Child(MonoTree), 서하영(MonoTree), Ryan Kim, Peter Chun, Sabrina Salmon Lyrics by 이스란, Inner Child(MonoTree), 서하영(MonoTree), Albi Albertsson(MUSSASHI), Mia Kemppainen Arranged by Albi Albertsson(MUSSASHI) ‘Shine’은 언제나 ‘Kep1er’의 꿈을 지켜주고 빛처럼 이끌어준 팬들을 위해, 이제는 ‘Kep1er’가 별이 되고 빛이 되어 고마운 팬들을 비춰주고 싶다는 마음을 담은 곡이다. 마칭 밴드를 연상시키는 경쾌한 드럼 비트와 발랄하고 생동감 넘치는 멜로디, 챈트가 돋보이는 업템포 댄스 팝 곡이다. 펑키한 기타 사운드, 게임에서 나올 법한 귀여운 신디사이저 사운드 등 다양한 사운드 소스가 더해져 한층 더 리드미컬한 느낌을 더한다. 05 Another Dream (Kep1er Ver.) Composed by 박수석, 서지은 Lyrics by 박수석, 서지은, 왕유림 Arranged by 박수석, 서지은 ‘Another Dream’은 소녀들을 지켜주는 글로벌 음악팬들의 응원과 사랑이 있다면 멀게만 느껴졌던 꿈도 이뤄낼 수 있다는 메시지를 담은 미디엄 팝 발라드 곡이다. 글로벌 걸그룹 데뷔라는 1차 목표를 이룬 ‘Kep1er’ 멤버들이 팬들의 무한 응원과 사랑에 힘입어 앞으로 더 큰 꿈을 이뤄내겠다는 다짐을 담았다. 조화롭게 어우러지는 멤버들의 보컬과 서정적이고 흡입력 있는 멜로디, 몽환적인 신스 사운드와 풍성한 스트링 사운드가 귀를 사로잡는다. 06 O.O.O (Over&Over&Over) (Kep1er Ver.) Composed by 정호현(e.one), 황현(MonoTree) Lyrics by 정호현(e.one), 황현(MonoTree), Girls Planet 999 Arranged by 정호현(e.one), 황현(MonoTree) ‘O.O.O (Over&Over&Over) (Kep1er Ver.)’는 3개국 9명의 소녀들 각자의 꿈을 다채롭게 표현하기 위해 섹션별로 다른 편곡, 다양한 장르로 구성한 ‘멀티팝’ 장르의 곡이다. 작사·작곡에 e.one의 정호현 작곡가와 모노트리의 황현 작곡가의 역대급 공동작업으로 팬들의 많은 호응을 얻었다. 서로 다른 공간에서 같은 꿈을 꾸는 소녀들이 거대한 우주 안에서 함께 응답하고 연결되는 메시지가 담긴 흥미로운 가사와 꿈을 이루어내는 소녀의 당찬 포부를 보여주는 ‘바로 나야!’라고 외치는 킬링 파트가 매력적인 곡이다. ‘Kep1er’의 서사와 꿈을 향한 개성있는 외침이 담긴 곡이다.","SPOTLIGHTBUTTONFLAG":"N","HIRISINGBUTTONFLAG":"N","DUMMYTEXT":"10#_d4We5Vf6Ug7Th8Si9Rj0Qk!Pl@OmN#_7Th8Si9Rj0Qk!Pl@OmN#nM$oL%pK","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","TLOG":{"MENUID":"1000000461","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","CONTSTYPECODE":"N10002","CONTSTYPENAME":"앨범","CONTSID":"10830226","CONTSNAME":"FIRST IMPACT"}},"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=12416346 b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=12416346 new file mode 100644 index 0000000..07c6b35 --- /dev/null +++ b/testdata/https!/com.melon.m2/m6/v3/album/info.json!albumId=12416346 @@ -0,0 +1 @@ +{"httpsDomain":"https://m2.melon.com","response":{"RESULTCODE":"0","RESPONSE":"albumInfo","CPLANCODE":"0","MENUID":"1000000461","ALBUMINFO":{"ISSERVICE":true,"ALBUMID":"12416346","ALBUMNAME":"Panorama : The Best of TAEYEON","ISSUEDATE":"2025.12.01","ISTRACKZERO":false,"ALBUMIMG":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg?629ef777c3da841518096862ef556ce6","ALBUMIMGLARGE":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_1000.jpg?629ef777c3da841518096862ef556ce6","SONGCNT":"24","CTYPE":"2","CONTSTYPECODE":"N10002","ARTISTLIST":[{"ARTISTID":"236797","ARTISTNAME":"태연 (TAEYEON)","ACTTYPENAME":null,"DEBUTDAY":null,"BIRTHDAY":null,"ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/002/36/797/236797_20251120120808_500.jpg?c4b54d1f9d0086a7dffbe5b82f559769/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":"5.0","PTCPNMPRCO":"2050"},"LIKECNT":"8495","ISDOLBYATMOS":true,"ISMASTERPIECE":false,"BOOKLETIMGLIST":null,"ALBUMPRICE":"","ALBUMPRICEFLAC16":"","ALBUMPRICEFLAC24":"","ALBUMFLACINFO":"FLAC","ALBUMMESSAGE":"","BBSCHANNELSEQ":"102","BBSCONTSREFVALUE":"12416346","POSTIMG":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg/melon/optimize/90","POSTEDITIMG":"https://cdnimg.melon.co.kr/cm2/album/images/124/16/346/12416346_20251201142132_500.jpg/melon/resize/144/optimize/90","TITLESONGINFO":{"SONGID":"600604835","SONGNAME":"인사 (Panorama)"},"ARTISTNOTEINFO":{"ALBUMID":"12416346","ARTISTID":"236797","ARTISTNOTE":"듣는 내내 저와 함께해요♡","ARTISTNAME":"태연 (TAEYEON)","ARTISTIMG":"https://cdnimg.melon.co.kr/cm2/artistcrop/images/002/36/797/236797_20251120120808.jpg?c4b54d1f9d0086a7dffbe5b82f559769","ISSUEDATE":"2025.12.01"},"ARTISTNOTEALLBUTTONFLAG":false,"GENRELIST":[{"GENRECODE":"GN0100","GENRENAME":"발라드"},{"GENRECODE":"GN0600","GENRENAME":"록/메탈"},{"GENRECODE":"GN0200","GENRENAME":"댄스"},{"GENRECODE":"GN0400","GENRENAME":"R&B/Soul"}],"ISSUEDATE":"2025.12.01","REPORT":"‘솔로 데뷔 10주년’ 태연, 첫 컴필레이션 앨범 ‘Panorama’ 발매 \n‘I’부터 ‘Letter To Myself’까지, ‘믿듣탱’의 10년 파노라마! \n \n소녀시대 태연이 솔로 데뷔 10주년 기념 첫 컴필레이션 앨범을 발매했다. \n \n‘Panorama : The Best of TAEYEON’은 태연이 ‘믿고 듣는’ 보컬리스트로서 지난 10년간 펼쳐온 음악 여정을 한 폭의 파노라마로 담아낸 앨범으로, 그동안 선보인 수많은 곡 가운데 대표적인 시기와 장르로 선별한 트랙들로 이루어져 있다. \n \n이번 앨범의 신곡이자 타이틀곡 ‘인사 (Panorama)’는 생동감 있는 피아노와 신디사이저, 강렬한 드럼 라인 위에 거칠게 몰아치는 기타 멜로디가 어우러진 Pop Rock 장르의 곡으로, 고조되는 감정선을 따라 섬세함과 파워풀함을 오가며 펼쳐지는 태연의 보컬로 깊은 울림과 카타르시스를 선사하며, 가사에는 지난 시간과 앞으로 다가올 날들에 인사를 전하는 내용을 담았다. \n \n또한 기존 곡을 새롭게 구성한 2025년 믹스 버전, 오직 CD에서만 감상할 수 있는 라이브 버전 등도 추가되어, 단순한 베스트가 아닌 아티스트의 음악 세계를 재정의하는 스페셜 패키지로 완성도를 높였다. \n \n그룹 넬 (NELL)의 보컬 김종완이 태연을 위해 작업한 ‘Time Lapse (2025 Mix)’는 시간이 지나도 계속해서 마음을 아프게 하는 이별의 감정을 담아낸 가사와 태연의 폭발적인 가창력이 잘 어우러져 많은 사랑을 받은 곡으로, 이번 컴필레이션 앨범의 발매를 기념하여 김종완이 새롭게 믹스, 원곡과는 색다른 매력을 느낄 수 있다. \n \n데뷔곡 ‘I (Solo Ver.)’는 일렉트로닉 기타 선율과 강렬한 드럼 리듬이 조화를 이룬 미디움 템포의 팝 곡으로, 첫 컴필레이션 앨범 발매를 기념하여 원곡을 재구성, 태연만의 목소리로 재탄생했다. \n \n더불어 오직 CD로만 감상할 수 있는 ‘인사 (Panorama) (Live Studio Session) (CD Only)’ 라이브 스튜디오 세션 버전은 원곡의 고조되는 감성을 몰아치는 태연의 보컬과 라이브 세션으로 더욱 생생하게 담아내, 리스너들의 몰입도를 높일 것으로 보인다. \n \n이밖에도 모든 감정을 쏟아내는 듯한 태연의 가창이 감성을 자극하는 미니 6집 타이틀곡 ‘Letter To Myself’, 화려한 고음의 멜로디가 드라마틱한 정규 3집 타이틀곡 ‘INVU’, 소울풀한 보컬이 매력적인 정규 1집 디럭스 에디션 타이틀곡 ‘Make Me Love You’, 섬세한 표현력이 돋보이는 정규 3집 수록곡 ‘그런 밤 (Some Nights)’, 시원하고 청량감 있는 보컬이 인상적인 미니 2집 타이틀곡 ‘Why’, 달콤한 보컬과 나긋한 싱잉랩이 곡의 매력을 더한 싱글 ‘Weekend’, 덤덤하고 무심하게 노래하는 보컬이 인상적인 미니 4집 타이틀곡 ‘What Do I Call You’, 재즈의 소울풀한 느낌이 새로웠던 SM STATION의 첫 곡 ‘Rain’, 특유의 맑고 깨끗한 보컬이 돋보이는 미니 1집 더블 타이틀곡 ‘U R’ 등 태연의 폭넓은 보컬 스펙트럼을 경험할 수 있는 대표곡들도 수록되어 있다. \n \n이어 태연의 부드럽고 매력적인 음색과 감정선의 절정을 함께 만끽할 수 있는 정규 1집 타이틀곡 ‘Fine’부터 태연의 아티스트로서 뜨거운 자아와 비전을 담은 정규 2집 타이틀곡 '불티 (Spark)', 애틋한 보컬이 감성을 자극하는 정규 3집 수록곡 'Set Myself On Fire', 시크하고 냉담한 무드를 느낄 수 있는 미니 5집 타이틀곡 ‘To. X’, 감성적인 보컬이 극적인 분위기를 연출하는 싱글 '사계 (Four Seasons)', 태연이 작사에 참여한 가사로 솔직한 감정을 녹인 미니 5집 수록곡 ‘All For Nothing’, 따뜻한 위로와 팬사랑을 담은 겨울 앨범 수록곡 '겨울나무 (I'm all ears)', 태연의 어쿠스틱한 매력을 담은 싱글 '11:11', 호소력 짙은 보이스가 깊은 여운을 선사하는 정규 2집 수록곡 ‘Gravity’, 사랑을 재앙에 빗대어 벅찬 감정을 노래한 미니 6집 수록곡 ‘Disaster’, '아름다운 마무리'에 대한 단상을 노래하는 보컬이 감정을 고조시키는 정규 3집 수록곡 'Ending Credits' 등 태연표 감성을 다채롭게 표현한 곡들까지, 태연이 지금까지 걸어온 음악 여정을 되돌아보고 앞으로 펼쳐질 또 다른 음악 세계를 함께 바라보게 한다. \n \n \n01 인사 (Panorama) \nKorean Lyrics by Mola \nComposed by Mary Josephine Young / Keith Varon / JT Foley / Alida Peck \nArranged by Keith Varon \n타이틀곡 ‘인사 (Panorama)’는 생동감 있는 피아노와 신디사이저, 강렬한 드럼 라인 위에 거칠게 몰아치는 기타 멜로디가 어우러진 Pop Rock 장르의 곡으로, 고조되는 감정선을 따라 섬세함과 파워풀함을 오가며 펼쳐지는 태연의 보컬로 깊은 울림과 카타르시스를 선사하며, 가사에는 지난 시간과 앞으로 다가올 날들에 인사를 전하는 내용을 담았다. \n \n02 Letter To Myself \nKorean Lyrics by 하윤아(153/Joombas) \nComposed by Dino Medanhodzic / Johanna Jansson / Rena Lovelis / Nia Lovelis / Casey Moreta \nArranged by Dino Medanhodzic \n미니 6집 타이틀곡 ‘Letter To Myself’는 선율적인 기타 사운드와 서정적이면서도 폭발적인 멜로디가 어우러진 Pop Rock 장르의 곡으로, 모든 감정을 쏟아내는 듯한 태연의 가창과 광대하게 펼쳐지는 트랙이 극적인 분위기를 연출하여 풍부하고도 섬세한 감성을 느낄 수 있으며, 가사는 스스로를 아프게 했던 과거의 자신에게 지금의 화자가 보내는 진솔한 편지로, 마음속에 묻어둔 서툴지만 단단한 위로의 말을 전한다. \n \n03 Time Lapse (2025 Mix) \nLyrics by 김종완 \nComposed & Arranged by 김종완 / ZOOEY \n‘Time Lapse (2025 Mix)’는 그룹 넬 (NELL)의 보컬 김종완이 태연을 위해 작업한 곡으로, 시간이 지나도 계속해서 마음을 아프게 하는 이별의 감정을 담아낸 가사와 태연의 폭발적인 가창력이 잘 어우러져 많은 사랑을 받았으며, 이번 컴필레이션 앨범의 발매를 기념하여 김종완이 새롭게 믹스하여 원곡과는 색다른 매력을 느낄 수 있다. \n \n04 Fine \nKorean Lyrics by 진리(Full8loom) \nComposed by Michael Woods / Kevin White / Andrew Bazzi / Shaylen Carroll / MZMC \nArranged by Rice n' Peas \n정규 1집 타이틀곡 ‘Fine’은 코러스 파트의 감성적이고 폭발적인 멜로디가 돋보이는 얼터너티브 팝 곡으로, 태연의 부드럽고 매력적인 음색과 감정선의 절정을 함께 만끽할 수 있으며, 가사에는 겉으로 태연한 척 하지만 속마음은 그렇지 못한, 이별 후의 힘든 감정을 솔직하고 담백하게 표현해 공감을 불러 일으킨다. \n \n05 INVU \nKorean Lyrics by 진리(Full8loom) \nComposed by Peter Wallevik / Daniel Davidsen / Rachel Furner / Jess Morgan \nArranged by PhD \n정규 3집 타이틀곡 ‘INVU’는 부드럽고 몽환적인 신스 사운드와 후렴에 등장하는 플룻 멜로디가 인상적인 하우스 기반의 팝 댄스 곡으로, 화려한 고음이 멜로디가 곡의 스토리텔링을 한층 더 드라마틱하게 보여주며, 가사에는 매번 상처받고 지칠 걸 알지만 그럼에도 사랑에 마음을 아끼지 않는 ‘나’와 그런 자신과는 너무 다른 상대방을 보며 느끼는 감정을 담았다. \n \n06 불티 (Spark) \nKorean Lyrics by KENZIE \nComposed & Arranged by KENZIE / Anne Judith Stokke Wik / Ronny Svendsen \n정규 2집 타이틀곡 ‘불티 (Spark)’는 감정을 휩쓰는 강렬한 멜로디와 태연의 압도적인 보컬이 어우러진 얼터너티브 소울 팝 장르의 곡으로, 히트메이커 KENZIE가 작사 및 작곡, 편곡에 참여했으며, 가사에는 태연이 가진 아티스트로서의 자아와 비전을 불티에 빗대어 표현했다. \n \n07 Set Myself On Fire \nKorean Lyrics by KENZIE \nComposed by Alna Hofmeyr / Michael Dunaief / Ryland Holland / Hamid Bashir \nArranged by Stryv \n정규 3집 수록곡 ‘Set Myself On Fire’는 빈티지한 기타 연주가 감성을 자극하는 팝 곡으로, 이별을 말하는 연인 앞에서 현실을 부정하지만 결국 이별을 예감하게 되는 가사와 태연의 애틋한 보컬이 잘 어우러진다. \n \n08 그런 밤 (Some Nights) \nKorean Lyrics by 김이나 \nComposed by Edvard Grieg / Simon Petrén / Andreas Oberg \nArranged by Simon Petrén \n정규 3집 수록곡 ‘그런 밤 (Some Nights)’은 노르웨이 작곡가 에드바르드 그리그(Edvard Grieg)의 ‘솔베이의 노래’를 샘플링한 R&B 발라드 곡으로, 하염없이 가라앉는 밤에 떠오르는 이름을 마음껏 그리워하면 한동안 버틸 수 있는 행복한 기억이 남는다는 내용을 태연의 섬세한 표현력으로 들려준다. \n \n09 Make Me Love You \nKorean Lyrics by 조윤경 \nComposed & Arranged by Aaron Benward / Matthew Tishler / Felicia Barton \n정규 1집 디럭스 에디션 타이틀곡 ‘Make Me Love You’는 가볍고 잔잔한 사운드와 태연의 소울풀한 보컬이 조화를 이룬 팝 R&B 곡으로, 마치 마법 같은 신비스러운 분위기가 봄과 잘 어울려 곡의 매력을 한층 배가시킨다. \n \n10 I (Solo Ver.) \nKorean Lyrics by 태연 / Mafly / 버벌진트 \nComposed & Arranged by Myah Marie Langston / Bennett Armstrong / Justin T. Armstrong / Cosmopolitan Douglas / David Quiñones / Jon Asher / RYAN JHUN \n태연의 솔로 데뷔곡 'I (Feat. 버벌진트)'를 태연의 첫 컴필레이션 앨범의 발매를 기념하여 새롭게 구성, 태연만의 목소리로 탄생시킨 ‘I (Solo Ver.)'은 일렉트로닉 기타 선율과 강렬한 드럼 리듬이 조화를 이룬 미디움 템포의 팝 곡으로 화려한 스포트라이트 속에 감춰진 진솔한 감정과 앞으로의 다짐 등 자전적인 이야기를 가사에 담았다. \n \n11 Why \nKorean Lyrics by 조윤경 \nComposed & Arranged by LDN Noise / Lauren Dyson / Rodnae “Chikk” Bell \n프로듀싱 팀 런던노이즈(LDN Noise)가 작곡에 참여한 태연 미니 2집 타이틀곡 ‘Why’는 트로피컬 하우스 풍의 트렌디한 팝 곡으로, 갑갑한 일상으로부터 탈출을 꿈꾸면서도 망설이는 이들에게 ‘왜’라는 반문을 던지며 가볍게 떠나 몸과 마음을 재충전 할 수 있기를 바라는 마음을 담은 가사와 태연만의 시원하고 청량감 있는 보컬이 인상적이다. \n \n12 Weekend \nKorean Lyrics by 황유빈 (XYXX) \nComposed by Rose In Peace / Saimon / Willemijn van der Neut / Marcia “MISHA” Sondeijker \nArranged by Saimon / Rose In Peace \n2021년 7월 발매된 싱글 ‘Weekend’는 경쾌한 기타와 레트로한 신스 사운드가 어우러진 디스코 팝 장르 곡으로, 가사에는 반복되는 일상에서 잠시 벗어나 주말만은 하고 싶은 대로 자유롭게 보내고, 이끌리는 대로 떠나고 싶은 마음을 표현했으며, 태연의 달콤한 보컬과 나긋한 싱잉랩이 곡의 설레는 분위기를 배가시킨다. \n \n13 To. X \nKorean Lyrics by KENZIE \nComposed by Stephen Puth / dazy / Kristin Carpenter \nArranged by Stephen Puth / dazy \n미니 5집 타이틀곡 ‘To. X’는 감각적인 기타 리프와 리드미컬한 멜로디가 조화를 이룬 R&B 곡으로, 덤덤하고 냉담한 분위기를 자아내는 태연의 섬세한 보컬이 더해져 시크한 무드를 느낄 수 있으며, 가사에는 상대방이 자신을 통제하고 있음을 깨닫고 관계의 끝을 알리는 내용이 담겨 있다. \n \n14 What Do I Call You \nKorean Lyrics by KENZIE \nComposed by Linnea Södahl / Caroline Pennell / David Pramik \nArranged by David Pramik \n미니 4집 타이틀곡 ‘What Do I Call You’는 개성 있는 악기들이 만들어내는 미니멀하고 리드미컬한 선율이 특징인 R&B 팝곡으로, 이별 후에도 여전히 주변을 맴도는 그에게 느끼는 감정을 덤덤하고 무심하게 노래하는 태연의 보컬이 돋보인다. \n \n15 사계 (Four Seasons) \nKorean Lyrics by KENZIE \nComposed by Josh Cumbee / Afshin Salmani / Andrew Allen / KENZIE \nArranged by NONFICTION (AFSHeeN & Josh Cumbee) / KENZIE \n2019년 3월 발매된 싱글 ‘사계 (Four Seasons)’는 어쿠스틱 기타 중심의 악기 구성이 인상적인 얼터너티브 팝 곡으로, 후렴구의 풍성한 스트링 선율과 태연의 감성적인 보컬이 어우러져 극적인 분위기를 연출하며, 가사에는 사계절 속에서 온전히 사랑했지만 서로에게 점점 무뎌져 가는 모습을 보며 현재 사랑하고 있는지 고민한 후, 먼저 이별을 이야기하는 내용을 담아 독특한 이별 감성을 느낄 수 있다. \n \n16 All For Nothing \nKorean Lyrics by 황유빈 (XYXX) / 태연 \nComposed by Mike Robinson / Sarah Troy / Thomas Daniel \nArranged by Mike Robinson \n미니 5집 수록곡 ‘All For Nothing’은 여린 듯 강한 피아노 연주와 몽환적인 사운드, 애절한 보이스가 만난 팝 발라드 곡으로, 태연이 작사에 참여한 가사는 모든 것을 내준 상대방에게 상처를 받은 마음을 솔직하게 표현했다. \n \n17 겨울나무 (I'm all ears) \nKorean Lyrics by Joohyoung (MonoTree) \nComposed by Joohyoung (MonoTree) / Astrid Holiday \nArranged by Joohyoung (MonoTree) \n겨울 앨범 수록곡 ’겨울나무 (I’m all ears)’는 현대인들을 거친 추위 속에 버티고 있는 한 그루의 나무에 빗대어, 말하지 못한 이야기들을 밤새 들어주겠다는 내용을 담은 위로송이자, 언제나 묵묵히 곁을 지켜주고 있는 팬들을 위한 팬송으로, 겨울철 모두의 마음을 따뜻하게 어루만져준다. \n \n18 11:11 \nKorean Lyrics by 김이나 \nComposed & Arranged by Christian Vinten / Chelcee Grimes \n2016년 11월 공개된 싱글 ‘11:11’은 어쿠스틱 기타의 잔잔한 선율과 태연의 부드러운 목소리가 잘 어우러진 팝 발라드 장르로, 고즈넉한 늦가을 밤의 운치 있는 분위기와 잘 어울리는 감성적인 곡이다. 가사는 유명 작사가 김이나가 작업, ‘하루가 끝나기 직전의 시간’을 ‘연인 관계가 완전히 끝나기 직전의 시간’에 비유한 내용과 시침과 분침이 11시 11분을 가리킬 때 연인과 함께 소원을 빌던 추억을 떠올리는 아련한 느낌이 인상적이다. \n \n19 Rain \nKorean Lyrics by 봉은영 / Mafly / 이유진 \nComposed by Matthew Tishler / Aaron Benward / Felicia Barton / Olivia Holt \nArranged by Matthew Tishler \nSM 디지털 음원 공개 채널 'SM STATION'의 포문을 연 ‘Rain’은 재즈의 소울풀한 느낌을 살린 미디움 템포 곡으로, 독특한 멜로디와 코드 진행이 인상적이며, 헤어진 연인에 대한 추억을 ‘비’에 빗대어 아름다웠던 사랑을 회상하는 스토리가 담긴 가사가 감성을 자극한다. \n \n20 Gravity \nKorean Lyrics by JQ (makeumine works) / 문예린 \nComposed by Lance Shipp / Rachael Kennedy / Nathalia Marshall / Angel Lopez / Gilde Flores \nArranged by LIONCHLD / Angel Lopez / Gilde Flores \n정규 2집 수록곡 ‘Gravity’는 소울풀한 멜로디와 감정을 극대화하는 코러스가 인상적인 팝 발라드 곡으로, 한결같은 사랑을 중력에 비유, 변함없는 마음에 감사하는 진심 어린 가사와 태연의 호소력 짙은 보이스가 깊은 여운을 선사한다. \n \n21 Disaster \nKorean Lyrics by bay(153/Joombas) / Ephy(153/Joombas) \nComposed & Arranged by Rob Resnick / Sarah de Warren / GiGi Grombacher \n미니 6집 수록곡 ‘Disaster’는 거칠고 역동적인 드럼 비트와 벅차오르는 신스 라인이 태연의 호소력 짙은 보컬과 만나 감수성을 극대화하는 Pop Rock 장르의 곡으로, 가사에는 끝이 절망임을 알면서도 기꺼이 뛰어드는 사랑의 감정을 ‘완벽한 재앙’이라는 모순적 표현으로 그려냈다. \n \n22 U R \nKorean Lyrics by 조윤경 \nComposed by Matthew Tishler / Robyn Newman / Ben Charles \nArranged by Matthew Tishler \n미니 1집 더블 타이틀곡 'U R'은 잔잔한 어쿠스틱 피아노 멜로디와 화려한 현악기 연주가 잘 어우러지는 트랙과 태연의 맑고 깨끗한 보컬이 돋보이는 발라드 곡이다. 'U R'은 'You are'(그대는)와 'Under the rainbow'(무지개 아래에서)라는 두 가지 의미를 담고 있으며, 비 내리는 풍경 속에서 빛이자 꿈과 같은 상대방을 기다리는 사랑스러운 소녀의 마음을 풀어낸 가사가 인상적이다. \n \n23 Ending Credits \nKorean Lyrics by 지예원(153/Joombas) \nComposed by Mich Hansen / Jeppe London Bilsby / Celine Svanbäck / Sam Merrifield \nArranged by Cutfather / Jeppe London Bilsby \n정규 3집 수록곡 ‘Ending Credits’은 그윽하게 깔리는 여러 겹의 신디사이저와 강한 타격감으로 힘있는 드럼 사운드가 감정을 고조시키는 미디엄템포 팝 곡으로, '인생은 마치 영화와 같다'라는 문구에서 힌트를 얻어 ‘아름다운 마무리’에 대한 단상을 영화와 연극에 빗대어 표현한 가사가 태연의 감성적인 보컬과 잘 어우러져 있다. \n \n24 인사 (Panorama) (Live Studio Session) (CD Only) \nKorean Lyrics by Mola \nComposed by Mary Josephine Young / Keith Varon / JT Foley / Alida Peck \nArranged by Keith Varon \n오직 CD로만 감상할 수 있는 ‘인사 (Panorama)’ 라이브 스튜디오 세션 버전은 원곡의 고조되는 감성을 몰아치는 태연의 보컬과 라이브 세션으로 더욱 생생하게 담아냈다.","ALBUMTYPE":"베스트","SELLCNPY":"카카오엔터테인먼트","PLANCNPY":"SM ENTERTAINMENT","CREDITLIST":null,"REPORTPREVIEW":"‘솔로 데뷔 10주년’ 태연, 첫 컴필레이션 앨범 ‘Panorama’ 발매 ‘I’부터 ‘Letter To Myself’까지, ‘믿듣탱’의 10년 파노라마! 소녀시대 태연이 솔로 데뷔 10주년 기념 첫 컴필레이션 앨범을 발매했다. ‘Panorama : The Best of TAEYEON’은 태연이 ‘믿고 듣는’ 보컬리스트로서 지난 10년간 펼쳐온 음악 여정을 한 폭의 파노라마로 담아낸 앨범으로, 그동안 선보인 수많은 곡 가운데 대표적인 시기와 장르로 선별한 트랙들로 이루어져 있다. 이번 앨범의 신곡이자 타이틀곡 ‘인사 (Panorama)’는 생동감 있는 피아노와 신디사이저, 강렬한 드럼 라인 위에 거칠게 몰아치는 기타 멜로디가 어우러진 Pop Rock 장르의 곡으로, 고조되는 감정선을 따라 섬세함과 파워풀함을 오가며 펼쳐지는 태연의 보컬로 깊은 울림과 카타르시스를 선사하며, 가사에는 지난 시간과 앞으로 다가올 날들에 인사를 전하는 내용을 담았다. 또한 기존 곡을 새롭게 구성한 2025년 믹스 버전, 오직 CD에서만 감상할 수 있는 라이브 버전 등도 추가되어, 단순한 베스트가 아닌 아티스트의 음악 세계를 재정의하는 스페셜 패키지로 완성도를 높였다. 그룹 넬 (NELL)의 보컬 김종완이 태연을 위해 작업한 ‘Time Lapse (2025 Mix)’는 시간이 지나도 계속해서 마음을 아프게 하는 이별의 감정을 담아낸 가사와 태연의 폭발적인 가창력이 잘 어우러져 많은 사랑을 받은 곡으로, 이번 컴필레이션 앨범의 발매를 기념하여 김종완이 새롭게 믹스, 원곡과는 색다른 매력을 느낄 수 있다. 데뷔곡 ‘I (Solo Ver.)’는 일렉트로닉 기타 선율과 강렬한 드럼 리듬이 조화를 이룬 미디움 템포의 팝 곡으로, 첫 컴필레이션 앨범 발매를 기념하여 원곡을 재구성, 태연만의 목소리로 재탄생했다. 더불어 오직 CD로만 감상할 수 있는 ‘인사 (Panorama) (Live Studio Session) (CD Only)’ 라이브 스튜디오 세션 버전은 원곡의 고조되는 감성을 몰아치는 태연의 보컬과 라이브 세션으로 더욱 생생하게 담아내, 리스너들의 몰입도를 높일 것으로 보인다. 이밖에도 모든 감정을 쏟아내는 듯한 태연의 가창이 감성을 자극하는 미니 6집 타이틀곡 ‘Letter To Myself’, 화려한 고음의 멜로디가 드라마틱한 정규 3집 타이틀곡 ‘INVU’, 소울풀한 보컬이 매력적인 정규 1집 디럭스 에디션 타이틀곡 ‘Make Me Love You’, 섬세한 표현력이 돋보이는 정규 3집 수록곡 ‘그런 밤 (Some Nights)’, 시원하고 청량감 있는 보컬이 인상적인 미니 2집 타이틀곡 ‘Why’, 달콤한 보컬과 나긋한 싱잉랩이 곡의 매력을 더한 싱글 ‘Weekend’, 덤덤하고 무심하게 노래하는 보컬이 인상적인 미니 4집 타이틀곡 ‘What Do I Call You’, 재즈의 소울풀한 느낌이 새로웠던 SM STATION의 첫 곡 ‘Rain’, 특유의 맑고 깨끗한 보컬이 돋보이는 미니 1집 더블 타이틀곡 ‘U R’ 등 태연의 폭넓은 보컬 스펙트럼을 경험할 수 있는 대표곡들도 수록되어 있다. 이어 태연의 부드럽고 매력적인 음색과 감정선의 절정을 함께 만끽할 수 있는 정규 1집 타이틀곡 ‘Fine’부터 태연의 아티스트로서 뜨거운 자아와 비전을 담은 정규 2집 타이틀곡 '불티 (Spark)', 애틋한 보컬이 감성을 자극하는 정규 3집 수록곡 'Set Myself On Fire', 시크하고 냉담한 무드를 느낄 수 있는 미니 5집 타이틀곡 ‘To. X’, 감성적인 보컬이 극적인 분위기를 연출하는 싱글 '사계 (Four Seasons)', 태연이 작사에 참여한 가사로 솔직한 감정을 녹인 미니 5집 수록곡 ‘All For Nothing’, 따뜻한 위로와 팬사랑을 담은 겨울 앨범 수록곡 '겨울나무 (I'm all ears)', 태연의 어쿠스틱한 매력을 담은 싱글 '11:11', 호소력 짙은 보이스가 깊은 여운을 선사하는 정규 2집 수록곡 ‘Gravity’, 사랑을 재앙에 빗대어 벅찬 감정을 노래한 미니 6집 수록곡 ‘Disaster’, '아름다운 마무리'에 대한 단상을 노래하는 보컬이 감정을 고조시키는 정규 3집 수록곡 'Ending Credits' 등 태연표 감성을 다채롭게 표현한 곡들까지, 태연이 지금까지 걸어온 음악 여정을 되돌아보고 앞으로 펼쳐질 또 다른 음악 세계를 함께 바라보게 한다. 01 인사 (Panorama) Korean Lyrics by Mola Composed by Mary Josephine Young / Keith Varon / JT Foley / Alida Peck Arranged by Keith Varon 타이틀곡 ‘인사 (Panorama)’는 생동감 있는 피아노와 신디사이저, 강렬한 드럼 라인 위에 거칠게 몰아치는 기타 멜로디가 어우러진 Pop Rock 장르의 곡으로, 고조되는 감정선을 따라 섬세함과 파워풀함을 오가며 펼쳐지는 태연의 보컬로 깊은 울림과 카타르시스를 선사하며, 가사에는 지난 시간과 앞으로 다가올 날들에 인사를 전하는 내용을 담았다. 02 Letter To Myself Korean Lyrics by 하윤아(153/Joombas) Composed by Dino Medanhodzic / Johanna Jansson / Rena Lovelis / Nia Lovelis / Casey Moreta Arranged by Dino Medanhodzic 미니 6집 타이틀곡 ‘Letter To Myself’는 선율적인 기타 사운드와 서정적이면서도 폭발적인 멜로디가 어우러진 Pop Rock 장르의 곡으로, 모든 감정을 쏟아내는 듯한 태연의 가창과 광대하게 펼쳐지는 트랙이 극적인 분위기를 연출하여 풍부하고도 섬세한 감성을 느낄 수 있으며, 가사는 스스로를 아프게 했던 과거의 자신에게 지금의 화자가 보내는 진솔한 편지로, 마음속에 묻어둔 서툴지만 단단한 위로의 말을 전한다. 03 Time Lapse (2025 Mix) Lyrics by 김종완 Composed & Arranged by 김종완 / ZOOEY ‘Time Lapse (2025 Mix)’는 그룹 넬 (NELL)의 보컬 김종완이 태연을 위해 작업한 곡으로, 시간이 지나도 계속해서 마음을 아프게 하는 이별의 감정을 담아낸 가사와 태연의 폭발적인 가창력이 잘 어우러져 많은 사랑을 받았으며, 이번 컴필레이션 앨범의 발매를 기념하여 김종완이 새롭게 믹스하여 원곡과는 색다른 매력을 느낄 수 있다. 04 Fine Korean Lyrics by 진리(Full8loom) Composed by Michael Woods / Kevin White / Andrew Bazzi / Shaylen Carroll / MZMC Arranged by Rice n' Peas 정규 1집 타이틀곡 ‘Fine’은 코러스 파트의 감성적이고 폭발적인 멜로디가 돋보이는 얼터너티브 팝 곡으로, 태연의 부드럽고 매력적인 음색과 감정선의 절정을 함께 만끽할 수 있으며, 가사에는 겉으로 태연한 척 하지만 속마음은 그렇지 못한, 이별 후의 힘든 감정을 솔직하고 담백하게 표현해 공감을 불러 일으킨다. 05 INVU Korean Lyrics by 진리(Full8loom) Composed by Peter Wallevik / Daniel Davidsen / Rachel Furner / Jess Morgan Arranged by PhD 정규 3집 타이틀곡 ‘INVU’는 부드럽고 몽환적인 신스 사운드와 후렴에 등장하는 플룻 멜로디가 인상적인 하우스 기반의 팝 댄스 곡으로, 화려한 고음이 멜로디가 곡의 스토리텔링을 한층 더 드라마틱하게 보여주며, 가사에는 매번 상처받고 지칠 걸 알지만 그럼에도 사랑에 마음을 아끼지 않는 ‘나’와 그런 자신과는 너무 다른 상대방을 보며 느끼는 감정을 담았다. 06 불티 (Spark) Korean Lyrics by KENZIE Composed & Arranged by KENZIE / Anne Judith Stokke Wik / Ronny Svendsen 정규 2집 타이틀곡 ‘불티 (Spark)’는 감정을 휩쓰는 강렬한 멜로디와 태연의 압도적인 보컬이 어우러진 얼터너티브 소울 팝 장르의 곡으로, 히트메이커 KENZIE가 작사 및 작곡, 편곡에 참여했으며, 가사에는 태연이 가진 아티스트로서의 자아와 비전을 불티에 빗대어 표현했다. 07 Set Myself On Fire Korean Lyrics by KENZIE Composed by Alna Hofmeyr / Michael Dunaief / Ryland Holland / Hamid Bashir Arranged by Stryv 정규 3집 수록곡 ‘Set Myself On Fire’는 빈티지한 기타 연주가 감성을 자극하는 팝 곡으로, 이별을 말하는 연인 앞에서 현실을 부정하지만 결국 이별을 예감하게 되는 가사와 태연의 애틋한 보컬이 잘 어우러진다. 08 그런 밤 (Some Nights) Korean Lyrics by 김이나 Composed by Edvard Grieg / Simon Petrén / Andreas Oberg Arranged by Simon Petrén 정규 3집 수록곡 ‘그런 밤 (Some Nights)’은 노르웨이 작곡가 에드바르드 그리그(Edvard Grieg)의 ‘솔베이의 노래’를 샘플링한 R&B 발라드 곡으로, 하염없이 가라앉는 밤에 떠오르는 이름을 마음껏 그리워하면 한동안 버틸 수 있는 행복한 기억이 남는다는 내용을 태연의 섬세한 표현력으로 들려준다. 09 Make Me Love You Korean Lyrics by 조윤경 Composed & Arranged by Aaron Benward / Matthew Tishler / Felicia Barton 정규 1집 디럭스 에디션 타이틀곡 ‘Make Me Love You’는 가볍고 잔잔한 사운드와 태연의 소울풀한 보컬이 조화를 이룬 팝 R&B 곡으로, 마치 마법 같은 신비스러운 분위기가 봄과 잘 어울려 곡의 매력을 한층 배가시킨다. 10 I (Solo Ver.) Korean Lyrics by 태연 / Mafly / 버벌진트 Composed & Arranged by Myah Marie Langston / Bennett Armstrong / Justin T. Armstrong / Cosmopolitan Douglas / David Quiñones / Jon Asher / RYAN JHUN 태연의 솔로 데뷔곡 'I (Feat. 버벌진트)'를 태연의 첫 컴필레이션 앨범의 발매를 기념하여 새롭게 구성, 태연만의 목소리로 탄생시킨 ‘I (Solo Ver.)'은 일렉트로닉 기타 선율과 강렬한 드럼 리듬이 조화를 이룬 미디움 템포의 팝 곡으로 화려한 스포트라이트 속에 감춰진 진솔한 감정과 앞으로의 다짐 등 자전적인 이야기를 가사에 담았다. 11 Why Korean Lyrics by 조윤경 Composed & Arranged by LDN Noise / Lauren Dyson / Rodnae “Chikk” Bell 프로듀싱 팀 런던노이즈(LDN Noise)가 작곡에 참여한 태연 미니 2집 타이틀곡 ‘Why’는 트로피컬 하우스 풍의 트렌디한 팝 곡으로, 갑갑한 일상으로부터 탈출을 꿈꾸면서도 망설이는 이들에게 ‘왜’라는 반문을 던지며 가볍게 떠나 몸과 마음을 재충전 할 수 있기를 바라는 마음을 담은 가사와 태연만의 시원하고 청량감 있는 보컬이 인상적이다. 12 Weekend Korean Lyrics by 황유빈 (XYXX) Composed by Rose In Peace / Saimon / Willemijn van der Neut / Marcia “MISHA” Sondeijker Arranged by Saimon / Rose In Peace 2021년 7월 발매된 싱글 ‘Weekend’는 경쾌한 기타와 레트로한 신스 사운드가 어우러진 디스코 팝 장르 곡으로, 가사에는 반복되는 일상에서 잠시 벗어나 주말만은 하고 싶은 대로 자유롭게 보내고, 이끌리는 대로 떠나고 싶은 마음을 표현했으며, 태연의 달콤한 보컬과 나긋한 싱잉랩이 곡의 설레는 분위기를 배가시킨다. 13 To. X Korean Lyrics by KENZIE Composed by Stephen Puth / dazy / Kristin Carpenter Arranged by Stephen Puth / dazy 미니 5집 타이틀곡 ‘To. X’는 감각적인 기타 리프와 리드미컬한 멜로디가 조화를 이룬 R&B 곡으로, 덤덤하고 냉담한 분위기를 자아내는 태연의 섬세한 보컬이 더해져 시크한 무드를 느낄 수 있으며, 가사에는 상대방이 자신을 통제하고 있음을 깨닫고 관계의 끝을 알리는 내용이 담겨 있다. 14 What Do I Call You Korean Lyrics by KENZIE Composed by Linnea Södahl / Caroline Pennell / David Pramik Arranged by David Pramik 미니 4집 타이틀곡 ‘What Do I Call You’는 개성 있는 악기들이 만들어내는 미니멀하고 리드미컬한 선율이 특징인 R&B 팝곡으로, 이별 후에도 여전히 주변을 맴도는 그에게 느끼는 감정을 덤덤하고 무심하게 노래하는 태연의 보컬이 돋보인다. 15 사계 (Four Seasons) Korean Lyrics by KENZIE Composed by Josh Cumbee / Afshin Salmani / Andrew Allen / KENZIE Arranged by NONFICTION (AFSHeeN & Josh Cumbee) / KENZIE 2019년 3월 발매된 싱글 ‘사계 (Four Seasons)’는 어쿠스틱 기타 중심의 악기 구성이 인상적인 얼터너티브 팝 곡으로, 후렴구의 풍성한 스트링 선율과 태연의 감성적인 보컬이 어우러져 극적인 분위기를 연출하며, 가사에는 사계절 속에서 온전히 사랑했지만 서로에게 점점 무뎌져 가는 모습을 보며 현재 사랑하고 있는지 고민한 후, 먼저 이별을 이야기하는 내용을 담아 독특한 이별 감성을 느낄 수 있다. 16 All For Nothing Korean Lyrics by 황유빈 (XYXX) / 태연 Composed by Mike Robinson / Sarah Troy / Thomas Daniel Arranged by Mike Robinson 미니 5집 수록곡 ‘All For Nothing’은 여린 듯 강한 피아노 연주와 몽환적인 사운드, 애절한 보이스가 만난 팝 발라드 곡으로, 태연이 작사에 참여한 가사는 모든 것을 내준 상대방에게 상처를 받은 마음을 솔직하게 표현했다. 17 겨울나무 (I'm all ears) Korean Lyrics by Joohyoung (MonoTree) Composed by Joohyoung (MonoTree) / Astrid Holiday Arranged by Joohyoung (MonoTree) 겨울 앨범 수록곡 ’겨울나무 (I’m all ears)’는 현대인들을 거친 추위 속에 버티고 있는 한 그루의 나무에 빗대어, 말하지 못한 이야기들을 밤새 들어주겠다는 내용을 담은 위로송이자, 언제나 묵묵히 곁을 지켜주고 있는 팬들을 위한 팬송으로, 겨울철 모두의 마음을 따뜻하게 어루만져준다. 18 11:11 Korean Lyrics by 김이나 Composed & Arranged by Christian Vinten / Chelcee Grimes 2016년 11월 공개된 싱글 ‘11:11’은 어쿠스틱 기타의 잔잔한 선율과 태연의 부드러운 목소리가 잘 어우러진 팝 발라드 장르로, 고즈넉한 늦가을 밤의 운치 있는 분위기와 잘 어울리는 감성적인 곡이다. 가사는 유명 작사가 김이나가 작업, ‘하루가 끝나기 직전의 시간’을 ‘연인 관계가 완전히 끝나기 직전의 시간’에 비유한 내용과 시침과 분침이 11시 11분을 가리킬 때 연인과 함께 소원을 빌던 추억을 떠올리는 아련한 느낌이 인상적이다. 19 Rain Korean Lyrics by 봉은영 / Mafly / 이유진 Composed by Matthew Tishler / Aaron Benward / Felicia Barton / Olivia Holt Arranged by Matthew Tishler SM 디지털 음원 공개 채널 'SM STATION'의 포문을 연 ‘Rain’은 재즈의 소울풀한 느낌을 살린 미디움 템포 곡으로, 독특한 멜로디와 코드 진행이 인상적이며, 헤어진 연인에 대한 추억을 ‘비’에 빗대어 아름다웠던 사랑을 회상하는 스토리가 담긴 가사가 감성을 자극한다. 20 Gravity Korean Lyrics by JQ (makeumine works) / 문예린 Composed by Lance Shipp / Rachael Kennedy / Nathalia Marshall / Angel Lopez / Gilde Flores Arranged by LIONCHLD / Angel Lopez / Gilde Flores 정규 2집 수록곡 ‘Gravity’는 소울풀한 멜로디와 감정을 극대화하는 코러스가 인상적인 팝 발라드 곡으로, 한결같은 사랑을 중력에 비유, 변함없는 마음에 감사하는 진심 어린 가사와 태연의 호소력 짙은 보이스가 깊은 여운을 선사한다. 21 Disaster Korean Lyrics by bay(153/Joombas) / Ephy(153/Joombas) Composed & Arranged by Rob Resnick / Sarah de Warren / GiGi Grombacher 미니 6집 수록곡 ‘Disaster’는 거칠고 역동적인 드럼 비트와 벅차오르는 신스 라인이 태연의 호소력 짙은 보컬과 만나 감수성을 극대화하는 Pop Rock 장르의 곡으로, 가사에는 끝이 절망임을 알면서도 기꺼이 뛰어드는 사랑의 감정을 ‘완벽한 재앙’이라는 모순적 표현으로 그려냈다. 22 U R Korean Lyrics by 조윤경 Composed by Matthew Tishler / Robyn Newman / Ben Charles Arranged by Matthew Tishler 미니 1집 더블 타이틀곡 'U R'은 잔잔한 어쿠스틱 피아노 멜로디와 화려한 현악기 연주가 잘 어우러지는 트랙과 태연의 맑고 깨끗한 보컬이 돋보이는 발라드 곡이다. 'U R'은 'You are'(그대는)와 'Under the rainbow'(무지개 아래에서)라는 두 가지 의미를 담고 있으며, 비 내리는 풍경 속에서 빛이자 꿈과 같은 상대방을 기다리는 사랑스러운 소녀의 마음을 풀어낸 가사가 인상적이다. 23 Ending Credits Korean Lyrics by 지예원(153/Joombas) Composed by Mich Hansen / Jeppe London Bilsby / Celine Svanbäck / Sam Merrifield Arranged by Cutfather / Jeppe London Bilsby 정규 3집 수록곡 ‘Ending Credits’은 그윽하게 깔리는 여러 겹의 신디사이저와 강한 타격감으로 힘있는 드럼 사운드가 감정을 고조시키는 미디엄템포 팝 곡으로, '인생은 마치 영화와 같다'라는 문구에서 힌트를 얻어 ‘아름다운 마무리’에 대한 단상을 영화와 연극에 빗대어 표현한 가사가 태연의 감성적인 보컬과 잘 어우러져 있다. 24 인사 (Panorama) (Live Studio Session) (CD Only) Korean Lyrics by Mola Composed by Mary Josephine Young / Keith Varon / JT Foley / Alida Peck Arranged by Keith Varon 오직 CD로만 감상할 수 있는 ‘인사 (Panorama)’ 라이브 스튜디오 세션 버전은 원곡의 고조되는 감성을 몰아치는 태연의 보컬과 라이브 세션으로 더욱 생생하게 담아냈다.","SPOTLIGHTBUTTONFLAG":"N","HIRISINGBUTTONFLAG":"N","PREVSPOTLIGHTINFOLIST":[{"SPOTLIGHTSEQ":"182","TITLE":"[Melon Spotlight] 태연 (TAEYEON) - Panorama : The Best of TAEYEON","IMAGEURL":"https://cdnimg.melon.co.kr/svc/images/spotlight/2025/11/56/182/20251128142908701.png/melon/optimize/90","LOGOIMAGEURL":"https://cdnimg.melon.co.kr/svc/images/spotlight/2025/11/83/e3d/20251128142913929.png/melon/optimize/90","IMAGEBGCOLOR":"#fff8f5","REGDATE":"2025.12.01","LINK":{"LINKTYPE":"ZA","LINKURL":"https://m2.melon.com/musicstory/detail.htm?mstorySeq=16607"}}],"DUMMYTEXT":"9#_Xd4We5Vf6Ug7Th8Si9Rj0Qk!Pl@_Th8Si9Rj0Qk!Pl@OmN#nM$oL%pK^qJ&r*IsH(tG)uF-v:Ew;","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","TLOG":{"MENUID":"1000000461","SECTION":"앨범상세","PAGE":"앨범상세_앨범홈","CONTSTYPECODE":"N10002","CONTSTYPENAME":"앨범","CONTSID":"12416346","CONTSNAME":"Panorama : The Best of TAEYEON"}},"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 diff --git a/utils/label.test.ts b/utils/label.test.ts index 0b14ead..6f0008e 100644 --- a/utils/label.test.ts +++ b/utils/label.test.ts @@ -17,6 +17,11 @@ describe('split labels', () => { name: 'IDJ', }]], ['preserves label whose suffix contains a slash', 'EMI Belgium SA/NV', [{ name: 'EMI Belgium SA/NV' }]], + [ + 'splits multiple comma-separated labels', + 'WAKEONE, 스윙엔터테인먼트', + [{ name: 'WAKEONE' }, { name: '스윙엔터테인먼트' }], + ], ]; passingCases.forEach(([description, input, expected]) => { diff --git a/utils/label.ts b/utils/label.ts index 5753899..c2abdc8 100644 --- a/utils/label.ts +++ b/utils/label.ts @@ -7,7 +7,7 @@ import { Label } from '@/harmonizer/types.ts'; * @returns List of `Label` entries */ export function splitLabels(labels: string): Label[] { - return labels?.split(/(?<=[^/]{3,})\/(?=[^/]{3,})/).map((label) => ({ + return labels?.split(/(?<=[^/]{3,})[/,](?=[^/]{3,})/).map((label) => ({ name: label.trim(), })); }