UNPKG

youtube-moosick

Version:

Unofficial Youtube music API, fully written in TypeScript

63 lines 3.19 kB
import { $, $$ } from '../resources/utilities/objectScan.utility.js'; import { ParsersExtended } from './parsersExtended.js'; import { PlaylistHeader, PlaylistURL } from '../resources/resultTypes/playlistURL.js'; import { FlexColumnOffset } from '../enums.js'; import { utils } from '../utils.js'; /** * Parser to deal with the output generated by the Moosick#getPlaylist * * @remarks * Do not use this class directly, unless for tests purposes * @internal */ export class GetPlaylistParser { static parsePlaylistURL(context) { // Gets all the ListItemRenderers and pushes the first 2 out only const flexColumns = []; const fixedColumns = []; const allResponsiveRenderers = $$('.musicResponsiveListItemRenderer')(context); // eslint-disable-next-line @typescript-eslint/prefer-for-of for (let i = 0; i < allResponsiveRenderers.length; i++) { flexColumns.push(allResponsiveRenderers[i].flexColumns[0].musicResponsiveListItemFlexColumnRenderer); flexColumns.push(allResponsiveRenderers[i].flexColumns[1].musicResponsiveListItemFlexColumnRenderer); fixedColumns.push(allResponsiveRenderers[i].fixedColumns[0].musicResponsiveListItemFixedColumnRenderer); } const unprocessedHeader = $$('.musicDetailHeaderRenderer')(context); const allThumbnailRenderers = ($$('.musicThumbnailRenderer')(context)); const continuation = ($('.nextContinuationData')(context)); const playlistContents = []; for (let i = 0; i < flexColumns.length; i += 2) { const flexColumnFirstRow = flexColumns[i]; playlistContents.push({ trackTitle: $('.text')(flexColumnFirstRow), trackId: $('.videoId')(flexColumnFirstRow), artist: ParsersExtended.artistParser(flexColumns[i + 1].text.runs), thumbnail: allThumbnailRenderers[Math.floor(i / 2)]?.thumbnail?.thumbnails ?? [], duration: utils.hms2ms(fixedColumns[Math.floor(i / 2)].text.runs[0].text), }); } return PlaylistURL.from({ headers: unprocessedHeader.length > 0 ? GetPlaylistParser.playlistURLHeaderParser(unprocessedHeader) : undefined, playlistContents, continuation, }); } /** * Parses playlist header data and related information * @param header - The header object from the returned axios request * @internal */ static playlistURLHeaderParser(header) { return PlaylistHeader.from({ playlistName: header[0].title.runs[FlexColumnOffset.ONLYRUN].text, owner: header[0].subtitle.runs[2].text, createdYear: parseInt(header[0].subtitle.runs[4].text, 10), thumbnail: header[0].thumbnail.croppedSquareThumbnailRenderer.thumbnail.thumbnails, songCount: parseInt(header[0].secondSubtitle.runs[FlexColumnOffset.ONLYRUN].text, 10), approxRunTime: header[0].secondSubtitle.runs[2].text, }); } } //# sourceMappingURL=getPlaylistParser.js.map