From efb17791e6c35f98996081dc120a42d3b785165d Mon Sep 17 00:00:00 2001 From: zS1L3NT Windows Date: Tue, 8 Aug 2023 05:18:55 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=96=204.3.0=20add=20back=20video=20cou?= =?UTF-8?q?nt=20only=20to=20PlaylistFull?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 4 +++ docs/references/interfaces.md | 1 + docs/references/interfaces/ArtistBasic.md | 2 ++ .../references/interfaces/PlaylistDetailed.md | 29 +++++++++++++++++++ docs/references/interfaces/PlaylistFull.md | 6 ++-- docs/references/interfaces/ThumbnailFull.md | 2 ++ docs/references/types/SearchResult.md | 4 +-- docs/references/ytmusic/searchPlaylists.md | 4 +-- package.json | 2 +- src/YTMusic.ts | 3 +- src/__tests__/traversing.spec.ts | 5 ++-- src/index.ts | 1 + src/parsers/PlaylistParser.ts | 12 ++++++-- src/schemas.ts | 12 +++++++- 14 files changed, 71 insertions(+), 16 deletions(-) create mode 100644 docs/references/interfaces/PlaylistDetailed.md diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index a19e645..47ea55d 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -226,6 +226,10 @@ export default defineUserConfig({ text: "AlbumFull", link: "/references/interfaces/AlbumFull.html" }, + { + text: "PlaylistDetailed", + link: "/references/interfaces/PlaylistDetailed.html" + }, { text: "PlaylistFull", link: "/references/interfaces/PlaylistFull.html" diff --git a/docs/references/interfaces.md b/docs/references/interfaces.md index 9451164..caf6572 100644 --- a/docs/references/interfaces.md +++ b/docs/references/interfaces.md @@ -11,4 +11,5 @@ - [AlbumBasic](./interfaces/AlbumBasic.html) - [AlbumDetailed](./interfaces/AlbumDetailed.html) - [AlbumFull](./interfaces/AlbumFull.html) +- [PlaylistDetailed](./interfaces/PlaylistDetailed.html) - [PlaylistFull](./interfaces/PlaylistFull.html) diff --git a/docs/references/interfaces/ArtistBasic.md b/docs/references/interfaces/ArtistBasic.md index a76dcb7..8afafb8 100644 --- a/docs/references/interfaces/ArtistBasic.md +++ b/docs/references/interfaces/ArtistBasic.md @@ -24,4 +24,6 @@ interface ArtistBasic { [AlbumDetailed#artists](./AlbumDetailed.html) +[PlaylistDetailed#artist](./PlaylistDetailed.html) + [PlaylistFull#artist](./PlaylistFull.html) diff --git a/docs/references/interfaces/PlaylistDetailed.md b/docs/references/interfaces/PlaylistDetailed.md new file mode 100644 index 0000000..9d98ffd --- /dev/null +++ b/docs/references/interfaces/PlaylistDetailed.md @@ -0,0 +1,29 @@ +# PlaylistDetailed + +## Properties + +| Name | Data Type | Description | +| :--------- | :---------------------------------- | :------------------------------- | +| type | `"PLAYLIST"` | Type of data | +| playlistId | `string` | Playlist ID | +| name | `string` | Name | +| artist | [ArtistBasic](#ArtistBasic) | Creator of the Playlist | +| thumbnails | [ThumbnailFull](#ThumbnailFull)`[]` | Thumbnails | + +## TypeScript Source Code + +```ts +interface PlaylistDetailed { + type: "PLAYLIST" + playlistId: string + name: string + artist: ArtistBasic + thumbnails: ThumbnailFull[] +} +``` + +## Usages + +[SearchResult](../types/SearchResult.html) + +[YTMusic#searchPlaylists](../ytmusic/searchPlaylists.html) diff --git a/docs/references/interfaces/PlaylistFull.md b/docs/references/interfaces/PlaylistFull.md index 891170f..74af1c9 100644 --- a/docs/references/interfaces/PlaylistFull.md +++ b/docs/references/interfaces/PlaylistFull.md @@ -8,6 +8,7 @@ | 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 @@ -18,14 +19,11 @@ interface PlaylistFull { playlistId: string name: string artist: ArtistBasic + videoCount: number thumbnails: ThumbnailFull[] } ``` ## Usages -[SearchResult](../types/SearchResult.html) - -[YTMusic#searchPlaylists](../ytmusic/searchPlaylists.html) - [YTMusic#getPlaylist](../ytmusic/getPlaylist.html) diff --git a/docs/references/interfaces/ThumbnailFull.md b/docs/references/interfaces/ThumbnailFull.md index cb91fe8..6d9ad90 100644 --- a/docs/references/interfaces/ThumbnailFull.md +++ b/docs/references/interfaces/ThumbnailFull.md @@ -28,4 +28,6 @@ interface ThumbnailFull { [AlbumDetailed#thumbnails](./AlbumDetailed.html) +[PlaylistDetailed#thumbnails](./PlaylistDetailed.html) + [PlaylistFull#thumbnails](./PlaylistFull.html) diff --git a/docs/references/types/SearchResult.md b/docs/references/types/SearchResult.md index 7b47533..4d40712 100644 --- a/docs/references/types/SearchResult.md +++ b/docs/references/types/SearchResult.md @@ -8,7 +8,7 @@ Either - [VideoDetailed](../interfaces/VideoDetailed.html) - [AlbumDetailed](../interfaces/AlbumDetailed.html) - [ArtistDetailed](../interfaces/ArtistDetailed.html) -- [PlaylistFull](../interfaces/PlaylistFull.html) +- [PlaylistDetailed](../interfaces/PlaylistDetailed.html) ## TypeScript Source Code @@ -18,7 +18,7 @@ type SearchResult = | VideoDetailed | AlbumDetailed | ArtistDetailed - | PlaylistFull + | PlaylistDetailed ``` ## Usages diff --git a/docs/references/ytmusic/searchPlaylists.md b/docs/references/ytmusic/searchPlaylists.md index a8e97e4..1e8b318 100644 --- a/docs/references/ytmusic/searchPlaylists.md +++ b/docs/references/ytmusic/searchPlaylists.md @@ -10,10 +10,10 @@ See the [guide](../../guides/usage/searchPlaylists.html) for information on how ## Returns -`Promise<`[PlaylistFull](../interfaces/PlaylistFull.html)`[]>` +`Promise<`[PlaylistDetailed](../interfaces/PlaylistDetailed.html)`[]>` ## TypeScript Source Code ```ts -public async searchPlaylists(query: string): Promise +public async searchPlaylists(query: string): Promise ``` diff --git a/package.json b/package.json index 2d6db08..7b5b5f5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ytmusic-api", - "version": "4.2.0", + "version": "4.3.0", "description": "YouTube Music API", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/YTMusic.ts b/src/YTMusic.ts index 6f20fac..07d28aa 100644 --- a/src/YTMusic.ts +++ b/src/YTMusic.ts @@ -13,6 +13,7 @@ import { AlbumFull, ArtistDetailed, ArtistFull, + PlaylistDetailed, PlaylistFull, SearchResult, SongDetailed, @@ -305,7 +306,7 @@ export default class YTMusic { * * @param query Query string */ - public async searchPlaylists(query: string): Promise[]> { + public async searchPlaylists(query: string): Promise[]> { const searchData = await this.constructRequest("search", { query, params: "Eg-KAQwIABAAGAAgACgBMABqChAEEAMQCRAFEAo%3D", diff --git a/src/__tests__/traversing.spec.ts b/src/__tests__/traversing.spec.ts index 4494d48..a77e6d1 100644 --- a/src/__tests__/traversing.spec.ts +++ b/src/__tests__/traversing.spec.ts @@ -7,6 +7,7 @@ import { AlbumFull, ArtistDetailed, ArtistFull, + PlaylistDetailed, PlaylistFull, SongDetailed, SongFull, @@ -57,7 +58,7 @@ queries.forEach(query => { it("Search Playlists", async () => { const playlists = await ytmusic.searchPlaylists(query) - expect(playlists, z.array(PlaylistFull)) + expect(playlists, z.array(PlaylistDetailed)) }) it("Search All", async () => { @@ -66,7 +67,7 @@ queries.forEach(query => { results, z.array( AlbumDetailed.or(ArtistDetailed) - .or(PlaylistFull) + .or(PlaylistDetailed) .or(SongDetailed) .or(VideoDetailed), ), diff --git a/src/index.ts b/src/index.ts index 3cf8397..4923625 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,6 +7,7 @@ export type { ArtistBasic, ArtistDetailed, ArtistFull, + PlaylistDetailed, PlaylistFull, SearchResult, SongDetailed, diff --git a/src/parsers/PlaylistParser.ts b/src/parsers/PlaylistParser.ts index 7894b93..4e6e42a 100644 --- a/src/parsers/PlaylistParser.ts +++ b/src/parsers/PlaylistParser.ts @@ -1,4 +1,4 @@ -import { PlaylistFull } from "../schemas" +import { PlaylistDetailed, PlaylistFull } from "../schemas" import checkType from "../utils/checkType" import traverseList from "../utils/traverseList" import traverseString from "../utils/traverseString" @@ -14,13 +14,19 @@ export default class PlaylistParser { artistId: traverseString(data, "header", "subtitle", "browseId")(), name: traverseString(data, "header", "subtitle", "text")(2), }, + videoCount: + +traverseList(data, "header", "secondSubtitle", "text") + .at(2) + .split(" ") + .at(0) + .replaceAll(",", "") ?? null, thumbnails: traverseList(data, "header", "thumbnails"), }, PlaylistFull, ) } - public static parseSearchResult(item: any): PlaylistFull { + public static parseSearchResult(item: any): PlaylistDetailed { const flexColumns = traverseList(item, "flexColumns") return checkType( @@ -34,7 +40,7 @@ export default class PlaylistParser { }, thumbnails: traverseList(item, "thumbnails"), }, - PlaylistFull, + PlaylistDetailed, ) } } diff --git a/src/schemas.ts b/src/schemas.ts index 38a40eb..c8ecc72 100644 --- a/src/schemas.ts +++ b/src/schemas.ts @@ -59,6 +59,15 @@ export const AlbumDetailed = z.object({ thumbnails: z.array(ThumbnailFull), }) +export type PlaylistDetailed = z.infer +export const PlaylistDetailed = z.object({ + type: z.literal("PLAYLIST"), + playlistId: z.string(), + name: z.string(), + artist: ArtistBasic, + thumbnails: z.array(ThumbnailFull), +}) + export type SongFull = z.infer export const SongFull = z.object({ type: z.literal("SONG"), @@ -119,6 +128,7 @@ export const PlaylistFull = z.object({ playlistId: z.string(), name: z.string(), artist: ArtistBasic, + videoCount: z.number(), thumbnails: z.array(ThumbnailFull), }) @@ -126,4 +136,4 @@ export type SearchResult = z.infer export const SearchResult = SongDetailed.or(VideoDetailed) .or(AlbumDetailed) .or(ArtistDetailed) - .or(PlaylistFull) + .or(PlaylistDetailed)