fix(service): Add dynamic port resolution for netflix service
[plugin.video.netflix.git] / service.py
1 import threading
2 import SocketServer
3 import xbmc
4 import socket
5 from xbmcaddon import Addon
6 from resources.lib.KodiHelper import KodiHelper
7 from resources.lib.MSLHttpRequestHandler import MSLHttpRequestHandler
8 from resources.lib.NetflixHttpRequestHandler import NetflixHttpRequestHandler
9
10 def select_unused_port():
11     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
12     sock.bind(('localhost', 0))
13     addr, port = sock.getsockname()
14     sock.close()
15     return port
16
17 addon = Addon()
18 kodi_helper = KodiHelper()
19
20 msl_port = select_unused_port()
21 addon.setSetting('msl_service_port', str(msl_port))
22 kodi_helper.log(msg='[MSL] Picked Port: ' + str(msl_port))
23
24 ns_port = select_unused_port()
25 addon.setSetting('netflix_service_port', str(ns_port))
26 kodi_helper.log(msg='[NS] Picked Port: ' + str(ns_port))
27
28 # server defaults
29 SocketServer.TCPServer.allow_reuse_address = True
30
31 # configure the MSL Server
32 msl_server = SocketServer.TCPServer(('127.0.0.1', msl_port), MSLHttpRequestHandler)
33 msl_server.server_activate()
34 msl_server.timeout = 1
35
36 # configure the Netflix Data Server
37 nd_server = SocketServer.TCPServer(('127.0.0.1', ns_port), NetflixHttpRequestHandler)
38 nd_server.server_activate()
39 nd_server.timeout = 1
40
41 if __name__ == '__main__':
42     monitor = xbmc.Monitor()
43
44     msl_thread = threading.Thread(target=msl_server.serve_forever)
45     msl_thread.daemon = True
46     msl_thread.start()
47
48     nd_thread = threading.Thread(target=nd_server.serve_forever)
49     nd_thread.daemon = True
50     nd_thread.start()
51
52     while not monitor.abortRequested():
53         if monitor.waitForAbort(5):
54             msl_server.shutdown()
55             nd_server.shutdown()
56             break
57
58     msl_server.server_close()
59     msl_server.socket.close()
60     msl_server.shutdown()
61     kodi_helper.log(msg='Stopped MSL Service')
62
63     nd_server.server_close()
64     nd_server.socket.close()
65     nd_server.shutdown()
66     kodi_helper.log(msg='Stopped HTTP Service')