Files
jellycon/resources/lib/jellyfin.py
2022-03-09 22:51:38 +01:00

160 lines
5.0 KiB
Python

from __future__ import division, absolute_import, print_function, unicode_literals
import xbmcaddon
from kodi_six.utils import py2_decode
import requests
from .utils import get_device_id, get_version, load_user_details
from .lazylogger import LazyLogger
log = LazyLogger(__name__)
class API:
def __init__(self, server=None, user_id=None, token=None):
self.server = server
self.user_id = user_id
self.token = token
self.settings = xbmcaddon.Addon()
self.headers = {}
self.create_headers()
def get(self, path):
if not self.headers:
self.create_headers()
url = '{}{}'.format(self.server, path)
r = requests.get(url, headers=self.headers)
try:
response_data = r.json()
except:
response_data = {}
return response_data
def post(self, url, payload = {}):
if not self.headers:
self.create_headers()
url = '{}{}'.format(self.server, url)
r = requests.post(url, json=payload, headers=self.headers)
try:
response_data = r.json()
except:
response_data = {}
return response_data
def delete(self, url):
url = '{}{}'.format(self.server, url)
requests.delete(url, headers=self.headers)
def authenticate(self, auth_data):
response = self.post('/Users/AuthenticateByName', auth_data)
token = response.get('AccessToken')
if token:
self.token = token
self.user_id = response.get('User').get('Id')
# Create headers again to include auth token
self.create_headers()
return response
else:
log.error('Unable to authenticate to Jellyfin server')
return {}
def create_headers(self):
# If the headers already exist with an auth token, return
if self.headers and 'x-mediabrowser-token' in self.headers:
return
headers = {}
device_name = self.settings.getSetting('deviceName')
if len(device_name) == 0:
device_name = "JellyCon"
# Ensure ascii and remove invalid characters
device_name = py2_decode(device_name).replace('"', '_').replace(',', '_')
device_id = get_device_id()
version = get_version()
authorization = (
'MediaBrowser Client="Kodi JellyCon", Device="{device}", '
'DeviceId="{device_id}", Version="{version}"'
).format(
device=device_name,
device_id=device_id,
version=version
)
headers['x-emby-authorization'] = authorization
# If we have a valid token, ensure it's included in the headers
if self.token:
headers['x-mediabrowser-token'] = self.token
# Make headers available to api calls
self.headers = headers
def post_capabilities(self):
url = '{}/Sessions/Capabilities/Full'.format(self.server)
data = {
'SupportsMediaControl': True,
'PlayableMediaTypes': ["Video", "Audio"],
'SupportedCommands': ["MoveUp",
"MoveDown",
"MoveLeft",
"MoveRight",
"Select",
"Back",
"ToggleContextMenu",
"ToggleFullscreen",
"ToggleOsdMenu",
"GoHome",
"PageUp",
"NextLetter",
"GoToSearch",
"GoToSettings",
"PageDown",
"PreviousLetter",
"TakeScreenshot",
"VolumeUp",
"VolumeDown",
"ToggleMute",
"SendString",
"DisplayMessage",
"SetAudioStreamIndex",
"SetSubtitleStreamIndex",
"SetRepeatMode",
"Mute",
"Unmute",
"SetVolume",
"PlayNext",
"Play",
"Playstate",
"PlayMediaSource"]
}
self.post(url, data)
def speedtest(self, test_data_size):
self.create_headers()
url = '{}/playback/bitratetest?size={}'.format(self.server, test_data_size)
response = requests.get(url, stream=True, headers=self.headers)
return response
settings = xbmcaddon.Addon()
user_details = load_user_details()
api = API(
settings.getSetting('server_address'),
user_details.get('user_id'),
user_details.get('token')
)