🔀 Merge branch 'fix/tests-breaking' into main

This commit is contained in:
zS1L3NT Windows 2023-07-29 23:51:53 +08:00
commit 8def009b73
8 changed files with 400 additions and 395 deletions

View File

@ -8,7 +8,6 @@
| playlistId | `string` | Playlist ID | | playlistId | `string` | Playlist ID |
| name | `string` | Name | | name | `string` | Name |
| artist | [ArtistBasic](#ArtistBasic) | Creator of the Playlist | | artist | [ArtistBasic](#ArtistBasic) | Creator of the Playlist |
| videoCount | `number` | Number of videos in the Playlist |
| thumbnails | [ThumbnailFull](#ThumbnailFull)`[]` | Thumbnails | | thumbnails | [ThumbnailFull](#ThumbnailFull)`[]` | Thumbnails |
## TypeScript Source Code ## TypeScript Source Code
@ -19,7 +18,6 @@ interface PlaylistFull {
playlistId: string playlistId: string
name: string name: string
artist: ArtistBasic artist: ArtistBasic
videoCount: number
thumbnails: ThumbnailFull[] thumbnails: ThumbnailFull[]
} }
``` ```

File diff suppressed because it is too large Load Diff

View File

@ -220,7 +220,9 @@ export default class YTMusic {
params: null params: null
}) })
return traverseList(searchData, "musicResponsiveListItemRenderer").map(SearchParser.parse) return traverseList(searchData, "musicResponsiveListItemRenderer")
.map(SearchParser.parse)
.filter(Boolean) as z.infer<typeof SearchResult>[]
} }
/** /**
@ -395,7 +397,7 @@ export default class YTMusic {
return traverseList(albumsData, "musicTwoRowItemRenderer").map(item => return traverseList(albumsData, "musicTwoRowItemRenderer").map(item =>
AlbumParser.parseArtistAlbum(item, { AlbumParser.parseArtistAlbum(item, {
artistId, artistId,
name: traverseString(albumsData, "header", "text")() name: traverseString(albumsData, "header", "runs", "text")()
}) })
) )
} }

View File

@ -1,4 +1,3 @@
import assert from "assert"
import describeParallel from "mocha.parallel" import describeParallel from "mocha.parallel"
import { z } from "zod" import { z } from "zod"
@ -7,15 +6,16 @@ import {
VideoDetailed, VideoFull VideoDetailed, VideoFull
} from "../schemas" } from "../schemas"
import YTMusic from "../YTMusic" import YTMusic from "../YTMusic"
import { equal } from "assert"
const errors = <z.ZodError<any>[]>[] const errors = <z.ZodError<any>[]>[]
const queries = ["Lilac", "Weekend", "Eill", "Eminem", "Lisa Hannigan"] const queries = ["Lilac", "Weekend", "Eill", "Eminem", "Lisa Hannigan"]
const expect = (data: any, schema: z.Schema) => { const expect = (data: any, schema: z.Schema) => {
const result = schema.safeParse(data) const result = schema.safeParse(data)
if (!result.success) { if (!result.success && "error" in result) {
errors.push(result.error) errors.push(result.error)
} }
assert.equal(result.success, true) equal(result.success, true)
} }
const ytmusic = new YTMusic() const ytmusic = new YTMusic()

View File

@ -14,11 +14,6 @@ export default class PlaylistParser {
artistId: traverseString(data, "header", "subtitle", "browseId")(), artistId: traverseString(data, "header", "subtitle", "browseId")(),
name: traverseString(data, "header", "subtitle", "text")(2) name: traverseString(data, "header", "subtitle", "text")(2)
}, },
videoCount: +traverseList(data, "header", "secondSubtitle", "text")
.at(0)
.split(" ")
.at(0)
.replaceAll(",", ""),
thumbnails: traverseList(data, "header", "thumbnails") thumbnails: traverseList(data, "header", "thumbnails")
}, },
PlaylistFull PlaylistFull
@ -27,7 +22,6 @@ export default class PlaylistParser {
public static parseSearchResult(item: any): PlaylistFull { public static parseSearchResult(item: any): PlaylistFull {
const flexColumns = traverseList(item, "flexColumns") const flexColumns = traverseList(item, "flexColumns")
const artistId = traverseString(flexColumns[1], "browseId")()
return checkType( return checkType(
{ {
@ -35,14 +29,9 @@ export default class PlaylistParser {
playlistId: traverseString(item, "overlay", "playlistId")(), playlistId: traverseString(item, "overlay", "playlistId")(),
name: traverseString(flexColumns[0], "runs", "text")(), name: traverseString(flexColumns[0], "runs", "text")(),
artist: { artist: {
artistId, artistId: traverseString(flexColumns[1], "browseId")(),
name: traverseString(flexColumns[1], "runs", "text")(-2) name: traverseString(flexColumns[1], "runs", "text")(-3)
}, },
videoCount: +traverseList(flexColumns[1], "runs", "text")
.at(-1)
.split(" ")
.at(0)
.replaceAll(",", ""),
thumbnails: traverseList(item, "thumbnails") thumbnails: traverseList(item, "thumbnails")
}, },
PlaylistFull PlaylistFull

View File

@ -7,7 +7,7 @@ import SongParser from "./SongParser"
import VideoParser from "./VideoParser" import VideoParser from "./VideoParser"
export default class SearchParser { export default class SearchParser {
public static parse(item: any): SearchResult { public static parse(item: any): SearchResult | null {
const flexColumns = traverseList(item, "flexColumns") const flexColumns = traverseList(item, "flexColumns")
const type = traverseList(flexColumns[1], "runs", "text").at(0) as const type = traverseList(flexColumns[1], "runs", "text").at(0) as
| "Song" | "Song"
@ -18,7 +18,7 @@ export default class SearchParser {
| "Album" | "Album"
| "Playlist" | "Playlist"
return { const parsers = {
Song: SongParser.parseSearchResult, Song: SongParser.parseSearchResult,
Video: VideoParser.parseSearchResult, Video: VideoParser.parseSearchResult,
Artist: ArtistParser.parseSearchResult, Artist: ArtistParser.parseSearchResult,
@ -26,6 +26,12 @@ export default class SearchParser {
Single: AlbumParser.parseSearchResult, Single: AlbumParser.parseSearchResult,
Album: AlbumParser.parseSearchResult, Album: AlbumParser.parseSearchResult,
Playlist: PlaylistParser.parseSearchResult Playlist: PlaylistParser.parseSearchResult
}[type](item) }
if (parsers[type]) {
return parsers[type](item)
} else {
return null
}
} }
} }

View File

@ -119,7 +119,6 @@ export const PlaylistFull = z.object({
playlistId: z.string(), playlistId: z.string(),
name: z.string(), name: z.string(),
artist: ArtistBasic, artist: ArtistBasic,
videoCount: z.number(),
thumbnails: z.array(ThumbnailFull) thumbnails: z.array(ThumbnailFull)
}) })

View File

@ -6,18 +6,20 @@ export default <T extends z.Schema>(data: z.infer<T>, schema: T): z.infer<T> =>
if (result.success) { if (result.success) {
return data return data
} else { } else {
console.error( if ("error" in result) {
"Invalid data schema, please report to https://github.com/zS1L3NT/ts-npm-ytmusic-api/issues/new/choose", console.error(
JSON.stringify( "Invalid data schema, please report to https://github.com/zS1L3NT/ts-npm-ytmusic-api/issues/new/choose",
{ JSON.stringify(
schema: zodtojson(schema), {
data, schema: zodtojson(schema),
error: result.error data,
}, error: result.error
null, },
2 null,
2
)
) )
) }
return data return data
} }
} }