mirror of
https://github.com/BradNut/graphbrainz
synced 2025-09-08 17:40:32 +00:00
Add link to Spotify extension
This commit is contained in:
parent
50c3223e6a
commit
1499e07fa7
1 changed files with 35 additions and 31 deletions
|
|
@ -65,13 +65,13 @@ graphbrainz({
|
||||||
The following extensions are included with GraphBrainz and loaded by default.
|
The following extensions are included with GraphBrainz and loaded by default.
|
||||||
See their respective documentation pages for schema info and config options.
|
See their respective documentation pages for schema info and config options.
|
||||||
|
|
||||||
* [Cover Art Archive](./cover-art-archive.md): Retrieve cover art images for
|
- [Cover Art Archive](./cover-art-archive.md): Retrieve cover art images for
|
||||||
releases from the Cover Art Archive.
|
releases from the Cover Art Archive.
|
||||||
* [fanart.tv](./fanart-tv.md): Retrieve high quality artwork for artists,
|
- [fanart.tv](./fanart-tv.md): Retrieve high quality artwork for artists,
|
||||||
releases, and labels from fanart.tv.
|
releases, and labels from fanart.tv.
|
||||||
* [MediaWiki](./mediawiki.md): Retrieve information from MediaWiki image pages,
|
- [MediaWiki](./mediawiki.md): Retrieve information from MediaWiki image pages,
|
||||||
like the actual image file URL and EXIF metadata.
|
like the actual image file URL and EXIF metadata.
|
||||||
* [TheAudioDB](./the-audio-db.md): Retrieve images and information about artists,
|
- [TheAudioDB](./the-audio-db.md): Retrieve images and information about artists,
|
||||||
releases, and recordings from TheAudioDB.com.
|
releases, and recordings from TheAudioDB.com.
|
||||||
|
|
||||||
## More Extensions
|
## More Extensions
|
||||||
|
|
@ -79,11 +79,13 @@ See their respective documentation pages for schema info and config options.
|
||||||
The following extensions are published separately, but can easily be added to
|
The following extensions are published separately, but can easily be added to
|
||||||
GraphBrainz by installing them:
|
GraphBrainz by installing them:
|
||||||
|
|
||||||
* [Last.fm](https://github.com/exogen/graphbrainz-extension-lastfm): Retrieve
|
- [Last.fm](https://github.com/exogen/graphbrainz-extension-lastfm): Retrieve
|
||||||
artist, release, and recording information from [Last.fm](https://www.last.fm/).
|
artist, release, and recording information from [Last.fm](https://www.last.fm/).
|
||||||
* [Discogs](https://github.com/exogen/graphbrainz-extension-discogs): Retrieve
|
- [Discogs](https://github.com/exogen/graphbrainz-extension-discogs): Retrieve
|
||||||
artist, label, release, and release group information from
|
artist, label, release, and release group information from
|
||||||
[Discogs](https://www.discogs.com/).
|
[Discogs](https://www.discogs.com/).
|
||||||
|
- [Spotify](https://github.com/exogen/graphbrainz-extension-spotify): Retrieve
|
||||||
|
artist, release, and recording information from [Spotify](https://www.spotify.com/).
|
||||||
|
|
||||||
## Extension API
|
## Extension API
|
||||||
|
|
||||||
|
|
@ -100,8 +102,8 @@ type Extension = {
|
||||||
description?: string,
|
description?: string,
|
||||||
extendContext?: (context: Context, options: Options) => Context,
|
extendContext?: (context: Context, options: Options) => Context,
|
||||||
extendSchema?:
|
extendSchema?:
|
||||||
{ schemas: Array<string | DocumentNode>, resolvers: ResolverMap } |
|
| { schemas: Array<string | DocumentNode>, resolvers: ResolverMap }
|
||||||
(schema: GraphQLSchema, options: Options) => GraphQLSchema
|
| ((schema: GraphQLSchema, options: Options) => GraphQLSchema)
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
@ -146,11 +148,13 @@ module.exports = {
|
||||||
name: 'Hello World',
|
name: 'Hello World',
|
||||||
description: 'A simple example extension.',
|
description: 'A simple example extension.',
|
||||||
extendSchema: {
|
extendSchema: {
|
||||||
schemas: [`
|
schemas: [
|
||||||
|
`
|
||||||
extend type Query {
|
extend type Query {
|
||||||
helloWorld: String!
|
helloWorld: String!
|
||||||
}
|
}
|
||||||
`],
|
`
|
||||||
|
],
|
||||||
resolvers: {
|
resolvers: {
|
||||||
Query: {
|
Query: {
|
||||||
helloWorld: {
|
helloWorld: {
|
||||||
|
|
@ -180,52 +184,52 @@ in your cap, there are a few guidelines you should follow in order to maintain
|
||||||
consistency with GraphBrainz and the built-in extensions. Here are some tips
|
consistency with GraphBrainz and the built-in extensions. Here are some tips
|
||||||
for writing a good extension:
|
for writing a good extension:
|
||||||
|
|
||||||
* If you need to make HTTP requests, using a [Client][] subclass will get you
|
- If you need to make HTTP requests, using a [Client][] subclass will get you
|
||||||
rate limiting, error handling, retrying, and a Promise-based API for free.
|
rate limiting, error handling, retrying, and a Promise-based API for free.
|
||||||
* Default to following the rate limiting rules of any APIs you use. If there
|
- Default to following the rate limiting rules of any APIs you use. If there
|
||||||
are no guidelines on rate limiting, consider playing nice anyway and limiting
|
are no guidelines on rate limiting, consider playing nice anyway and limiting
|
||||||
your client to around 1 to 10 requests per second.
|
your client to around 1 to 10 requests per second.
|
||||||
* Use a [DataLoader][dataloader] instance to batch and cache requests. Even if
|
- Use a [DataLoader][dataloader] instance to batch and cache requests. Even if
|
||||||
the data source doesn’t support batching, DataLoader will help by deduping
|
the data source doesn’t support batching, DataLoader will help by deduping
|
||||||
in-flight requests for the same key, preventing unnecessary requests.
|
in-flight requests for the same key, preventing unnecessary requests.
|
||||||
* Use a configurable cache and make sure you aren’t caching everything
|
- Use a configurable cache and make sure you aren’t caching everything
|
||||||
indefinitely by accident. The `cacheMap` option to DataLoader is a good place
|
indefinitely by accident. The `cacheMap` option to DataLoader is a good place
|
||||||
to put it.
|
to put it.
|
||||||
* Get as much configuration from environment variables as possible so that
|
- Get as much configuration from environment variables as possible so that
|
||||||
users can just run the standalone server instead of writing any code. If you
|
users can just run the standalone server instead of writing any code. If you
|
||||||
need more complex configuration, use a single field on the `options` object
|
need more complex configuration, use a single field on the `options` object
|
||||||
as a namespace for your extension’s options.
|
as a namespace for your extension’s options.
|
||||||
* Don’t hesitate to rename fields returned by third-party APIs when translating
|
- Don’t hesitate to rename fields returned by third-party APIs when translating
|
||||||
them to the GraphQL schema. Consistency with GraphQL conventions and the
|
them to the GraphQL schema. Consistency with GraphQL conventions and the
|
||||||
GraphBrainz schema is more desirable than consistency with the original API
|
GraphBrainz schema is more desirable than consistency with the original API
|
||||||
being used. Some general rules:
|
being used. Some general rules:
|
||||||
* Match type names to the service they’re coming from (e.g. many services use
|
- Match type names to the service they’re coming from (e.g. many services use
|
||||||
the words “album” and “track” and the type names should reflect that), but
|
the words “album” and “track” and the type names should reflect that), but
|
||||||
match scalar field names to their MusicBrainz equivalents when possible
|
match scalar field names to their MusicBrainz equivalents when possible
|
||||||
(e.g. `name` for artists but `title` for releases and recordings).
|
(e.g. `name` for artists but `title` for releases and recordings).
|
||||||
* Use camel case naming and capitalize acronyms (unless they are the only
|
- Use camel case naming and capitalize acronyms (unless they are the only
|
||||||
word), e.g. `id`, `url`, `artistID`, `pageURL`.
|
word), e.g. `id`, `url`, `artistID`, `pageURL`.
|
||||||
* If it’s ambiguous whether a field refers to an object/list vs. a scalar
|
- If it’s ambiguous whether a field refers to an object/list vs. a scalar
|
||||||
summary of an object/list, consider clarifying the field name, e.g. `user` →
|
summary of an object/list, consider clarifying the field name, e.g. `user` →
|
||||||
`userID`, `members` → `memberCount`.
|
`userID`, `members` → `memberCount`.
|
||||||
* Don’t include fields that are already available in MusicBrainz (unless it’s
|
- Don’t include fields that are already available in MusicBrainz (unless it’s
|
||||||
possible to retrieve an entity that isn’t in MusicBrainz). Only include
|
possible to retrieve an entity that isn’t in MusicBrainz). Only include
|
||||||
what’s relevant and useful.
|
what’s relevant and useful.
|
||||||
* Add descriptions for everything: types, fields, arguments, enum values, etc.
|
- Add descriptions for everything: types, fields, arguments, enum values, etc.
|
||||||
– with Markdown links wherever they’d be helpful.
|
– with Markdown links wherever they’d be helpful.
|
||||||
* When extending the built-in types, prefer adding a single object field that
|
- When extending the built-in types, prefer adding a single object field that
|
||||||
serves as a namespace rather than adding many fields. That way it’s more
|
serves as a namespace rather than adding many fields. That way it’s more
|
||||||
obvious that the data source isn’t MusicBrainz itself, and you’re less likely
|
obvious that the data source isn’t MusicBrainz itself, and you’re less likely
|
||||||
to conflict with new MusicBrainz fields in the future.
|
to conflict with new MusicBrainz fields in the future.
|
||||||
* Prefer using a [Relay][]-compliant schema for lists of objects that (1) have
|
- Prefer using a [Relay][]-compliant schema for lists of objects that (1) have
|
||||||
their own IDs and (2) are likely to be paginated. Feel free to add a `nodes`
|
their own IDs and (2) are likely to be paginated. Feel free to add a `nodes`
|
||||||
shortcut field to the Connection type (for users who want to skip over
|
shortcut field to the Connection type (for users who want to skip over
|
||||||
`edges`).
|
`edges`).
|
||||||
* If you publish your extension, consider prefixing the package name with
|
- If you publish your extension, consider prefixing the package name with
|
||||||
`graphbrainz-extension-` and having the default export of its `main` entry
|
`graphbrainz-extension-` and having the default export of its `main` entry
|
||||||
point be the extension object. That way, using it is as simple as adding the
|
point be the extension object. That way, using it is as simple as adding the
|
||||||
package name to the list of extensions.
|
package name to the list of extensions.
|
||||||
* Consider using [graphql-markdown][] to document the schema created by your
|
- Consider using [graphql-markdown][] to document the schema created by your
|
||||||
extension; this will match how GraphBrainz itself is documented. You can use
|
extension; this will match how GraphBrainz itself is documented. You can use
|
||||||
the [diffSchema][] function to document only the schema updates, see
|
the [diffSchema][] function to document only the schema updates, see
|
||||||
[scripts/build-extension-docs.js][build-extension-docs] for how this is done
|
[scripts/build-extension-docs.js][build-extension-docs] for how this is done
|
||||||
|
|
@ -233,13 +237,13 @@ for writing a good extension:
|
||||||
|
|
||||||
[graphql-tools]: http://dev.apollodata.com/tools/graphql-tools/index.html
|
[graphql-tools]: http://dev.apollodata.com/tools/graphql-tools/index.html
|
||||||
[schema stitching]: http://dev.apollodata.com/tools/graphql-tools/schema-stitching.html
|
[schema stitching]: http://dev.apollodata.com/tools/graphql-tools/schema-stitching.html
|
||||||
[mergeSchemas]: http://dev.apollodata.com/tools/graphql-tools/schema-stitching.html#mergeSchemas
|
[mergeschemas]: http://dev.apollodata.com/tools/graphql-tools/schema-stitching.html#mergeSchemas
|
||||||
[dataloader]: https://github.com/facebook/dataloader
|
[dataloader]: https://github.com/facebook/dataloader
|
||||||
[built-in extensions]: ../../src/extensions
|
[built-in extensions]: ../../src/extensions
|
||||||
[Client]: ../../src/api/client.js
|
[client]: ../../src/api/client.js
|
||||||
[graphql-markdown]: https://github.com/exogen/graphql-markdown
|
[graphql-markdown]: https://github.com/exogen/graphql-markdown
|
||||||
[diffSchema]: https://github.com/exogen/graphql-markdown#diffschemaoldschema-object-newschema-object-options-object
|
[diffschema]: https://github.com/exogen/graphql-markdown#diffschemaoldschema-object-newschema-object-options-object
|
||||||
[build-extension-docs]: ../../scripts/build-extension-docs.js
|
[build-extension-docs]: ../../scripts/build-extension-docs.js
|
||||||
[Relay]: https://facebook.github.io/relay/
|
[relay]: https://facebook.github.io/relay/
|
||||||
[GraphQL.js]: http://graphql.org/graphql-js/
|
[graphql.js]: http://graphql.org/graphql-js/
|
||||||
[addResolveFunctionsToSchema]: http://dev.apollodata.com/tools/graphql-tools/resolvers.html#addResolveFunctionsToSchema
|
[addresolvefunctionstoschema]: http://dev.apollodata.com/tools/graphql-tools/resolvers.html#addResolveFunctionsToSchema
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue