import requests import base64 import urllib.parse def stringtob64(inputstring): return base64.b64encode(inputstring.encode('ascii')).decode('ascii') class ts3ab: def __init__(self, apiurl, userid, token, botid=0): self._token = stringtob64("{userid}:{token}".format(userid=userid, token=token)) self.apiurl = apiurl self.botid = botid def gethistory(self): response = requests.get("{apiurl}/bot/use/{botid}(/history/last/10".format(apiurl=self.apiurl, botid=self.botid), headers={ "Content-Type": "application/json", "Authorization": "Basic {token}".format(token=self._token) } ) return response def getplaylist(self, listid): return self.playlist(self, listid) def getplaylists(self): response = requests.get("{apiurl}/bot/use/{botid}(/list/list".format(apiurl=self.apiurl, botid=self.botid), headers={ "Content-Type": "application/json", "Authorization": "Basic {token}".format(token=self._token) } ) if (response.status_code != 200): raise Exception("unable to fetch {status_code}".format(status_code=response.status_code)) return response.json() def createplaylist(self, listid, title=None): response = requests.get("{apiurl}/bot/use/{botid}(/list/create/{listid}/{title}".format(apiurl=self.apiurl, botid=self.botid, listid=listid, title=title if not title == None else listid), headers={ "Content-Type": "application/json", "Authorization": "Basic {token}".format(token=self._token) } ) if (response.status_code != 204): raise Exception("unable to fetch {status_code}".format(status_code=response.status_code)) return response class playlist: def __init__(self, outer, listid): self._outer = outer self.id = listid if not self._checkiflistexists(): self._outer.createplaylist(self.id, self.id) self.songcount = 0 self.title = self.id self.items = [] self.renamestash = [] return pljson = self._getpl(0, 20).json() self.songcount = int(pljson['SongCount']) self.title = pljson['Title'] self.items = pljson['Items'] self.renamestash = [] i = 1 while len(self.items) < self.songcount: self.items += self._getpl(20*i).json()['Items'] i += 1 def _checkiflistexists(self): for playlist in self._outer.getplaylists(): if playlist['Id'] == self.id: return True return False def _getpl(self, offset=0, count=20): response = requests.get("{apiurl}/bot/use/{botid}(/list/show/{listid}/{offset}/{count}".format(apiurl=self._outer.apiurl, botid=self._outer.botid, listid=self.id, offset=offset, count=count), headers={ "Content-Type": "application/json", "Authorization": "Basic {token}".format(token=self._outer._token) } ) if response.status_code != 200: raise Exception("unable to fetch {status_code}".format(status_code=response.status_code)) if "ErrorMessage" in response.json().keys(): raise Exception(response.json()['ErrorMessage']) return response def fetchsongcount(self): self.songcount = self._getpl(0, 1).json()['SongCount'] def additem(self, url, name=None): self.fetchsongcount() response = requests.get("{apiurl}/bot/use/{botid}(/list/add/{listid}/{url}".format(apiurl=self._outer.apiurl, botid=self._outer.botid, listid=self.id, url=urllib.parse.quote(url, safe='')), headers={ "Content-Type": "application/json", "Authorization": "Basic {token}".format(token=self._outer._token) } ) if response.status_code != 200: raise Exception("unable to add {status_code}".format(status_code=response.status_code)) if "ErrorMessage" in response.json().keys(): raise Exception(response.json()['ErrorMessage']) #self.renamestash.append({'index': self.songcount, 'name': name}) if not name == None: self.renameitem(self.songcount, name) def clearrenamestash(self): for item in self.renamestash: self.renameitem(item['index'], item['name']) self.renamestash.remove(item) def renameitem(self, index, name): response = requests.get("{apiurl}/bot/use/{botid}(/list/item/name/{listid}/{index}/{title}".format(apiurl=self._outer.apiurl, botid=self._outer.botid, listid=self.id, index=index, title=urllib.parse.quote(name, safe='')), headers={ "Content-Type": "application/json", "Authorization": "Basic {token}".format(token=self._outer._token) } ) if response.status_code != 204: raise Exception("unable to rename {status_code}".format(status_code=response.status_code)) def delitem(self, index): response = requests.get("{apiurl}/bot/use/{botid}(/list/item/delete/{listid}/{index}".format(apiurl=self._outer.apiurl, botid=self._outer.botid, listid=self.id, index=index), headers={ "Content-Type": "application/json", "Authorization": "Basic {token}".format(token=self._outer._token) } ) if response.status_code != 204: raise Exception("unable to delete {status_code}".format(status_code=response.status_code))