Ich habe leider Lösung 1 von Simaryp nach wie vor nicht ans Laufen gebracht, habe aber festgestellt, dass KODI von selbst für Lösung 2 gesorgt hat:
Die Aufnahmen sind ja als Dateien vorhanden, deshalb sind sie unter "Filme" zu finden. Und der Universal Scraper hat für viele Aufnahmen auch passende Cover etc. gefunden.Es wäre zwar schöner, wenn die alten Aufnahmen zusammen mit den neuen am selben Ort zu finden wären, aber so komme ich auch klar.
Trotzdem vielen Dank!
Ich habe ein ähnliches Problem, ich bekomme das Script nicht zum Laufen!
Ich hatte einen Stromausfall und damit ist der TVH-Server hart runtergefahren, ohne seine IMDB sichern zu können. Auf der Platte sind jetzt zahlreiche Aufnahmen, die unter Kodi nicht (mehr) angezeigt werden. Die Logfiles habe ich zum größten Teil noch. Ich musste allerdings das Script ein wenig für Python3 anpassen:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
""".
usage: tvh_addfile.py
registers a local file in tvheadend as recorded by sending json formed conf info via http api:
http://user:pwd@localhost:9981/api/dvr/entry/create?conf=
If successful returns the uuid of the created timer
""".
import json, urllib.request, time, datetime, subprocess
from urllib.parse import quote
def datestr2num(string_date):
"""Convert Date&Time string YYYY-MM-DD HH:MM:SS to Unix timestamp; use default date on error""".
try:
dt=time.mktime(datetime.datetime.strptime(string_date, "%Y-%m-%d %H:%M:%S").timetuple())
except:
print("ERROR in datestr2num: file name doesn't start with 'YYYY-MM-DDTHH-MM.ts'. Use Inode Change Time instead.")
dt = int(os.stat(filepath).st_ctime)
return dt
def videoDuration(video_file_path):
"""Get video duration in sec from a ffprobe call, using json output""".
#command is: ffprobe -loglevel quiet -print_format json -show_format /full/path/to/videofile
command = ["ffprobe", "-loglevel", "quiet", "-print_format", "json", "-show_format", video_file_path]
pipe = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
out, err = pipe.communicate()
js = json.loads(out)
return int(float(js['format']['duration']) + 1.)
############# enter your data here ############################################
video_storage = "/media/tvheadend/video/A World Beyond/" # must end with "/".
video_name = "A World Beyond.ts" # your video name with
# proper extension!
video_title = "A World Beyond" # your text (any)
video_description = "A World Beyond" # your text (any)
video_starttime = "2018-04-18 22:04:33" # your start time (any)
###############################################################################
video_path = video_storage + video_name
video_subtitle = "filename: " + video_name
video_startstmp = datestr2num(video_starttime)
video_stopstmp = video_startstmp + videoDuration(video_path)
mask = """{
"enabled": true,
"start": 1000,
"stop": 2000,
"channelname": "local file",
"title": {
"ger": "my title".
},
"subtitle": {
"ger": "filename: my video"
},
"description": {
"ger": "my description"
},
"comment": "added by tvh_addfile.py",
"files": [
{
"filename": "/full/path/to/videofile.ts"
}
]
}"""
mask = mask.replace("\n", "") # remove the line feeds
new_mask = json.loads(mask)
new_mask['files'][0]['filename'] = video_path
new_mask['title']['ger'] = video_title
new_mask['subtitle']['ger'] = video_subtitle
new_mask['description']['ger'] = video_description
new_mask['start'] = video_startstmp
new_mask['stop'] = video_stopstmp
print("New File Info: \n", json.dumps(new_mask, sort_keys = True, indent = 4))
api_url = 'http://user:pwd@localhost:9981/api/dvr/entry/create'
post = 'conf=' + json.dumps(new_mask)
post = quote(post)
print("API:", api_url)
print("Post:", post)
filehandle = urllib.request.urlopen(api_url + "?" + post)
print("Server Answer:", filehandle.read())
Alles anzeigen
Änderungen:
- Geänderte Import-Anweisungen
- print erfordert jetzt Klammern, ergänzt
- Es muss nun heißen urllib.request.urlopen(...), geändert
- Der Aufruf darf keine reservierten Zeichen enthalten, das kann durch einen Aufruf von "quote(...)" erreichen, done
Ich habe auf die for-Schleifen verzichtet, denn ein Teil ist bei mir ja noch vorhanden und ich möchte doppelte Einträge vermeiden, auch wenn das wiederholtes manuelles Editieren und Aufrufen bedeutet. Die Authentifizierung steht bei mir auf "plain und digest".
Probleme:
- Ich habe in TVH einen Admin und einen normalen User angelegt. Das Login geht bei beiden erst nach dem 3. oder 5., 6. Mal. Ich verwende Keepass, kann mich also nicht vertippt haben! Nerv! Keine Ahnung ob das mit dem nächsten Problem zusammenhängt.
- Beim Versuch das Script auszuführen kommt es in Python zu einer Exception in einer Exception beim Versuch die URL aufzurufen:
Traceback (most recent call last):
File "/usr/lib/python3.9/urllib/request.py", line 1346, in do_open
h.request(req.get_method(), req.selector, req.data, headers,
File "/usr/lib/python3.9/http/client.py", line 1255, in request
self._send_request(method, url, body, headers, encode_chunked)
File "/usr/lib/python3.9/http/client.py", line 1301, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "/usr/lib/python3.9/http/client.py", line 1250, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "/usr/lib/python3.9/http/client.py", line 1010, in _send_output
self.send(msg)
File "/usr/lib/python3.9/http/client.py", line 950, in send
self.connect()
File "/usr/lib/python3.9/http/client.py", line 921, in connect
self.sock = self._create_connection(
File "/usr/lib/python3.9/socket.py", line 822, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
File "/usr/lib/python3.9/socket.py", line 953, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno -2] Name or service not known
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/media/tvheadend/./tvh_addfile.py", line 89, in <module>
filehandle = urllib.request.urlopen(api_url + "?" + post)
File "/usr/lib/python3.9/urllib/request.py", line 214, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.9/urllib/request.py", line 517, in open
response = self._open(req, data)
File "/usr/lib/python3.9/urllib/request.py", line 534, in _open
result = self._call_chain(self.handle_open, protocol, protocol +
File "/usr/lib/python3.9/urllib/request.py", line 494, in _call_chain
result = func(*args)
File "/usr/lib/python3.9/urllib/request.py", line 1375, in http_open
return self.do_open(http.client.HTTPConnection, req)
File "/usr/lib/python3.9/urllib/request.py", line 1349, in do_open
raise URLError(err)
urllib.error.URLError: <urlopen error [Errno -2] Name or service not known>
Alles anzeigen
WTF???
Cheers
Don