Skip to content
This repository has been archived by the owner on Mar 26, 2024. It is now read-only.

Commit

Permalink
feat: remove browser support
Browse files Browse the repository at this point in the history
BREAKING CHANGE: no longer intended for browser use
  • Loading branch information
vaaski committed Feb 23, 2021
1 parent c9b6940 commit 12e0671
Show file tree
Hide file tree
Showing 9 changed files with 6 additions and 260 deletions.
49 changes: 0 additions & 49 deletions docs/api/resolve.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,52 +44,3 @@
const resolvedPlaylist = await resolve("noisia/sets/noisia-radio")
console.log(resolvedPlaylist.kind) //> "playlist"
```

## browser

- **Arguments**:
- url: `{string} URL`
- client_id: `{string} client_id for APIv1`

- **Returns**: `Promise<APIv1Resolve>`

::: details example resolved user

<<< @/docs/snippets/resolve.browser.user.json

:::

::: details example resolved track

<<< @/docs/snippets/resolve.browser.track.json

:::

::: details example resolved playlist

<<< @/docs/snippets/resolve.browser.playlist.json

:::

- **Usage**:
Resolve a track, user or playlist using the public APIv1. Works in browsers.

You can determine the type of the returned Object by inspecting its `kind` property.
It'll either be `"user"`, `"track"` or `"playlist"`

- **Example**:

```ts
import { resolve } from "opensoundcloud"
const client_id = "aaabbbcccdddeeefff00011122233344" // your v1 client_id
const resolvedUser = await resolve.browser("noisia", client_id)
console.log(resolvedUser.kind) //> "user"
const resolvedTrack = await resolve.browser("noisia/deep-down", client_id)
console.log(resolvedTrack.kind) //> "track"
const resolvedPlaylist = await resolve.browser("noisia/sets/noisia-radio", client_id)
console.log(resolvedPlaylist.kind) //> "playlist"
```
7 changes: 3 additions & 4 deletions docs/guide/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ Install into your project:

## Usage info

Opensoundcloud works in both Node.js and the browser,
but since CORS is not enabled for the APIv2 nor for web-scraping,
you can only use methods that end in `.browser` in the browser.
Opensoundcloud only works in Node.js, because CORS is neither
enabled for the APIv2 nor for web-scraping.

Therefore, using opensoundcloud on the server
or in an environment where CORS is not required is recommended.
or in an environment where CORS is required.

## Basic example

Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
"vuepress-theme-default-prefers-color-scheme": "^2.0.0"
},
"ava": {
"failFast": true,
"extensions": [
"ts"
],
Expand Down
2 changes: 0 additions & 2 deletions src/playlist.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,4 @@ const playlist = async (identifier: URLorID, client_id?: ClientIDv2): Promise<Pl
playlist.id = byID
playlist.url = byURL

// TODO browser equivalents with pagination

export default playlist
24 changes: 2 additions & 22 deletions src/resolve.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
import type { APIv1Resolve, ScrapeResolve } from "../types/resolve"
import type { ScrapeResolve } from "../types/resolve"

import ky from "ky-universal"
import { APIv1, at, scrapeData, urlify } from "./util"
import { at, scrapeData, urlify } from "./util"

/**
* Resolve a track, user or playlist using web scraping.
* This doesn't work in browsers, as CORS is disabled.
* In browsers you have to use `resolve.browser` instead.
* @param url
*/
const resolve = async (url: string): Promise<ScrapeResolve> => {
Expand All @@ -16,21 +13,4 @@ const resolve = async (url: string): Promise<ScrapeResolve> => {
return data[0] as ScrapeResolve
}

/**
* Resolve a track, user or playlist using the public APIv1.
* This works in browsers, as CORS is enabled.
* @param url the url to resolve
* @param client_id a APIv1 client_id
*/
resolve.browser = async (url: string, client_id: string): Promise<APIv1Resolve> => {
url = urlify(url)

if (!client_id) throw new Error("APIv1 client_id has to be provided")

const searchParams = { url, client_id }
const data = await ky(`${APIv1}/resolve`, { searchParams })

return (await data.json()) as APIv1Resolve
}

export default resolve
1 change: 0 additions & 1 deletion src/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import ky from "ky-universal"
export const issueURL = "https://github.com/cloudr-app/opensoundcloud/issues/new"

export const scrapeURL = "https://soundcloud.com"
export const APIv1 = "https://api.soundcloud.com"
export const APIv2 = "https://api-v2.soundcloud.com"
export const defaultLimit = 20
export const urlify = (url: string, base = scrapeURL): string => {
Expand Down
24 changes: 0 additions & 24 deletions tests/resolve.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,27 +30,3 @@ test("resolve track", async t => {
test("resolve user using invalid URL", async t => {
await t.throwsAsync(resolve("https://vaaski.dev"))
})

test("resolve.browser user", async t => {
const data = await resolve.browser(exampleUserURL, client_id)
t.is(data.kind, "user")
t.truthy(data.username)
t.truthy(data.id)
})

test("resolve.browser playlist", async t => {
const data = await resolve.browser(examplePlaylistURL, client_id)
t.is(data.kind, "playlist")
t.truthy(data.id)
})

test("resolve.browser track", async t => {
const data = await resolve.browser(exampleTrackURL, client_id)
t.is(data.kind, "track")
t.truthy(data.id)
})

test("resolve.browser user throws without client_id", async t => {
// @ts-expect-error intentionally without client_id
await t.throwsAsync(resolve.browser(exampleUserURL))
})
1 change: 0 additions & 1 deletion types/index.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export type URLorID = string | number
export type ClientIDv1 = string
export type ClientIDv2 = string
export interface PaginatedOptions {
limit?: number
Expand Down
157 changes: 0 additions & 157 deletions types/resolve.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -296,160 +296,3 @@ export interface Visual {
entry_time: number
visual_url: string
}

export interface APIv1Resolve {
duration?: number
release_day?: null
permalink_url: string
genre?: string
permalink: string
purchase_url?: null
release_month?: null
description: null | string
tags?: string
uri: string
label_name?: null
label?: null
tag_list?: string
release_year?: null
track_count?: number
user_id?: number
last_modified: string
license?: License
tracks?: APIv1ResolveTrack[]
playlist_type?: string
id: number
tracks_uri?: string
downloadable?: boolean | null
sharing?: Sharing
created_at?: string
release?: null
likes_count?: number
kind: ResolvedKind
title?: string
type?: string
purchase_title?: null
artwork_url?: null
ean?: null
streamable?: boolean
user?: APIv1ResolveUser
embeddable_by?: EmbeddableBy
label_id?: null
username?: string
avatar_url?: string
country?: null
first_name?: string
last_name?: string
full_name?: string
city?: string
discogs_name?: null
myspace_name?: null
website?: null
website_title?: null
playlist_count?: number
online?: boolean
plan?: string
public_favorites_count?: number
followers_count?: number
followings_count?: number
subscriptions?: any[]
reposts_count?: number
commentable?: boolean
comment_count?: number
state?: State
original_content_size?: number
track_type?: null
key_signature?: null
isrc?: null
video_url?: null
bpm?: null
original_format?: OriginalFormat
user_uri?: string
stream_url?: string
download_url?: string
waveform_url?: string
domain_lockings?: null
available_country_codes?: null
secret_token?: null
secret_uri?: null
user_favorite?: null
user_playback_count?: null
playback_count?: number
download_count?: number
favoritings_count?: number
downloads_remaining?: null
}

export enum OriginalFormat {
FLAC = "flac",
Mp3 = "mp3",
Wav = "wav",
}

export interface APIv1ResolveTrack {
kind: TrackKind
id: number
created_at: string
user_id: number
duration: number
commentable: boolean
comment_count: number
state: State
original_content_size: number
last_modified: string
sharing: Sharing
tag_list: string
permalink: string
streamable: boolean
embeddable_by: EmbeddableBy
purchase_url: null | string
purchase_title: null | string
label_id: null
genre: string
title: string
description: string
label_name: null
release: null
track_type: null
key_signature: null
isrc: null
video_url: null
bpm: null
release_year: number | null
release_month: number | null
release_day: number | null
original_format: OriginalFormat
license: License
uri: string
user: APIv1ResolveUser
user_uri: string
permalink_url: string
artwork_url: string
stream_url: string
download_url: string
waveform_url: string
domain_lockings: null
available_country_codes: null
label: null
secret_token: null
secret_uri: null
user_favorite: null
user_playback_count: null
playback_count: number
download_count: number
favoritings_count: number
reposts_count: number
downloadable: boolean
downloads_remaining: null
}

export interface APIv1ResolveUser {
id: number
kind: UserKind
permalink: string
username: string
last_modified: string
uri: string
permalink_url: string
avatar_url: string
}

0 comments on commit 12e0671

Please sign in to comment.