Flatlogic Bot ca3a32f23e V 4
2026-02-16 06:55:36 +00:00

1 line
11 KiB
Plaintext

{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Soundcloud } from \"soundcloud.ts\";\nimport { DisTubeError, ExtractorPlugin, Playlist, Song, checkInvalidKey } from \"distube\";\nimport type { ResolveOptions } from \"distube\";\nimport type { SoundcloudPlaylist, SoundcloudTrack } from \"soundcloud.ts\";\n\ntype Falsy = undefined | null | false | 0 | \"\";\nconst isTruthy = <T>(x: T | Falsy): x is T => Boolean(x);\nexport enum SearchType {\n Track = \"track\",\n Playlist = \"playlist\",\n}\n\nexport interface SoundCloudPluginOptions {\n clientId?: string;\n oauthToken?: string;\n}\n\nexport class SoundCloudPlugin extends ExtractorPlugin {\n soundcloud: Soundcloud;\n constructor(options: SoundCloudPluginOptions = {}) {\n super();\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new DisTubeError(\"INVALID_TYPE\", [\"object\", \"undefined\"], options, \"SoundCloudPluginOptions\");\n }\n checkInvalidKey(options, [\"clientId\", \"oauthToken\"], \"SoundCloudPluginOptions\");\n if (options.clientId && typeof options.clientId !== \"string\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"string\", options.clientId, \"clientId\");\n }\n if (options.oauthToken && typeof options.oauthToken !== \"string\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"string\", options.oauthToken, \"oauthToken\");\n }\n\n this.soundcloud = new Soundcloud(options.clientId, options.oauthToken);\n }\n search<T>(query: string, type?: SearchType.Track, limit?: number, options?: ResolveOptions<T>): Promise<Song<T>[]>;\n search<T>(\n query: string,\n type: SearchType.Playlist,\n limit?: number,\n options?: ResolveOptions<T>,\n ): Promise<Playlist<T>[]>;\n search<T>(\n query: string,\n type?: SearchType,\n limit?: number,\n options?: ResolveOptions<T>,\n ): Promise<Song<T>[] | Playlist<T>[]>;\n async search<T>(query: string, type: SearchType = SearchType.Track, limit = 10, options: ResolveOptions<T> = {}) {\n if (typeof query !== \"string\") {\n throw new DisTubeError(\"INVALID_TYPE\", \"string\", query, \"query\");\n }\n if (!Object.values(SearchType).includes(type)) {\n throw new DisTubeError(\"INVALID_TYPE\", Object.values(SearchType), type, \"type\");\n }\n if (typeof limit !== \"number\" || limit < 1 || !Number.isInteger(limit)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"natural number\", limit, \"limit\");\n }\n if (typeof options !== \"object\" || Array.isArray(options)) {\n throw new DisTubeError(\"INVALID_TYPE\", \"object\", options, \"ResolveOptions\");\n }\n\n await this.soundcloud.api.getClientId().catch(() => {\n throw new DisTubeError(\n \"SOUNDCLOUD_PLUGIN_NO_CLIENT_ID\",\n \"Cannot find SoundCloud client id automatically. Please provide a client id in the constructor.\\nGuide: https://github.com/distubejs/soundcloud#documentation\",\n );\n });\n\n switch (type) {\n case SearchType.Track: {\n const data = await this.soundcloud.tracks.search({ q: query, limit });\n if (!data?.collection?.length) {\n throw new DisTubeError(\"SOUNDCLOUD_PLUGIN_NO_RESULT\", `Cannot find any \"${query}\" ${type} on SoundCloud!`);\n }\n return data.collection.map(t => new SoundCloudSong(this, t, options));\n }\n case SearchType.Playlist: {\n const data = await this.soundcloud.playlists.search({ q: query, limit });\n const playlists = data.collection;\n return (\n await Promise.all(\n playlists.map(async p => new SoundCloudPlaylist(this, await this.soundcloud.playlists.fetch(p), options)),\n )\n ).filter(isTruthy);\n }\n default:\n throw new DisTubeError(\"SOUNDCLOUD_PLUGIN_UNSUPPORTED_TYPE\", `${type} search is not supported!`);\n }\n }\n\n validate(url: string) {\n return /^https?:\\/\\/(?:(?:www|m)\\.)?soundcloud\\.com\\/(.*)$/.test(url);\n }\n\n async resolve<T>(url: string, options: ResolveOptions<T>) {\n await this.soundcloud.api.getClientId().catch(() => {\n throw new DisTubeError(\n \"SOUNDCLOUD_PLUGIN_NO_CLIENT_ID\",\n \"Cannot find SoundCloud client id automatically. Please provide a client id in the constructor.\\nGuide: https://github.com/distubejs/soundcloud#documentation\",\n );\n });\n const opt = { ...options, source: \"soundcloud\" };\n url = url.replace(/:\\/\\/(m|www)\\./g, \"://\");\n const data = await this.soundcloud.resolve.get(url, true).catch(e => {\n throw new DisTubeError(\"SOUNDCLOUD_PLUGIN_RESOLVE_ERROR\", e.message);\n });\n if (!data || ![\"track\", \"playlist\"].includes(data.kind)) {\n throw new DisTubeError(\"SOUNDCLOUD_PLUGIN_NOT_SUPPORTED\", \"Only public tracks and playlists are supported.\");\n }\n\n return data.kind === \"playlist\"\n ? new SoundCloudPlaylist(this, await this.soundcloud.playlists.fetch(data), opt)\n : new SoundCloudSong(this, data, opt);\n }\n\n async getRelatedSongs(song: SoundCloudSong<undefined>) {\n if (!song.url) {\n throw new DisTubeError(\"SOUNDCLOUD_PLUGIN_INVALID_SONG\", \"Cannot get related songs from invalid song.\");\n }\n const related = await this.soundcloud.tracks.related(song.url, 10);\n return related.filter(t => t.title).map(t => new SoundCloudSong(this, t));\n }\n\n async getStreamURL<T>(song: SoundCloudSong<T>) {\n if (!song.url) {\n throw new DisTubeError(\"SOUNDCLOUD_PLUGIN_INVALID_SONG\", \"Cannot get stream url from invalid song.\");\n }\n const stream = await this.soundcloud.util.streamLink(song.url);\n if (!stream) {\n throw new DisTubeError(\n \"SOUNDCLOUD_PLUGIN_RATE_LIMITED\",\n \"Reached SoundCloud rate limits\\nSee more: https://developers.soundcloud.com/docs/api/rate-limits#play-requests\",\n );\n }\n return stream;\n }\n\n async searchSong<T>(query: string, options: ResolveOptions<T>) {\n const songs = await this.search(query, SearchType.Track, 1, options);\n return songs[0];\n }\n}\n\nclass SoundCloudSong<T> extends Song<T> {\n constructor(plugin: SoundCloudPlugin, info: SoundcloudTrack, options: ResolveOptions<T> = {}) {\n super(\n {\n plugin,\n source: \"soundcloud\",\n playFromSource: true,\n id: info.id.toString(),\n name: info.title,\n url: info.permalink_url,\n thumbnail: info.artwork_url,\n duration: info.duration / 1000,\n views: info.playback_count,\n uploader: {\n name: info.user?.username,\n url: info.user?.permalink_url,\n },\n likes: info.likes_count,\n reposts: info.reposts_count,\n },\n options,\n );\n }\n}\n\nclass SoundCloudPlaylist<T> extends Playlist<T> {\n constructor(plugin: SoundCloudPlugin, info: SoundcloudPlaylist, options: ResolveOptions<T> = {}) {\n super(\n {\n source: \"soundcloud\",\n id: info.id.toString(),\n name: info.title,\n url: info.permalink_url,\n thumbnail: info.artwork_url ?? undefined,\n songs: info.tracks.map(s => new SoundCloudSong(plugin, s, options)),\n },\n options,\n );\n }\n}\n\nexport default SoundCloudPlugin;\n"],"mappings":"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","names":["SearchType"]}