Major change in data structure that should resolve the double data issue
This commit is contained in:
parent
b523f1346e
commit
d7f8bf83a0
1 changed files with 101 additions and 56 deletions
157
tautulli.py
157
tautulli.py
|
@ -1,134 +1,179 @@
|
|||
# Do not edit this script. Edit configuration.py
|
||||
import os
|
||||
import shutil
|
||||
import tarfile
|
||||
import requests
|
||||
import urllib.request
|
||||
import geoip2.database
|
||||
import time
|
||||
from datetime import datetime, timezone
|
||||
import geoip2.database
|
||||
from influxdb import InfluxDBClient
|
||||
import requests
|
||||
import configuration
|
||||
|
||||
current_time = datetime.now(timezone.utc).astimezone().isoformat()
|
||||
CURRENT_TIME = datetime.now(timezone.utc).astimezone().isoformat()
|
||||
|
||||
payload = {'apikey': configuration.tautulli_api_key, 'cmd': 'get_activity'}
|
||||
PAYLOAD = {'apikey': configuration.tautulli_api_key, 'cmd': 'get_activity'}
|
||||
|
||||
activity = requests.get('{}/api/v2'.format(configuration.tautulli_url), params=payload).json()['response']['data']
|
||||
ACTIVITY = requests.get('{}/api/v2'.format(configuration.tautulli_url),
|
||||
params=PAYLOAD).json()['response']['data']
|
||||
|
||||
sessions = {d['session_id']: d for d in activity['sessions']}
|
||||
SESSIONS = {d['session_id']: d for d in ACTIVITY['sessions']}
|
||||
|
||||
TAR_DBFILE = '{}/GeoLite2-City.tar.gz'.format(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
DBFILE = '{}/GeoLite2-City.mmdb'.format(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
NOW = time.time()
|
||||
|
||||
DB_AGE = NOW - (86400 * 35)
|
||||
|
||||
#remove the running db file if it is older than 35 days
|
||||
try:
|
||||
t = os.stat(DBFILE)
|
||||
c = t.st_ctime
|
||||
if c < DB_AGE:
|
||||
os.remove(DBFILE)
|
||||
except FileNotFoundError:
|
||||
pass
|
||||
|
||||
|
||||
def GeoLite2db(ipaddress):
|
||||
tar_dbfile = '{}/GeoLite2-City.tar.gz'.format(os.path.dirname(os.path.realpath(__file__)))
|
||||
def geo_lookup(ipaddress):
|
||||
"""Lookup an IP using the local GeoLite2 DB"""
|
||||
if not os.path.isfile(DBFILE):
|
||||
urllib.request.urlretrieve(
|
||||
'http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz',
|
||||
TAR_DBFILE)
|
||||
|
||||
dbfile = '{}/GeoLite2-City.mmdb'.format(os.path.dirname(os.path.realpath(__file__)))
|
||||
|
||||
if not os.path.isfile(dbfile):
|
||||
urllib.request.urlretrieve('http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz', tar_dbfile)
|
||||
|
||||
tar = tarfile.open(tar_dbfile, "r:gz")
|
||||
tar = tarfile.open(TAR_DBFILE, "r:gz")
|
||||
for files in tar.getmembers():
|
||||
if 'GeoLite2-City.mmdb' in files.name:
|
||||
files.name = os.path.basename(files.name)
|
||||
tar.extract(files, '{}/'.format(os.path.dirname(os.path.realpath(__file__))))
|
||||
|
||||
reader = geoip2.database.Reader(dbfile)
|
||||
geodata = reader.city(ipaddress)
|
||||
reader = geoip2.database.Reader(DBFILE)
|
||||
|
||||
return geodata
|
||||
return reader.city(ipaddress)
|
||||
|
||||
|
||||
influx_payload = [
|
||||
INFLUX_PAYLOAD = [
|
||||
{
|
||||
"measurement": "Tautulli",
|
||||
"tags": {
|
||||
"type": "stream_count"
|
||||
},
|
||||
"time": current_time,
|
||||
"time": CURRENT_TIME,
|
||||
"fields": {
|
||||
"current_streams": int(activity['stream_count']),
|
||||
"transcode_streams": int(activity['stream_count_transcode']),
|
||||
"direct_play_streams": int(activity['stream_count_direct_play']),
|
||||
"direct_streams": int(activity['stream_count_direct_stream'])
|
||||
"current_streams": int(ACTIVITY['stream_count']),
|
||||
"transcode_streams": int(ACTIVITY['stream_count_transcode']),
|
||||
"direct_play_streams": int(ACTIVITY['stream_count_direct_play']),
|
||||
"direct_streams": int(ACTIVITY['stream_count_direct_stream'])
|
||||
}
|
||||
}
|
||||
]
|
||||
|
||||
for session in sessions.keys():
|
||||
for session in SESSIONS.keys():
|
||||
try:
|
||||
geodata = GeoLite2db(sessions[session]['ip_address_public'])
|
||||
geodata = geo_lookup(SESSIONS[session]['ip_address_public'])
|
||||
except ValueError:
|
||||
if configuration.tautulli_failback_ip:
|
||||
geodata = GeoLite2db(configuration.tautulli_failback_ip)
|
||||
geodata = geo_lookup(configuration.tautulli_failback_ip)
|
||||
else:
|
||||
geodata = GeoLite2db(requests.get('http://ip.42.pl/raw').text)
|
||||
geodata = geo_lookup(requests.get('http://ip.42.pl/raw').text)
|
||||
|
||||
latitude = geodata.location.latitude
|
||||
|
||||
# Get the latitude of each session. If we cant find it then...
|
||||
if not geodata.location.latitude:
|
||||
latitude = 37.234332396
|
||||
else:
|
||||
latitude = geodata.location.latitude
|
||||
|
||||
# Get the longitude of each session. If we cant find it then...
|
||||
if not geodata.location.longitude:
|
||||
longitude = -115.80666344
|
||||
else:
|
||||
longitude = geodata.location.longitude
|
||||
|
||||
decision = sessions[session]['transcode_decision']
|
||||
decision = SESSIONS[session]['transcode_decision']
|
||||
|
||||
if decision == 'copy':
|
||||
decision = 'direct stream'
|
||||
|
||||
video_decision = sessions[session]['stream_video_decision']
|
||||
video_decision = SESSIONS[session]['stream_video_decision']
|
||||
|
||||
if video_decision == 'copy':
|
||||
video_decision = 'direct stream'
|
||||
|
||||
quality = sessions[session]['stream_video_resolution']
|
||||
elif video_decision == '':
|
||||
video_decision = 'Music'
|
||||
|
||||
quality = SESSIONS[session]['stream_video_resolution']
|
||||
|
||||
|
||||
# If the video resolution is empty. Asssume it's an audio stream
|
||||
# and use the container for music
|
||||
if not quality:
|
||||
quality = sessions[session]['container'].upper()
|
||||
quality = SESSIONS[session]['container'].upper()
|
||||
|
||||
elif quality in ('SD', 'sd'):
|
||||
quality = sessions[session]['stream_video_resolution'].upper()
|
||||
quality = SESSIONS[session]['stream_video_resolution'].upper()
|
||||
|
||||
elif quality in '4k':
|
||||
quality = sessions[session]['stream_video_resolution'].upper()
|
||||
quality = SESSIONS[session]['stream_video_resolution'].upper()
|
||||
|
||||
else:
|
||||
quality = '{}p'.format(sessions[session]['stream_video_resolution'])
|
||||
quality = '{}p'.format(SESSIONS[session]['stream_video_resolution'])
|
||||
|
||||
influx_payload.append(
|
||||
|
||||
# Translate player_state to integers so we can colorize the table
|
||||
player_state = SESSIONS[session]['state'].lower()
|
||||
|
||||
if player_state == 'playing':
|
||||
player_state = 0
|
||||
|
||||
elif player_state == 'paused':
|
||||
player_state = 1
|
||||
|
||||
elif player_state == 'buffering':
|
||||
player_state = 3
|
||||
|
||||
|
||||
INFLUX_PAYLOAD.append(
|
||||
{
|
||||
"measurement": "Tautulli",
|
||||
"tags": {
|
||||
"type": "Session",
|
||||
"region_code": geodata.subdivisions.most_specific.iso_code,
|
||||
"latitude": latitude,
|
||||
"longitude": longitude,
|
||||
"location": '{} - {}'.format(geodata.subdivisions.most_specific.name, geodata.city.name),
|
||||
"session_key": sessions[session]['session_key']
|
||||
},
|
||||
"time": current_time,
|
||||
"fields": {
|
||||
"name": sessions[session]['friendly_name'],
|
||||
"title": sessions[session]['full_title'],
|
||||
"session_id": SESSIONS[session]['session_id'],
|
||||
"name": SESSIONS[session]['friendly_name'],
|
||||
"title": SESSIONS[session]['full_title'],
|
||||
"platform": SESSIONS[session]['platform'],
|
||||
"product_version": SESSIONS[session]['product_version'],
|
||||
"quality": quality,
|
||||
"video_decision": video_decision.title(),
|
||||
"transcode_decision": decision.title(),
|
||||
"platform": sessions[session]['platform'],
|
||||
"product_version": sessions[session]['product_version'],
|
||||
"quality_profile": sessions[session]['quality_profile'],
|
||||
"progress_percent": sessions[session]['progress_percent'],
|
||||
"media_type": SESSIONS[session]['media_type'].title(),
|
||||
"audio_codec": SESSIONS[session]['audio_codec'].upper(),
|
||||
"audio_profile": SESSIONS[session]['audio_profile'].upper(),
|
||||
"stream_audio_codec": SESSIONS[session]['stream_audio_codec'].upper(),
|
||||
"quality_profile": SESSIONS[session]['quality_profile'],
|
||||
"progress_percent": SESSIONS[session]['progress_percent'],
|
||||
"region_code": geodata.subdivisions.most_specific.iso_code,
|
||||
"location": geodata.city.name,
|
||||
"full_location": '{} - {}'.format(geodata.subdivisions.most_specific.name,
|
||||
geodata.city.name),
|
||||
"latitude": latitude,
|
||||
"longitude": longitude,
|
||||
"player_state": player_state,
|
||||
"device_type": SESSIONS[session]['platform']
|
||||
},
|
||||
"time": CURRENT_TIME,
|
||||
"fields": {
|
||||
"session_id": SESSIONS[session]['session_id'],
|
||||
"session_key": SESSIONS[session]['session_key']
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
influx = InfluxDBClient(configuration.influxdb_url, configuration.influxdb_port, configuration.influxdb_username,
|
||||
configuration.influxdb_password, configuration.tautulli_influxdb_db_name)
|
||||
influx.write_points(influx_payload)
|
||||
INFLUX_SENDER = InfluxDBClient(configuration.influxdb_url,
|
||||
configuration.influxdb_port,
|
||||
configuration.influxdb_username,
|
||||
configuration.influxdb_password,
|
||||
configuration.tautulli_influxdb_db_name)
|
||||
|
||||
INFLUX_SENDER.write_points(INFLUX_PAYLOAD)
|
||||
|
|
Loading…
Reference in a new issue