{"version":3,"file":"index.modern.mjs","sources":["../node_modules/querystringify/index.js","../node_modules/unfetch/dist/unfetch.module.js","../node_modules/isomorphic-unfetch/browser.js","../node_modules/jssha/dist/sha256.mjs","../src/utils.ts","../src/base.ts","../src/index.ts","../src/albums/index.ts","../src/artists/index.ts","../src/auth/index.ts","../src/bookmarks/index.ts","../src/catalogs/index.ts","../src/genres/index.ts","../src/labels/index.ts","../src/licenses/index.ts","../src/live-streams/index.ts","../src/playlists/index.ts","../src/podcasts/index.ts","../src/preferences/index.ts","../src/shares/index.ts","../src/shouts/index.ts","../src/songs/index.ts","../src/system/index.ts","../src/users/index.ts","../src/videos/index.ts"],"sourcesContent":["'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , undef;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String|Null} The decoded string.\n * @api private\n */\nfunction decode(input) {\n  try {\n    return decodeURIComponent(input.replace(/\\+/g, ' '));\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Attempts to encode a given input.\n *\n * @param {String} input The string that needs to be encoded.\n * @returns {String|Null} The encoded string.\n * @api private\n */\nfunction encode(input) {\n  try {\n    return encodeURIComponent(input);\n  } catch (e) {\n    return null;\n  }\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n  var parser = /([^=?#&]+)=?([^&]*)/g\n    , result = {}\n    , part;\n\n  while (part = parser.exec(query)) {\n    var key = decode(part[1])\n      , value = decode(part[2]);\n\n    //\n    // Prevent overriding of existing properties. This ensures that build-in\n    // methods like `toString` or __proto__ are not overriden by malicious\n    // querystrings.\n    //\n    // In the case if failed decoding, we want to omit the key/value pairs\n    // from the result.\n    //\n    if (key === null || value === null || key in result) continue;\n    result[key] = value;\n  }\n\n  return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n  prefix = prefix || '';\n\n  var pairs = []\n    , value\n    , key;\n\n  //\n  // Optionally prefix with a '?' if needed\n  //\n  if ('string' !== typeof prefix) prefix = '?';\n\n  for (key in obj) {\n    if (has.call(obj, key)) {\n      value = obj[key];\n\n      //\n      // Edge cases where we actually want to encode the value to an empty\n      // string instead of the stringified value.\n      //\n      if (!value && (value === null || value === undef || isNaN(value))) {\n        value = '';\n      }\n\n      key = encode(key);\n      value = encode(value);\n\n      //\n      // If we failed to encode the strings, we should bail out as we don't\n      // want to add invalid strings to the query.\n      //\n      if (key === null || value === null) continue;\n      pairs.push(key +'='+ value);\n    }\n  }\n\n  return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nexports.stringify = querystringify;\nexports.parse = querystring;\n","export default function(e,n){return n=n||{},new Promise(function(t,r){var s=new XMLHttpRequest,o=[],u=[],i={},a=function(){return{ok:2==(s.status/100|0),statusText:s.statusText,status:s.status,url:s.responseURL,text:function(){return Promise.resolve(s.responseText)},json:function(){return Promise.resolve(s.responseText).then(JSON.parse)},blob:function(){return Promise.resolve(new Blob([s.response]))},clone:a,headers:{keys:function(){return o},entries:function(){return u},get:function(e){return i[e.toLowerCase()]},has:function(e){return e.toLowerCase()in i}}}};for(var l in s.open(n.method||\"get\",e,!0),s.onload=function(){s.getAllResponseHeaders().replace(/^(.*?):[^\\S\\n]*([\\s\\S]*?)$/gm,function(e,n,t){o.push(n=n.toLowerCase()),u.push([n,t]),i[n]=i[n]?i[n]+\",\"+t:t}),t(a())},s.onerror=r,s.withCredentials=\"include\"==n.credentials,n.headers)s.setRequestHeader(l,n.headers[l]);s.send(n.body||null)})}\n//# sourceMappingURL=unfetch.module.js.map\n","module.exports = self.fetch || (self.fetch = require('unfetch').default || require('unfetch'));\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2023 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\",r=\"ARRAYBUFFER not supported by this environment\",n=\"UINT8ARRAY not supported by this environment\";function i(t,r,n,i){let e,s,o;const h=r||[0],u=(n=n||0)>>>3,f=-1===i?3:0;for(e=0;e<t.length;e+=1)o=e+u,s=o>>>2,h.length<=s&&h.push(0),h[s]|=t[e]<<8*(f+i*(o%4));return{value:h,binLen:8*t.length+n}}function e(e,s,o){switch(s){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(e){case\"HEX\":return function(t,r,n){return function(t,r,n,i){let e,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=r||[0],f=(n=n||0)>>>3,c=-1===i?3:0;for(e=0;e<t.length;e+=2){if(s=parseInt(t.substr(e,2),16),isNaN(s))throw new Error(\"String of HEX type contains invalid characters\");for(h=(e>>>1)+f,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+i*(h%4))}return{value:u,binLen:4*t.length+n}}(t,r,n,o)};case\"TEXT\":return function(t,r,n){return function(t,r,n,i,e){let s,o,h,u,f,c,a,w,E=0;const l=n||[0],A=(i=i||0)>>>3;if(\"UTF8\"===r)for(a=-1===e?3:0,h=0;h<t.length;h+=1)for(s=t.charCodeAt(h),o=[],128>s?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u<o.length;u+=1){for(c=E+A,f=c>>>2;l.length<=f;)l.push(0);l[f]|=o[u]<<8*(a+e*(c%4)),E+=1}else for(a=-1===e?2:0,w=\"UTF16LE\"===r&&1!==e||\"UTF16LE\"!==r&&1===e,h=0;h<t.length;h+=1){for(s=t.charCodeAt(h),!0===w&&(u=255&s,s=u<<8|s>>>8),c=E+A,f=c>>>2;l.length<=f;)l.push(0);l[f]|=s<<8*(a+e*(c%4)),E+=2}return{value:l,binLen:8*E+i}}(t,s,r,n,o)};case\"B64\":return function(r,n,i){return function(r,n,i,e){let s,o,h,u,f,c,a,w=0;const E=n||[0],l=(i=i||0)>>>3,A=-1===e?3:0,p=r.indexOf(\"=\");if(-1===r.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(r=r.replace(/=/g,\"\"),-1!==p&&p<r.length)throw new Error(\"Invalid '=' found in base-64 string\");for(o=0;o<r.length;o+=4){for(f=r.substr(o,4),u=0,h=0;h<f.length;h+=1)s=t.indexOf(f.charAt(h)),u|=s<<18-6*h;for(h=0;h<f.length-1;h+=1){for(a=w+l,c=a>>>2;E.length<=c;)E.push(0);E[c]|=(u>>>16-8*h&255)<<8*(A+e*(a%4)),w+=1}}return{value:E,binLen:8*w+i}}(r,n,i,o)};case\"BYTES\":return function(t,r,n){return function(t,r,n,i){let e,s,o,h;const u=r||[0],f=(n=n||0)>>>3,c=-1===i?3:0;for(s=0;s<t.length;s+=1)e=t.charCodeAt(s),h=s+f,o=h>>>2,u.length<=o&&u.push(0),u[o]|=e<<8*(c+i*(h%4));return{value:u,binLen:8*t.length+n}}(t,r,n,o)};case\"ARRAYBUFFER\":try{new ArrayBuffer(0)}catch(t){throw new Error(r)}return function(t,r,n){return function(t,r,n,e){return i(new Uint8Array(t),r,n,e)}(t,r,n,o)};case\"UINT8ARRAY\":try{new Uint8Array(0)}catch(t){throw new Error(n)}return function(t,r,n){return i(t,r,n,o)};default:throw new Error(\"format must be HEX, TEXT, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY\")}}function s(i,e,s,o){switch(i){case\"HEX\":return function(t){return function(t,r,n,i){const e=\"0123456789abcdef\";let s,o,h=\"\";const u=r/8,f=-1===n?3:0;for(s=0;s<u;s+=1)o=t[s>>>2]>>>8*(f+n*(s%4)),h+=e.charAt(o>>>4&15)+e.charAt(15&o);return i.outputUpper?h.toUpperCase():h}(t,e,s,o)};case\"B64\":return function(r){return function(r,n,i,e){let s,o,h,u,f,c=\"\";const a=n/8,w=-1===i?3:0;for(s=0;s<a;s+=3)for(u=s+1<a?r[s+1>>>2]:0,f=s+2<a?r[s+2>>>2]:0,h=(r[s>>>2]>>>8*(w+i*(s%4))&255)<<16|(u>>>8*(w+i*((s+1)%4))&255)<<8|f>>>8*(w+i*((s+2)%4))&255,o=0;o<4;o+=1)c+=8*s+6*o<=n?t.charAt(h>>>6*(3-o)&63):e.b64Pad;return c}(r,e,s,o)};case\"BYTES\":return function(t){return function(t,r,n){let i,e,s=\"\";const o=r/8,h=-1===n?3:0;for(i=0;i<o;i+=1)e=t[i>>>2]>>>8*(h+n*(i%4))&255,s+=String.fromCharCode(e);return s}(t,e,s)};case\"ARRAYBUFFER\":try{new ArrayBuffer(0)}catch(t){throw new Error(r)}return function(t){return function(t,r,n){let i;const e=r/8,s=new ArrayBuffer(e),o=new Uint8Array(s),h=-1===n?3:0;for(i=0;i<e;i+=1)o[i]=t[i>>>2]>>>8*(h+n*(i%4))&255;return s}(t,e,s)};case\"UINT8ARRAY\":try{new Uint8Array(0)}catch(t){throw new Error(n)}return function(t){return function(t,r,n){let i;const e=r/8,s=-1===n?3:0,o=new Uint8Array(e);for(i=0;i<e;i+=1)o[i]=t[i>>>2]>>>8*(s+n*(i%4))&255;return o}(t,e,s)};default:throw new Error(\"format must be HEX, B64, BYTES, ARRAYBUFFER, or UINT8ARRAY\")}}const o=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],h=[3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428],u=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225];function f(t){const r={outputUpper:!1,b64Pad:\"=\",outputLen:-1},n=t||{},i=\"Output length must be a multiple of 8\";if(r.outputUpper=n.outputUpper||!1,n.b64Pad&&(r.b64Pad=n.b64Pad),n.outputLen){if(n.outputLen%8!=0)throw new Error(i);r.outputLen=n.outputLen}else if(n.shakeLen){if(n.shakeLen%8!=0)throw new Error(i);r.outputLen=n.shakeLen}if(\"boolean\"!=typeof r.outputUpper)throw new Error(\"Invalid outputUpper formatting option\");if(\"string\"!=typeof r.b64Pad)throw new Error(\"Invalid b64Pad formatting option\");return r}class c{constructor(t,r,n){const i=n||{};if(this.t=r,this.i=i.encoding||\"UTF8\",this.numRounds=i.numRounds||1,isNaN(this.numRounds)||this.numRounds!==parseInt(this.numRounds,10)||1>this.numRounds)throw new Error(\"numRounds must a integer >= 1\");this.o=t,this.h=[],this.u=0,this.l=!1,this.A=0,this.p=!1,this.U=[],this.R=[]}update(t){let r,n=0;const i=this.T>>>5,e=this.F(t,this.h,this.u),s=e.binLen,o=e.value,h=s>>>5;for(r=0;r<h;r+=i)n+this.T<=s&&(this.m=this.g(o.slice(r,r+i),this.m),n+=this.T);return this.A+=n,this.h=o.slice(n>>>5),this.u=s%this.T,this.l=!0,this}getHash(t,r){let n,i,e=this.H;const o=f(r);if(this.B){if(-1===o.outputLen)throw new Error(\"Output length must be specified in options\");e=o.outputLen}const h=s(t,e,this.v,o);if(this.p&&this.C)return h(this.C(o));for(i=this.Y(this.h.slice(),this.u,this.A,this.S(this.m),e),n=1;n<this.numRounds;n+=1)this.B&&e%32!=0&&(i[i.length-1]&=16777215>>>24-e%32),i=this.Y(i,e,0,this.I(this.o),e);return h(i)}setHMACKey(t,r,n){if(!this.L)throw new Error(\"Variant does not support HMAC\");if(this.l)throw new Error(\"Cannot set MAC key after calling update\");const i=e(r,(n||{}).encoding||\"UTF8\",this.v);this.M(i(t))}M(t){const r=this.T>>>3,n=r/4-1;let i;if(1!==this.numRounds)throw new Error(\"Cannot set numRounds with MAC\");if(this.p)throw new Error(\"MAC key already set\");for(r<t.binLen/8&&(t.value=this.Y(t.value,t.binLen,0,this.I(this.o),this.H));t.value.length<=n;)t.value.push(0);for(i=0;i<=n;i+=1)this.U[i]=909522486^t.value[i],this.R[i]=1549556828^t.value[i];this.m=this.g(this.U,this.m),this.A=this.T,this.p=!0}getHMAC(t,r){const n=f(r);return s(t,this.H,this.v,n)(this.N())}N(){let t;if(!this.p)throw new Error(\"Cannot call getHMAC without first setting MAC key\");const r=this.Y(this.h.slice(),this.u,this.A,this.S(this.m),this.H);return t=this.g(this.R,this.I(this.o)),t=this.Y(r,this.H,this.T,t,this.H),t}}function a(t,r){return t>>>r|t<<32-r}function w(t,r){return t>>>r}function E(t,r,n){return t&r^~t&n}function l(t,r,n){return t&r^t&n^r&n}function A(t){return a(t,2)^a(t,13)^a(t,22)}function p(t,r){const n=(65535&t)+(65535&r);return(65535&(t>>>16)+(r>>>16)+(n>>>16))<<16|65535&n}function U(t,r,n,i){const e=(65535&t)+(65535&r)+(65535&n)+(65535&i);return(65535&(t>>>16)+(r>>>16)+(n>>>16)+(i>>>16)+(e>>>16))<<16|65535&e}function d(t,r,n,i,e){const s=(65535&t)+(65535&r)+(65535&n)+(65535&i)+(65535&e);return(65535&(t>>>16)+(r>>>16)+(n>>>16)+(i>>>16)+(e>>>16)+(s>>>16))<<16|65535&s}function R(t){return a(t,7)^a(t,18)^w(t,3)}function y(t){return a(t,6)^a(t,11)^a(t,25)}function T(t){let r;return r=\"SHA-224\"==t?h.slice():u.slice(),r}function F(t,r){let n,i,e,s,h,u,f,c,T,F,b;const m=[];for(n=r[0],i=r[1],e=r[2],s=r[3],h=r[4],u=r[5],f=r[6],c=r[7],b=0;b<64;b+=1)m[b]=b<16?t[b]:U(a(g=m[b-2],17)^a(g,19)^w(g,10),m[b-7],R(m[b-15]),m[b-16]),T=d(c,y(h),E(h,u,f),o[b],m[b]),F=p(A(n),l(n,i,e)),c=f,f=u,u=h,h=p(s,T),s=e,e=i,i=n,n=p(T,F);var g;return r[0]=p(n,r[0]),r[1]=p(i,r[1]),r[2]=p(e,r[2]),r[3]=p(s,r[3]),r[4]=p(h,r[4]),r[5]=p(u,r[5]),r[6]=p(f,r[6]),r[7]=p(c,r[7]),r}class b extends c{constructor(t,r,n){if(\"SHA-224\"!==t&&\"SHA-256\"!==t)throw new Error(\"Chosen SHA variant is not supported\");super(t,r,n);const i=n||{};this.C=this.N,this.L=!0,this.v=-1,this.F=e(this.t,this.i,this.v),this.g=F,this.S=function(t){return t.slice()},this.I=T,this.Y=function(r,n,i,e){return function(t,r,n,i,e){let s,o;const h=15+(r+65>>>9<<4),u=r+n;for(;t.length<=h;)t.push(0);for(t[r>>>5]|=128<<24-r%32,t[h]=4294967295&u,t[h-1]=u/4294967296|0,s=0;s<t.length;s+=16)i=F(t.slice(s,s+16),i);return o=\"SHA-224\"===e?[i[0],i[1],i[2],i[3],i[4],i[5],i[6]]:i,o}(r,n,i,e,t)},this.m=T(t),this.T=512,this.H=\"SHA-224\"===t?224:256,this.B=!1,i.hmacKey&&this.M(function(t,r,n,i){const s=t+\" must include a value and format\";if(!r){if(!i)throw new Error(s);return i}if(void 0===r.value||!r.format)throw new Error(s);return e(r.format,r.encoding||\"UTF8\",n)(r.value)}(\"hmacKey\",i.hmacKey,this.v))}}export{b as default};\n","import JsSHA from \"jssha/dist/sha256\";\r\nimport { Base } from \"./base\";\r\n\r\nexport function applyMixins(derivedCtor: any, baseCtors: any[]) {\r\n  baseCtors.forEach((baseCtor) => {\r\n    Object.getOwnPropertyNames(baseCtor.prototype).forEach((name) => {\r\n      Object.defineProperty(\r\n        derivedCtor.prototype,\r\n        name,\r\n        Object.getOwnPropertyDescriptor(baseCtor.prototype, name),\r\n      );\r\n    });\r\n  });\r\n}\r\n\r\nexport function encryptPassword(password: string, time: number) {\r\n  let key = getSHA256(password);\r\n  return getSHA256(time + key);\r\n\r\n  function getSHA256(text) {\r\n    let shaObj = new JsSHA(\"SHA-256\", \"TEXT\", { encoding: \"UTF8\" });\r\n    shaObj.update(text);\r\n\r\n    return shaObj.getHash(\"HEX\");\r\n  }\r\n}\r\n\r\nexport function outputDebugURL(url: string, config: Base) {\r\n  let label = \"javascript-ampache query URL\";\r\n\r\n  if (config.useBearerToken) {\r\n    label = \"(Using Bearer token, auth added for debugging) - \" + label;\r\n    url += \"&auth=\" + config.sessionKey;\r\n  }\r\n\r\n  console.debug(\r\n      label + \" %c\" + url,\r\n      \"color: black; font-style: italic; background-color: orange;padding: 2px\",\r\n  );\r\n}","import fetch from \"isomorphic-unfetch\";\r\nimport qs from \"querystringify\";\r\nimport { outputDebugURL } from \"./utils\";\r\n\r\ntype Config = {\r\n  url: string;\r\n  sessionKey?: string;\r\n  useBearerToken?: boolean;\r\n  debug?: boolean;\r\n};\r\n\r\nexport type Success = {\r\n  success: string;\r\n};\r\n\r\n/**\r\n * @param [offset] Return results starting from this index position\r\n * @param [limit] Maximum number of results to return\r\n */\r\nexport type Pagination = {\r\n  offset?: number;\r\n  limit?: number;\r\n};\r\n\r\n/**\r\n * @param [offset] Return results starting from this index position\r\n * @param [limit] Maximum number of results to return\r\n * @param [cond] Apply additional filters to the browse using ; separated comma string pairs (e.g. 'filter1,value1;filter2,value2')\r\n * @param [sort] Sort name or comma-separated key pair. (e.g. 'name,order') Default order 'ASC' (e.g. 'name,ASC' == 'name')\r\n */\r\nexport type ExtendedPagination = Pagination & {\r\n  cond?: string;\r\n  sort?: string;\r\n};\r\n\r\nexport type BinaryBoolean = 0 | 1;\r\n\r\nexport type UID = string | number;\r\n\r\nexport abstract class Base {\r\n  sessionKey: string;\r\n  url: string;\r\n  version: string = \"6.6.8\";\r\n  useBearerToken: boolean;\r\n  debug: boolean;\r\n\r\n  constructor(config: Config) {\r\n    this.sessionKey = config.sessionKey || null;\r\n    this.url = config.url;\r\n    this.useBearerToken = config.useBearerToken || false;\r\n    this.debug = config.debug || false;\r\n  }\r\n\r\n  protected request<T>(endpoint: string): Promise<T> {\r\n    let url =\r\n      this.url +\r\n      \"/server/json.server.php?action=\" +\r\n      endpoint +\r\n      \"&version=\" +\r\n      this.version;\r\n\r\n    if (!this.useBearerToken) {\r\n      url += \"&auth=\" + this.sessionKey;\r\n    }\r\n\r\n    if (this.debug) {\r\n      outputDebugURL(url, this);\r\n    }\r\n\r\n    return fetch(url, {\r\n      method: \"GET\",\r\n      headers: this.useBearerToken ? { Authorization: \"Bearer \" + this.sessionKey } : {},\r\n    }).then((r) => {\r\n      if (r.ok) {\r\n        return r.json();\r\n      }\r\n      throw new Error(r.statusText);\r\n    });\r\n  }\r\n\r\n  protected binary<T>(endpoint: string): Promise<Blob> {\r\n    let url =\r\n      this.url +\r\n      \"/server/json.server.php?action=\" + endpoint +\r\n      \"&version=\" + this.version;\r\n\r\n    if (!this.useBearerToken) {\r\n      url += \"&auth=\" + this.sessionKey;\r\n    }\r\n\r\n    if (this.debug) {\r\n      outputDebugURL(url, this);\r\n    }\r\n\r\n    return fetch(url, {\r\n      method: \"GET\",\r\n      headers: this.useBearerToken ? { Authorization: \"Bearer \" + this.sessionKey } : {},\r\n    })\r\n      .then((response) => response.blob())\r\n      .then((r) => {\r\n        return r;\r\n      });\r\n  }\r\n\r\n  public setSessionKey(sessionKey: string) {\r\n    this.sessionKey = sessionKey;\r\n  }\r\n\r\n  /**\r\n   * Construct and return a URL\r\n   * @param endpoint\r\n   * @param [params]\r\n   */\r\n  public rawURL(endpoint: string, params?: {}) {\r\n    let query = endpoint;\r\n    query += qs.stringify(params, \"&\");\r\n\r\n    let url =\r\n      this.url +\r\n      \"/server/json.server.php?action=\" + query +\r\n      \"&version=\" + this.version;\r\n\r\n    if (!this.useBearerToken) {\r\n      url += \"&auth=\" + this.sessionKey;\r\n    }\r\n\r\n    if (this.debug) {\r\n      outputDebugURL(url, this);\r\n    }\r\n\r\n    return url;\r\n  }\r\n}\r\n","import { Albums } from \"./albums\";\nimport { Artists } from \"./artists\";\nimport { Auth } from \"./auth\";\nimport { Bookmarks } from \"./bookmarks\";\nimport { Catalogs } from \"./catalogs\";\nimport { Genres } from \"./genres\";\nimport { Labels } from \"./labels\";\nimport { Licenses } from \"./licenses\";\nimport { LiveStreams } from \"./live-streams\";\nimport { Playlists } from \"./playlists\";\nimport { Podcasts } from \"./podcasts\";\nimport { Preferences } from \"./preferences\";\nimport { Shares } from \"./shares\";\nimport { Shouts } from \"./shouts\";\nimport { Songs } from \"./songs\";\nimport { System } from \"./system\";\nimport { Users } from \"./users\";\nimport { Videos } from \"./videos\";\nimport { applyMixins } from \"./utils\";\nimport { Base } from \"./base\";\n\nclass AmpacheAPI extends Base {}\ninterface AmpacheAPI\n  extends Albums,\n    Artists,\n    Auth,\n    Bookmarks,\n    Catalogs,\n    Genres,\n    Labels,\n    Licenses,\n    LiveStreams,\n    Playlists,\n    Podcasts,\n    Preferences,\n    Shares,\n    Shouts,\n    Songs,\n    System,\n    Users,\n    Videos {}\napplyMixins(AmpacheAPI, [\n  Albums,\n  Artists,\n  Auth,\n  Bookmarks,\n  Catalogs,\n  Genres,\n  Labels,\n  Licenses,\n  LiveStreams,\n  Playlists,\n  Podcasts,\n  Preferences,\n  Shares,\n  Shouts,\n  Songs,\n  System,\n  Users,\n  Videos,\n]);\n\nexport default AmpacheAPI;\n","import qs from \"querystringify\";\nimport { AlbumResponse, AlbumsResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, UID } from \"../base\";\n\nexport class Albums extends Base {\n  /**\n   * This returns albums based on the provided search filters\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.filter] UID to find\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\n   * @param [params.include] albums, songs (include child objects in the response)\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#albums}\n   */\n  albums(\n    params?: {\n      filter?: number;\n      exact?: BinaryBoolean;\n      add?: Date;\n      update?: Date;\n      include?: \"albums\" | \"songs\";\n    } & ExtendedPagination,\n  ) {\n    let query = \"albums\";\n    query += qs.stringify(params, \"&\");\n    return this.request<AlbumsResponse>(query);\n  }\n\n  /**\n   * This returns a single album based on the UID provided\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.filter UID to find\n   * @param [params.include] songs (include child objects in the response)\n   * @see {@link https://ampache.org/api/api-json-methods#album}\n   */\n  album(params: { filter: UID; include?: \"songs\" }) {\n    let query = \"album\";\n    query += qs.stringify(params, \"&\");\n    return this.request<AlbumResponse>(query);\n  }\n\n  /**\n   * This returns the albums of an artist\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.filter UID to find\n   * @param [params.album_artist] 0, 1 (if true filter for album artists only)\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#artist_albums}\n   */\n  artistAlbums(\n    params: {\n      filter: UID;\n      album_artist?: BinaryBoolean;\n    } & ExtendedPagination,\n  ) {\n    let query = \"artist_albums\";\n    query += qs.stringify(params, \"&\");\n    return this.request<AlbumsResponse>(query);\n  }\n\n  /**\n   * This returns the albums associated with the genre in question\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.filter UID to find\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#genre_albums}\n   */\n  genreAlbums(\n    params?: {\n      filter: UID;\n    } & ExtendedPagination,\n  ) {\n    let query = \"genre_albums\";\n    query += qs.stringify(params, \"&\");\n    return this.request<AlbumsResponse>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { ArtistResponse, ArtistsResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, UID } from \"../base\";\n\nexport class Artists extends Base {\n  /**\n   * This takes a collection of inputs and returns artist objects\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.filter] Filter results to match this string\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\n   * @param [params.include] (albums | songs) include child objects in the response\n   * @param [params.album_artist] 0, 1 (if true filter for album artists only)\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#artists}\n   */\n  artists(\n    params?: {\n      filter?: string;\n      exact?: BinaryBoolean;\n      add?: Date;\n      update?: Date;\n      include?: \"albums\" | \"songs\";\n      album_artist?: BinaryBoolean;\n    } & ExtendedPagination,\n  ) {\n    let query = \"artists\";\n    query += qs.stringify(params, \"&\");\n    return this.request<ArtistsResponse>(query);\n  }\n\n  /**\n   * This returns a single artist based on the UID of said artist\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.filter UID to find\n   * @param [params.include] (albums | songs) include child objects in the response\n   * @see {@link https://ampache.org/api/api-json-methods#artist}\n   */\n  artist(params: { filter: UID; include?: \"albums\" | \"songs\" }) {\n    let query = \"artist\";\n    query += qs.stringify(params, \"&\");\n    return this.request<ArtistResponse>(query);\n  }\n\n  /**\n   * This returns the artists associated with the genre in question as defined by the UID\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.filter UID to find\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#genre_artists}\n   */\n  genreArtists(\n    params: {\n      filter: UID;\n    } & ExtendedPagination,\n  ) {\n    let query = \"genre_artists\";\n    query += qs.stringify(params, \"&\");\n    return this.request<ArtistsResponse>(query);\n  }\n\n  /**\n   * This returns the artists associated with the label in question as defined by the UID\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID of find\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#label_artists}\n   */\n  labelArtists(\n    params: {\n      filter: UID;\n    } & ExtendedPagination,\n  ) {\n    let query = \"label_artists\";\n    query += qs.stringify(params, \"&\");\n    return this.request<ArtistsResponse>(query);\n  }\n}\n","import JsSHA from \"jssha/dist/sha256\";\nimport qs from \"querystringify\";\nimport fetch from \"isomorphic-unfetch\";\nimport { Base, Success } from \"../base\";\nimport { AuthResponse } from \"./types\";\nimport { outputDebugURL } from \"../utils\";\n\nexport class Auth extends Base {\n  /**\n   * Handles verifying a new handshake\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.auth encrypted apikey OR password if using password auth\n   * @param [params.user] username\n   * @param [params.timestamp] UNIXTIME()\n   * @param [params.version] version of Ampache API to establish connection with\n   * @see {@link https://ampache.org/api/api-json-methods#handshake}\n   */\n  handshake(params: {\n    auth: string;\n    user?: string;\n    timestamp?: number;\n    version?: string;\n  }) {\n    let token = params.auth;\n\n    // generate a timestamp if one wasn't provided\n    if (!params.timestamp) {\n      params.timestamp = Math.floor(new Date().getTime() / 1000);\n    }\n\n    // override the fallback API version with specified\n    if (params.version) {\n      this.version = params.version;\n    }\n\n    // drop timestamp if no user provided (i.e. logging in with API key)\n    if (!params.user) {\n      delete params.timestamp;\n    }\n\n    // not needed if using Bearer token\n    if (this.useBearerToken) {\n      delete params.auth;\n    }\n\n    let query = this.url + \"/server/json.server.php?action=handshake\";\n    query += qs.stringify(params, \"&\");\n\n    if (this.debug) {\n      outputDebugURL(query, this);\n    }\n\n    return fetch(query, {\n      method: \"GET\",\n      headers: this.useBearerToken ? { Authorization: \"Bearer \" + token } : {},\n    })\n      .then((response) => response.json())\n      .then((data) => {\n        if (data.auth) {\n          this.sessionKey = data.auth;\n        }\n        return <AuthResponse>data;\n      });\n  }\n\n  /**\n   * This can be called without being authenticated, it is useful for determining if what the status\n   * of the server is, and what version it is running/compatible with\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.auth] (Session ID) returns version information and extends the session if passed\n   * @param [params.version] API Version that the application understands\n   * @see {@link https://ampache.org/api/api-json-methods#ping}\n   */\n  ping(params?: { auth?: string; version?: string }) {\n    let query = \"ping\";\n    query += qs.stringify(params, \"&\");\n    return this.request<AuthResponse>(query);\n  }\n\n  /**\n   * Destroy a session using the session auth parameter\n   * @remarks MINIMUM_API_VERSION=400001\n   * @param params.auth Session ID to destroy\n   * @see {@link https://ampache.org/api/api-json-methods#goodbye}\n   */\n  goodbye(params: { auth: string }) {\n    let query = \"goodbye\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Email a new password to the user (if allowed) using a reset token.\n   * @remarks MINIMUM_API_VERSION=6.1.0\n   * @param params.auth Password reset token\n   * @see {@link https://ampache.org/api/api-json-methods#lost_password}\n   */\n  lostPassword(params: { auth: string }) {\n    let query = \"lost_password\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Encrypt your password into the accepted format.\n   */\n  encryptPassword(params: { password: string; time: number }) {\n    let key = getSHA256(params.password);\n    return getSHA256(params.time + key);\n\n    function getSHA256(text) {\n      let shaObj = new JsSHA(\"SHA-256\", \"TEXT\", { encoding: \"UTF8\" });\n      shaObj.update(text);\n\n      return shaObj.getHash(\"HEX\");\n    }\n  }\n}\n","import qs from \"querystringify\";\r\nimport { BookmarkResponse, BookmarksResponse } from \"./types\";\r\nimport { Base, BinaryBoolean, Success, UID } from \"../base\";\r\n\r\nexport class Bookmarks extends Base {\r\n  /**\r\n   * Get a single bookmark by bookmark_id\r\n   * @remarks MINIMUM_API_VERSION=6.1.0\r\n   * @param params.filter UID to find\r\n   * @param [params.include] 0,1, if true include the object in the bookmark\r\n   * @see {@link https://ampache.org/api/api-json-methods#bookmark}\r\n   */\r\n  bookmark(params: { filter: UID; include?: BinaryBoolean }) {\r\n    let query = \"bookmark\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<BookmarkResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Get information about bookmarked media this user is allowed to manage\r\n   * @remarks MINIMUM_API_VERSION=5.0.0\r\n   * @param [params.client] filter by the agent/client name\r\n   * @param [params.include] 0,1, if true include the object in the bookmark\r\n   * @see {@link https://ampache.org/api/api-json-methods#bookmarks}\r\n   */\r\n  bookmarks(params: { client?: string; include?: BinaryBoolean }) {\r\n    let query = \"bookmarks\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<BookmarksResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Get the bookmark/s from its object_id and object_type.\r\n   * @remarks MINIMUM_API_VERSION=5.0.0\r\n   * @param params.filter UID to find\r\n   * @param params.type Object type\r\n   * @param [params.include] 0,1, if true include the object in the bookmark\r\n   * @see {@link https://ampache.org/api/api-json-methods#get_bookmark}\r\n   */\r\n  getBookmark(params: {\r\n    filter: UID;\r\n    type: \"song\" | \"video\" | \"podcast_episode\";\r\n    include?: BinaryBoolean;\r\n    all?: BinaryBoolean;\r\n  }) {\r\n    let query = \"get_bookmark\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<BookmarkResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Create a placeholder for the current media that you can return to later.\r\n   * @remarks MINIMUM_API_VERSION=5.0.0\r\n   * @param params.filter UID to find\r\n   * @param params.type Object type\r\n   * @param params.position current track time in seconds\r\n   * @param [params.client] Agent string. (Default: 'AmpacheAPI')\r\n   * @param [params.date] update time (Default: UNIXTIME())\r\n   * @param [params.include] 0,1, if true include the object in the bookmark\r\n   * @see {@link https://ampache.org/api/api-json-methods#bookmark_create}\r\n   */\r\n  bookmarkCreate(params: {\r\n    filter: UID;\r\n    type: \"song\" | \"video\" | \"podcast_episode\";\r\n    position: number;\r\n    client?: string;\r\n    date?: number;\r\n    include?: BinaryBoolean;\r\n  }) {\r\n    let query = \"bookmark_create\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<BookmarkResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Edit a placeholder for the current media that you can return to later.\r\n   * @remarks MINIMUM_API_VERSION=5.0.0\r\n   * @param params.filter UID to find\r\n   * @param params.type Object type\r\n   * @param params.position current track time in seconds\r\n   * @param [params.client] Agent string. (Default: 'AmpacheAPI')\r\n   * @param [params.date] update time (Default: UNIXTIME())\r\n   * @param [params.include] 0,1, if true include the object in the bookmark\r\n   * @see {@link https://ampache.org/api/api-json-methods#bookmark_edit}\r\n   */\r\n  bookmarkEdit(params: {\r\n    filter: UID;\r\n    type: \"song\" | \"video\" | \"podcast_episode\";\r\n    position: number;\r\n    client?: string;\r\n    date?: number;\r\n    include?: BinaryBoolean;\r\n  }) {\r\n    let query = \"bookmark_edit\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<BookmarkResponse>(query);\r\n  }\r\n\r\n  /**\r\n     * Delete an existing bookmark. (if it exists)\r\n     * @remarks MINIMUM_API_VERSION=5.0.0\r\n     * @param params.filter UID to find\r\n     * @param params.type Object type\r\n     * @param [params.client] Agent string. (Default: 'AmpacheAPI')\r\n     @see {@link https://ampache.org/api/api-json-methods#bookmark_delete}\r\n     */\r\n  bookmarkDelete(params: {\r\n    filter: UID;\r\n    type: \"song\" | \"video\" | \"podcast_episode\";\r\n    client?: string;\r\n  }) {\r\n    let query = \"bookmark_delete\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n}\r\n","import qs from \"querystringify\";\r\nimport { CatalogResponse, CatalogsResponse } from \"./types\";\r\nimport { Base, ExtendedPagination, Success, UID } from \"../base\";\r\n\r\nexport class Catalogs extends Base {\r\n  /**\r\n   * This searches the catalogs and returns... catalogs\r\n   * @remarks MINIMUM_API_VERSION=420000\r\n   * @param [params.filter] Catalog type\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#catalogs}\r\n   */\r\n  catalogs(\r\n    params?: {\r\n      filter?:\r\n        | \"music\"\r\n        | \"clip\"\r\n        | \"tvshow\"\r\n        | \"movie\"\r\n        | \"personal_video\"\r\n        | \"podcast\";\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"catalogs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<CatalogsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Return catalog by UID\r\n   * @remarks MINIMUM_API_VERSION=420000\r\n   * @param params.filter UID to find\r\n   * @see {@link https://ampache.org/api/api-json-methods#catalog}\r\n   */\r\n  catalog(params: { filter: UID }) {\r\n    let query = \"catalog\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<CatalogResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Kick off a catalog update or clean for the selected catalog\r\n   * ACCESS REQUIRED: 75 (Catalog Manager)\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.task add_to_catalog, clean_catalog\r\n   * @param params.catalog UID of catalog\r\n   * @see {@link https://ampache.org/api/api-json-methods#catalog_action}\r\n   */\r\n  catalogAction(params: {\r\n    task: \"add_to_catalog\" | \"clean_catalog\";\r\n    catalog: UID;\r\n  }) {\r\n    let query = \"catalog_action\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Perform actions on local catalog files. Single file versions of catalog add, clean, verify and remove (delete).\r\n   * Make sure you remember to urlencode those file names!\r\n   * ACCESS REQUIRED: 50 (Content Manager)\r\n   * @remarks MINIMUM_API_VERSION=420000\r\n   * @param params.file FULL path to local file\r\n   * @param params.task add, clean, verify, remove, (can include comma-separated values)\r\n   * @param params.catalog UID of catalog\r\n   * @see {@link https://ampache.org/api/api-json-methods#catalog_file}\r\n   */\r\n  catalogFile(params: { file: string; task: string; catalog: UID }) {\r\n    let query = \"catalog_file\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Create a new catalog.\r\n   * ACCESS REQUIRED: 75 (Catalog Manager)\r\n   * @remarks MINIMUM_API_VERSION=6.0.0\r\n   * @param params.name Name for the catalog\r\n   * @param params.path URL or folder path for your catalog\r\n   * @param [params.type] Default: 'local'\r\n   * @param [params.media_type] Default: 'music'\r\n   * @param [params.file_pattern] Pattern used identify tags from the file name. Default: '%T - %t'\r\n   * @param [params.folder_pattern] Pattern used identify tags from the folder name. Default: '%a/%A'\r\n   * @param [params.username] login to remote catalog\r\n   * @param [params.password] password to remote catalog\r\n   * @see {@link https://ampache.org/api/api-json-methods#catalog_add}\r\n   */\r\n  catalogAdd(params: {\r\n    name: string;\r\n    path: string;\r\n    type?:\r\n      | \"local\"\r\n      | \"beets\"\r\n      | \"remote\"\r\n      | \"subsonic\"\r\n      | \"seafile\"\r\n      | \"beetsremote\";\r\n    media_type?:\r\n      | \"music\"\r\n      | \"podcast\"\r\n      | \"clip\"\r\n      | \"tvshow\"\r\n      | \"movie\"\r\n      | \"personal_video\";\r\n    file_pattern?: string;\r\n    folder_pattern?: string;\r\n    username?: string;\r\n    password?: string;\r\n  }) {\r\n    let query = \"catalog_add\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<CatalogResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Delete an existing catalog. (if it exists)\r\n   * ACCESS REQUIRED: 75 (Catalog Manager)\r\n   * @remarks MINIMUM_API_VERSION=6.0.0\r\n   * @param params.filter ID of the catalog\r\n   * @see {@link https://ampache.org/api/api-json-methods#catalog_delete}\r\n   */\r\n  catalogDelete(params: { filter: UID }) {\r\n    let query = \"catalog_delete\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n}\r\n","import qs from \"querystringify\";\nimport { GenreResponse, GenresResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, UID } from \"../base\";\n\nexport class Genres extends Base {\n  /**\n   * This returns the genres (Tags) based on the specified filter\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.filter] UID to find\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#genres}\n   */\n  genres(\n    params?: {\n      filter?: string;\n      exact?: BinaryBoolean;\n    } & ExtendedPagination,\n  ) {\n    let query = \"genres\";\n    query += qs.stringify(params, \"&\");\n    return this.request<GenresResponse>(query);\n  }\n\n  /**\n   * This returns a single genre based on UID\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.filter UID to find\n   * @see {@link https://ampache.org/api/api-json-methods#genre}\n   */\n  genre(params: { filter: UID }) {\n    let query = \"genre\";\n    query += qs.stringify(params, \"&\");\n    return this.request<GenreResponse>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { LabelResponse, LabelsResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, UID } from \"../base\";\n\nexport class Labels extends Base {\n  /**\n   * This returns labels based on the specified filter\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param [params.filter] Filter results to match this string\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#labels}\n   */\n  labels(\n    params?: {\n      filter?: string;\n      exact?: BinaryBoolean;\n      add?: Date;\n      update?: Date;\n    } & ExtendedPagination,\n  ) {\n    let query = \"labels\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LabelsResponse>(query);\n  }\n\n  /**\n   * This returns a single label\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID to find\n   * @see {@link https://ampache.org/api/api-json-methods#label}\n   */\n  label(params: { filter: UID }) {\n    let query = \"label\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LabelResponse>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { LicenseResponse, LicensesResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, UID } from \"../base\";\n\nexport class Licenses extends Base {\n  /**\n   * This returns licenses based on the specified filter\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param [params.filter] Filter results to match this string\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#licenses}\n   */\n  licenses(\n    params?: {\n      filter?: string;\n      exact?: BinaryBoolean;\n      add?: Date;\n      update?: Date;\n    } & ExtendedPagination,\n  ) {\n    let query = \"licenses\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LicensesResponse>(query);\n  }\n\n  /**\n   * This returns a single license\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID to find\n   * @see {@link https://ampache.org/api/api-json-methods#license}\n   */\n  license(params: { filter: UID }) {\n    let query = \"license\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LicenseResponse>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { LiveStreamResponse, LiveStreamsResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, Success, UID } from \"../base\";\n\nexport class LiveStreams extends Base {\n  /**\n   * This returns live_streams based on the specified filter\n   * @remarks MINIMUM_API_VERSION=5.1.0\n   * @param [params.filter] Filter results to match this string\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#live_streams}\n   */\n  liveStreams(\n    params?: {\n      filter?: string;\n      exact?: BinaryBoolean;\n      add?: Date;\n      update?: Date;\n    } & ExtendedPagination,\n  ) {\n    let query = \"live_streams\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LiveStreamsResponse>(query);\n  }\n\n  /**\n   * This returns a single live_stream\n   * @remarks MINIMUM_API_VERSION=5.1.0\n   * @param params.filter UID to find\n   * @see {@link https://ampache.org/api/api-json-methods#live_stream}\n   */\n  liveStream(params: { filter: UID }) {\n    let query = \"live_stream\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LiveStreamResponse>(query);\n  }\n\n  /**\n   * Create a live_stream (radio station) object.\n   * ACCESS REQUIRED: 50 (Content Manager)\n   * @remarks MINIMUM_API_VERSION=6.0.0\n   * @param params.name Stream title\n   * @param params.url URL of the http/s stream\n   * @param params.codec Stream codec\n   * @param params.catalog Catalog ID to associate with this stream\n   * @param [params.site_url] Homepage URL of the stream\n   * @see {@link https://ampache.org/api/api-json-methods#live_stream_create}\n   */\n  liveStreamCreate(params: {\n    name: string;\n    url: string;\n    codec: \"mp3\" | \"flac\" | \"ogg\" | \"vorbis\" | \"opus\" | \"aac\" | \"alac\";\n    catalog: string;\n    site_url?: string;\n  }) {\n    let query = \"live_stream_create\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LiveStreamResponse>(query);\n  }\n\n  /**\n   * Edit a live_stream (radio station) object.\n   * ACCESS REQUIRED: 50 (Content Manager)\n   * @remarks MINIMUM_API_VERSION=6.0.0\n   * @param params.filter Object to find\n   * @param [params.name] Stream title\n   * @param [params.url] URL of the http/s stream\n   * @param [params.codec] Stream codec\n   * @param [params.catalog] Catalog ID to associate with this stream\n   * @param [params.site_url] Homepage URL of the stream\n   * @see {@link https://ampache.org/api/api-json-methods#live_stream_edit}\n   */\n  liveStreamEdit(params: {\n    filter: string;\n    name?: string;\n    url?: string;\n    codec?: \"mp3\" | \"flac\" | \"ogg\" | \"vorbis\" | \"opus\" | \"aac\" | \"alac\";\n    catalog?: string;\n    site_url?: string;\n  }) {\n    let query = \"live_stream_edit\";\n    query += qs.stringify(params, \"&\");\n    return this.request<LiveStreamResponse>(query);\n  }\n\n  /**\n   * Delete a live_stream (radio station) object (if it exists)\n   * ACCESS REQUIRED: 50 (Content Manager)\n   * @remarks MINIMUM_API_VERSION=6.0.0\n   * @param params.filter Object to find\n   * @see {@link https://ampache.org/api/api-json-methods#live_stream_delete}\n   */\n  liveStreamDelete(params: { filter: string }) {\n    let query = \"live_stream_delete\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n}\n","import qs from \"querystringify\";\r\nimport { HashResponse, PlaylistResponse, PlaylistsResponse } from \"./types\";\r\nimport { SongsResponse } from \"../songs/types\";\r\nimport {\r\n  Base,\r\n  BinaryBoolean,\r\n  ExtendedPagination,\r\n  Pagination,\r\n  Success,\r\n  UID,\r\n} from \"../base\";\r\n\r\nexport class Playlists extends Base {\r\n  /**\r\n   * This returns playlists based on the specified filter\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param [params.filter] Filter results to match this string\r\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.hide_search] 0, 1 (if true do not include searches/smartlists in the result)\r\n   * @param [params.show_dupes] 0, 1 (if true ignore 'api_hide_dupe_searches' setting)\r\n   * @param [params.include] 0, 1 (if true include the objects in the playlist)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlists}\r\n   */\r\n  playlists(\r\n    params?: {\r\n      filter?: string;\r\n      exact?: BinaryBoolean;\r\n      add?: Date;\r\n      update?: Date;\r\n      hide_search?: BinaryBoolean;\r\n      show_dupes?: BinaryBoolean;\r\n      include?: BinaryBoolean;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"playlists\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<PlaylistsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This returns smartlists based on the specified filter. NOTE: Filtered from Playlists() so pagination is invalid.\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param [params.filter] Filter results to match this string\r\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.show_dupes] 0, 1 (if true ignore 'api_hide_dupe_searches' setting)\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlists}\r\n   */\r\n  smartlists(params?: {\r\n    filter?: string;\r\n    exact?: BinaryBoolean;\r\n    add?: Date;\r\n    update?: Date;\r\n    show_dupes?: BinaryBoolean;\r\n  }) {\r\n    let query = \"playlists\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<PlaylistsResponse>(query).then((response) => {\r\n      // filter out regular playlists\r\n      if (Array.isArray(response.playlist)) {\r\n        response.playlist = response.playlist.filter((item) =>\r\n          item.id.toString().startsWith(\"smart_\"),\r\n        );\r\n      }\r\n      return response;\r\n    });\r\n  }\r\n\r\n  /**\r\n   * This returns a single playlist\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter UID to find\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist}\r\n   */\r\n  playlist(params: { filter: UID }) {\r\n    let query = \"playlist\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<PlaylistResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This returns a user's playlists based on the specified filter\r\n   * @remarks MINIMUM_API_VERSION=6.3.0\r\n   * @param [params.filter] Filter results to match this string\r\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#user_playlists}\r\n   */\r\n  userPlaylists(\r\n    params?: {\r\n      filter?: string;\r\n      exact?: BinaryBoolean;\r\n      add?: Date;\r\n      update?: Date;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"user_playlists\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<PlaylistsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This returns a user's smartlists based on the specified filter\r\n   * @remarks MINIMUM_API_VERSION=6.3.0\r\n   * @param [params.filter] Filter results to match this string\r\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#user_smartlists}\r\n   */\r\n  userSmartlists(\r\n    params?: {\r\n      filter?: string;\r\n      exact?: BinaryBoolean;\r\n      add?: Date;\r\n      update?: Date;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"user_smartlists\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<PlaylistsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This creates a new playlist and returns it\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.name Playlist name\r\n   * @param [params.type] public, private (Playlist type)\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_create}\r\n   */\r\n  playlistCreate(params: { name: string; type?: \"public\" | \"private\" }) {\r\n    let query = \"playlist_create\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<PlaylistResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This adds an item to a playlist\r\n   * @remarks MINIMUM_API_VERSION=6.3.0\r\n   * @param params.filter UID of Playlist\r\n   * @param params.id UID of the object to add to playlist\r\n   * @param params.type 'song', 'album', 'artist', 'playlist'\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_add}\r\n   */\r\n  playlistAdd(params: {\r\n    filter: UID;\r\n    id: UID;\r\n    type: \"song\" | \"album\" | \"artist\" | \"playlist\";\r\n  }) {\r\n    let query = \"playlist_add\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * This modifies name and type of the playlist.\r\n   * NOTE items and tracks must be sent together and be of equal length.\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.filter UID to find\r\n   * @param [params.name] Playlist name\r\n   * @param [params.type] public, private (Playlist type)\r\n   * @param [params.owner] Change playlist owner to the user id (-1 = System playlist)\r\n   * @param [params.items] comma-separated song_id's (replaces existing items with a new id)\r\n   * @param [params.tracks] comma-separated playlisttrack numbers matched to 'items' in order\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_edit}\r\n   */\r\n  playlistEdit(params: {\r\n    filter: UID;\r\n    name?: string;\r\n    type?: \"public\" | \"private\";\r\n    owner?: string;\r\n    items?: string;\r\n    tracks?: string;\r\n  }) {\r\n    let query = \"playlist_edit\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * This deletes a playlist\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter UID of playlist to delete\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_delete}\r\n   */\r\n  playlistDelete(params: { filter: UID }) {\r\n    let query = \"playlist_delete\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * This adds a song to a playlist\r\n   * @remarks MINIMUM_API_VERSION=380001; CHANGED_IN_API_VERSION=400003\r\n   * @param params.filter UID of Playlist\r\n   * @param params.song UID of song to add to playlist\r\n   * @param [params.check] 0, 1 Whether to check and ignore duplicates (default = 0)\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_add_song}\r\n   * @deprecated Being removed in 7.0.0. Use `playlist_add` instead.\r\n   */\r\n  playlistAddSong(params: { filter: UID; song: UID; check?: BinaryBoolean }) {\r\n    let query = \"playlist_add_song\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * This remove a song from a playlist\r\n   * @remarks MINIMUM_API_VERSION=380001; CHANGED_IN_API_VERSION=400001\r\n   * @param params.filter UID of Playlist\r\n   * @param [params.song] UID of song to remove from playlist\r\n   * @param [params.track] Track number to remove from playlist\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_remove_song}\r\n   */\r\n  playlistRemoveSong(params: { filter: UID; song?: UID; track?: number }) {\r\n    let query = \"playlist_remove_song\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Get a list of song JSON, indexes or id's based on some simple search criteria\r\n   * @remarks MINIMUM_API_VERSION=400001; CHANGED_IN_API_VERSION=400002; 'recent' will search for tracks played after 'Popular Threshold' days; 'forgotten' will search for tracks played before 'Popular Threshold' days; 'unplayed' added in 400002 for searching unplayed tracks\r\n   * @param [params.mode] (default = 'random')\r\n   * @param [params.filter] string LIKE matched to song title\r\n   * @param [params.album] UID of album\r\n   * @param [params.artist] UID of artist\r\n   * @param [params.flag] 0, 1 (get flagged songs only. default = 0)\r\n   * @param [params.format] song, index, id (default = 'song')\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_generate}\r\n   */\r\n  playlistGenerate(\r\n    params?: {\r\n      mode?: \"recent\" | \"forgotten\" | \"unplayed\" | \"random\";\r\n      filter?: string;\r\n      album?: number;\r\n      artist?: number;\r\n      flag?: BinaryBoolean;\r\n      format?: \"song\" | \"index\" | \"id\";\r\n    } & Pagination,\r\n  ) {\r\n    let query = \"playlist_generate\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This returns the md5 hash for the songs in a playlist\r\n   * @remarks MINIMUM_API_VERSION=6.6.0\r\n   * @param params.filter string UID of Playlist\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_hash}\r\n   */\r\n  playlistHash(\r\n      params: {\r\n        filter: UID;\r\n      },\r\n  ) {\r\n    let query = \"playlist_hash\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<HashResponse>(query);\r\n  }\r\n}\r\n","import qs from \"querystringify\";\nimport {\n  PodcastResponse,\n  PodcastsResponse,\n  PodcastEpisodeResponse,\n  PodcastEpisodesResponse,\n  DeletedPodcastEpisodeResponse,\n  DeletedPodcastEpisodesResponse,\n} from \"./types\";\nimport { Base, ExtendedPagination, Pagination, Success, UID } from \"../base\";\n\nexport class Podcasts extends Base {\n  /**\n   * Get information about podcasts\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param [params.filter] Value is Alpha Match for returned results, may be more than one letter/number\n   * @param [params.include] episodes (include podcast_episodes in the response)\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#podcasts}\n   */\n  podcasts(\n    params?: {\n      filter?: string;\n      include?: \"episodes\";\n    } & ExtendedPagination,\n  ) {\n    let query = \"podcasts\";\n    query += qs.stringify(params, \"&\");\n    return this.request<PodcastsResponse>(query);\n  }\n\n  /**\n   * Get information about podcasts\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID to find\n   * @param [params.include] episodes (include podcast_episodes in the response)\n   * @param [params.offset]\n   * @param [params.limit]\n   * @see {@link https://ampache.org/api/api-json-methods#podcast}\n   */\n  podcast(\n    params?: {\n      filter: UID;\n      include?: \"episodes\";\n    } & Pagination,\n  ) {\n    let query = \"podcast\";\n    query += qs.stringify(params, \"&\");\n    return this.request<PodcastResponse>(query);\n  }\n\n  /**\n   * Create a podcast that can be used by anyone to stream media.\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.url RSS url for podcast\n   * @param params.catalog UID of podcast catalog\n   * @see {@link https://ampache.org/api/api-json-methods#podcast_create}\n   */\n  podcastCreate(params: { url: string; catalog: UID }) {\n    let query = \"podcast_create\";\n    query += qs.stringify(params, \"&\");\n    return this.request<PodcastResponse>(query);\n  }\n\n  /**\n   * Update the description and/or expiration date for an existing podcast.\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID to find\n   * @param [params.feed] RSS url for podcast\n   * @param [params.title] Podcast title\n   * @param [params.website] Source website URL\n   * @param [params.description] Podcast description\n   * @param [params.generator] Podcast generator\n   * @param [params.copyright] Podcast copyright\n   * @see {@link https://ampache.org/api/api-json-methods#podcast_edit}\n   */\n  podcastEdit(params: {\n    filter: UID;\n    feed?: string;\n    title?: string;\n    website?: string;\n    description?: string;\n    generator?: string;\n    copyright?: string;\n  }) {\n    let query = \"podcast_edit\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Delete an existing podcast\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID of podcast to delete\n   * @see {@link https://ampache.org/api/api-json-methods#podcast_delete}\n   */\n  podcastDelete(params: { filter: UID }) {\n    let query = \"podcast_delete\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * This returns the episodes for a podcast\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID of podcast\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#podcast_episodes}\n   */\n  podcastEpisodes(\n    params: {\n      filter: UID;\n    } & ExtendedPagination,\n  ) {\n    let query = \"podcast_episodes\";\n    query += qs.stringify(params, \"&\");\n    return this.request<PodcastEpisodesResponse>(query);\n  }\n\n  /**\n   * Get the podcast_episode from a UID\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID of podcast\n   * @see {@link https://ampache.org/api/api-json-methods#podcast_episode}\n   */\n  podcastEpisode(params: { filter: UID }) {\n    let query = \"podcast_episode\";\n    query += qs.stringify(params, \"&\");\n    return this.request<PodcastEpisodeResponse>(query);\n  }\n\n  /**\n   * Delete an existing podcast_episode\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID of podcast episode to delete\n   * @see {@link https://ampache.org/api/api-json-methods#podcast_episode_delete}\n   */\n  podcastEpisodeDelete(params: { filter: UID }) {\n    let query = \"podcast_episode_delete\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Sync and download new podcast episodes\n   * ACCESS REQUIRED: 50 (Content Manager)\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.id UID of podcast\n   * @see {@link https://ampache.org/api/api-json-methods#update_podcast}\n   */\n  updatePodcast(params: { id: UID }) {\n    let query = \"update_podcast\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * This returns the episodes for a podcast that have been deleted\n   * @param [params.offset]\n   * @param [params.limit]\n   * @see {@link https://ampache.org/api/api-json-methods#deleted_podcast_episodes}\n   */\n  deletedPodcastEpisodes(params?: {} & Pagination) {\n    let query = \"deleted_podcast_episodes\";\n    query += qs.stringify(params, \"&\");\n    return this.request<DeletedPodcastEpisodesResponse>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { Base, BinaryBoolean, Success } from \"../base\";\nimport { PreferenceResponse, PreferencesResponse } from \"./types\";\n\nexport class Preferences extends Base {\n  /**\n   * Get your server preferences\n   * ACCESS REQUIRED: 100 (Admin)\n   * @remarks MINIMUM_API_VERSION=5.0.0\n   * @see {@link https://ampache.org/api/api-json-methods#system_preferences}\n   */\n  systemPreferences() {\n    let query = \"system_preferences\";\n    return this.request<PreferencesResponse>(query);\n  }\n\n  /**\n   * Get your system preference by name\n   * ACCESS REQUIRED: 100 (Admin)\n   * @remarks MINIMUM_API_VERSION=5.0.0\n   * @param params.systemPreference Preference name e.g ('notify_email', 'ajax_load')\n   * @see {@link https://ampache.org/api/api-json-methods#system_preference}\n   */\n  systemPreference(params: { filter: string }) {\n    let query = \"system_preference\";\n    query += qs.stringify(params, \"&\");\n    return this.request<PreferenceResponse>(query);\n  }\n\n  /**\n   * Get your user preferences\n   * @remarks MINIMUM_API_VERSION=5.0.0\n   * @see {@link https://ampache.org/api/api-json-methods#user_preferences}\n   */\n  userPreferences() {\n    let query = \"user_preferences\";\n    return this.request<PreferencesResponse>(query);\n  }\n\n  /**\n   * Get your user preference by name\n   * @remarks MINIMUM_API_VERSION=5.0.0\n   * @param params.filter Preference name e.g ('notify_email', 'ajax_load')\n   * @see {@link https://ampache.org/api/api-json-methods#user_preference}\n   */\n  userPreference(params: { filter: string }) {\n    let query = \"user_preference\";\n    query += qs.stringify(params, \"&\");\n    return this.request<PreferenceResponse>(query);\n  }\n\n  /**\n   * Add a new preference to your server\n   * ACCESS REQUIRED: 100 (Admin)\n   * @param params.filter Preference name e.g ('notify_email', 'ajax_load')\n   * @param params.type boolean, integer, string, special\n   * @param params.default string or integer default value\n   * @param params.category Category type\n   * @param [params.description]\n   * @param [params.subcategory]\n   * @param [params.level] access level required to change the value (default 100)\n   * @see {@link https://ampache.org/api/api-json-methods#preference_create}\n   */\n  preferenceCreate(params: {\n    filter: string;\n    type: \"boolean\" | \"integer\" | \"string\" | \"special\";\n    default: string | number;\n    category:\n      | \"interface\"\n      | \"internal\"\n      | \"options\"\n      | \"playlist\"\n      | \"plugins\"\n      | \"streaming\";\n    description?: string;\n    subcategory?: string;\n    level?: number;\n  }) {\n    let query = \"preference_create\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Edit a preference value and apply to all users if allowed\n   * ACCESS REQUIRED: 100 (Admin)\n   * @remarks MINIMUM_API_VERSION=5.0.0\n   * @param params.filter Preference name e.g ('notify_email', 'ajax_load')\n   * @param params.value (string/integer) Preference value\n   * @param [params.all] 0, 1 apply to all users\n   * @see {@link https://ampache.org/api/api-json-methods#preference_edit}\n   */\n  preferenceEdit(params: {\n    filter: string;\n    value: string | number;\n    all?: BinaryBoolean;\n  }) {\n    let query = \"preference_edit\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Delete a non-system preference by name\n   * ACCESS REQUIRED: 100 (Admin)\n   * @param params.filter Preference name e.g ('notify_email', 'ajax_load')\n   * @see {@link https://ampache.org/api/api-json-methods#preference_delete}\n   */\n  preferenceDelete(params: { filter: string }) {\n    let query = \"preference_delete\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { ShareResponse, SharesResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, Success, UID } from \"../base\";\n\nexport class Shares extends Base {\n  /**\n   * This searches the shares and returns... shares\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param [params.filter] UID to find\n   * @param [params.exact] 0, 1 boolean to match the exact filter string\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#shares}\n   */\n  shares(\n    params?: {\n      filter?: string;\n      exact?: BinaryBoolean;\n    } & ExtendedPagination,\n  ) {\n    let query = \"shares\";\n    query += qs.stringify(params, \"&\");\n    return this.request<SharesResponse>(query);\n  }\n\n  /**\n   * Return a share from UID\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID to find\n   * @see {@link https://ampache.org/api/api-json-methods#share}\n   */\n  share(params: { filter: UID }) {\n    let query = \"share\";\n    query += qs.stringify(params, \"&\");\n    return this.request<ShareResponse>(query);\n  }\n\n  /**\n   * Create a public url that can be used by anyone to stream media.\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID of object you are sharing\n   * @param params.type ('song', 'album', 'artist', 'playlist', 'podcast', 'podcast_episode', 'video')\n   * @param [params.description] description (will be filled for you if empty)\n   * @param [params.expires] days to keep active\n   * @see {@link https://ampache.org/api/api-json-methods#share_create}\n   */\n  shareCreate(params: {\n    filter: UID;\n    type:\n      | \"song\"\n      | \"album\"\n      | \"artist\"\n      | \"playlist\"\n      | \"podcast\"\n      | \"podcast_episode\"\n      | \"video\";\n    description?: string;\n    expires?: number;\n  }) {\n    let query = \"share_create\";\n    query += qs.stringify(params, \"&\");\n    return this.request<ShareResponse>(query);\n  }\n\n  /**\n   * Update the description and/or expiration date for an existing share\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID to find\n   * @param [params.stream] 0, 1\n   * @param [params.download] 0, 1\n   * @param [params.expires] days to keep active\n   * @param [params.description] description\n   * @see {@link https://ampache.org/api/api-json-methods#share_edit}\n   */\n  shareEdit(params: {\n    filter: UID;\n    stream?: BinaryBoolean;\n    download?: BinaryBoolean;\n    expires?: number;\n    description?: string;\n  }) {\n    let query = \"share_edit\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Delete an existing share.\n   * @remarks MINIMUM_API_VERSION=420000\n   * @param params.filter UID of share to delete\n   * @see {@link https://ampache.org/api/api-json-methods#share_delete}\n   */\n  shareDelete(params: { filter: UID }) {\n    let query = \"share_delete\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { ShoutResponse } from \"./types\";\nimport { Base } from \"../base\";\n\nexport class Shouts extends Base {\n  /**\n   * This gets the latest posted shouts\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.username] Username to find\n   * @param [params.limit] Maximum number of results to return\n   * @see {@link https://ampache.org/api/api-json-methods#last_shouts}\n   */\n  last_shouts(params?: { username?: string; limit?: number }) {\n    let query = \"last_shouts\";\n    query += qs.stringify(params, \"&\");\n    return this.request<{ shout: ShoutResponse[] }>(query);\n  }\n}\n","import qs from \"querystringify\";\r\nimport { SongResponse, SongsResponse, DeletedSongsResponse } from \"./types\";\r\nimport {\r\n  Base,\r\n  BinaryBoolean,\r\n  ExtendedPagination,\r\n  Pagination,\r\n  Success,\r\n  UID,\r\n} from \"../base\";\r\n\r\nexport class Songs extends Base {\r\n  /**\r\n   * Returns songs based on the specified filter\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param [params.filter] Filter results to match this string\r\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#songs}\r\n   */\r\n  songs(\r\n    params?: {\r\n      filter?: string;\r\n      exact?: BinaryBoolean;\r\n      add?: Date;\r\n      update?: Date;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Returns a single song\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter UID to find\r\n   * @see {@link https://ampache.org/api/api-json-methods#song}\r\n   */\r\n  song(params: { filter: UID }) {\r\n    let query = \"song\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Songs of the specified artist\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter UID to find\r\n   * @param [params.top50] 0, 1 (if true filter to the artist top 50)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#artist_songs}\r\n   */\r\n  artistSongs(\r\n    params: {\r\n      filter: UID;\r\n      top50?: BinaryBoolean;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"artist_songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Songs of the specified album\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter UID to find\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#album_songs}\r\n   */\r\n  albumSongs(\r\n    params: {\r\n      filter: UID;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"album_songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Songs of the specified genre\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter UID to find\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#genre_songs}\r\n   */\r\n  genreSongs(\r\n    params: {\r\n      filter: UID;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"genre_songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This returns the songs for a playlist\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter UID to find\r\n   * @param [params.random] 0, 1 (if true get random songs using limit)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#playlist_songs}\r\n   */\r\n  playlistSongs(\r\n    params: {\r\n      filter: UID;\r\n      random?: BinaryBoolean;\r\n    } & Pagination,\r\n  ) {\r\n    let query = \"playlist_songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This returns the songs for a license\r\n   * @remarks MINIMUM_API_VERSION=420000\r\n   * @param params.filter UID to find\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#license_songs}\r\n   */\r\n  licenseSongs(\r\n    params: {\r\n      filter: UID;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"license_songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Delete an existing song. (if you are allowed to)\r\n   * @remarks MINIMUM_API_VERSION=5.0.0\r\n   * @param params.filter UID of song to delete\r\n   * @see {@link https://ampache.org/api/api-json-methods#song_delete}\r\n   */\r\n  songDelete(params: { filter: UID }) {\r\n    let query = \"song_delete\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Get the full song file tags using VaInfo\r\n   * This is used to get tags for remote catalogs to allow maximum data to be returned\r\n   * @remarks MINIMUM_API_VERSION=7.5.0\r\n   * @param params.filter UID of song to fetch\r\n   * @see {@link https://ampache.org/api/api-json-methods#song_tags}\r\n   */\r\n  // songTags(params: { filter: UID }) {\r\n  //   let query = \"song_tags\";\r\n  //   query += qs.stringify(params, \"&\");\r\n  //   return this.request<SongResponse>(query); // TODO update reponse\r\n  // }\r\n\r\n  /**\r\n   * This takes a URL and returns the song object in question\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.url Full Ampache URL from server\r\n   * @see {@link https://ampache.org/api/api-json-methods#url_to_song}\r\n   */\r\n  urlToSong(params: { url: string }) {\r\n    let query = \"url_to_song\";\r\n    params.url = encodeURIComponent(params.url);\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * This searches the songs and returns... songs\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.filter Filter results to match this string\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#search_songs}\r\n   */\r\n  searchSongs(\r\n    params: {\r\n      filter: string;\r\n    } & Pagination,\r\n  ) {\r\n    let query = \"search_songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<SongsResponse>(query);\r\n  }\r\n\r\n  /**\r\n   * Returns songs that have been deleted from the server\r\n   * @remarks MINIMUM_API_VERSION=500000\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#deleted_songs}\r\n   */\r\n  deletedSongs(params?: {} & Pagination) {\r\n    let query = \"deleted_songs\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<DeletedSongsResponse>(query);\r\n  }\r\n}\r\n","import qs from \"querystringify\";\r\nimport { SongResponse, SongsResponse } from \"../songs/types\";\r\nimport { ArtistResponse, ArtistsResponse } from \"../artists/types\";\r\nimport {\r\n  Base,\r\n  BinaryBoolean,\r\n  ExtendedPagination,\r\n  Pagination,\r\n  Success,\r\n  UID,\r\n} from \"../base\";\r\nimport { AlbumResponse, AlbumsResponse } from \"../albums/types\";\r\nimport { VideoResponse, VideosResponse } from \"../videos/types\";\r\nimport { PlaylistResponse, PlaylistsResponse } from \"../playlists/types\";\r\nimport {\r\n  PodcastsResponse,\r\n  PodcastEpisodesResponse,\r\n  PodcastResponse,\r\n  PodcastEpisodeResponse,\r\n} from \"../podcasts/types\";\r\nimport { LiveStreamsResponse } from \"../live-streams/types\";\r\nimport { LabelResponse, LabelsResponse } from \"../labels/types\";\r\nimport { GenreResponse, GenresResponse } from \"../genres/types\";\r\nimport { UserResponse, UsersResponse } from \"../users/types\";\r\nimport { IndexEntry, NowPlayingResponse } from \"./types\";\r\n\r\nexport class System extends Base {\r\n  /**\r\n   * Check Ampache for updates and run the update if there is one.\r\n   * @remarks MINIMUM_API_VERSION=5.0.0\r\n   * @see {@link https://ampache.org/api/api-json-methods#system_update}\r\n   */\r\n  systemUpdate() {\r\n    let query = \"system_update\";\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * This takes a collection of inputs and returns ID + name for the object type\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.type type of object to find\r\n   * @param [params.filter] search the name of the object_type\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.include] 0, 1 (include songs in a playlist or episodes in a podcast)\r\n   * @param [params.hide_search] 0, 1 (if true do not include searches/smartlists in the result)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#get_indexes}\r\n   * @deprecated Being removed in 7.0.0. Use `list` instead.\r\n   */\r\n  getIndexes(\r\n    params: {\r\n      type:\r\n        | \"song\"\r\n        | \"album\"\r\n        | \"artist\"\r\n        | \"album_artist\"\r\n        | \"playlist\"\r\n        | \"podcast\"\r\n        | \"podcast_episode\"\r\n        | \"live_stream\"\r\n        | \"catalog\"\r\n        | \"song_artist\";\r\n      filter?: string;\r\n      add?: Date;\r\n      update?: Date;\r\n      include?: BinaryBoolean;\r\n      hide_search?: BinaryBoolean;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"get_indexes\";\r\n    query += qs.stringify(params, \"&\");\r\n    let data;\r\n\r\n    switch (params.type) {\r\n      case \"song\":\r\n        data = this.request<SongsResponse>(query);\r\n        break;\r\n      case \"album\":\r\n        data = this.request<AlbumsResponse>(query);\r\n        break;\r\n      case \"artist\":\r\n      case \"album_artist\":\r\n        data = this.request<ArtistsResponse>(query);\r\n        break;\r\n      case \"playlist\":\r\n        data = this.request<PlaylistsResponse>(query);\r\n        break;\r\n      case \"podcast\":\r\n        data = this.request<PodcastsResponse>(query);\r\n        break;\r\n      case \"podcast_episode\":\r\n        data = this.request<PodcastEpisodesResponse>(query);\r\n        break;\r\n      case \"live_stream\":\r\n        data = this.request<LiveStreamsResponse>(query);\r\n        break;\r\n      default:\r\n        return false;\r\n    }\r\n\r\n    return data;\r\n  }\r\n\r\n  /**\r\n   * This takes a named array of objects and returning `id`, `name`, `prefix` and `basename`\r\n   * @remarks MINIMUM_API_VERSION=6.0.0\r\n   * @param params.type type of object to find\r\n   * @param [params.filter] Value is Alpha Match for returned results, may be more than one letter/number\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.hide_search] 0, 1 (if true do not include searches/smartlists in the result)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#list}\r\n   */\r\n  list(\r\n    params: {\r\n      type:\r\n        | \"song\"\r\n        | \"album\"\r\n        | \"artist\"\r\n        | \"album_artist\"\r\n        | \"playlist\"\r\n        | \"podcast\"\r\n        | \"podcast_episode\"\r\n        | \"live_stream\"\r\n        | \"catalog\"\r\n        | \"song_artist\";\r\n      filter?: string;\r\n      add?: Date;\r\n      update?: Date;\r\n      hide_search?: BinaryBoolean;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"list\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<{ list: IndexEntry[] }>(query);\r\n  }\r\n\r\n  /**\r\n   * This takes a collection of inputs and return ID's for the object type.\r\n   * @remarks MINIMUM_API_VERSION=6.3.0\r\n   * @param params.type type of object to find\r\n   * @param [params.filter] Value is Alpha Match for returned results, may be more than one letter/number\r\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.include] 0, 1, (include child objects)\r\n   * @param [params.hide_search] 0, 1 (if true do not include searches/smartlists in the result)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#index}\r\n   */\r\n  index(\r\n    params: {\r\n      type:\r\n        | \"catalog\"\r\n        | \"song\"\r\n        | \"album\"\r\n        | \"artist\"\r\n        | \"album_artist\"\r\n        | \"song_artist\"\r\n        | \"playlist\"\r\n        | \"podcast\"\r\n        | \"podcast_episode\"\r\n        | \"share\"\r\n        | \"video\"\r\n        | \"live_stream\";\r\n      filter?: string;\r\n      exact?: BinaryBoolean;\r\n      add?: Date;\r\n      update?: Date;\r\n      include?: BinaryBoolean;\r\n      hide_search?: BinaryBoolean;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"index\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<{ index: [] }>(query);\r\n  }\r\n\r\n  /**\r\n   * Return children of a parent object in a folder traversal/browse style\r\n   * If you don't send any parameters you'll get a catalog list (the 'root' path)\r\n   * @remarks MINIMUM_API_VERSION=6.0.0\r\n   * @param [params.filter] object_id\r\n   * @param [params.type] type of object to find\r\n   * @param [params.catalog] catalog ID you are browsing (required on 'artist', 'album', 'podcast')\r\n   * @param [params.add] ISO 8601 Date Format (2020-09-16) Find objects with an 'add' date newer than the specified date\r\n   * @param [params.update] ISO 8601 Date Format (2020-09-16) Find objects with an 'update' time newer than the specified date\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @param [params.cond]\r\n   * @param [params.sort]\r\n   * @see {@link https://ampache.org/api/api-json-methods#browse}\r\n   */\r\n  browse(\r\n    params: {\r\n      filter?: UID;\r\n      type?: \"root\" | \"catalog\" | \"artist\" | \"album\" | \"podcast\";\r\n      catalog?: number;\r\n      add?: Date;\r\n      update?: Date;\r\n    } & ExtendedPagination,\r\n  ) {\r\n    let query = \"browse\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<{ browse: IndexEntry[] }>(query);\r\n  }\r\n\r\n  /**\r\n   * Return similar artist IDs or similar song IDs compared to the input filter\r\n   * @remarks MINIMUM_API_VERSION=420000\r\n   * @param params.type type of object to check against\r\n   * @param params.filter UID to find\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#get_similar}\r\n   */\r\n  getSimilar(\r\n    params: {\r\n      type: \"song\" | \"artist\";\r\n      filter: UID;\r\n    } & Pagination,\r\n  ) {\r\n    let query = \"get_similar\";\r\n    query += qs.stringify(params, \"&\");\r\n    let data;\r\n\r\n    switch (params.type) {\r\n      case \"song\":\r\n        data = this.request<SongsResponse>(query);\r\n        break;\r\n      case \"artist\":\r\n        data = this.request<ArtistsResponse>(query);\r\n        break;\r\n      default:\r\n        return false;\r\n    }\r\n\r\n    return data;\r\n  }\r\n\r\n  /**\r\n   * Get some items based on some simple search types and filters. (Random by default)\r\n   * @remarks MINIMUM_API_VERSION=380001; CHANGED_IN_API_VERSION=400001\r\n   * @param params.type Object type\r\n   * @param [params.filter] newest, highest, frequent, recent, forgotten, flagged, random\r\n   * @param [params.user_id] Filter results to a certain user by UID\r\n   * @param [params.username] Filter results to a certain user by username\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#stats}\r\n   */\r\n  stats(\r\n    params: {\r\n      type:\r\n        | \"song\"\r\n        | \"album\"\r\n        | \"artist\"\r\n        | \"video\"\r\n        | \"playlist\"\r\n        | \"podcast\"\r\n        | \"podcast_episode\";\r\n      filter?:\r\n        | \"newest\"\r\n        | \"highest\"\r\n        | \"frequent\"\r\n        | \"recent\"\r\n        | \"forgotten\"\r\n        | \"flagged\"\r\n        | \"random\";\r\n      user_id?: number;\r\n      username?: string;\r\n    } & Pagination,\r\n  ) {\r\n    let query = \"stats\";\r\n    query += qs.stringify(params, \"&\");\r\n    let data;\r\n\r\n    switch (params.type) {\r\n      case \"song\":\r\n        data = this.request<SongsResponse>(query);\r\n        break;\r\n      case \"album\":\r\n        data = this.request<AlbumsResponse>(query);\r\n        break;\r\n      case \"artist\":\r\n        data = this.request<ArtistsResponse>(query);\r\n        break;\r\n      case \"video\":\r\n        data = this.request<VideosResponse>(query);\r\n        break;\r\n      case \"playlist\":\r\n        data = this.request<PlaylistsResponse>(query);\r\n        break;\r\n      case \"podcast\":\r\n        data = this.request<PodcastsResponse>(query);\r\n        break;\r\n      case \"podcast_episode\":\r\n        data = this.request<PodcastEpisodesResponse>(query);\r\n        break;\r\n      default:\r\n        return false;\r\n    }\r\n\r\n    return data;\r\n  }\r\n\r\n  /**\r\n   * This rates a library item\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.type Object type\r\n   * @param params.id UID to find\r\n   * @param params.rating Rating to apply\r\n   * @see {@link https://ampache.org/api/api-json-methods#rate}\r\n   */\r\n  rate(params: {\r\n    type:\r\n      | \"song\"\r\n      | \"album\"\r\n      | \"artist\"\r\n      | \"playlist\"\r\n      | \"podcast\"\r\n      | \"podcast_episode\"\r\n      | \"video\"\r\n      | \"tvshow\"\r\n      | \"tvshow_season\";\r\n    id: UID;\r\n    rating: 0 | 1 | 2 | 3 | 4 | 5;\r\n  }) {\r\n    let query = \"rate\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * This flags a library item as a favorite\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.type Object type\r\n   * @param params.id UID to find\r\n   * @param params.flag 0, 1\r\n   * @param [params.date] UNIXTIME\r\n   * @see {@link https://ampache.org/api/api-json-methods#flag}\r\n   */\r\n  flag(params: {\r\n    type:\r\n      | \"song\"\r\n      | \"album\"\r\n      | \"artist\"\r\n      | \"playlist\"\r\n      | \"podcast\"\r\n      | \"podcast_episode\"\r\n      | \"video\"\r\n      | \"tvshow\"\r\n      | \"tvshow_season\";\r\n    id: UID;\r\n    flag: BinaryBoolean;\r\n    date?: number;\r\n  }) {\r\n    let query = \"flag\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Take a song_id and update the object_count and user_activity table with a play. This allows other sources to record play history to Ampache.\r\n   * If you don't supply a user id (optional) then just fall back to you.\r\n   * ACCESS REQUIRED: 100 (Admin) permission to change another user's play history\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.id UID of song\r\n   * @param [params.user] UID of user\r\n   * @param [params.client] Client string\r\n   * @param [params.date] UNIXTIME\r\n   * @see {@link https://ampache.org/api/api-json-methods#record_play}\r\n   */\r\n  recordPlay(params: { id: UID; user?: UID; client?: string; date?: number }) {\r\n    let query = \"record_play\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Search for a song using text info and then record a play if found. This allows other sources to record play history to ampache\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.song HTML encoded string\r\n   * @param params.artist HTML encoded string\r\n   * @param params.album HTML encoded string\r\n   * @param [params.songmbid] Song MBID\r\n   * @param [params.artistmbid] Artist MBID\r\n   * @param [params.albummbid] Album MBID\r\n   * @param [params.song_mbid] Alias of songmbid\r\n   * @param [params.artist_mbid] Alias of artistmbid\r\n   * @param [params.album_mbid] Alias of albummbid\r\n   * @param [params.date] UNIXTIME\r\n   * @param [params.client] Client string\r\n   * @see {@link https://ampache.org/api/api-json-methods#scrobble}\r\n   */\r\n  scrobble(params: {\r\n    song: string;\r\n    artist: string;\r\n    album: string;\r\n    songmbid?: string;\r\n    artistmbid?: string;\r\n    albummbid?: string;\r\n    song_mbid?: string;\r\n    artist_mbid?: string;\r\n    album_mbid?: string;\r\n    date?: number;\r\n    client?: string;\r\n  }) {\r\n    let query = \"scrobble\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Update a single album, artist, song from the tag data\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.type Object type\r\n   * @param params.id UID to find\r\n   * @see {@link https://ampache.org/api/api-json-methods#update_from_tags}\r\n   */\r\n  updateFromTags(params: { type: \"song\" | \"artist\" | \"album\"; id: UID }) {\r\n    let query = \"update_from_tags\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Update artist information and fetch similar artists from last.fm\r\n   * Make sure lastfm_API_key is set in your configuration file\r\n   * ACCESS REQUIRED: 75 (Catalog Manager)\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.id UID to find\r\n   * @see {@link https://ampache.org/api/api-json-methods#update_artist_info}\r\n   */\r\n  updateArtistInfo(params: { id: UID }) {\r\n    let query = \"update_artist_info\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Updates a single album, artist, song running the gather_art process.\r\n   * Doesn't overwrite existing art by default.\r\n   * ACCESS REQUIRED: 75 (Catalog Manager)\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.id UID to update\r\n   * @param params.type Object type\r\n   * @param [params.overwrite]\r\n   * @see {@link https://ampache.org/api/api-json-methods#update_art}\r\n   */\r\n  updateArt(params: {\r\n    id: UID;\r\n    type: \"artist\" | \"album\" | \"song\";\r\n    overwrite?: BinaryBoolean;\r\n  }) {\r\n    let query = \"update_art\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<Success>(query);\r\n  }\r\n\r\n  /**\r\n   * Streams a given media file. Takes the file id in parameter with optional max bit rate, file format, time offset,\r\n   * size and estimate content length option.\r\n   * NOTE search and playlist will only stream a random object from the list.\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.id UID to find\r\n   * @param params.type Object type\r\n   * @param [params.bitrate] Max bitrate for transcoding\r\n   * @param [params.format] mp3, ogg, raw, etc. (raw returns the original format)\r\n   * @param [params.offset] Time offset\r\n   * @param [params.length] 0, 1 (estimate content length)\r\n   * @param [params.stats] 0, 1 (if false disable stat recording when playing the object; default: 1)\r\n   * @see {@link https://ampache.org/api/api-json-methods#stream}\r\n   */\r\n  stream(params: {\r\n    id: UID;\r\n    type: \"song\" | \"podcast_episode\" | \"search\" | \"playlist\";\r\n    bitrate?: number;\r\n    format?: string;\r\n    offset?: number;\r\n    length?: BinaryBoolean;\r\n    stats?: BinaryBoolean;\r\n  }) {\r\n    let query = \"stream\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.binary(query);\r\n  }\r\n\r\n  /**\r\n   * Downloads a given media file. set format=raw to download the full file\r\n   * NOTE search and playlist will only download a random object from the list\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.id UID to find\r\n   * @param params.type Object type\r\n   * @param [params.format] mp3, ogg, raw, etc. (raw returns the original format)\r\n   * @param [params.bitrate] max bitrate for transcoding in bytes (e.g 192000=192Kb)\r\n   * @param [params.stats] 0, 1 (if false disable stat recording when playing the object; default: 1)\r\n   * @see {@link https://ampache.org/api/api-json-methods#download}\r\n   */\r\n  download(params: {\r\n    id: UID;\r\n    type: \"song\" | \"podcast_episode\" | \"search\" | \"playlist\";\r\n    format?: string;\r\n    bitrate?: number;\r\n    stats?: BinaryBoolean;\r\n  }) {\r\n    let query = \"download\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.binary(query);\r\n  }\r\n\r\n  /**\r\n   * Get an art image file.\r\n   * @remarks MINIMUM_API_VERSION=400001\r\n   * @param params.id UID to find\r\n   * @param params.type Object type\r\n   * @param [params.size] width x height (e.g. '640x480')\r\n   * @see {@link https://ampache.org/api/api-json-methods#get_art}\r\n   */\r\n  getArt(params: {\r\n    id: UID;\r\n    type: \"song\" | \"artist\" | \"album\" | \"playlist\" | \"search\" | \"podcast\";\r\n    size?: string;\r\n  }) {\r\n    let query = \"get_art\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.binary(query);\r\n  }\r\n\r\n  /**\r\n   * This is for controlling localplay\r\n   * @param params.command The command to send to the localplay controller\r\n   * @param [params.oid] Object UID\r\n   * @param [params.type] Object type\r\n   * @param [params.clear] 0, 1 (Clear the current playlist before adding)\r\n   * @remarks MINIMUM_API_VERSION=380001; CHANGED_IN_API_VERSION=5.0.0\r\n   * @see {@link https://ampache.org/api/api-json-methods#localplay}\r\n   */\r\n  localplay(params: {\r\n    command:\r\n      | \"next\"\r\n      | \"prev\"\r\n      | \"stop\"\r\n      | \"play\"\r\n      | \"pause\"\r\n      | \"add\"\r\n      | \"volume_up\"\r\n      | \"volume_down\"\r\n      | \"volume_mute\"\r\n      | \"delete_all\"\r\n      | \"skip\"\r\n      | \"status\";\r\n    oid?: number;\r\n    type?:\r\n      | \"song\"\r\n      | \"video\"\r\n      | \"podcast_episode\"\r\n      | \"channel\"\r\n      | \"broadcast\"\r\n      | \"democratic\"\r\n      | \"live_stream\";\r\n    clear?: BinaryBoolean;\r\n  }) {\r\n    let query = \"localplay\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request(query);\r\n  }\r\n\r\n  /**\r\n   * Get the list of songs in your localplay playlist\r\n   * @remarks MINIMUM_API_VERSION=5.0.0\r\n   * @see {@link https://ampache.org/api/api-json-methods#localplay_songs}\r\n   */\r\n  localplaySongs() {\r\n    let query = \"localplay_songs\";\r\n    return this.request(query);\r\n  }\r\n\r\n  /**\r\n   * This is for controlling democratic play (Songs only). VOTE: +1 vote for the oid. DEVOTE: -1 vote for the oid.\r\n   * PLAYLIST: Return an array of song items with an additional VOTE COUNT element.\r\n   * PLAY: Returns the URL for playing democratic play.\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.oid UID of song\r\n   * @param params.method vote, devote, playlist, play\r\n   * @see {@link https://ampache.org/api/api-json-methods#democratic}\r\n   */\r\n  democratic(params: {\r\n    oid: UID;\r\n    method: \"vote\" | \"devote\" | \"playlist\" | \"play\";\r\n  }) {\r\n    let query = \"democratic\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request(query);\r\n  }\r\n\r\n  /**\r\n   * Get what is currently being played by all users.\r\n   * @remarks MINIMUM_API_VERSION=6.3.1\r\n   * @see {@link https://ampache.org/api/api-json-methods#now_playing}\r\n   */\r\n  nowPlaying() {\r\n    let query = \"now_playing\";\r\n    return this.request<{ now_playing: NowPlayingResponse[] }>(query);\r\n  }\r\n\r\n  /**\r\n   * Inform the server about the state of your client. (Song you are playing, Play/Pause state, etc.)\r\n   * @remarks MINIMUM_API_VERSION=6.4.0\r\n   * @param params.filter $object_id currently playing/stopping\r\n   * @param [params.type] song, video, podcast_episode (Default: song)\r\n   * @param [params.state] play, stop (Default: play)\r\n   * @param [params.time] current play time in whole seconds (Default: 0)\r\n   * @param [params.client] agent/client name\r\n   * @see {@link https://ampache.org/api/api-json-methods#player}\r\n   */\r\n  player(params: {\r\n    filter: UID;\r\n    type?: \"song\" | \"video\" | \"podcast_episode\";\r\n    state?: \"play\" | \"stop\";\r\n    time?: number;\r\n    client?: string;\r\n  }) {\r\n    let query = \"player\";\r\n    query += qs.stringify(params, \"&\");\r\n    return this.request<{ now_playing: NowPlayingResponse[] }>(query);\r\n  }\r\n\r\n  /**\r\n   * Perform an advanced search given passed rules.\r\n   * You'll want to consult the docs for this.\r\n   * @remarks MINIMUM_API_VERSION=380001\r\n   * @param params.operator and, or (whether to match one rule or all)\r\n   * @param params.type Object type to return\r\n   * @param params.rules An array of rules\r\n   * @param [params.random] 0, 1 (random order of results; default to 0)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#advanced_search}\r\n   */\r\n  advancedSearch(\r\n    params: {\r\n      operator: \"and\" | \"or\";\r\n      type:\r\n        | \"song\"\r\n        | \"album\"\r\n        | \"album_disk\"\r\n        | \"artist\"\r\n        | \"album_artist\"\r\n        | \"song_artist\"\r\n        | \"label\"\r\n        | \"playlist\"\r\n        | \"podcast\"\r\n        | \"podcast_episode\"\r\n        | \"genre\"\r\n        | \"user\"\r\n        | \"video\";\r\n      rules: Array<Array<string>>;\r\n      random?: BinaryBoolean;\r\n    } & Pagination,\r\n  ) {\r\n    let query = \"advanced_search\";\r\n\r\n    for (let i = 0; i < params.rules.length; i++) {\r\n      const thisRule = params.rules[i];\r\n      const ruleNumber = i + 1;\r\n\r\n      params[\"rule_\" + ruleNumber] = thisRule[0];\r\n      params[\"rule_\" + ruleNumber + \"_operator\"] = thisRule[1];\r\n      params[\"rule_\" + ruleNumber + \"_input\"] = thisRule[2];\r\n\r\n      if (thisRule[0] === \"metadata\") {\r\n        params[\"rule_\" + ruleNumber + \"_subtype\"] = thisRule[3];\r\n      }\r\n    }\r\n\r\n    // drop the initial 'rules' as it was split into its parts\r\n    delete params.rules;\r\n\r\n    query += qs.stringify(params, \"&\");\r\n\r\n    let data;\r\n\r\n    switch (params.type) {\r\n      case \"song\":\r\n        data = this.request<SongsResponse>(query);\r\n        break;\r\n      case \"album\":\r\n        data = this.request<AlbumsResponse>(query);\r\n        break;\r\n      case \"artist\":\r\n      case \"album_artist\":\r\n      case \"song_artist\":\r\n        data = this.request<ArtistsResponse>(query);\r\n        break;\r\n      case \"label\":\r\n        data = this.request<LabelsResponse>(query);\r\n        break;\r\n      case \"playlist\":\r\n        data = this.request<PlaylistsResponse>(query);\r\n        break;\r\n      case \"podcast\":\r\n        data = this.request<PodcastsResponse>(query);\r\n        break;\r\n      case \"podcast_episode\":\r\n        data = this.request<PodcastEpisodesResponse>(query);\r\n        break;\r\n      case \"genre\":\r\n        data = this.request<GenresResponse>(query);\r\n        break;\r\n      case \"user\":\r\n        data = this.request<UsersResponse>(query);\r\n        break;\r\n      case \"video\":\r\n        data = this.request<VideosResponse>(query);\r\n        break;\r\n      default:\r\n        return false;\r\n    }\r\n\r\n    return data;\r\n  }\r\n\r\n  // alias of advanced_search\r\n  search = this.advancedSearch;\r\n\r\n  /**\r\n   * Perform a search given passed rules and return matching objects in a group.\r\n   * If the rules do not exist for the object type or would return the entire table they will not return objects\r\n   * You'll want to consult the docs for this.\r\n   * @remarks MINIMUM_API_VERSION=6.3.0\r\n   * @param params.operator and, or (whether to match one rule or all)\r\n   * @param params.rules An array of rules\r\n   * @param [params.type] Object type to return (all, music, song_artist, album_artist, podcast, video; all by default)\r\n   * @param [params.random] 0, 1 (random order of results; default to 0)\r\n   * @param [params.offset]\r\n   * @param [params.limit]\r\n   * @see {@link https://ampache.org/api/api-json-methods#search_group}\r\n   */\r\n  searchGroup(\r\n      params: {\r\n        operator: \"and\" | \"or\";\r\n        rules: Array<Array<string>>;\r\n        type?:\r\n            | \"all\"\r\n            | \"music\"\r\n            | \"song_artist\"\r\n            | \"album_artist\"\r\n            | \"podcast\"\r\n            | \"video\";\r\n        random?: BinaryBoolean;\r\n      } & Pagination,\r\n  ) {\r\n    let query = \"search_group\";\r\n\r\n    for (let i = 0; i < params.rules.length; i++) {\r\n      const thisRule = params.rules[i];\r\n      const ruleNumber = i + 1;\r\n\r\n      params[\"rule_\" + ruleNumber] = thisRule[0];\r\n      params[\"rule_\" + ruleNumber + \"_operator\"] = thisRule[1];\r\n      params[\"rule_\" + ruleNumber + \"_input\"] = thisRule[2];\r\n\r\n      if (thisRule[0] === \"metadata\") {\r\n        params[\"rule_\" + ruleNumber + \"_subtype\"] = thisRule[3];\r\n      }\r\n    }\r\n\r\n    // drop the initial 'rules' as it was split into its parts\r\n    delete params.rules;\r\n\r\n    query += qs.stringify(params, \"&\");\r\n\r\n    let data;\r\n\r\n    switch (params.type) {\r\n      case \"music\":\r\n        data = this.request<{ search: {\r\n            song: SongResponse[];\r\n            album: AlbumResponse[];\r\n            artist: ArtistResponse[];\r\n          }\r\n        }>(query);\r\n        break;\r\n      case \"song_artist\":\r\n        data = this.request<{ search: {\r\n            song: SongResponse[];\r\n            album: AlbumResponse[];\r\n            song_artist: ArtistResponse[];\r\n          }\r\n        }>(query);\r\n        break;\r\n      case \"album_artist\":\r\n        data = this.request<{ search: {\r\n            song: SongResponse[];\r\n            album: AlbumResponse[];\r\n            album_artist: ArtistResponse[];\r\n          }\r\n        }>(query);\r\n        break;\r\n      case \"podcast\":\r\n        data = this.request<{ search: {\r\n            podcast: PodcastResponse[];\r\n            podcast_episode: PodcastEpisodeResponse[];\r\n          }\r\n        }>(query);\r\n        break;\r\n      case \"video\":\r\n        data = this.request<{ search: {\r\n            video: VideoResponse[];\r\n          }\r\n        }>(query);\r\n        break;\r\n      case \"all\":\r\n      default:\r\n        data = this.request<{ search: {\r\n            song: SongResponse[];\r\n            album: AlbumResponse[];\r\n            artist: ArtistResponse[];\r\n            song_artist: ArtistResponse[];\r\n            album_artist: ArtistResponse[];\r\n            label: LabelResponse[];\r\n            playlist: PlaylistResponse[];\r\n            podcast: PodcastResponse[];\r\n            podcast_episode: PodcastEpisodeResponse[];\r\n            genre: GenreResponse[];\r\n            user: UserResponse[];\r\n          }\r\n        }>(query);\r\n    }\r\n\r\n    return data;\r\n  }\r\n}\r\n","import qs from \"querystringify\";\nimport { UserResponse, UserSummary, ActivityResponse } from \"./types\";\nimport { Base, BinaryBoolean, ExtendedPagination, Success } from \"../base\";\n\nexport class Users extends Base {\n  /**\n   * Get ids and usernames for your site\n   * @remarks MINIMUM_API_VERSION=5.0.0\n   * @see {@link https://ampache.org/api/api-json-methods#users}\n   */\n  users() {\n    let query = \"users\";\n    return this.request<{ user: UserSummary[] }>(query);\n  }\n\n  /**\n   * This get a user's public information (or current user if username is omitted)\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.username] UID to find\n   * @see {@link https://ampache.org/api/api-json-methods#user}\n   */\n  user(params?: { username?: string }) {\n    let query = \"user\";\n    query += qs.stringify(params, \"&\");\n    return this.request<UserResponse>(query);\n  }\n\n  /**\n   * Create a new user\n   * ACCESS REQUIRED: 100 (Admin)\n   * @remarks MINIMUM_API_VERSION=400001\n   * @param params.username Username\n   * @param params.password SHA256 hashed password\n   * @param params.email  Email\n   * @param [params.fullname] Full Name\n   * @param [params.disable] 0, 1\n   * @param [params.catalog_filter_group] Catalog filter group, default = 0\n   * @see {@link https://ampache.org/api/api-json-methods#user_create}\n   */\n  userCreate(params: {\n    username: string;\n    password: string;\n    email: string;\n    fullname?: string;\n    disable?: BinaryBoolean;\n    catalog_filter_group?: number;\n  }) {\n    let query = \"user_create\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Register as a new user if allowed.\n   * @remarks MINIMUM_API_VERSION=6.0.0\n   * @param params.username Username\n   * @param params.password SHA256 hashed password\n   * @param params.email  Email\n   * @param [params.fullname] Full Name\n   * @see {@link https://ampache.org/api/api-json-methods/#register}\n   */\n  register(params: {\n    username: string;\n    password: string;\n    email: string;\n    fullname?: string;\n  }) {\n    let query = \"register\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Update an existing user\n   * ACCESS REQUIRED: 100 (Admin)\n   * @remarks MINIMUM_API_VERSION=400001\n   * @param  params.username Username\n   * @param  [params.password] Password\n   * @param  [params.email] Email\n   * @param  [params.fullname] Full Name\n   * @param  [params.website] Website\n   * @param  [params.state] State\n   * @param  [params.city] City\n   * @param  [params.disable] 0, 1\n   * @param  [params.maxbitrate] Max bitrate for transcoding\n   * @see {@link https://ampache.org/api/api-json-methods#user_update}\n   * @deprecated Being removed in 7.0.0. Use `user_edit` instead.\n   */\n  userUpdate(params: {\n    username: string;\n    password?: string;\n    email?: string;\n    fullname?: string;\n    website?: string;\n    state?: string;\n    city?: string;\n    disable?: BinaryBoolean;\n    maxbitrate?: string;\n  }) {\n    let query = \"user_update\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Update an existing user\n   * ACCESS REQUIRED: 100 (Admin)\n   * @remarks MINIMUM_API_VERSION=6.0.0\n   * @param  params.username Username\n   * @param  [params.password] Password\n   * @param  [params.email] Email\n   * @param  [params.fullname] Full Name\n   * @param  [params.website] Website\n   * @param  [params.state] State\n   * @param  [params.city] City\n   * @param  [params.disable] 0, 1\n   * @param  [params.maxbitrate] Max bitrate for transcoding\n   * @param  [params.group] Catalog filter group, default = 0\n   * @param  [params.fullname_public] show fullname in public display\n   * @param  [params.reset_apikey] reset user Api Key\n   * @param  [params.reset_streamtoken] reset user Stream Token\n   * @param  [params.clear_stats] reset all stats for this user\n   * @see {@link https://ampache.org/api/api-json-methods#user_edit}\n   */\n  userEdit(params: {\n    username: string;\n    password?: string;\n    email?: string;\n    fullname?: string;\n    website?: string;\n    state?: string;\n    city?: string;\n    maxbitrate?: string;\n    group?: number;\n    disable?: BinaryBoolean;\n    fullname_public?: BinaryBoolean;\n    reset_apikey?: BinaryBoolean;\n    reset_streamtoken?: BinaryBoolean;\n    clear_stats?: BinaryBoolean;\n  }) {\n    let query = \"user_edit\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * Delete an existing user.\n   * ACCESS REQUIRED: 100 (Admin)\n   * @remarks MINIMUM_API_VERSION=400001\n   * @param params.filter UID of user to delete\n   * @see {@link https://ampache.org/api/api-json-methods#user_delete}\n   */\n  userDelete(params: { filter: string }) {\n    let query = \"user_delete\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * This gets the followers for the requested username\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.username UID to find\n   * @param [params.offset]\n   * @param [params.limit]\n   * @param [params.cond]\n   * @param [params.sort]\n   * @see {@link https://ampache.org/api/api-json-methods#followers}\n   */\n  followers(\n    params: {\n      username: string;\n    } & ExtendedPagination,\n  ) {\n    let query = \"followers\";\n    query += qs.stringify(params, \"&\");\n    return this.request<{ user: UserSummary[] }>(query);\n  }\n\n  /**\n   * Get a list of people that this user follows\n   * @remarks MINIMUM_API_VERSION=380001\n   * @see {@link https://ampache.org/api/api-json-methods#following}\n   */\n  following(params: { username: string }) {\n    let query = \"following\";\n    query += qs.stringify(params, \"&\");\n    return this.request<{ user: UserSummary[] }>(query);\n  }\n\n  /**\n   * This will follow/unfollow a user\n   * @param params.username Username string to find\n   * @see {@link https://ampache.org/api/api-json-methods#toggle_follow}\n   */\n  toggleFollow(params: { username: string }) {\n    let query = \"toggle_follow\";\n    query += qs.stringify(params, \"&\");\n    return this.request<Success>(query);\n  }\n\n  /**\n   * This get a user timeline\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.username Username to find\n   * @param [params.limit] Max results to return\n   * @param [params.since] UNIXTIME\n   * @see {@link https://ampache.org/api/api-json-methods#timeline}\n   */\n  timeline(params: { username: string; limit?: number; since?: number }) {\n    let query = \"timeline\";\n    query += qs.stringify(params, \"&\");\n    return this.request<{ activity: ActivityResponse[] }>(query);\n  }\n\n  /**\n   * This get current user friends timeline\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.limit] Max results to return\n   * @param [params.since] UNIXTIME\n   * @see {@link https://ampache.org/api/api-json-methods#friends_timeline}\n   */\n  friendsTimeline(params?: { limit?: number; since?: number }) {\n    let query = \"friends_timeline\";\n    query += qs.stringify(params, \"&\");\n    return this.request<{ activity: ActivityResponse[] }>(query);\n  }\n}\n","import qs from \"querystringify\";\nimport { VideoResponse, VideosResponse, DeletedVideosResponse } from \"./types\";\nimport { Base, BinaryBoolean, Pagination, UID } from \"../base\";\n\nexport class Videos extends Base {\n  /**\n   * Get videos\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param [params.filter] Filter results to match this string\n   * @param [params.exact] 0, 1 (if true filter is exact = rather than fuzzy LIKE)\n   * @param [params.offset]\n   * @param [params.limit]\n   * @see {@link https://ampache.org/api/api-json-methods#videos}\n   */\n  videos(\n    params?: {\n      filter?: string;\n      exact?: BinaryBoolean;\n    } & Pagination,\n  ) {\n    let query = \"videos\";\n    query += qs.stringify(params, \"&\");\n    return this.request<VideosResponse>(query);\n  }\n\n  /**\n   * This returns a single video\n   * @remarks MINIMUM_API_VERSION=380001\n   * @param params.filter UID to find\n   * @see {@link https://ampache.org/api/api-json-methods#video}\n   */\n  video(params: { filter: UID }) {\n    let query = \"video\";\n    query += qs.stringify(params, \"&\");\n    return this.request<VideoResponse>(query);\n  }\n\n  /**\n   * This returns video objects that have been deleted\n   * @param [params.offset]\n   * @param [params.limit]\n   * @see {@link https://ampache.org/api/api-json-methods#deleted_videos}\n   */\n  deletedVideos(params?: {} & Pagination) {\n    let query = \"deleted_videos\";\n    query += qs.stringify(params, \"&\");\n    return this.request<DeletedVideosResponse>(query);\n  }\n}\n"],"names":["has","Object","prototype","hasOwnProperty","encode","input","encodeURIComponent","e","obj","prefix","value","key","pairs","call","isNaN","push","length","join","n","Promise","t","r","s","XMLHttpRequest","o","u","i","a","ok","status","statusText","url","responseURL","text","resolve","responseText","json","then","JSON","parse","blob","Blob","response","clone","headers","keys","entries","get","toLowerCase","l","open","method","onload","getAllResponseHeaders","replace","onerror","withCredentials","credentials","setRequestHeader","send","body","browser","self","fetch","require$$0","default","h","f","binLen","Error","c","parseInt","substr","w","E","A","charCodeAt","p","indexOf","search","charAt","ArrayBuffer","Uint8Array","outputUpper","toUpperCase","b64Pad","String","fromCharCode","outputLen","shakeLen","constructor","this","encoding","numRounds","U","R","update","T","F","m","g","slice","getHash","H","B","v","C","Y","S","I","setHMACKey","L","M","getHMAC","N","d","y","b","super","hmacKey","format","outputDebugURL","config","label","useBearerToken","sessionKey","console","debug","Base","version","request","endpoint","Authorization","binary","setSessionKey","rawURL","params","query","qs","AmpacheAPI","derivedCtor","baseCtors","albums","album","artistAlbums","genreAlbums","artists","artist","genreArtists","labelArtists","handshake","token","auth","timestamp","Math","floor","Date","getTime","user","data","ping","goodbye","lostPassword","encryptPassword","getSHA256","password","time","shaObj","JsSHA","bookmark","bookmarks","getBookmark","bookmarkCreate","bookmarkEdit","bookmarkDelete","catalogs","catalog","catalogAction","catalogFile","catalogAdd","catalogDelete","genres","genre","labels","licenses","license","liveStreams","liveStream","liveStreamCreate","liveStreamEdit","liveStreamDelete","playlists","smartlists","Array","isArray","playlist","filter","item","id","toString","startsWith","userPlaylists","userSmartlists","playlistCreate","playlistAdd","playlistEdit","playlistDelete","playlistAddSong","playlistRemoveSong","playlistGenerate","playlistHash","podcasts","podcast","podcastCreate","podcastEdit","podcastDelete","podcastEpisodes","podcastEpisode","podcastEpisodeDelete","updatePodcast","deletedPodcastEpisodes","systemPreferences","systemPreference","userPreferences","userPreference","preferenceCreate","preferenceEdit","preferenceDelete","shares","share","shareCreate","shareEdit","shareDelete","last_shouts","songs","song","artistSongs","albumSongs","genreSongs","playlistSongs","licenseSongs","songDelete","urlToSong","searchSongs","deletedSongs","args","advancedSearch","systemUpdate","getIndexes","type","list","index","browse","getSimilar","stats","rate","flag","recordPlay","scrobble","updateFromTags","updateArtistInfo","updateArt","stream","download","getArt","localplay","localplaySongs","democratic","nowPlaying","player","rules","thisRule","ruleNumber","searchGroup","users","userCreate","register","userUpdate","userEdit","userDelete","followers","following","toggleFollow","timeline","friendsTimeline","videos","video","deletedVideos","forEach","baseCtor","getOwnPropertyNames","name","defineProperty","getOwnPropertyDescriptor"],"mappings":"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"}