mirror of
https://github.com/idanoo/GoScrobble.git
synced 2024-11-28 19:35:15 +00:00
982 lines
29 KiB
HTML
982 lines
29 KiB
HTML
|
|
<!doctype html>
|
|
<html>
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta content="IE=edge,chrome=1" http-equiv="X-UA-Compatible">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
|
|
<meta
|
|
name="description"
|
|
content="Documentation for the GoScrobble API"
|
|
>
|
|
<title>GoScrobble API Documentation</title>
|
|
|
|
<style media="screen">
|
|
.highlight table td { padding: 5px; }
|
|
.highlight table pre { margin: 0; }
|
|
.highlight .gh {
|
|
color: #999999;
|
|
}
|
|
.highlight .sr {
|
|
color: #f6aa11;
|
|
}
|
|
.highlight .go {
|
|
color: #888888;
|
|
}
|
|
.highlight .gp {
|
|
color: #555555;
|
|
}
|
|
.highlight .gs {
|
|
}
|
|
.highlight .gu {
|
|
color: #aaaaaa;
|
|
}
|
|
.highlight .nb {
|
|
color: #f6aa11;
|
|
}
|
|
.highlight .cm {
|
|
color: #75715e;
|
|
}
|
|
.highlight .cp {
|
|
color: #75715e;
|
|
}
|
|
.highlight .c1 {
|
|
color: #75715e;
|
|
}
|
|
.highlight .cs {
|
|
color: #75715e;
|
|
}
|
|
.highlight .c, .highlight .ch, .highlight .cd, .highlight .cpf {
|
|
color: #75715e;
|
|
}
|
|
.highlight .err {
|
|
color: #960050;
|
|
}
|
|
.highlight .gr {
|
|
color: #960050;
|
|
}
|
|
.highlight .gt {
|
|
color: #960050;
|
|
}
|
|
.highlight .gd {
|
|
color: #49483e;
|
|
}
|
|
.highlight .gi {
|
|
color: #49483e;
|
|
}
|
|
.highlight .ge {
|
|
color: #49483e;
|
|
}
|
|
.highlight .kc {
|
|
color: #66d9ef;
|
|
}
|
|
.highlight .kd {
|
|
color: #66d9ef;
|
|
}
|
|
.highlight .kr {
|
|
color: #66d9ef;
|
|
}
|
|
.highlight .no {
|
|
color: #66d9ef;
|
|
}
|
|
.highlight .kt {
|
|
color: #66d9ef;
|
|
}
|
|
.highlight .mf {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .mh {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .il {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .mi {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .mo {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .m, .highlight .mb, .highlight .mx {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .sc {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .se {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .ss {
|
|
color: #ae81ff;
|
|
}
|
|
.highlight .sd {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .s2 {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .sb {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .sh {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .si {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .sx {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .s1 {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .s, .highlight .sa, .highlight .dl {
|
|
color: #e6db74;
|
|
}
|
|
.highlight .na {
|
|
color: #a6e22e;
|
|
}
|
|
.highlight .nc {
|
|
color: #a6e22e;
|
|
}
|
|
.highlight .nd {
|
|
color: #a6e22e;
|
|
}
|
|
.highlight .ne {
|
|
color: #a6e22e;
|
|
}
|
|
.highlight .nf, .highlight .fm {
|
|
color: #a6e22e;
|
|
}
|
|
.highlight .vc {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .nn {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .ni {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .bp {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .vg {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .vi {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .nv, .highlight .vm {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .w {
|
|
color: #ffffff;
|
|
}
|
|
.highlight {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .n, .highlight .py, .highlight .nx {
|
|
color: #ffffff;
|
|
}
|
|
.highlight .nl {
|
|
color: #f92672;
|
|
}
|
|
.highlight .ow {
|
|
color: #f92672;
|
|
}
|
|
.highlight .nt {
|
|
color: #f92672;
|
|
}
|
|
.highlight .k, .highlight .kv {
|
|
color: #f92672;
|
|
}
|
|
.highlight .kn {
|
|
color: #f92672;
|
|
}
|
|
.highlight .kp {
|
|
color: #f92672;
|
|
}
|
|
.highlight .o {
|
|
color: #f92672;
|
|
}
|
|
</style>
|
|
<style media="print">
|
|
* {
|
|
-webkit-transition:none!important;
|
|
transition:none!important;
|
|
}
|
|
.highlight table td { padding: 5px; }
|
|
.highlight table pre { margin: 0; }
|
|
.highlight, .highlight .w {
|
|
color: #586e75;
|
|
}
|
|
.highlight .err {
|
|
color: #002b36;
|
|
background-color: #dc322f;
|
|
}
|
|
.highlight .c, .highlight .ch, .highlight .cd, .highlight .cm, .highlight .cpf, .highlight .c1, .highlight .cs {
|
|
color: #657b83;
|
|
}
|
|
.highlight .cp {
|
|
color: #b58900;
|
|
}
|
|
.highlight .nt {
|
|
color: #b58900;
|
|
}
|
|
.highlight .o, .highlight .ow {
|
|
color: #93a1a1;
|
|
}
|
|
.highlight .p, .highlight .pi {
|
|
color: #93a1a1;
|
|
}
|
|
.highlight .gi {
|
|
color: #859900;
|
|
}
|
|
.highlight .gd {
|
|
color: #dc322f;
|
|
}
|
|
.highlight .gh {
|
|
color: #268bd2;
|
|
background-color: #002b36;
|
|
font-weight: bold;
|
|
}
|
|
.highlight .k, .highlight .kn, .highlight .kp, .highlight .kr, .highlight .kv {
|
|
color: #6c71c4;
|
|
}
|
|
.highlight .kc {
|
|
color: #cb4b16;
|
|
}
|
|
.highlight .kt {
|
|
color: #cb4b16;
|
|
}
|
|
.highlight .kd {
|
|
color: #cb4b16;
|
|
}
|
|
.highlight .s, .highlight .sb, .highlight .sc, .highlight .dl, .highlight .sd, .highlight .s2, .highlight .sh, .highlight .sx, .highlight .s1 {
|
|
color: #859900;
|
|
}
|
|
.highlight .sa {
|
|
color: #6c71c4;
|
|
}
|
|
.highlight .sr {
|
|
color: #2aa198;
|
|
}
|
|
.highlight .si {
|
|
color: #d33682;
|
|
}
|
|
.highlight .se {
|
|
color: #d33682;
|
|
}
|
|
.highlight .nn {
|
|
color: #b58900;
|
|
}
|
|
.highlight .nc {
|
|
color: #b58900;
|
|
}
|
|
.highlight .no {
|
|
color: #b58900;
|
|
}
|
|
.highlight .na {
|
|
color: #268bd2;
|
|
}
|
|
.highlight .m, .highlight .mb, .highlight .mf, .highlight .mh, .highlight .mi, .highlight .il, .highlight .mo, .highlight .mx {
|
|
color: #859900;
|
|
}
|
|
.highlight .ss {
|
|
color: #859900;
|
|
}
|
|
</style>
|
|
<link href="stylesheets/screen-cfdc3565.css" rel="stylesheet" media="screen" />
|
|
<link href="stylesheets/print-953e3353.css" rel="stylesheet" media="print" />
|
|
<script src="javascripts/all-b12a2749.js"></script>
|
|
|
|
<script>
|
|
$(function() { setupCodeCopy(); });
|
|
</script>
|
|
</head>
|
|
|
|
<body class="index" data-languages="["shell"]">
|
|
<a href="#" id="nav-button">
|
|
<span>
|
|
NAV
|
|
<img src="images/navbar-cad8cdcb.png" alt="" />
|
|
</span>
|
|
</a>
|
|
<div class="toc-wrapper">
|
|
<img src="images/logo-7aa55c75.png" class="logo" alt="" />
|
|
<div class="lang-selector">
|
|
<a href="#" data-language-name="shell">shell</a>
|
|
</div>
|
|
<div class="search">
|
|
<input type="text" class="search" id="input-search" placeholder="Search">
|
|
</div>
|
|
<ul class="search-results"></ul>
|
|
<ul id="toc" class="toc-list-h1">
|
|
<li>
|
|
<a href="#introduction" class="toc-h1 toc-link" data-title="Introduction">Introduction</a>
|
|
</li>
|
|
<li>
|
|
<a href="#rate-limits" class="toc-h1 toc-link" data-title="Rate Limits">Rate Limits</a>
|
|
</li>
|
|
<li>
|
|
<a href="#server-info" class="toc-h1 toc-link" data-title="Server Info">Server Info</a>
|
|
<ul class="toc-list-h2">
|
|
<li>
|
|
<a href="#get-v1-serverinfo" class="toc-h2 toc-link" data-title="GET v1/serverinfo">GET v1/serverinfo</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href="#administration" class="toc-h1 toc-link" data-title="Administration">Administration</a>
|
|
<ul class="toc-list-h2">
|
|
<li>
|
|
<a href="#get-v1-config" class="toc-h2 toc-link" data-title="GET v1/config">GET v1/config</a>
|
|
</li>
|
|
<li>
|
|
<a href="#post-v1-config" class="toc-h2 toc-link" data-title="POST v1/config">POST v1/config</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href="#authentication" class="toc-h1 toc-link" data-title="Authentication">Authentication</a>
|
|
<ul class="toc-list-h2">
|
|
<li>
|
|
<a href="#post-v1-login" class="toc-h2 toc-link" data-title="POST v1/login">POST v1/login</a>
|
|
</li>
|
|
<li>
|
|
<a href="#post-v1-register" class="toc-h2 toc-link" data-title="POST v1/register">POST v1/register</a>
|
|
</li>
|
|
<li>
|
|
<a href="#post-v1-sendreset" class="toc-h2 toc-link" data-title="POST v1/sendreset">POST v1/sendreset</a>
|
|
</li>
|
|
<li>
|
|
<a href="#post-v1-resetpassword" class="toc-h2 toc-link" data-title="POST v1/resetpassword">POST v1/resetpassword</a>
|
|
</li>
|
|
<li>
|
|
<a href="#post-v1-refresh" class="toc-h2 toc-link" data-title="POST v1/refresh">POST v1/refresh</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
<li>
|
|
<a href="#ingress-endpoints" class="toc-h1 toc-link" data-title="Ingress Endpoints">Ingress Endpoints</a>
|
|
<ul class="toc-list-h2">
|
|
<li>
|
|
<a href="#post-v1-ingress-jellyfin" class="toc-h2 toc-link" data-title="POST v1/ingress/jellyfin">POST v1/ingress/jellyfin</a>
|
|
</li>
|
|
<li>
|
|
<a href="#post-v1-ingress-multiscrobbler" class="toc-h2 toc-link" data-title="POST v1/ingress/multiscrobbler">POST v1/ingress/multiscrobbler</a>
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
<ul class="toc-footer">
|
|
<li><a href='https://goscrobble.com'>GoScrobble website</a></li>
|
|
<li><a href='https://gitlab.com/goscrobble/goscrobble-api'>Backend Repository</a></li>
|
|
<li><a href='https://gitlab.com/goscrobble/goscrobble-web'>Frontend Repository</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="page-wrapper">
|
|
<div class="dark-box"></div>
|
|
<div class="content">
|
|
<h1 id='introduction'>Introduction</h1>
|
|
<p>Welcome to the GoScrobble API documentation.</p>
|
|
|
|
<p>The majority of these API endpoints are public with rate limiting and do not require authentication.</p>
|
|
|
|
<p>Base URL for the API endpoints: https://goscrobble.com/api</p>
|
|
<h1 id='rate-limits'>Rate Limits</h1>
|
|
<p>There are 3 tiers of rate-limiting:<br>
|
|
Light rate-limiting: 1 request per 4 seconds with a max burst of 2.<br>
|
|
Standard rate-limiting: 5 requests per second with a burst of 5.<br>
|
|
Heavy rate-limiting: 10 requests per second with a burst of 10. </p>
|
|
|
|
<p>The rate limits work as a 'bucket' system where there is a max (burst) and a regenerative rate. More info can be found in the source file server_middleware.go.</p>
|
|
|
|
<p>Each endpoint will depict which rate limit applies.</p>
|
|
|
|
<p>For example:
|
|
On the medium rate-limiter, you start with 5 requests available to you instantly, and this replenishes 5 requests per second.</p>
|
|
<h1 id='server-info'>Server Info</h1><h2 id='get-v1-serverinfo'>GET v1/serverinfo</h2>
|
|
<blockquote>
|
|
<p>Check server version and registration status:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/serverinfo"</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"version"</span><span class="p">:</span><span class="s2">"0.1.1"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"registration_enabled"</span><span class="p">:</span><span class="s2">"1"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>This endpoint is used to get server API version and registration status.</p>
|
|
<h3 id='http-request'>HTTP Request</h3>
|
|
<p><code>GET https://goscrobble.com/api/v1/serverstatus</code></p>
|
|
<h1 id='administration'>Administration</h1>
|
|
<aside class="warning">
|
|
An admin JWT token is required for the below endpoints
|
|
</aside>
|
|
<h2 id='get-v1-config'>GET v1/config</h2>
|
|
<blockquote>
|
|
<p>Fetch configuration values:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/config"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImVtYWlsIjoidGVzdEB0ZXN0LmNvbSIsImV4cCI6MTY0MTAwMjUxOSwiaWF0IjoxNjQwMzk3NzE5LCJtb2QiOnRydWUsI"</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"SPOTIFY_API_ID"</span><span class="p">:</span><span class="w"> </span><span class="s2">"abc"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"SPOTIFY_API_SECRET"</span><span class="p">:</span><span class="w"> </span><span class="s2">"def"</span><span class="p">,</span><span class="w">
|
|
</span><span class="nl">"REGISTRATION_ENABLED"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>Fetch instance configuration values.</p>
|
|
|
|
<aside class="notice">
|
|
Standard rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request'>HTTP Request</h3>
|
|
<p><code>GET https://goscrobble.com/api/v1/config</code></p>
|
|
<h2 id='post-v1-config'>POST v1/config</h2>
|
|
<blockquote>
|
|
<p>Update a configuration parameter:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/config"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImVtYWlsIjoidGVzdEB0ZXN0LmNvbSIsImV4cCI6MTY0MTAwMjUxOSwiaWF0IjoxNjQwMzk3NzE5LCJtb2QiOnRydWUsI"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"SPOTIFY_API_ID":"notarealapikey","SPOTIFY_API_SECRET":"notarealsecret"}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Config updated successfully"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>Updates instance configuration values.</p>
|
|
|
|
<aside class="notice">
|
|
Standard rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request-2'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/config</code></p>
|
|
<h3 id='query-parameters'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>key</td>
|
|
<td>true</td>
|
|
<td>Array of key/value pairs to update. See example.</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<h1 id='authentication'>Authentication</h1><h2 id='post-v1-login'>POST v1/login</h2>
|
|
<blockquote>
|
|
<p>To obtain a JWT token (Replace default credentials):</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/login"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"username":"abc","password":"def"}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"token"</span><span class="p">:</span><span class="w"> </span><span class="s2">"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImVtYWlsIjoidGVzdEB0ZXN0LmNvbSIsImV4cCI6MTY0MTAwMjUxOSwiaWF0IjoxNjQwMzk3NzE5LCJtb2QiOnRydWUsInJlZnJlc2hfZXhwIjoxNjQxMDAyNTE5LCJyZWZyZXNoX3Rva2VuIjoiYWJjZGVmZ2hqaWtsbW5vcHF3ZXJ0dXZ3eHl6Iiwic3ViIjoiNDE4ZmRkZmItOGIxYi01MWFiLTliZHMtNGZnMDhjYTYzY2ZmIiwidXNlcm5hbWUiOiJ0ZXN0In0.fuPXjQ7IzNyttgIKpdS4-KBQ-QeHTl-BfgYkSnMCmpVrBunzMrSwr1RzxI7Xg2WWF-FHtW3Bnv9RpSqLDN4F2g"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>This endpoint is used to authenticate and retrieve a JWT token.</p>
|
|
|
|
<aside class="notice">
|
|
Standard rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/login</code></p>
|
|
<h3 id='query-parameters'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>username</td>
|
|
<td>true</td>
|
|
<td>Account username</td>
|
|
</tr>
|
|
<tr>
|
|
<td>password</td>
|
|
<td>true</td>
|
|
<td>Account password</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<h2 id='post-v1-register'>POST v1/register</h2>
|
|
<blockquote>
|
|
<p>Create a new account (Replace default credentials):</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/register"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"email": "test@test.com", "username":"abc","password":"def"}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"User created succesfully. You may now login"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>If the server has REGISTRATION_ENABLED=true set, this endpoint will allow you to create a new account. Password must be at least 8 characters long.</p>
|
|
|
|
<aside class="notice">
|
|
Heavy rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request-2'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/register</code></p>
|
|
<h3 id='query-parameters-2'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>email</td>
|
|
<td>true</td>
|
|
<td>Account email</td>
|
|
</tr>
|
|
<tr>
|
|
<td>username</td>
|
|
<td>true</td>
|
|
<td>Account username</td>
|
|
</tr>
|
|
<tr>
|
|
<td>password</td>
|
|
<td>true</td>
|
|
<td>Account password</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<h2 id='post-v1-sendreset'>POST v1/sendreset</h2>
|
|
<blockquote>
|
|
<p>Trigger a password reset email:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/sendreset"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"email":"test@test.com"}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Password reset email sent"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>This endpoint triggers a password reset email to be sent to the email on an account.</p>
|
|
|
|
<aside class="notice">
|
|
Heavy rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request-3'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/sendreset</code></p>
|
|
<h3 id='query-parameters-3'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>email</td>
|
|
<td>true</td>
|
|
<td>Account username</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<h2 id='post-v1-resetpassword'>POST v1/resetpassword</h2>
|
|
<blockquote>
|
|
<p>Trigger a password reset email:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/resetpassword"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"token":"abcdefghijklmnopqrstuvwxyz", "password": "Hunter1"}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Password updated successfully!"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>This endpoint confirms a password reset with a valid hash from the reset email. You must call v1/sendreset first and obtain the hash.</p>
|
|
|
|
<aside class="notice">
|
|
Heavy rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request-4'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/resetpassword</code></p>
|
|
<h3 id='query-parameters-4'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>token</td>
|
|
<td>true</td>
|
|
<td>Reset token from the password reset email</td>
|
|
</tr>
|
|
<tr>
|
|
<td>password</td>
|
|
<td>true</td>
|
|
<td>New account password</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<h2 id='post-v1-refresh'>POST v1/refresh</h2>
|
|
<blockquote>
|
|
<p>Fetch a new JWT with a refresh token:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/refresh"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"token":"abcdefghijklmnopqrstuvwxyz"}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"token"</span><span class="p">:</span><span class="w"> </span><span class="s2">"eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImVtYWlsIjoidGVzdEB0ZXN0LmNvbSIsImV4cCI6MTY0MTAwMjUxOSwiaWF0IjoxNjQwMzk3NzE5LCJtb2QiOnRydWUsInJlZnJlc2hfZXhwIjoxNjQxMDAyNTE5LCJyZWZyZXNoX3Rva2VuIjoiYWJjZGVmZ2hqaWtsbW5vcHF3ZXJ0dXZ3eHl6Iiwic3ViIjoiNDE4ZmRkZmItOGIxYi01MWFiLTliZHMtNGZnMDhjYTYzY2ZmIiwidXNlcm5hbWUiOiJ0ZXN0In0.fuPXjQ7IzNyttgIKpdS4-KBQ-QeHTl-BfgYkSnMCmpVrBunzMrSwr1RzxI7Xg2WWF-FHtW3Bnv9RpSqLDN4F2g"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>Returns a new JWT token by passing a refresh token.</p>
|
|
|
|
<aside class="notice">
|
|
Standard rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request-5'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/refresh</code></p>
|
|
<h3 id='query-parameters-5'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>token</td>
|
|
<td>true</td>
|
|
<td>Refresh token from previously issued JWT</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<h1 id='ingress-endpoints'>Ingress Endpoints</h1>
|
|
<p>Spotify and Navidrome both work on a poll based system and do not require incoming webhooks/endpoints.</p>
|
|
<h2 id='post-v1-ingress-jellyfin'>POST v1/ingress/jellyfin</h2>
|
|
<blockquote>
|
|
<p>Submit a scrobble:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/ingress/jellyfin"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImVtYWlsIjoidGVzdEB0ZXN0LmNvbSIsImV4cCI6MTY0MTAwMjUxOSwiaWF0IjoxNjQwMzk3NzE5LCJtb2QiOnRydWUsI"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"Name":"<Full JSON structure located in ingress_jellyfin.go>", "Album":"Best Album","Artist":"Best Artist"}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>Adds a scrobble from Jellyfin into the database. Please view <code>type JellyfinRequest struct</code> in ingress_jellyfin.go for the full request format. You need to install the webhook plugin for this to work.</p>
|
|
|
|
<aside class="notice">
|
|
Light rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/ingress/jellyfin</code></p>
|
|
<h3 id='query-parameters'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Type</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>Album</td>
|
|
<td>true</td>
|
|
<td>string</td>
|
|
<td>Album title</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Artist</td>
|
|
<td>true</td>
|
|
<td>string</td>
|
|
<td>Artist name</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Name</td>
|
|
<td>true</td>
|
|
<td>string</td>
|
|
<td>Song title</td>
|
|
</tr>
|
|
<tr>
|
|
<td>ItemType</td>
|
|
<td>true</td>
|
|
<td>string</td>
|
|
<td>Will only scrobble type 'Audio'</td>
|
|
</tr>
|
|
<tr>
|
|
<td>ClientName</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>DeviceId</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>DeviceName</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>IsAutomated</td>
|
|
<td>false</td>
|
|
<td>bool</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>IsPaused</td>
|
|
<td>false</td>
|
|
<td>bool</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>ItemId</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>MediaSourceId</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>NotificationType</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Overview</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>PlaybackPosition</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>PlaybackPositionTicks</td>
|
|
<td>false</td>
|
|
<td>int</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Provider_musicbrainzalbum</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Provider_musicbrainzalbumartist</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Provider_musicbrainzartist</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Provider_musicbrainzreleasegroup</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Provider_musicbrainztrack</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>RunTime</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>RunTimeTicks</td>
|
|
<td>false</td>
|
|
<td>int</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>ServerId</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>ServerName</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>ServerUrl</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>ServerVersion</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Timestamp</td>
|
|
<td>false</td>
|
|
<td>string</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
<tr>
|
|
<td>UserId</td>
|
|
<td>false</td>
|
|
<td>TBD</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Username</td>
|
|
<td>false</td>
|
|
<td>TBD</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>UtcTimestamp</td>
|
|
<td>false</td>
|
|
<td>TBD</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td>Year</td>
|
|
<td>false</td>
|
|
<td>int</td>
|
|
<td>TBD</td>
|
|
</tr>
|
|
</tbody></table>
|
|
<h2 id='post-v1-ingress-multiscrobbler'>POST v1/ingress/multiscrobbler</h2>
|
|
<blockquote>
|
|
<p>Submit a scrobble:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="s2">"https://goscrobble.com/api/v1/ingress/multiscrobbler"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
|
|
<span class="nt">-H</span> <span class="s2">"Authorization: Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJhZG1pbiI6ZmFsc2UsImVtYWlsIjoidGVzdEB0ZXN0LmNvbSIsImV4cCI6MTY0MTAwMjUxOSwiaWF0IjoxNjQwMzk3NzE5LCJtb2QiOnRydWUsI"</span> <span class="se">\</span>
|
|
<span class="nt">-X</span> POST <span class="se">\</span>
|
|
<span class="nt">--data</span> <span class="s1">'{"Track":"<Full JSON structure located in ingress_multiscrobbler.go>", "Album":"Best Album","Artist":["Best Artist1", "Best Artist2"]}'</span>
|
|
</code></pre></div>
|
|
<blockquote>
|
|
<p>Response:</p>
|
|
</blockquote>
|
|
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
|
|
</span><span class="nl">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w">
|
|
</span><span class="p">}</span><span class="w">
|
|
</span></code></pre></div>
|
|
<p>Adds a scrobble from MultiScrobbler into the database. Please view <code>type MultiScrobblerRequest struct</code> in ingress_multiscrobbler.go for the full request format.</p>
|
|
|
|
<aside class="notice">
|
|
Light rate-limiting applies
|
|
</aside>
|
|
<h3 id='http-request-2'>HTTP Request</h3>
|
|
<p><code>POST https://goscrobble.com/api/v1/ingress/multiscrobbler</code></p>
|
|
<h3 id='query-parameters-2'>Query Parameters</h3>
|
|
<table><thead>
|
|
<tr>
|
|
<th>Parameter</th>
|
|
<th>Required</th>
|
|
<th>Type</th>
|
|
<th>Description</th>
|
|
</tr>
|
|
</thead><tbody>
|
|
<tr>
|
|
<td>Album</td>
|
|
<td>true</td>
|
|
<td>string</td>
|
|
<td>Album title</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Artist</td>
|
|
<td>true</td>
|
|
<td>array</td>
|
|
<td>Array of Artist names</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Track</td>
|
|
<td>true</td>
|
|
<td>string</td>
|
|
<td>Song title</td>
|
|
</tr>
|
|
<tr>
|
|
<td>PlayedAt</td>
|
|
<td>true</td>
|
|
<td>int</td>
|
|
<td>Unix Timestamp of scrobble time</td>
|
|
</tr>
|
|
<tr>
|
|
<td>Duration</td>
|
|
<td>true</td>
|
|
<td>int</td>
|
|
<td>Song length in seconds</td>
|
|
</tr>
|
|
</tbody></table>
|
|
|
|
</div>
|
|
<div class="dark-box">
|
|
<div class="lang-selector">
|
|
<a href="#" data-language-name="shell">shell</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|