🔀 Merge branch 'fix/tests-breaking' into main
This commit is contained in:
commit
8def009b73
|
|
@ -8,7 +8,6 @@
|
|||
| playlistId | `string` | Playlist ID |
|
||||
| name | `string` | Name |
|
||||
| artist | [ArtistBasic](#ArtistBasic) | Creator of the Playlist |
|
||||
| videoCount | `number` | Number of videos in the Playlist |
|
||||
| thumbnails | [ThumbnailFull](#ThumbnailFull)`[]` | Thumbnails |
|
||||
|
||||
## TypeScript Source Code
|
||||
|
|
@ -19,7 +18,6 @@ interface PlaylistFull {
|
|||
playlistId: string
|
||||
name: string
|
||||
artist: ArtistBasic
|
||||
videoCount: number
|
||||
thumbnails: ThumbnailFull[]
|
||||
}
|
||||
```
|
||||
|
|
|
|||
727
pnpm-lock.yaml
727
pnpm-lock.yaml
File diff suppressed because it is too large
Load Diff
|
|
@ -220,7 +220,9 @@ export default class YTMusic {
|
|||
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 =>
|
||||
AlbumParser.parseArtistAlbum(item, {
|
||||
artistId,
|
||||
name: traverseString(albumsData, "header", "text")()
|
||||
name: traverseString(albumsData, "header", "runs", "text")()
|
||||
})
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import assert from "assert"
|
||||
import describeParallel from "mocha.parallel"
|
||||
import { z } from "zod"
|
||||
|
||||
|
|
@ -7,15 +6,16 @@ import {
|
|||
VideoDetailed, VideoFull
|
||||
} from "../schemas"
|
||||
import YTMusic from "../YTMusic"
|
||||
import { equal } from "assert"
|
||||
|
||||
const errors = <z.ZodError<any>[]>[]
|
||||
const queries = ["Lilac", "Weekend", "Eill", "Eminem", "Lisa Hannigan"]
|
||||
const expect = (data: any, schema: z.Schema) => {
|
||||
const result = schema.safeParse(data)
|
||||
if (!result.success) {
|
||||
if (!result.success && "error" in result) {
|
||||
errors.push(result.error)
|
||||
}
|
||||
assert.equal(result.success, true)
|
||||
equal(result.success, true)
|
||||
}
|
||||
|
||||
const ytmusic = new YTMusic()
|
||||
|
|
|
|||
|
|
@ -14,11 +14,6 @@ export default class PlaylistParser {
|
|||
artistId: traverseString(data, "header", "subtitle", "browseId")(),
|
||||
name: traverseString(data, "header", "subtitle", "text")(2)
|
||||
},
|
||||
videoCount: +traverseList(data, "header", "secondSubtitle", "text")
|
||||
.at(0)
|
||||
.split(" ")
|
||||
.at(0)
|
||||
.replaceAll(",", ""),
|
||||
thumbnails: traverseList(data, "header", "thumbnails")
|
||||
},
|
||||
PlaylistFull
|
||||
|
|
@ -27,7 +22,6 @@ export default class PlaylistParser {
|
|||
|
||||
public static parseSearchResult(item: any): PlaylistFull {
|
||||
const flexColumns = traverseList(item, "flexColumns")
|
||||
const artistId = traverseString(flexColumns[1], "browseId")()
|
||||
|
||||
return checkType(
|
||||
{
|
||||
|
|
@ -35,14 +29,9 @@ export default class PlaylistParser {
|
|||
playlistId: traverseString(item, "overlay", "playlistId")(),
|
||||
name: traverseString(flexColumns[0], "runs", "text")(),
|
||||
artist: {
|
||||
artistId,
|
||||
name: traverseString(flexColumns[1], "runs", "text")(-2)
|
||||
artistId: traverseString(flexColumns[1], "browseId")(),
|
||||
name: traverseString(flexColumns[1], "runs", "text")(-3)
|
||||
},
|
||||
videoCount: +traverseList(flexColumns[1], "runs", "text")
|
||||
.at(-1)
|
||||
.split(" ")
|
||||
.at(0)
|
||||
.replaceAll(",", ""),
|
||||
thumbnails: traverseList(item, "thumbnails")
|
||||
},
|
||||
PlaylistFull
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import SongParser from "./SongParser"
|
|||
import VideoParser from "./VideoParser"
|
||||
|
||||
export default class SearchParser {
|
||||
public static parse(item: any): SearchResult {
|
||||
public static parse(item: any): SearchResult | null {
|
||||
const flexColumns = traverseList(item, "flexColumns")
|
||||
const type = traverseList(flexColumns[1], "runs", "text").at(0) as
|
||||
| "Song"
|
||||
|
|
@ -18,7 +18,7 @@ export default class SearchParser {
|
|||
| "Album"
|
||||
| "Playlist"
|
||||
|
||||
return {
|
||||
const parsers = {
|
||||
Song: SongParser.parseSearchResult,
|
||||
Video: VideoParser.parseSearchResult,
|
||||
Artist: ArtistParser.parseSearchResult,
|
||||
|
|
@ -26,6 +26,12 @@ export default class SearchParser {
|
|||
Single: AlbumParser.parseSearchResult,
|
||||
Album: AlbumParser.parseSearchResult,
|
||||
Playlist: PlaylistParser.parseSearchResult
|
||||
}[type](item)
|
||||
}
|
||||
|
||||
if (parsers[type]) {
|
||||
return parsers[type](item)
|
||||
} else {
|
||||
return null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -119,7 +119,6 @@ export const PlaylistFull = z.object({
|
|||
playlistId: z.string(),
|
||||
name: z.string(),
|
||||
artist: ArtistBasic,
|
||||
videoCount: z.number(),
|
||||
thumbnails: z.array(ThumbnailFull)
|
||||
})
|
||||
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ export default <T extends z.Schema>(data: z.infer<T>, schema: T): z.infer<T> =>
|
|||
if (result.success) {
|
||||
return data
|
||||
} else {
|
||||
if ("error" in result) {
|
||||
console.error(
|
||||
"Invalid data schema, please report to https://github.com/zS1L3NT/ts-npm-ytmusic-api/issues/new/choose",
|
||||
JSON.stringify(
|
||||
|
|
@ -18,6 +19,7 @@ export default <T extends z.Schema>(data: z.infer<T>, schema: T): z.infer<T> =>
|
|||
2
|
||||
)
|
||||
)
|
||||
}
|
||||
return data
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue