stremio-addon-client
Version:
Client library for using stremio addons (v3 protocol)
109 lines (62 loc) • 4.27 kB
Markdown
Client library for using stremio addons (v3 protocol). You can read the actual protocol [here](https://github.com/Stremio/stremio-addons-sdk/blob/master/docs/protocol.md).
This can be used to make a UI to the stremio addons. It is currently used in the [Stremio desktop app](https://www.stremio.com), [mobile app](https://www.stremio.com) and [web app](https://app.strem.io).
## Client
```javascript
const client = require('stremio-addon-client')
```
**NOTE**: All functions here can either return a `Promise` or be given a `callback(err, res)`
If it detects an add-on: `{ addon: AddonClientInstance }`
If it detects a collection: `{ collection: { /* collection descriptor that can be loaded by colletion.load() */ } }`
If it detects neither, it will throw an exception (or return an error if using a callback): `errors.ERR_RESP_UNRECOGNIZED`
Please note, this will apply the `stremio-addon-linter` to lint both add-ons and collections. If the linting fails, the `err` will contain `lintResult` property with the exact output from the linter.
#### `client.fromDescriptor(descriptor)` - returns an instance of AddonClient, from AddonDescriptor
Please note, `descriptor` must be a valid descriptor
#### Instance of AddonClient
##### `addon.get(resource, type, id [, extra])` - call the add-on with the given args
##### `addon.isSupported(resource, type, id)` - returns true/false depending on whether this addon supports this call, according to the manifest
##### `addon.manifest` - the manifest of the add-on
##### `addon.toDescriptor()` - returns an `AddonDescriptor`
### AddonClient Example
```javascript
client.detectFromURL('https://gateway.ipfs.io/ipfs/QmeZ431sbdzuqJppkiGMTucuZxwBH7CffQMtftkLDypBrg/manifest.json')
.then(function(resp) {
// resp.addon is an instance of AddonClient
return resp.addon.get('meta', 'movie', 'exmp:1')
})
.then(function(resp) {
console.log(resp.meta)
})
```
```javascript
let col = new client.AddonCollection()
col.load(require('stremio-official-addons'))
```
`col.getAddons()` - get an array of all Add-ons, where each is an instance of `AddonClient`
`col.load()` - load from an object that describes all add-ons (format: `[{ manifest, transportUrl, flags }]`, i.e. `[AddonDescriptor]`)
`col.save()` - get the object that describes all add-ons (same format as `col.load()`)
`col.includes(addon)` - returns boolean, whether the add-on is in the collection
`col.add(addon)` - adds an addon (`AddonClient`) to a collection
`col.remove(addon)` - removes an addon (`AddonClient`) from the collection
`col.clone()` - creates a clone of the collection
### Universal save/load format (`[AddonDescriptor]`)
The format of the `.save()` and `.load()` functions is widely used across Stremio to describe a collection of add-ons.
It can also be used to distribute collections of add-ons as JSON files amongst users - similar to the Kodi add-on repositories.
The format is `[{ manifest, transportUrl, flags }]` (also referred to as `[AddonDescriptor]`), where `flags` is ignored by Stremio if loading an untrusted collection.
`manifest` is a valid stremio addon v3 manifest
`transportUrl` is the URL to the add-on; the transport that will be used will be determined from this URL
`flags` is used when Stremio is loading a trusted collection (a built-in collection) to flag add-ons as official or protected
## mapURL
`client.mapURL(URL1)` (returns a string, URL2) is a function that will convert URL1 to a more browser-friendly URL2. This just means forcing HTTPS, and changing `localhost` to `127.0.0.1` (CORS does not work on localhost). Since this is needed in a lot of places, we expose that function, and recommend that every URL obtained by user input is passed through it before becoming `transportUrl`
## Internal APIs
#### Transport
```javascript
let transport = new Transport(url)
transport.manifest(cb)
transport.get(args, cb)
// transport.name
```
**NOTE** - you can synchronously construct instances of `AddonClient` by using the constructor directly: `new AddonClient(manifest, transport, flags)`