from wsgiref.simple_server import make_server from bottle import app, request, HTTPResponse, Bottle import xbmc import re from librespot.core import Session from librespot.audio.decoders import AudioQuality, VorbisOnlyAudioQuality from librespot.metadata import TrackId from utils import log_msg class LibrespotServer(Bottle): def __init__(self, session: Session): super(LibrespotServer, self).__init__() self.session: Session = session self.route('/track/', callback=self.stream) # TODO: Make Range header work PLEASE I BEG def stream(self, track_id): try: playabletrack_id = TrackId.from_uri(f"spotify:track:{track_id}") stream = self.session.content_feeder().load( playabletrack_id, VorbisOnlyAudioQuality(AudioQuality.NORMAL), False, None) start = 0 end = stream.input_stream.size payload = stream.input_stream.stream() log_msg(stream.input_stream.size) # reqrange = request.get_header("range") # if reqrange is not None: # range_search = re.search( # "^bytes=(?P[0-9]+?)-(?P[0-9]+?)$", # reqrange) # if range_search is not None: # start = int(range_search.group("start")) # end = (int(range_search.group("end")) # if int(range_search.group("end")) <= # stream.input_stream.size else # stream.input_stream.size) # payload.skip(start) # else: # payload = stream response = HTTPResponse(body=payload) response.add_header('Content-Type', 'audio/ogg') # response.add_header('Accept-Ranges', 'bytes') # response.add_header("Content-Length", str(stream.input_stream.size).encode() if # stream.input_stream.size == end else "{}-{}/{}" # .format(start, end, # stream.input_stream.size).encode()) return response except Exception as e: log_msg(e) def start_thread(web_port: int) -> None: httpd = make_server('127.0.0.1', web_port, app) monitor = xbmc.Monitor() while not monitor.abortRequested(): httpd.handle_request()