neodot/.config/mpv/scripts/mpvDLNA/mpvDLNA.py
2023-11-29 21:44:29 -05:00

127 lines
4.0 KiB
Python

import sys
import upnpclient
from lxml import etree
# Try to import wake on lan
wol = True
try:
import wakeonlan
except ImportError as error:
wol = False
import logging
# important information is passed through stdout so we need to supress
# the output of the upnp client module
logging.getLogger("upnpclient").setLevel(logging.CRITICAL)
logging.getLogger("ssdp").setLevel(logging.CRITICAL)
def wake(mac):
if wol:
try:
wakeonlan.send_magic_packet(mac);
print("packet sent")
except:
print("send failed")
else:
print("import failed")
def info(url, id, count):
device = upnpclient.Device(url)
result = device.ContentDirectory.Browse(ObjectID=id, BrowseFlag="BrowseMetadata", Filter="*", StartingIndex=0, RequestedCount=count, SortCriteria="")
root = etree.fromstring(result["Result"])
# Determine if we should be looking at items or containers
list = root.findall("./item", root.nsmap)
type = "item"
if len(list) == 0:
list = root.findall("./container", root.nsmap)
type = "container"
print(type)
for t in list:
print("")
print(t.findtext("upnp:episodeNumber", "No Episode Number", root.nsmap))
print(t.findtext("dc:description", "No Description", root.nsmap).encode().decode("ascii", errors='ignore'))
def browse(url, id, count):
device = upnpclient.Device(url)
result = device.ContentDirectory.Browse(ObjectID=id, BrowseFlag="BrowseDirectChildren", Filter="*", StartingIndex=0, RequestedCount=count, SortCriteria="")
root = etree.fromstring(result["Result"])
list = {}
# Determine if we should be looking at items or containers
list["item"] = root.findall("./item", root.nsmap)
list["container"] = root.findall("./container", root.nsmap)
for type in list.keys():
print(type + "s:")
for t in list[type]:
print("")
print(t.findtext("dc:title", "untitled", root.nsmap).encode().decode("ascii", errors='ignore'))
print(t.get("id"))
if type == "item":
print(t.findtext("res", "", root.nsmap))
print("----")
def list(timeout):
devices = []
possibleDevices = upnpclient.discover(timeout)
for device in possibleDevices:
if "MediaServer" in device.device_type:
addToList = True
for d in devices:
if d.friendly_name == device.friendly_name:
addToList = False
break
if addToList:
devices.append(device)
for device in devices:
print("")
print(device.friendly_name.encode().decode("ascii", errors='ignore'))
print(device.location)
def help():
print("mpvDLNA.py supports the following commands:")
print("-h, --help Prints the help dialog")
print("-v, --version Prints version information")
print("-l, --list Takes a timeout in seconds and outputs a list of DLNA Media Servers on the network")
print("-b, --browse Takes a DLNA url and the id of a DLNA element and outputs its direct children")
print("-i, --info Takes a DLNA url and the id of a DLNA element and outputs its metadata")
print("-w, --wake Takes a MAC address and attempts to send a wake on lan packet to it")
if len(sys.argv) == 2:
if sys.argv[1] == "-v" or sys.argv[1] == "--version":
print("mpvDLNA.py Plugin Version 2.0.0")
else:
help()
elif len(sys.argv) == 3:
if sys.argv[1] == "-l" or sys.argv[1] == "--list":
list(int(sys.argv[2]))
elif sys.argv[1] == "-w" or sys.argv[1] == "--wake":
wake(sys.argv[2])
else:
help()
elif len(sys.argv) >= 4:
count = 2000
if len(sys.argv) == 5:
count = sys.argv[4]
if sys.argv[1] == "-b" or sys.argv[1] == "--browse":
browse(sys.argv[2], sys.argv[3], count)
elif sys.argv[1] == "-i" or sys.argv[1] == "--info":
info(sys.argv[2], sys.argv[3], count)
else:
help()
else:
help()