import requests
from xbmcgui import Dialog
from xbmcplugin import (
SORT_METHOD_FILE,
SORT_METHOD_LABEL_IGNORE_THE,
addDirectoryItem,
addSortMethod,
)
from lib.api.webdav.webdav import WebDAVClient
from lib.utils.kodi.utils import (
ADDON_HANDLE,
build_url,
dialog_ok,
end_of_directory,
get_setting,
kodilog,
make_list_item,
notification,
show_picture,
translation,
)
def list_webdav(params):
relative_path = params.get("path", "").strip("/")
client = WebDAVClient(
get_setting("webdav_hostname"),
get_setting("webdav_username"),
get_setting("webdav_password"),
get_setting("webdav_port"),
get_setting("webdav_remote_path"),
)
items = client.list_dir(relative_path)
for item in items:
list_item = make_list_item(label=item["name"])
url = ""
is_folder = False
# --- FOLDERS ---
if item["type"] == "folder":
new_relative_path = f"{relative_path}/{item['name']}" if relative_path else item["name"]
url = build_url("list_webdav", path=new_relative_path)
is_folder = True
# --- VIDEOS ---
elif item["type"] == "video":
list_item.setProperty("IsPlayable", "true")
info_tag = list_item.getVideoInfoTag()
info_tag.setTitle(item["name"])
url = build_url("play_url", url=item["url"], name=item["name"])
is_folder = False
# --- AUDIO ---
elif item["type"] == "audio":
info_tag = list_item.getMusicInfoTag()
info_tag.setTitle(item["name"])
list_item.setProperty("IsPlayable", "true")
url = build_url("play_url", url=item["url"], name=item["name"])
is_folder = False
# --- IMAGES ---
elif item["type"] == "image":
list_item.setProperty("IsPlayable", "false")
list_item.setArt({"thumb": item["url"]})
list_item.setInfo("pictures", {"title": item["name"]})
name_parts = item["name"].rsplit(".", 1)
ext = name_parts[-1].lower() if len(name_parts) > 1 else "jpeg"
mime = f"image/{ext}" if ext not in ["jpg", "jpeg"] else "image/jpeg"
list_item.setMimeType(mime)
url = build_url("show_picture_webdav", url=item["url"])
is_folder = False
elif item["type"] == "text":
list_item.setProperty("IsPlayable", "false")
url = build_url("display_text_webdav", url=item["url"], title=item["name"])
is_folder = False
else:
list_item.setProperty("IsPlayable", "false")
url = item["url"]
is_folder = False
addDirectoryItem(handle=ADDON_HANDLE, url=url, listitem=list_item, isFolder=is_folder)
addSortMethod(ADDON_HANDLE, SORT_METHOD_LABEL_IGNORE_THE)
addSortMethod(ADDON_HANDLE, SORT_METHOD_FILE)
end_of_directory()
def webdav_provider_test(params):
client = WebDAVClient(
get_setting("webdav_hostname"),
get_setting("webdav_username"),
get_setting("webdav_password"),
get_setting("webdav_port"),
get_setting("webdav_remote_path"),
)
result = client.test_connection()
if result["success"]:
dialog_ok(translation(90131), result["message"])
else:
dialog_ok(translation(90562), result["message"])
def display_text_webdav(params):
url = params.get("url")
title = params.get("title", translation(90663))
if not url:
return
try:
r = requests.get(url, timeout=15)
r.raise_for_status()
r.encoding = r.apparent_encoding
content = r.text
Dialog().textviewer(title, content)
except requests.exceptions.RequestException as e:
kodilog(f"Error downloading text file ({url}): {e}")
notification(translation(90597), translation(90598) % title)
except Exception as e:
kodilog(f"General error displaying text: {e}")
notification(translation(90599), translation(90600))
def show_picture_webdav(params):
show_picture(url=params.get("url"))