From e8f09b159da95ef2bfe0c00c09b9bd5eea1c2313 Mon Sep 17 00:00:00 2001 From: Eclypsed Date: Wed, 6 Mar 2024 21:13:12 -0500 Subject: [PATCH] Changing up YTmusic implementation --- src/app.d.ts | 4 +- src/lib/server/users.db | Bin 32768 -> 32768 bytes src/lib/service-managers/youtube-music.ts | 94 +++++++++++----------- 3 files changed, 47 insertions(+), 51 deletions(-) diff --git a/src/app.d.ts b/src/app.d.ts index 5a3df86..f3f86f6 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -42,7 +42,7 @@ declare global { connectionId: string serviceType: serviceType type: 'song' - duration: number + duration?: number artists?: { id: string name: string @@ -60,7 +60,7 @@ declare global { connectionId: string serviceType: serviceType type: 'album' - duration: number + duration?: number albumArtists?: { id: string name: string diff --git a/src/lib/server/users.db b/src/lib/server/users.db index 579510927c9813867fa681eea6d0cb54cb676dc7..ca82eb889358098981f8cf316e5ea9cc5eba9590 100644 GIT binary patch delta 635 zcma)(%Zi&&0EQ<+Ll>pfDHOWsK!*_MriW3_F&?{fk}**ejhds06lT0eV>B0YaSB5N zg|4UM4f+P1zE0nx+lD?tw*TV)KKORK)7|d$@m;0*?kOeo34C~@bHg!7`I`}6*3tP^hvH8t+lCodX{Y|nxpr*_Vz^_8tvR}TR}tIKWcA2 zBLicz9A>6e4mFjqT_qCBLhZFBS{4rcRE?)?r%;OKb|hU(sg{nEmf&vlmC&aJ7C8Xb fKGwo=o-FTcpJqKc|ulAmNX$~-VmkI3MCz3OU8kuisNaZ(7;~=a7l?SB=04H zQgbyNWW89+NlCuA)&0evXU$`39&wd zAP^WHNj@X-qR0?Tp~wnU0s=WkIGDP6>&tVeYJp{OwOC(;{Y$A|qIIALLzQ7lOXy7I zuI#2s2(gJx8E^bTsN_}5xB1y-qv;AAOd=ev*0@Saxr%N`Ks)(hZ4Ik(Qfys=I>Jn} zxE-=RKdE|iao3(IU0IDoHHIv<({RyZmZi=@Hcli>2?~$3qJU(eZ>|$)Cq@=ygS3O0 z*793c%j{d9jBaPj_9H9i;*!s*IdWt*=cYS@l1l?X%pJ19%co-5k3J?dJIXhQyTOak zo(Xv5;F0E(o6)4mQ{X##)-lIszUXvI8e@B)1{Cv|vq;i#xEp)ou0UJWP8BE5yam&1 fylc?yGAgRZ2Z(_LkR] } + } + }[] + menu: unknown + playlistItemData: { + videoId: string + } + } + type musicThumbnailRenderer = { thumbnail: { thumbnails: { @@ -129,19 +146,18 @@ declare namespace InnerTube { : { text: string } type endpointType = 'browse' | 'watch' | 'watchPlaylist' - type navigationEndpoint = T extends 'browse' + type navigationEndpoint = { + clickTrackingParams: string + } & T extends 'browse' ? { - clickTrackingParams: string browseEndpoint: browseEndpoint } : T extends 'watch' ? { - clickTrackingParams: string watchEndpoint: watchEndpoint } : T extends 'watchPlaylist' ? { - clickTrackingParams: string watchPlaylistEndpoint: watchPlaylistEndpoint } : never @@ -178,11 +194,6 @@ declare namespace InnerTube { label: string } } - - interface YouTubeMusicClient { - userId: string - accessToken: string - } } export class YouTubeMusic { @@ -269,50 +280,30 @@ export class YouTubeMusic { console.log(response.status) const data: InnerTube.BrowseResponse = await response.json() - const results = data.contents.singleColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents - const home: { id: string; name: string }[] = [] - for (const result of results) { - const homeSection = result.musicCarouselShelfRenderer.contents - for (const item of homeSection) { - if (item.musicTwoRowItemRenderer?.navigationEndpoint) { - let id: string - const navigationEndpoint = item.musicTwoRowItemRenderer.navigationEndpoint - if ('browseEndpoint' in navigationEndpoint) { - id = navigationEndpoint.browseEndpoint.browseId - } else if ('watchEndpoint' in navigationEndpoint) { - id = navigationEndpoint.watchEndpoint.videoId - } else { - continue + const contents = data.contents.singleColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer.contents.flatMap((section) => section.musicCarouselShelfRenderer.contents) + console.log(JSON.stringify(contents[0])) + + for (const item of contents) { + let artists: Song['artists'], album: Song['album'] + + if (item.musicResponsiveListItemRenderer) { + for (const column of item.musicResponsiveListItemRenderer.flexColumns) { + const text = column.musicResponsiveListItemFlexColumnRenderer.text.runs[0].text + const endpoint = column.musicResponsiveListItemFlexColumnRenderer.text.runs[0].navigationEndpoint! + if ('watchEndpoint' in endpoint) { } - home.push({ id, name: item.musicTwoRowItemRenderer.title.runs[0].text }) } + } else { + continue } } + } - const youtube = google.youtube('v3') - const videoInfo = await youtube.videos.list({ - id: home.map((video) => video.id), - part: ['contentDetails', 'snippet', 'statistics'], - access_token: this.accessToken, - }) - console.log(JSON.stringify(videoInfo)) - - // console.log(JSON.stringify(results[0].musicCarouselShelfRenderer.contents[0])) - - // const sectionList = data.contents.singleColumnBrowseResultsRenderer.tabs[0].tabRenderer.content.sectionListRenderer - // if ('continuations' in sectionList) { - - // } - - // const song: Song = { - // connectionId: this.connectionId, - // serviceType: 'youtube-music', - // type: 'song', - // id: home[0].id, - // name: home[0].name, - // duration: - // } - // return home + private getDatestamp = () => { + const currentDate = new Date() + const epochDate = new Date(0) + const daysDifference = Math.floor((currentDate.getTime() - epochDate.getTime()) / (24 * 60 * 60 * 1000)) + return daysDifference } public getSong = async (videoId: string) => { @@ -323,8 +314,9 @@ export class YouTubeMusic { method: 'POST', body: JSON.stringify({ playbackContext: { - contentPlaybackContext: { signatureTimestamp: } + contentPlaybackContext: { signatureTimestamp: this.getDatestamp() - 1 }, }, + videoId, context: { client: { clientName: 'WEB_REMIX', @@ -334,6 +326,10 @@ export class YouTubeMusic { }, }), }) + + console.log(response.status) + const data = await response.json() + console.log(JSON.stringify(data)) } }