🔀 Merge branch 'fix/tests-breaking' into main
This commit is contained in:
commit
8def009b73
|
|
@ -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[]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
|
||||||
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
|
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")()
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -17,8 +17,8 @@ export default class SearchParser {
|
||||||
| "Single"
|
| "Single"
|
||||||
| "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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue