Skip to content

Commit

Permalink
[Incomplete] Implementation of ZeroconfServer
Browse files Browse the repository at this point in the history
  • Loading branch information
kokarare1212 committed May 15, 2021
1 parent 4a016f5 commit 145e9a7
Showing 1 changed file with 89 additions and 0 deletions.
89 changes: 89 additions & 0 deletions librespot/ZeroconfServer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
from __future__ import annotations
from librespot.common import Utils
from librespot.core import Session
from librespot.crypto import DiffieHellman
from librespot.standard import Closeable, Runnable
from librespot.proto import Connect
import concurrent.futures
import random
import socket


class ZeroconfServer(Closeable):
__MAX_PORT = 65536
__MIN_PORT = 1024
__EOL = "\r\n"
__keys: DiffieHellman
__inner: ZeroconfServer.Inner

def __init__(self, inner: ZeroconfServer.Inner, listen_port: int, listen_all: bool):
self.__inner = inner
self.__keys = DiffieHellman()

if listen_port == -1:
listen_port = random.randint(self.__MIN_PORT, self.__MAX_PORT)

class Builder(Session.AbsBuilder):
__listenAll = False
__listenPort = -1

def __init__(self, conf: Session.Configuration):
super().__init__(conf)

def set_listen_all(self, listen_all: bool) -> ZeroconfServer.Builder:
self.__listenAll = listen_all
return self

def set_listen_port(self, listen_port: int) -> ZeroconfServer.Builder:
self.__listenPort = listen_port
return self

def create(self) -> ZeroconfServer:
return ZeroconfServer(ZeroconfServer.Inner(self.device_type, self.device_name, self.preferred_locale, self.conf, self.device_id), self.__listenPort, self.__listenAll)

class Inner:
device_type: Connect.DeviceType = None
device_name: str = None
device_id: str = None
preferred_locale: str = None
conf = None

def __init__(self,
device_type: Connect.DeviceType,
device_name: str,
preferred_locale: str,
conf: Session.Configuration,
device_id: str = None):
self.preferred_locale = preferred_locale
self.conf = conf
self.device_type = device_type
self.device_name = device_name
self.device_id = device_id if device_id is not None else Utils.random_hex_string(
40)

class HttpRunner(Runnable, Closeable):
__sock: socket
__executorService: concurrent.futures.ThreadPoolExecutor = concurrent.futures.ThreadPoolExecutor()
__shouldStop: bool = False

def __init__(self, port: int):
self.__sock = socket.socket()
self.__sock.bind(("0.0.0.0", port))
self.__sock.listen(1)

def run(self) -> None:
while not self.__shouldStop:
client, address = self.__sock.accept()

def anonymous():
self.__handle(client)
client.close()

self.__executorService.submit(anonymous)

def __handle(self, client: socket.socket):
client.recv(1)

def close(self) -> None:
super().close()

0 comments on commit 145e9a7

Please sign in to comment.