diff --git a/catt/controllers.py b/catt/controllers.py index 57c6e87..5150909 100644 --- a/catt/controllers.py +++ b/catt/controllers.py @@ -96,7 +96,9 @@ def setup_cast(device_name, video_url=None, prep=None, controller=None, ytdl_opt if video_url: model_name = DEVICES_WITH_TWO_MODEL_NAMES.get(cast.model_name, cast.model_name) cc_info = (cast.device.manufacturer, model_name) - stream = StreamInfo(video_url, model=cc_info, device_type=cast.cast_type, ytdl_options=ytdl_options) + stream = StreamInfo( + video_url, model=cc_info, host=cast.host, device_type=cast.cast_type, ytdl_options=ytdl_options + ) if controller: if controller == "default": diff --git a/catt/stream_info.py b/catt/stream_info.py index 9a4d9f7..b8f7c97 100644 --- a/catt/stream_info.py +++ b/catt/stream_info.py @@ -1,8 +1,9 @@ +import ipaddress import random from pathlib import Path import click -import netifaces +import ifaddr import youtube_dl from .util import guess_mime @@ -32,10 +33,10 @@ class StreamInfoError(Exception): class StreamInfo: - def __init__(self, video_url, model=None, device_type=None, ytdl_options=None): + def __init__(self, video_url, host=None, model=None, device_type=None, ytdl_options=None): if "://" not in video_url: self._local_file = video_url - self.local_ip = self._get_local_ip() + self.local_ip = self._get_local_ip(host) self.port = random.randrange(45000, 47000) self.is_local_file = True else: @@ -148,9 +149,21 @@ def set_playlist_entry(self, number): else: raise StreamInfoError("called on non-playlist") - def _get_local_ip(self): - interface = netifaces.gateways()["default"][netifaces.AF_INET][1] - return netifaces.ifaddresses(interface)[netifaces.AF_INET][0]["addr"] + def _get_local_ip(self, host): + for adapter in ifaddr.get_adapters(): + for adapter_ip in adapter.ips: + aip = adapter_ip.ip[0] if isinstance(adapter_ip.ip, tuple) else adapter_ip.ip + try: + if not isinstance(ipaddress.ip_address(host), type(ipaddress.ip_address(aip))): + raise ValueError + except ValueError: + continue + ipt = [(ip, adapter_ip.network_prefix) for ip in (aip, host)] + catt_net, cc_net = [ipaddress.ip_network("%s/%s" % ip, strict=False) for ip in ipt] + if catt_net == cc_net: + return aip + else: + continue def _get_stream_preinfo(self, video_url): try: diff --git a/setup.py b/setup.py index df5ab38..8b8396b 100644 --- a/setup.py +++ b/setup.py @@ -13,7 +13,7 @@ with open("README.rst") as readme_file: readme = readme_file.read() -requirements = ["youtube-dl>=2017.3.15", "PyChromecast>=2.3.0", "Click>=5.0", "netifaces>=0.10.7", "requests>=2.18.4"] +requirements = ["youtube-dl>=2017.3.15", "PyChromecast>=2.3.0", "Click>=5.0", "ifaddr>=0.1.4", "requests>=2.18.4"] test_requirements = [] # type: ignore