68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
# pylint: disable=too-few-public-methods
|
|
|
|
import collections
|
|
from prometheus_client import CollectorRegistry, generate_latest
|
|
from prometheus_client.core import GaugeMetricFamily
|
|
from prometheus_client.registry import Collector
|
|
from .jellyfin import JellyfinAPI
|
|
|
|
CollectorsOptions = collections.namedtuple('CollectorsOptions', [
|
|
'sessions',
|
|
])
|
|
|
|
|
|
class SessionsCollector(Collector):
|
|
"""
|
|
Collects Jellyfin /Sessions API endpoint
|
|
|
|
# HELP jellyfin_sessions Current sessions
|
|
# TYPE jellyfin_sessions gauge
|
|
jellyfin_session{device="Android TV", "playing"="Attack on Titan", "playmethod"="DirectPlay", "username": "hipstercat"} 1.0
|
|
"""
|
|
|
|
def __init__(self, jf):
|
|
self._jf = jf
|
|
|
|
def collect(self): # pylint: disable=missing-docstring
|
|
sessions_metrics = GaugeMetricFamily(
|
|
'jellyfin_sessions',
|
|
'Current sessions',
|
|
labels=["device", "playing", "playmethod", "username"])
|
|
|
|
for session in self._jf.api("GET", "Sessions", params={"ActiveWithinSeconds": 30}):
|
|
if "NowPlayingItem" not in session:
|
|
continue
|
|
if "PlayState" not in session:
|
|
continue
|
|
if session["PlayState"]["IsPaused"]:
|
|
continue
|
|
if "SeriesName" in session["NowPlayingItem"]:
|
|
name = session["NowPlayingItem"]["SeriesName"]
|
|
else:
|
|
name = session["NowPlayingItem"]["Name"]
|
|
|
|
playmethod = session["PlayState"]["PlayMethod"]
|
|
if playmethod == "Transcode":
|
|
if "TranscodingInfo" in session:
|
|
if session["TranscodingInfo"]["IsVideoDirect"] and session["TranscodingInfo"]["IsAudioDirect"]:
|
|
playmethod = "Remux"
|
|
elif session["TranscodingInfo"]["IsVideoDirect"] and not session["TranscodingInfo"]["IsAudioDirect"]:
|
|
playmethod = "DirectStream"
|
|
|
|
label_values = [session["Client"], name, playmethod, session["UserName"]]
|
|
sessions_metrics.add_metric(label_values, 1)
|
|
|
|
yield sessions_metrics
|
|
|
|
|
|
def collect_jellyfin(config, host, options: CollectorsOptions):
|
|
"""Scrape a host and return prometheus text format for it"""
|
|
|
|
jf = JellyfinAPI(host, **config)
|
|
|
|
registry = CollectorRegistry()
|
|
if options.sessions:
|
|
registry.register(SessionsCollector(jf))
|
|
|
|
return generate_latest(registry)
|