From eea7becbe82523d7730d100e71f31b345cb92875 Mon Sep 17 00:00:00 2001 From: zS1L3NT Mac Date: Thu, 28 Dec 2023 04:35:09 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=9D=20simplify=20documentation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .npmignore | 1 - README.md | 35 +-- bun.lockb | Bin 142481 -> 58717 bytes docs/.vuepress/config.ts | 253 ------------------ docs/.vuepress/styles/index.scss | 5 - docs/README.md | 17 -- docs/guides/getting-started.md | 41 --- docs/guides/usage.md | 28 -- docs/guides/usage/getAlbum.md | 11 - docs/guides/usage/getArtist.md | 11 - docs/guides/usage/getArtistAlbums.md | 11 - docs/guides/usage/getArtistSongs.md | 11 - docs/guides/usage/getPlaylist.md | 11 - docs/guides/usage/getPlaylistVideos.md | 11 - docs/guides/usage/getSearchSuggestions.md | 11 - docs/guides/usage/getSong.md | 11 - docs/guides/usage/getVideo.md | 11 - docs/guides/usage/search.md | 11 - docs/guides/usage/searchAlbums.md | 11 - docs/guides/usage/searchArtists.md | 11 - docs/guides/usage/searchPlaylists.md | 11 - docs/guides/usage/searchSongs.md | 11 - docs/guides/usage/searchVideos.md | 11 - docs/references/interfaces.md | 15 -- docs/references/interfaces/AlbumBasic.md | 21 -- docs/references/interfaces/AlbumDetailed.md | 39 --- docs/references/interfaces/AlbumFull.md | 35 --- docs/references/interfaces/ArtistBasic.md | 29 -- docs/references/interfaces/ArtistDetailed.md | 27 -- docs/references/interfaces/ArtistFull.md | 35 --- .../references/interfaces/PlaylistDetailed.md | 29 -- docs/references/interfaces/PlaylistFull.md | 29 -- docs/references/interfaces/SongDetailed.md | 39 --- docs/references/interfaces/SongFull.md | 35 --- docs/references/interfaces/ThumbnailFull.md | 33 --- docs/references/interfaces/VideoDetailed.md | 35 --- docs/references/interfaces/VideoFull.md | 39 --- docs/references/types.md | 3 - docs/references/types/SearchResult.md | 26 -- docs/references/ytmusic.md | 19 -- docs/references/ytmusic/getAlbum.md | 19 -- docs/references/ytmusic/getArtist.md | 19 -- docs/references/ytmusic/getArtistAlbums.md | 19 -- docs/references/ytmusic/getArtistSongs.md | 19 -- docs/references/ytmusic/getPlaylist.md | 19 -- docs/references/ytmusic/getPlaylistVideos.md | 19 -- .../ytmusic/getSearchSuggestions.md | 19 -- docs/references/ytmusic/getSong.md | 19 -- docs/references/ytmusic/getVideo.md | 19 -- docs/references/ytmusic/search.md | 19 -- docs/references/ytmusic/searchAlbums.md | 19 -- docs/references/ytmusic/searchArtists.md | 19 -- docs/references/ytmusic/searchPlaylists.md | 19 -- docs/references/ytmusic/searchSongs.md | 19 -- docs/references/ytmusic/searchVideos.md | 19 -- package.json | 8 +- 56 files changed, 20 insertions(+), 1306 deletions(-) delete mode 100644 docs/.vuepress/config.ts delete mode 100644 docs/.vuepress/styles/index.scss delete mode 100644 docs/README.md delete mode 100644 docs/guides/getting-started.md delete mode 100644 docs/guides/usage.md delete mode 100644 docs/guides/usage/getAlbum.md delete mode 100644 docs/guides/usage/getArtist.md delete mode 100644 docs/guides/usage/getArtistAlbums.md delete mode 100644 docs/guides/usage/getArtistSongs.md delete mode 100644 docs/guides/usage/getPlaylist.md delete mode 100644 docs/guides/usage/getPlaylistVideos.md delete mode 100644 docs/guides/usage/getSearchSuggestions.md delete mode 100644 docs/guides/usage/getSong.md delete mode 100644 docs/guides/usage/getVideo.md delete mode 100644 docs/guides/usage/search.md delete mode 100644 docs/guides/usage/searchAlbums.md delete mode 100644 docs/guides/usage/searchArtists.md delete mode 100644 docs/guides/usage/searchPlaylists.md delete mode 100644 docs/guides/usage/searchSongs.md delete mode 100644 docs/guides/usage/searchVideos.md delete mode 100644 docs/references/interfaces.md delete mode 100644 docs/references/interfaces/AlbumBasic.md delete mode 100644 docs/references/interfaces/AlbumDetailed.md delete mode 100644 docs/references/interfaces/AlbumFull.md delete mode 100644 docs/references/interfaces/ArtistBasic.md delete mode 100644 docs/references/interfaces/ArtistDetailed.md delete mode 100644 docs/references/interfaces/ArtistFull.md delete mode 100644 docs/references/interfaces/PlaylistDetailed.md delete mode 100644 docs/references/interfaces/PlaylistFull.md delete mode 100644 docs/references/interfaces/SongDetailed.md delete mode 100644 docs/references/interfaces/SongFull.md delete mode 100644 docs/references/interfaces/ThumbnailFull.md delete mode 100644 docs/references/interfaces/VideoDetailed.md delete mode 100644 docs/references/interfaces/VideoFull.md delete mode 100644 docs/references/types.md delete mode 100644 docs/references/types/SearchResult.md delete mode 100644 docs/references/ytmusic.md delete mode 100644 docs/references/ytmusic/getAlbum.md delete mode 100644 docs/references/ytmusic/getArtist.md delete mode 100644 docs/references/ytmusic/getArtistAlbums.md delete mode 100644 docs/references/ytmusic/getArtistSongs.md delete mode 100644 docs/references/ytmusic/getPlaylist.md delete mode 100644 docs/references/ytmusic/getPlaylistVideos.md delete mode 100644 docs/references/ytmusic/getSearchSuggestions.md delete mode 100644 docs/references/ytmusic/getSong.md delete mode 100644 docs/references/ytmusic/getVideo.md delete mode 100644 docs/references/ytmusic/search.md delete mode 100644 docs/references/ytmusic/searchAlbums.md delete mode 100644 docs/references/ytmusic/searchArtists.md delete mode 100644 docs/references/ytmusic/searchPlaylists.md delete mode 100644 docs/references/ytmusic/searchSongs.md delete mode 100644 docs/references/ytmusic/searchVideos.md diff --git a/.npmignore b/.npmignore index 8edcc6e..e86375f 100644 --- a/.npmignore +++ b/.npmignore @@ -1,6 +1,5 @@ /node_modules /src -/docs /.github .gitignore .prettierrc diff --git a/README.md b/README.md index 640890b..8bdb84c 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,6 @@ YouTube Music API (Unofficial) is a YouTube Music data scraper. It comes with TypeScript support API for return types. The NPM package can be found [here](https://npmjs.com/package/ytmusic-api) -**Full documentation is available [here](http://ytmusic-api.zectan.com).** - ## Motivation I used to use [youtube-music-api](https://npmjs.com/package/youtube-music-api) as my youtube music api data scraper. I liked looking into the source code of how it works but it never made sense to me. I also didn't like that there were no TypeScript annotations for the return types of methods. @@ -22,6 +20,20 @@ Because of this, I decided to build my own version of a youtube music api with T - Artists - Albums - Playlists + - Lyrics + +## Usage + +```js +import YTMusic from "ytmusic-api" + +const ytmusic = new YTMusic() +await ytmusic.initialize(/* Optional: Custom cookies */) + +ytmusic.search("Never gonna give you up").then(songs => { + console.log(songs) +}) +``` ## Credits @@ -29,38 +41,27 @@ A lot of the credit should go to [youtube-music-api](https://npmjs.com/package/y ## Testing -YTMusic API's data return types are tested with Mocha. To run the tests, run the command +YTMusic API's data return types are tested with Bun Test. To run the tests, run the command ``` -$ npm run test +$ bun test ``` ## Built with - NodeJS - TypeScript - - [![@types/json-schema](https://img.shields.io/badge/%40types%2Fjson--schema-%5E7.0.11-red?style=flat-square)](https://npmjs.com/package/@types/json-schema/v/7.0.11) - - [![@types/mocha](https://img.shields.io/badge/%40types%2Fmocha-%5E10.0.1-red?style=flat-square)](https://npmjs.com/package/@types/mocha/v/10.0.1) - - [![@types/node](https://img.shields.io/badge/%40types%2Fnode-%5E18.11.17-red?style=flat-square)](https://npmjs.com/package/@types/node/v/18.11.17) - [![@types/tough-cookie](https://img.shields.io/badge/%40types%2Ftough--cookie-%5E4.0.2-red?style=flat-square)](https://npmjs.com/package/@types/tough-cookie/v/4.0.2) - [![@typescript-eslint/eslint-plugin](https://img.shields.io/badge/%40typescript--eslint%2Feslint--plugin-latest-red?style=flat-square)](https://npmjs.com/package/@typescript-eslint/eslint-plugin/v/latest) - [![@typescript-eslint/parser](https://img.shields.io/badge/%40typescript--eslint%2Fparser-latest-red?style=flat-square)](https://npmjs.com/package/@typescript-eslint/parser/v/latest) - - [![ts-node](https://img.shields.io/badge/ts--node-%5E10.9.1-red?style=flat-square)](https://npmjs.com/package/ts-node/v/10.9.1) + - [![bun-types](https://img.shields.io/badge/bun--types-%5E1.0.18--1-red?style=flat-square)](https://npmjs.com/package/bun-types/v/1.0.18-1) - [![typescript](https://img.shields.io/badge/typescript-latest-red?style=flat-square)](https://npmjs.com/package/typescript/v/latest) - - Mocha - - [![mocha](https://img.shields.io/badge/mocha-%5E10.2.0-red?style=flat-square)](https://npmjs.com/package/mocha/v/10.2.0) - - [![mocha.parallel](https://img.shields.io/badge/mocha.parallel-%5E0.15.6-red?style=flat-square)](https://npmjs.com/package/mocha.parallel/v/0.15.6) - - [![ts-mocha](https://img.shields.io/badge/ts--mocha-%5E10.0.0-red?style=flat-square)](https://npmjs.com/package/ts-mocha/v/10.0.0) - - VuePress - - [![@vuepress/plugin-search](https://img.shields.io/badge/%40vuepress%2Fplugin--search-%5E2.0.0--beta.46-red?style=flat-square)](https://npmjs.com/package/@vuepress/plugin-search/v/2.0.0-beta.46) - - [![vuepress](https://img.shields.io/badge/vuepress-%5E2.0.0--beta.46-red?style=flat-square)](https://npmjs.com/package/vuepress/v/2.0.0-beta.46) - ESLint - [![eslint](https://img.shields.io/badge/eslint-latest-red?style=flat-square)](https://npmjs.com/package/eslint/v/latest) - [![eslint-config-prettier](https://img.shields.io/badge/eslint--config--prettier-latest-red?style=flat-square)](https://npmjs.com/package/eslint-config-prettier/v/latest) - [![eslint-plugin-simple-import-sort](https://img.shields.io/badge/eslint--plugin--simple--import--sort-latest-red?style=flat-square)](https://npmjs.com/package/eslint-plugin-simple-import-sort/v/latest) - [![prettier](https://img.shields.io/badge/prettier-latest-red?style=flat-square)](https://npmjs.com/package/prettier/v/latest) - Miscellaneous + - [![arktype](https://img.shields.io/badge/arktype-%5E1.0.28--alpha-red?style=flat-square)](https://npmjs.com/package/arktype/v/1.0.28-alpha) - [![axios](https://img.shields.io/badge/axios-%5E0.27.2-red?style=flat-square)](https://npmjs.com/package/axios/v/0.27.2) - [![tough-cookie](https://img.shields.io/badge/tough--cookie-%5E4.1.2-red?style=flat-square)](https://npmjs.com/package/tough-cookie/v/4.1.2) - - [![zod](https://img.shields.io/badge/zod-%5E3.20.2-red?style=flat-square)](https://npmjs.com/package/zod/v/3.20.2) - - [![zod-to-json-schema](https://img.shields.io/badge/zod--to--json--schema-%5E3.20.1-red?style=flat-square)](https://npmjs.com/package/zod-to-json-schema/v/3.20.1) diff --git a/bun.lockb b/bun.lockb index 6c964b5bcbb50d65f280751ee2d11b41d51af29e..39c0ac83329df7e4da173276ef9bd852a7e3832b 100755 GIT binary patch delta 12455 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 z - - -```bash:no-line-numbers -npm i ytmusic-api -``` - - - - -```bash:no-line-numbers -yarn add ytmusic-api -``` - - - - -```bash:no-line-numbers -pnpm i ytmusic-api -``` - - - - -## Importing - -```ts -// ES6 Import -import YTMusic from "ytmusic-api" - -// Node Require -const YTMusic = require("ytmusic-api").default -``` diff --git a/docs/guides/usage.md b/docs/guides/usage.md deleted file mode 100644 index 09fd1bd..0000000 --- a/docs/guides/usage.md +++ /dev/null @@ -1,28 +0,0 @@ -# Usage - -YTMusic provides you with many ways of fetching data from YouTube Music
-To leverage all the functions, we will need to create an instance of the class `YTMusic`. -Then, call the `initialize()` to initialize the API before using the API anywhere - -```ts -const ytmusic = new YTMusic() -ytmusic.initialize().then(() => { - // Use API here -}) -``` - -In an async context, you can initialize the API in one line - -```ts -const ytmusic = await new YTMusic().initialize() -// Use API here -``` - -## Custom Cookies - -If you want to use your own cookies for all requests, you can do so like this - -```ts -const ytmusic = await new YTMusic() - .initialize("COOKIES=here; COOKIES=here; COOKIES=here") -``` \ No newline at end of file diff --git a/docs/guides/usage/getAlbum.md b/docs/guides/usage/getAlbum.md deleted file mode 100644 index 6a3f89e..0000000 --- a/docs/guides/usage/getAlbum.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting an album - -`getAlbum()` will fetch you information about a specific album by its ID. - -```ts -ytmusic.getAlbum("MPREb_iG5q5DIdhdA").then(album => { - console.log(album) -}) -``` - -See the [reference](../../references/ytmusic/getAlbum.html) for more information. diff --git a/docs/guides/usage/getArtist.md b/docs/guides/usage/getArtist.md deleted file mode 100644 index 4495b85..0000000 --- a/docs/guides/usage/getArtist.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting an artist - -`getArtist()` will fetch you information about a specific artist by its ID. - -```ts -ytmusic.getArtist("UCTUR0sVEkD8T5MlSHqgaI_Q").then(artist => { - console.log(artist) -}) -``` - -See the [reference](../../references/ytmusic/getArtist.html) for more information. diff --git a/docs/guides/usage/getArtistAlbums.md b/docs/guides/usage/getArtistAlbums.md deleted file mode 100644 index ca2b78b..0000000 --- a/docs/guides/usage/getArtistAlbums.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting an artist's albums - -`getArtistAlbums()` will fetch you information about a specific artist's albums by its ID. - -```ts -ytmusic.getArtistAlbums("UCTUR0sVEkD8T5MlSHqgaI_Q").then(artistAlbums => { - console.log(artistAlbums) -}) -``` - -See the [reference](../../references/ytmusic/getArtistAlbums.html) for more information. diff --git a/docs/guides/usage/getArtistSongs.md b/docs/guides/usage/getArtistSongs.md deleted file mode 100644 index e644792..0000000 --- a/docs/guides/usage/getArtistSongs.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting an artist's songs - -`getArtistSongs()` will fetch you information about a specific artist's songs by its ID. - -```ts -ytmusic.getArtistSongs("UCTUR0sVEkD8T5MlSHqgaI_Q").then(artistSongs => { - console.log(artistSongs) -}) -``` - -See the [reference](../../references/ytmusic/getArtistSongs.html) for more information. diff --git a/docs/guides/usage/getPlaylist.md b/docs/guides/usage/getPlaylist.md deleted file mode 100644 index 9116d8d..0000000 --- a/docs/guides/usage/getPlaylist.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting a playlist - -`getPlaylist()` will fetch you information about a specific playlist by its ID. - -```ts -ytmusic.getPlaylist("OLAK5uy_nRb467jR73IXKybwzw22_rTYIJ808x4Yc").then(playlist => { - console.log(playlist) -}) -``` - -See the [reference](../../references/ytmusic/getPlaylist.html) for more information. diff --git a/docs/guides/usage/getPlaylistVideos.md b/docs/guides/usage/getPlaylistVideos.md deleted file mode 100644 index 214528e..0000000 --- a/docs/guides/usage/getPlaylistVideos.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting a playlist's videos - -`getPlaylistVideos()` will fetch you information about a specific playlist's videos by its ID. - -```ts -ytmusic.getPlaylistVideos("OLAK5uy_nRb467jR73IXKybwzw22_rTYIJ808x4Yc").then(playlistVideos => { - console.log(playlistVideos) -}) -``` - -See the [reference](../../references/ytmusic/getPlaylistVideos.html) for more information. diff --git a/docs/guides/usage/getSearchSuggestions.md b/docs/guides/usage/getSearchSuggestions.md deleted file mode 100644 index 895e527..0000000 --- a/docs/guides/usage/getSearchSuggestions.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting search suggestions - -`getSearchSuggestions()` will fetch you a list of search suggestions based on the query - -```ts -ytmusic.getSearchSuggestions("Lilac").then(res => { - console.log(res) -}) -``` - -See the [reference](../../references/ytmusic/getSearchSuggestions.html) for information. diff --git a/docs/guides/usage/getSong.md b/docs/guides/usage/getSong.md deleted file mode 100644 index 6abd620..0000000 --- a/docs/guides/usage/getSong.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting a song - -`getSong()` will fetch you information about a specific song by its ID. - -```ts -ytmusic.getSong("v7bnOxV4jAc").then(song => { - console.log(song) -}) -``` - -See the [reference](../../references/ytmusic/getSong.html) for more information. diff --git a/docs/guides/usage/getVideo.md b/docs/guides/usage/getVideo.md deleted file mode 100644 index 99532db..0000000 --- a/docs/guides/usage/getVideo.md +++ /dev/null @@ -1,11 +0,0 @@ -# Getting a video - -`getVideo()` will fetch you information about a specific video by its ID. - -```ts -ytmusic.getVideo("v7bnOxV4jAc").then(video => { - console.log(video) -}) -``` - -See the [reference](../../references/ytmusic/getVideo.html) for more information. diff --git a/docs/guides/usage/search.md b/docs/guides/usage/search.md deleted file mode 100644 index 84db62b..0000000 --- a/docs/guides/usage/search.md +++ /dev/null @@ -1,11 +0,0 @@ -# Searching for results - -`search()` will search YTMusic for any type of result. - -```ts -ytmusic.search("Lilac").then(results => { - console.log(results) -}) -``` - -See the [reference](../../references/ytmusic/search.html) for information. diff --git a/docs/guides/usage/searchAlbums.md b/docs/guides/usage/searchAlbums.md deleted file mode 100644 index 8d7f847..0000000 --- a/docs/guides/usage/searchAlbums.md +++ /dev/null @@ -1,11 +0,0 @@ -# Searching for albums - -`searchAlbums()` will search YTMusic for album results. - -```ts -ytmusic.searchAlbums("Lilac").then(albums => { - console.log(albums) -}) -``` - -See the [reference](../../references/ytmusic/searchAlbums.html) for information. \ No newline at end of file diff --git a/docs/guides/usage/searchArtists.md b/docs/guides/usage/searchArtists.md deleted file mode 100644 index 944e38f..0000000 --- a/docs/guides/usage/searchArtists.md +++ /dev/null @@ -1,11 +0,0 @@ -# Searching for artists - -`searchArtists()` will search YTMusic for artist results. - -```ts -ytmusic.searchArtists("Lilac").then(artists => { - console.log(artists) -}) -``` - -See the [reference](../../references/ytmusic/searchArtists.html) for information. diff --git a/docs/guides/usage/searchPlaylists.md b/docs/guides/usage/searchPlaylists.md deleted file mode 100644 index 95e5277..0000000 --- a/docs/guides/usage/searchPlaylists.md +++ /dev/null @@ -1,11 +0,0 @@ -# Searching for playlists - -`searchPlaylists()` will search YTMusic for playlist results. - -```ts -ytmusic.searchPlaylists("Lilac").then(playlists => { - console.log(playlists) -}) -``` - -See the [reference](../../references/ytmusic/searchPlaylists.html) for information. \ No newline at end of file diff --git a/docs/guides/usage/searchSongs.md b/docs/guides/usage/searchSongs.md deleted file mode 100644 index c783ef4..0000000 --- a/docs/guides/usage/searchSongs.md +++ /dev/null @@ -1,11 +0,0 @@ -# Searching for songs - -`searchSongs()` will search YTMusic for song results. - -```ts -ytmusic.searchSongs("Lilac").then(songs => { - console.log(songs) -}) -``` - -See the [reference](../../references/ytmusic/searchSongs.html) for information. \ No newline at end of file diff --git a/docs/guides/usage/searchVideos.md b/docs/guides/usage/searchVideos.md deleted file mode 100644 index 6367ca2..0000000 --- a/docs/guides/usage/searchVideos.md +++ /dev/null @@ -1,11 +0,0 @@ -# Searching for songs - -`searchVideos()` will search YTMusic for video results. - -```ts -ytmusic.searchVideos("Lilac").then(videos => { - console.log(videos) -}) -``` - -See the [reference](../../references/ytmusic/searchVideos.html) for information. diff --git a/docs/references/interfaces.md b/docs/references/interfaces.md deleted file mode 100644 index caf6572..0000000 --- a/docs/references/interfaces.md +++ /dev/null @@ -1,15 +0,0 @@ -# Interfaces - -- [ThumbnailFull](./interfaces/ThumbnailFull.html) -- [SongDetailed](./interfaces/SongDetailed.html) -- [SongFull](./interfaces/SongFull.html) -- [VideoDetailed](./interfaces/VideoDetailed.html) -- [VideoFull](./interfaces/VideoFull.html) -- [ArtistBasic](./interfaces/ArtistBasic.html) -- [ArtistDetailed](./interfaces/ArtistDetailed.html) -- [ArtistFull](./interfaces/ArtistFull.html) -- [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/AlbumBasic.md b/docs/references/interfaces/AlbumBasic.md deleted file mode 100644 index 68c934c..0000000 --- a/docs/references/interfaces/AlbumBasic.md +++ /dev/null @@ -1,21 +0,0 @@ -# AlbumBasic - -## Properties - -| Name | Data Type | Description | -| :-------- | :-------- | :---------- | -| `albumId` | `string` | Album ID | -| `name` | `string` | Name | - -## TypeScript Source Code - -```ts -interface AlbumBasic { - albumId: string - name: string -} -``` - -## Usages - -[SongDetailed#album](./SongDetailed.html) diff --git a/docs/references/interfaces/AlbumDetailed.md b/docs/references/interfaces/AlbumDetailed.md deleted file mode 100644 index 25d12b7..0000000 --- a/docs/references/interfaces/AlbumDetailed.md +++ /dev/null @@ -1,39 +0,0 @@ -# AlbumDetailed - -## Properties - -| Name | Data Type | Description | -| :----------- | :---------------------------------------- | :-------------------- | -| `type` | `"ALBUM"` | Type of data | -| `albumId` | `string` | Album ID | -| `playlistId` | `string` | Playlist ID for Album | -| `name` | `string` | Name | -| `artists` | [ArtistBasic](./ArtistBasic.html)`[]` | Creators of the Album | -| `year` | `number \| null` | Year of release | -| `thumbnails` | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | - -## TypeScript Source Code - -```ts -interface AlbumDetailed { - type: "ALBUM" - albumId: string - playlistId: string - name: string - artists: ArtistBasic[] - year: number | null - thumbnails: ThumbnailFull[] -} -``` - -## Usages - -[ArtistFull#topAlbums](./ArtistFull.html) - -[ArtistFull#topSingles](./ArtistFull.html) - -[SearchResult](../types/SearchResult.html) - -[YTMusic#searchAlbums](../ytmusic/searchAlbums.html) - -[YTMusic#getArtistAlbums](../ytmusic/getArtistAlbums.html) \ No newline at end of file diff --git a/docs/references/interfaces/AlbumFull.md b/docs/references/interfaces/AlbumFull.md deleted file mode 100644 index 947f9f9..0000000 --- a/docs/references/interfaces/AlbumFull.md +++ /dev/null @@ -1,35 +0,0 @@ -# AlbumFull - -## Properties - -| Name | Data Type | Description | -| :------------ | :---------------------------------------- | :-------------------- | -| `type` | `"ALBUM"` | Type of data | -| `albumId` | `string` | Album ID | -| `playlistId` | `string` | Playlist ID for Album | -| `name` | `string` | Name | -| `artists` | [ArtistBasic](./ArtistBasic.html)`[]` | Creators of the Album | -| `year` | `number \| null` | Year of release | -| `thumbnails` | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | -| `description` | `string` | Description | -| `songs` | [SongDetailed](./SongDetailed.html)`[]` | Songs in the Album | - -## TypeScript Source Code - -```ts -interface AlbumFull { - type: "ALBUM" - albumId: string - playlistId: string - name: string - artists: ArtistBasic[] - year: number | null - thumbnails: ThumbnailFull[] - description: string - songs: SongDetailed[] -} -``` - -## Usages - -[YTMusic#getAlbum](../ytmusic/getAlbum.md) diff --git a/docs/references/interfaces/ArtistBasic.md b/docs/references/interfaces/ArtistBasic.md deleted file mode 100644 index 8afafb8..0000000 --- a/docs/references/interfaces/ArtistBasic.md +++ /dev/null @@ -1,29 +0,0 @@ -# ArtistBasic - -## Properties - -| Name | Data Type | Description | -| :------- | :-------- | :---------- | -| artistId | `string` | Artist ID | -| name | `string` | Name | - -## TypeScript Source Code - -```ts -interface ArtistBasic { - artistId: string - name: string -} -``` - -## Usages - -[SongDetailed#artists](./SongDetailed.html) - -[VideoDetailed#artists](./VideoDetailed.html) - -[AlbumDetailed#artists](./AlbumDetailed.html) - -[PlaylistDetailed#artist](./PlaylistDetailed.html) - -[PlaylistFull#artist](./PlaylistFull.html) diff --git a/docs/references/interfaces/ArtistDetailed.md b/docs/references/interfaces/ArtistDetailed.md deleted file mode 100644 index a46d7aa..0000000 --- a/docs/references/interfaces/ArtistDetailed.md +++ /dev/null @@ -1,27 +0,0 @@ -# ArtistDetailed - -## Properties - -| Name | Data Type | Description | -| :--------- | :---------------------------------------- | :----------- | -| type | `"ARTIST"` | Type of data | -| artistId | `string` | Artist ID | -| name | `string` | Name | -| thumbnails | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | - -## TypeScript Source Code - -```ts -interface ArtistDetailed { - type: "ARTIST" - artistId: string - name: string - thumbnails: ThumbnailFull[] -} -``` - -## Usages - -[SearchResult](../types/SearchResult.html) - -[YTMusic#searchArtists](../ytmusic/searchArtists.html) diff --git a/docs/references/interfaces/ArtistFull.md b/docs/references/interfaces/ArtistFull.md deleted file mode 100644 index a2ee61d..0000000 --- a/docs/references/interfaces/ArtistFull.md +++ /dev/null @@ -1,35 +0,0 @@ -# ArtistFull - -## Properties - -| Name | Data Type | Description | -| :---------- | :---------------------------------------------------------- | :----------------------------------- | -| type | `"ARTIST"` | Type of data | -| artistId | `string` | Artist ID | -| name | `string` | Name | -| thumbnails | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | -| description | `string` | Description | -| topSongs | `Omit<`[SongDetailed](./SongDetailed.html)`, "duration">[]` | Top Songs from Artist | -| topAlbums | [AlbumDetailed](./AlbumDetailed.html)`[]` | Top Albums from Artist | -| topSingles | [AlbumDetailed](./AlbumDetailed.html)`[]` | Top Singles from Artist | -| topVideos | `Omit<`[VideoDetailed](./VideoDetailed.html)`, "duration">[]` | Top Videos from Artist | - -## TypeScript Source Code - -```ts -interface ArtistFull { - type: "ARTIST" - artistId: string - name: string - thumbnails: ThumbnailFull[] - description: string - topSongs: Omit[] - topAlbums: AlbumDetailed[] - topSingles: AlbumDetailed[] - topVideos: Omit[] -} -``` - -## Usages - -[YTMusic#getArtist](../ytmusic/getArtist.html) diff --git a/docs/references/interfaces/PlaylistDetailed.md b/docs/references/interfaces/PlaylistDetailed.md deleted file mode 100644 index 9d98ffd..0000000 --- a/docs/references/interfaces/PlaylistDetailed.md +++ /dev/null @@ -1,29 +0,0 @@ -# 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 deleted file mode 100644 index 74af1c9..0000000 --- a/docs/references/interfaces/PlaylistFull.md +++ /dev/null @@ -1,29 +0,0 @@ -# PlaylistFull - -## Properties - -| Name | Data Type | Description | -| :--------- | :---------------------------------- | :------------------------------- | -| type | `"PLAYLIST"` | Type of data | -| 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 - -```ts -interface PlaylistFull { - type: "PLAYLIST" - playlistId: string - name: string - artist: ArtistBasic - videoCount: number - thumbnails: ThumbnailFull[] -} -``` - -## Usages - -[YTMusic#getPlaylist](../ytmusic/getPlaylist.html) diff --git a/docs/references/interfaces/SongDetailed.md b/docs/references/interfaces/SongDetailed.md deleted file mode 100644 index 68aa244..0000000 --- a/docs/references/interfaces/SongDetailed.md +++ /dev/null @@ -1,39 +0,0 @@ -# SongDetailed - -## Properties - -| Name | Data Type | Description | -| :--------- | :---------------------------------------- | :------------------ | -| type | `"SONG"` | Type of data | -| videoId | `string` | YouTube Video ID | -| name | `string` | Name | -| artists | [ArtistBasic](./ArtistBasic.html)`[]` | Artists | -| album | [AlbumBasic](./AlbumBasic.html) | Album | -| duration | `number` | Duration in seconds | -| thumbnails | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | - -## TypeScript Source Code - -```ts -interface SongDetailed { - type: "SONG" - videoId: string - name: string - artists: ArtistBasic[] - album: AlbumBasic - duration: number - thumbnails: ThumbnailFull[] -} -``` - -## Usages - -[ArtistFull#topSongs](./ArtistFull.html) - -[AlbumFull#songs](./AlbumFull.html) - -[SearchResult](../types/SearchResult.html) - -[YTMusic#searchSongs](../ytmusic/searchSongs.html) - -[YTMusic#getArtistSongs](../ytmusic/getArtistSongs.html) diff --git a/docs/references/interfaces/SongFull.md b/docs/references/interfaces/SongFull.md deleted file mode 100644 index 59eb011..0000000 --- a/docs/references/interfaces/SongFull.md +++ /dev/null @@ -1,35 +0,0 @@ -# SongFull - -## Properties - -| Name | Data Type | Description | -| :-------------- | :---------------------------------------- | :--------------------- | -| type | `"SONG"` | Type of data | -| videoId | `string` | YouTube Video ID | -| name | `string` | Name | -| artists | [ArtistBasic](./ArtistBasic.html)`[]` | Artists | -| duration | `number` | Duration in seconds | -| thumbnails | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | -| description | `string` | Description | -| formats | `any[]` | Video Formats | -| adaptiveFormats | `any[]` | Adaptive Video Formats | - -## TypeScript Source Code - -```ts -interface SongFull { - type: "SONG" - videoId: string - name: string - artists: ArtistBasic[] - duration: number - thumbnails: ThumbnailFull[] - description: string - formats: any[] - adaptiveFormats: any[] -} -``` - -## Usages - -[YTMusic#getSong](../ytmusic/getSong.html) diff --git a/docs/references/interfaces/ThumbnailFull.md b/docs/references/interfaces/ThumbnailFull.md deleted file mode 100644 index 6d9ad90..0000000 --- a/docs/references/interfaces/ThumbnailFull.md +++ /dev/null @@ -1,33 +0,0 @@ -# ThumbnailFull - -## Properties - -| Name | Data Type | Description | -| :------- | :-------- | :------------------ | -| `url` | `string` | Link | -| `width` | `number` | Width of the image | -| `height` | `number` | Height of the image | - -## TypeScript Source Code - -```ts -interface ThumbnailFull { - url: string - width: number - height: number -} -``` - -## Usages - -[SongDetailed#thumbnails](./SongDetailed.html) - -[VideoDetailed#thumbnails](./VideoDetailed.html) - -[ArtistDetailed#thumbnails](./ArtistDetailed.html) - -[AlbumDetailed#thumbnails](./AlbumDetailed.html) - -[PlaylistDetailed#thumbnails](./PlaylistDetailed.html) - -[PlaylistFull#thumbnails](./PlaylistFull.html) diff --git a/docs/references/interfaces/VideoDetailed.md b/docs/references/interfaces/VideoDetailed.md deleted file mode 100644 index 740448c..0000000 --- a/docs/references/interfaces/VideoDetailed.md +++ /dev/null @@ -1,35 +0,0 @@ -# VideoDetailed - -## Properties - -| Name | Data Type | Description | -| :--------- | :---------------------------------------- | :------------------------------ | -| type | `"VIDEO"` | Type of data | -| videoId | `string` | YouTube Video ID | -| name | `string` | Name | -| artists | [ArtistBasic](./ArtistBasic.html)`[]` | Channels that created the video | -| duration | `number` | Duration in seconds | -| thumbnails | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | - -## TypeScript Source Code - -```ts -interface VideoDetailed { - type: "VIDEO" - videoId: string - name: string - artists: ArtistBasic[] - duration: number - thumbnails: ThumbnailFull[] -} -``` - -## Usages - -[ArtistFull#topVideos](../types/ArtistFull.html) - -[SearchResult](../types/SearchResult.html) - -[YTMusic#searchVideos](../ytmusic/searchVideos.html) - -[YTMusic#getPlaylistVideos](../ytmusic/getPlaylistVideos.html) diff --git a/docs/references/interfaces/VideoFull.md b/docs/references/interfaces/VideoFull.md deleted file mode 100644 index 5d68269..0000000 --- a/docs/references/interfaces/VideoFull.md +++ /dev/null @@ -1,39 +0,0 @@ -# VideoFull - -## Properties - -| Name | Data Type | Description | -| :---------- | :---------------------------------------- | :------------------------------------- | -| type | `"VIDEO"` | Type of data | -| videoId | `string` | YouTube Video ID | -| name | `string` | Name | -| artists | [ArtistBasic](./ArtistBasic.html)`[]` | Channels that created the video | -| duration | `number` | Duration in seconds | -| thumbnails | [ThumbnailFull](./ThumbnailFull.html)`[]` | Thumbnails | -| description | `string` | Description | -| unlisted | `boolean` | If the video is unlisted on YouTube | -| familySafe | `boolean` | If the video is family safe on YouTube | -| paid | `boolean` | If the video is paid on YouTube | -| tags | `string[]` | Tags | - -## TypeScript Source Code - -```ts -interface VideoFull { - type: "VIDEO" - videoId: string - name: string - artists: ArtistBasic[] - duration: number - thumbnails: ThumbnailFull[] - description: string - unlisted: boolean - familySafe: boolean - paid: boolean - tags: string[] -} -``` - -## Usages - -[YTMusic#getVideo](../ytmusic/getVideo.html) diff --git a/docs/references/types.md b/docs/references/types.md deleted file mode 100644 index c41ffa1..0000000 --- a/docs/references/types.md +++ /dev/null @@ -1,3 +0,0 @@ -# Types - -- [SearchResult](../types/SearchResult.html) diff --git a/docs/references/types/SearchResult.md b/docs/references/types/SearchResult.md deleted file mode 100644 index 4d40712..0000000 --- a/docs/references/types/SearchResult.md +++ /dev/null @@ -1,26 +0,0 @@ -# SearchResult - -## Value - -Either - -- [SongDetailed](../interfaces/SongDetailed.html) -- [VideoDetailed](../interfaces/VideoDetailed.html) -- [AlbumDetailed](../interfaces/AlbumDetailed.html) -- [ArtistDetailed](../interfaces/ArtistDetailed.html) -- [PlaylistDetailed](../interfaces/PlaylistDetailed.html) - -## TypeScript Source Code - -```ts -type SearchResult = - | SongDetailed - | VideoDetailed - | AlbumDetailed - | ArtistDetailed - | PlaylistDetailed -``` - -## Usages - -[YTMusic#search](../ytmusic/search.html) diff --git a/docs/references/ytmusic.md b/docs/references/ytmusic.md deleted file mode 100644 index 85cc2f2..0000000 --- a/docs/references/ytmusic.md +++ /dev/null @@ -1,19 +0,0 @@ -# YTMusic Class - -## Methods - -- [getSearchSuggestions](./ytmusic/getSearchSuggestions.html) -- [search](./ytmusic/search.html) -- [searchSongs](./ytmusic/searchSongs.html) -- [searchVideos](./ytmusic/searchVideos.html) -- [searchArtists](./ytmusic/searchArtists.html) -- [searchAlbums](./ytmusic/searchAlbums.html) -- [searchPlaylists](./ytmusic/searchPlaylists.html) -- [getSong](./ytmusic/getSong.html) -- [getVideo](./ytmusic/getVideo.html) -- [getArtist](./ytmusic/getArtist.html) -- [getArtistSongs](./ytmusic/getArtistSongs.html) -- [getArtistAlbums](./ytmusic/getArtistAlbums.html) -- [getAlbum](./ytmusic/getAlbum.html) -- [getPlaylist](./ytmusic/getPlaylist.html) -- [getPlaylistVideos](./ytmusic/getPlaylistVideos.html) diff --git a/docs/references/ytmusic/getAlbum.md b/docs/references/ytmusic/getAlbum.md deleted file mode 100644 index 6a37913..0000000 --- a/docs/references/ytmusic/getAlbum.md +++ /dev/null @@ -1,19 +0,0 @@ -# getAlbum - -See the [guide](../../guides/usage/getAlbum.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :-------- | :-------- | :---------- | -| `albumId` | `string` | Album ID | - -## Returns - -`Promise<`[AlbumFull](../interfaces/AlbumFull.html)`>` - -## TypeScript Source Code - -```ts -public async getAlbum(albumId: string): Promise -``` diff --git a/docs/references/ytmusic/getArtist.md b/docs/references/ytmusic/getArtist.md deleted file mode 100644 index 7639772..0000000 --- a/docs/references/ytmusic/getArtist.md +++ /dev/null @@ -1,19 +0,0 @@ -# getArtist - -See the [guide](../../guides/usage/getArtist.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :--------- | :-------- | :---------- | -| `artistId` | `string` | Artist ID | - -## Returns - -`Promise<`[ArtistFull](../interfaces/ArtistFull.html)`>` - -## TypeScript Source Code - -```ts -public async getArtist(artistId: string): Promise -``` diff --git a/docs/references/ytmusic/getArtistAlbums.md b/docs/references/ytmusic/getArtistAlbums.md deleted file mode 100644 index 7c4d55e..0000000 --- a/docs/references/ytmusic/getArtistAlbums.md +++ /dev/null @@ -1,19 +0,0 @@ -# getArtistAlbums - -See the [guide](../../guides/usage/getArtistAlbums.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :--------- | :-------- | :---------- | -| `artistId` | `string` | Artist ID | - -## Returns - -`Promise<`[AlbumDetailed](../interfaces/AlbumDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async getArtistAlbums(artistId: string): Promise -``` diff --git a/docs/references/ytmusic/getArtistSongs.md b/docs/references/ytmusic/getArtistSongs.md deleted file mode 100644 index d269192..0000000 --- a/docs/references/ytmusic/getArtistSongs.md +++ /dev/null @@ -1,19 +0,0 @@ -# getArtistSongs - -See the [guide](../../guides/usage/getArtistSongs.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :--------- | :-------- | :---------- | -| `artistId` | `string` | Artist ID | - -## Returns - -`Promise<`[SongDetailed](../interfaces/SongDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async getArtistSongs(artistId: string): Promise -``` diff --git a/docs/references/ytmusic/getPlaylist.md b/docs/references/ytmusic/getPlaylist.md deleted file mode 100644 index 5b271bf..0000000 --- a/docs/references/ytmusic/getPlaylist.md +++ /dev/null @@ -1,19 +0,0 @@ -# getPlaylist - -See the [guide](../../guides/usage/getPlaylist.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :----------- | :-------- | :---------- | -| `playlistId` | `string` | Playlist ID | - -## Returns - -`Promise<`[PlaylistFull](../interfaces/PlaylistFull.html)`>` - -## TypeScript Source Code - -```ts -public async getPlaylist(playlistId: string): Promise -``` diff --git a/docs/references/ytmusic/getPlaylistVideos.md b/docs/references/ytmusic/getPlaylistVideos.md deleted file mode 100644 index c6f5e43..0000000 --- a/docs/references/ytmusic/getPlaylistVideos.md +++ /dev/null @@ -1,19 +0,0 @@ -# getPlaylistVideos - -See the [guide](../../guides/usage/getPlaylistVideos.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :----------- | :-------- | :---------- | -| `playlistId` | `string` | Playlist ID | - -## Returns - -`Promise<`[VideoDetailed](../interfaces/VideoDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async getPlaylistVideos(playlistId: string): Promise -``` diff --git a/docs/references/ytmusic/getSearchSuggestions.md b/docs/references/ytmusic/getSearchSuggestions.md deleted file mode 100644 index f218382..0000000 --- a/docs/references/ytmusic/getSearchSuggestions.md +++ /dev/null @@ -1,19 +0,0 @@ -# getSearchSuggestions - -See the [guide](../../guides/usage/getSearchSuggestions.html) for information on how to use this. - -## Parameters - -| Name | Data Type | Description | -| :---- | :-------- | :------------------------------------ | -| query | string | Search query you want suggestions for | - -## Returns - -`Promise` - -## TypeScript Source Code - -```ts -public async getSearchSuggestions(query: string): Promise -``` diff --git a/docs/references/ytmusic/getSong.md b/docs/references/ytmusic/getSong.md deleted file mode 100644 index f7d3c1a..0000000 --- a/docs/references/ytmusic/getSong.md +++ /dev/null @@ -1,19 +0,0 @@ -# getSong - -See the [guide](../../guides/usage/getSong.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :-------- | :-------- | :---------- | -| `videoId` | `string` | Video ID | - -## Returns - -`Promise<`[SongFull](../interfaces/SongFull.html)`>` - -## TypeScript Source Code - -```ts -public async getSong(videoId: string): Promise -``` diff --git a/docs/references/ytmusic/getVideo.md b/docs/references/ytmusic/getVideo.md deleted file mode 100644 index 20e4fb2..0000000 --- a/docs/references/ytmusic/getVideo.md +++ /dev/null @@ -1,19 +0,0 @@ -# getVideo - -See the [guide](../../guides/usage/getVideo.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :-------- | :-------- | :---------- | -| `videoId` | `string` | Video ID | - -## Returns - -`Promise<`[VideoFull](../interfaces/VideoFull.html)`>` - -## TypeScript Source Code - -```ts -public async getVideo(videoId: string): Promise -``` diff --git a/docs/references/ytmusic/search.md b/docs/references/ytmusic/search.md deleted file mode 100644 index 4f22814..0000000 --- a/docs/references/ytmusic/search.md +++ /dev/null @@ -1,19 +0,0 @@ -# search - -See the [guide](../../guides/usage/search.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :------ | :-------- | :----------- | -| `query` | `string` | Search query | - -## Returns - -`Promise<`[SearchResult](../types/SearchResult.html)`[]>` - -## TypeScript Source Code - -```ts -public async search(query: string): Promise -``` diff --git a/docs/references/ytmusic/searchAlbums.md b/docs/references/ytmusic/searchAlbums.md deleted file mode 100644 index 692c739..0000000 --- a/docs/references/ytmusic/searchAlbums.md +++ /dev/null @@ -1,19 +0,0 @@ -# searchAlbums - -See the [guide](../../guides/usage/searchAlbums.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :------ | :-------- | :----------- | -| `query` | `string` | Search query | - -## Returns - -`Promise<`[AlbumDetailed](../interfaces/AlbumDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async searchAlbums(query: string): Promise -``` diff --git a/docs/references/ytmusic/searchArtists.md b/docs/references/ytmusic/searchArtists.md deleted file mode 100644 index 80d2249..0000000 --- a/docs/references/ytmusic/searchArtists.md +++ /dev/null @@ -1,19 +0,0 @@ -# searchArtists - -See the [guide](../../guides/usage/searchArtists.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :------ | :-------- | :----------- | -| `query` | `string` | Search query | - -## Returns - -`Promise<`[ArtistDetailed](../interfaces/ArtistDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async searchArtists(query: string): Promise -``` diff --git a/docs/references/ytmusic/searchPlaylists.md b/docs/references/ytmusic/searchPlaylists.md deleted file mode 100644 index 1e8b318..0000000 --- a/docs/references/ytmusic/searchPlaylists.md +++ /dev/null @@ -1,19 +0,0 @@ -# searchPlaylists - -See the [guide](../../guides/usage/searchPlaylists.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :------ | :-------- | :----------- | -| `query` | `string` | Search query | - -## Returns - -`Promise<`[PlaylistDetailed](../interfaces/PlaylistDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async searchPlaylists(query: string): Promise -``` diff --git a/docs/references/ytmusic/searchSongs.md b/docs/references/ytmusic/searchSongs.md deleted file mode 100644 index b527b33..0000000 --- a/docs/references/ytmusic/searchSongs.md +++ /dev/null @@ -1,19 +0,0 @@ -# searchSongs - -See the [guide](../../guides/usage/searchSongs.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :------ | :-------- | :----------- | -| `query` | `string` | Search query | - -## Returns - -`Promise<`[SongDetailed](../interfaces/SongDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async searchSongs(query: string): Promise -``` diff --git a/docs/references/ytmusic/searchVideos.md b/docs/references/ytmusic/searchVideos.md deleted file mode 100644 index 65d1319..0000000 --- a/docs/references/ytmusic/searchVideos.md +++ /dev/null @@ -1,19 +0,0 @@ -# searchVideos - -See the [guide](../../guides/usage/searchVideos.html) for information on how to use this. - -## Properties - -| Name | Data Type | Description | -| :------ | :-------- | :----------- | -| `query` | `string` | Search query | - -## Returns - -`Promise<`[VideoDetailed](../interfaces/VideoDetailed.html)`[]>` - -## TypeScript Source Code - -```ts -public async searchVideos(query: string): Promise -``` diff --git a/package.json b/package.json index 592bdd6..3a7ac03 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ytmusic-api", - "version": "4.5.0", + "version": "5.0.0", "description": "YouTube Music API", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -12,8 +12,6 @@ }, "scripts": { "build": "tsc", - "docs:dev": "vuepress dev docs", - "docs:build": "vuepress build docs", "clean": "tsc --noEmit && eslint src --fix && prettier src --write && rm tsconfig.tsbuildinfo" }, "dependencies": { @@ -25,14 +23,12 @@ "@types/tough-cookie": "^4.0.2", "@typescript-eslint/eslint-plugin": "latest", "@typescript-eslint/parser": "latest", - "@vuepress/plugin-search": "^2.0.0-beta.46", "bun-types": "^1.0.18-1", "eslint": "latest", "eslint-config-prettier": "latest", "eslint-plugin-simple-import-sort": "latest", "prettier": "latest", - "typescript": "latest", - "vuepress": "^2.0.0-beta.46" + "typescript": "latest" }, "keywords": [ "youtube",