[HowTo] Import von Aufnahmen in neue TVHeadend-Installation

  • Weil ich mich noch mal weiter mit der Thematik befasst habe, dachte ich, ich schreibe direkt mal ein kleines HowTo, was vielleicht angepinnt werden kann, damit andere Nutzer von meinen Erfahrungen profitieren. Sollte ich an irgendeiner Stelle etwas zu unpräzise oder falsch erklären, dann korrigiere ich das gerne :). Da je nach Installationsweise die Dateipfade unterschiedlich sein können, gebe ich die immer nur relativ an. In den Skripten müssen die Dateipfade immer auf die eigene Situation angepasst werden.


    Disclaimer
    Benutzung auf eigene Gefahr! Eigentlich kann nichts schlimmes passieren, ausser dass ihr euer [definition='1','0']log[/definition] Verzeichnis zumüllt, wenn ihr das Skript nicht richtig anpasst, aber sicher ist sicher ;).


    Das Problem
    Ihr habt einen TVHeadend-Server und aus welchen Gründen auch immer, habt ihr den TVHeadend-Server neu installiert oder seid vielleicht auf eine Dockerinstallation gwechselt. Nachdem ihr alles eingerichtet habt, stellt ihr fest, die ganzen alten Aufnahmen, die vielleicht noch in /recordings waren oder die ihr dorthin zurückgesüpielt habt, tauchen nicht mehr unter Aufnahmen auf. TVHeadend bietet leider keine direkte Möglichkeit die Aufnahmen wieder zu integrieren. Wenn ihr die Aufnahmen nicht so in Kodi einbinden wollt, zeige ich euch jetzt zwei Wege, wie ihr eure Aufnahmen in eine neue TVHeadend installation integriert bekommt.


    Hintergrund

    Wie funktioniert das mit den Aufnahmen in TVHeadend? Wenn ihr eine Aufnahme plant, dann wird im Configordner von TVHeadend im Verzeichnis dvr/[definition='1','0']log[/definition]/ eine JSON erzeugt, mit jeder Menge Infos aus dem EPG und zur Aufnahme. Diese Datei enthällt auch den Speicherort und den Dateinamen der Aufnahme und ist der Schlüssel dazu, dass ein Video bei TVHeadend als Aufnahme auftaucht. Es reicht allerdings nicht einfach diese Datei in das Verzeichnis der neuen Installation zu kopieren. Da passiert genau gar nichts, weil TVHeandend diesen Ordner anscheinend in keiner Art und Weise überwacht oder scannt.


    Die Lösung

    Man kann über eine API per URL Aufnahmen in TVHeadend planen. Der Clou ist, man kann auch Aufnahmen in der Vergangenheit planen und diese API nutzen, um für Videos, die in einem Verzeichnis liegen zugehörige Dateien in dvr/[definition='1','0']log[/definition]/ von TVHeadend anlegen zu lassen. Das wurde im TVHeadend-Forum diskutiert und die hier vorgestellten Lösungen basieren auf Anpassungen von einem Skript des Users ullix tv https://tvheadend.org/boards/5/topic…3#message-29113.


    Beide Lösungen sind in Pyhton geschrieben und sollten sowohl mit Python 2.7, als auch Python 3 funktionieren.


    Lösung 1

    Solltet ihr noch die alte config haben, dann könnt ihr die erste Lösung nutzen, die, soweit ich das überschaue, vom Resultat her absolut identisch ist, zu der Situation vorher in eurer alten Installation. Besser kanns nicht gehen :).
    1. Speichert eure alten Logs in einen Ordner /storage/log-backup/ ab.
    2. Überprüft, ob der Speicherort in den Dateien richtig ist. Bei einer nativen Installation steht da zum Beispiel als Verzeichnispfad /storage/recordings/..., aber wenn ihr eine Dockerinstallation habt, steht dort als Pfad nur /recordings/... Solltet ihr von der einen zur anderen Installationsart wechseln, dann müsst ihr das entsprechend in den Dateien anpassen.
    3. Speichert einfach den Code zum Beispiel im Ordner /storage unter dem Dateinamen tvh_log_import.py ab.
    4. Passt die api_url an, indem ihr euren TVHeadend-Benutzernamen, -Passwort und die IP Adresse des Servers eintragt.
    4. Verbindet euch per SSH mit eurem Kodirechner und führt die Datei aus mit

    Code
    #python /storage/tvh_log_import.py`


    5. Fertig :).

    Lösung 2
    Solltet ihr nichts mehr außer euren Aufnahmen haben, dann könnt ihr die zweite Variante nutzen. Das Skript geht einfach euren Aufnahme Ordner durch und erzeugt aus den Informationen aus dem Dateinahmen eine sehr leere JSON. Zum erkennen, um was es geht, reicht das aber allemal und ihr könnt eure Aufnahmen wieder wie vorher abspielen. Das Skript geht davon aus, dass in eurem /recordings Ordner für jeden Film oder Serie ein Unterordner besteht. Falls das bei euch nicht der Fall ist, passt entweder die Ordnerstruktur an oder das Skript, je nachdem, was euch leichter von der Hand geht. Außerdem erwartet das Skript, dass eure Dateien am Anfang des Dateinamens einen Zeitstempel der Form YYYY-MM-DDTHH-MM haben. Hier gilt fast das gleiche wie zuvor. Solltet ihr keinen Zeitstempel haben oder das Ändern des Skriptes oder der Dateinamen ist euch zu aufwendig, dann nutzt das Skript einen Fallbackmodus und nutzt den Zeitstempel der cdate.


    1. Speichert einfach den Code zum Beispiel im Ordner /storage unter dem Dateinamen tvh_rec_import.py ab.
    2. Passt die api_url an, indem ihr euren TVHeadend-Benutzernamen, -Passwort und die IP Adresse des Servers eintragt.
    3. Verbindet euch per SSH mit eurem Kodirechner und führt die Datei aus mit

    Code
    #python /storage/tvh_rec_import.py`

    4. Fertig :).

    Update 26.08.2020:

    Beim Debugging eines Problems von Nutzer Friedhofsblond ist mir aufgefallen, dass die ursprüngliche Version meines Skripts in Lösung 2 an einer Stelle ein Spezialfall für mich war.
    Ursprünglich stand dort in der Erzeugung des json-Files:

    Code
    new_mask['files'][0]['filename'] = filepath[8:]

    Dabei sorgt [8:] dafür, dass das führende /storage entfernt wird. Dies habe ich in meiner Installation entfernt, weil ich TVH im Docker laufen habe und der /recordings Ordner direkt im Docker gemountet wird.
    Für den vlt. üblicheren Fall der nativen Installation steht nun im Skript korrekterweise:

    Code
    new_mask['files'][0]['filename'] = filepath

    Solltet ihr auch Docker benutzen, dann könnt ihr die ursprüngliche Variante benutzen und solltet die Zahl entsprechend der Anzahl der führenden Zeichen anpassen. Zum Beispiel /mydisk/recordings benötigt dann [7:].

  • Ich finde die Idee super, den ich stehe genau vor dem von Dir geschilderten Problem.

    Nur wird von meinem Tvh Server die Verbindung mit einem 401 abgelehnt.
    Wenn ich aber den Link, ohne Api aufruf also nur user:pass@ip:9981 aufrufe im Firefox werde ich 2 mal gebeten zu bestätigen das ich das will
    und schwupps es geht.

    Hat sich da eventuell in TVH 4.3 was geändert?
    Nutze HTS Tvheadend 4.3-1979~g8fc2dfa7e falls das eine Rolle spielt.

    Auch konnte ich nicht in allen von den Logdateien der Aufnahmen (~200) einen Verweis auf den Speicherort finden.
    Die Verwirrung lies sich leicht mit etwas Recherche klären:
    Wenn eine Aufnahme geplant wird, wird schon das Log File angelegt, erst wenn in dem Log file auch ein "files" vorkommt,
    wurde diese Aufnahme auch durchgeführt und liegt da. Okay.

    Spoiler anzeigen


    LibreELEC:~/recordings_nas/_Backup/storage # python2.7 ./tvh_log_import.py
    Traceback (most recent call last):
    File "./tvh_log_import.py", line 31, in <module>
    importLog(logdir+[definition='1','0']log[/definition], api_url)
    File "./tvh_log_import.py", line 24, in importLog
    filehandle = urllib.urlopen(api_string)
    File "/usr/lib/python2.7/urllib.py", line 87, in urlopen
    File "/usr/lib/python2.7/urllib.py", line 213, in open
    File "/usr/lib/python2.7/urllib.py", line 364, in open_http
    File "/usr/lib/python2.7/urllib.py", line 377, in http_error
    File "/usr/lib/python2.7/urllib.py", line 701, in http_error_401
    File "/usr/lib/python2.7/urllib.py", line 386, in http_error_default
    IOError: ('http error', 401, 'Unauthorized', <httplib.HTTPMessage instance at 0x7fd9280c99e0>)

    2 Mal editiert, zuletzt von theplayer02 (24. Oktober 2021 um 20:44) aus folgendem Grund: Version nachgereicht. Verwirrung zwecks Log-Files aufgeklärt.

  • Durch Zufall hab ich heute mal hier wieder rein geschaut.
    401 heißt ja, du hast mit den Zugangsdaten keine Zugriffsrechte.
    Meibe Vermutung ist, du hast entweder einen Fehler beim Anpassen des Scripts gemacht oder es vergessen oder das Passwort enthält Sonderzeichen, die in der URL nicht gehen.

    Zum Test ändere mal Name und Passwort auf rein alphanumerisch.

  • Hi @Simaryp, danke für deine schnelle Antwort.

    das gute ist: Da muss ich nix ändern, das PW ist schon alphanumerisch.

    Im Spoiler kannst du meinen Inhalt des Skriptes, welcher anzupassen war, sehen.

    Spoiler anzeigen


    logdir = "/storage/recordings_nas/_Backup/storage/log-backup/"
    api_url = "http://user:user@192.168.1.249:9981/api/dvr/entry/create?conf="

    Also wenn ich nur den Teil bis inkl. Portnummer kopiere und z.B. im Edge einfüge, dann funktioniert das ganze auch.
    Deswegen vermute ich stark das es das PW nicht sein kann.

    Auch ist mir aufgefallen wenn ich den kompletten aufruf in Edge einfüge, siehe zweiten Spoiler, dann bekomme ich 403, forbidden.

    Spoiler anzeigen


    http://user:user@192.168.1.249:9981/api/dvr/entry/create?conf={"creator": "user", "pri": 2, "fileremoved": 0, "owner": "user", "channelname": "Das Erste HD", "retention": 0, "errors": 0, "title": {"ger": "Ferdinand von Schirach: Feinde Das Gestaendnis"}, "data_errors": 0, "noresched": true, "removal": 0, "errorcode": 0, "start": 1609709400, "playposition": 0, "dvb_eid": 0, "channel": "d4808a518cebe4999d703333df692f4d", "files": [{"info": [{"height": 720, "width": 1280, "aspect_num": 0, "duration": 1800, "type": "H264", "aspect_den": 0}, {"type": "MPEG2AUDIO", "audio_version": 2, "language": "ger", "audio_type": 0}, {"type": "MPEG2AUDIO", "audio_version": 2, "language": "mis", "audio_type": 0}, {"type": "TELETEXT"}, {"composition_id": 1, "type": "DVBSUB", "language": "ger", "ancillary_id": 1}, {"type": "AC3", "audio_version": 1, "language": "ger", "audio_type": 0}], "start": 1609708800, "stop": 1609715700, "filename": "/recordings/Ferdinand von Schirach_ Feinde \u2013 Das Gest\u00e4ndnis/Ferdinand von Schirach_ Feinde \u2013 Das Gest\u00e4ndnis-Das Erste HD2021-01-0322-30.ts"}], "description": {"ger": "Georg Kelz (Franz Hartwig) gesteht seinem Anwalt Biegler (Klaus Maria Brandauer), dass er in der Untersuchungshaft gefoltert wurde, mit Waterboarding im Duschraum. Darf die Polizei soweit gehen, um ein zwoelfjaehriges Maedchen zu retten? Nein, davon ist Anwalt Biegler ueberzeugt. Fuer ihn geht es nicht um Schuld oder Unschuld, sondern um Grundpfeiler des Rechtsstaats und so nimmt er sich in der Verhandlung Kommissar Nadler (Bjarne Maedel) vor...\n\nZweiter Teil des Fernseh-Experiments \"Feinde\" nach Ferdinand von Schirach. Der andere Teil \"Feinde - Gegen die Zeit\" zeigt, wie Nadler das Gesetz uebertritt, um die entfuehrte Lisa von Bode (Alix Heyblom) zu retten. \nSchirach will mit seinen Stuecken zur Diskussion anregen, eine Einstellung, die auch Brandauer teilt: Kunst \"kann Fragen aufwerfen, Themen setzen oder im besten Fall einen neuen Blick auf die Welt anregen. Wenn die Gesellschaft\nreif dafuer ist, wird sie diese Impulse aufnehmen und sich weiterentwickeln.\""}, "parent": "", "timerec": "", "stop": 1609714800, "broadcast": 0, "content_type": 0, "child": "", "norerecord": false, "config_name": "8d0f5b7ae354d956d7fe5db25f5d0d24", "autorec": "", "enabled": true, "stop_extra": 0, "playcount": 0, "start_extra": 0}

    Alles merkwürdig.

  • Hmm, ich fürchte, ich kann dir nicht viel dabei helfen.
    Es gibt noch zwei Baustellen, die mir einfallen würden.
    Darf dein Nutzer Aufnahmen planen?
    Hast du vlt. Http gesperrt und wirst auf https im Browser umgeleitet?

    Ansonsten schreib doch mal in die Shoutbox und mach ein bisschen Werbung für dein Problem ;).

  • Danke schon mal für dein Feedback,
    wir nähern uns da sicher an :)

    Also der User "user" darf Aufnahmen planen, das ist der gleiche, welchen ich in Kodi nutze.
    Damit wäre der Punkt ausgeräumt, ich habe es selbst mit meinem Admin Zugang ausprobiert, da ging es auch nicht.

    Https zu Http kann man, zumindest im Firefox, leicht sehen: Bei Http bekommt man ein Schloss mit rotem Strich durch angezeigt,
    bei Https ist es ein normales Schloss.
    tvheadend server ist bei mir normales http und kein https (wüsste gar nicht ob man das überhaupt einstellen kann)


    Dann scheint es was anderes zu sein. Werde mal versuchen in der Shoutbox Werbung zu machen, vielleicht hilft es ja.

    Edit:
    Ich bin einen Schritt weiter!
    Bei den "Allgemeinen Einstellungen" im TVH kann man den sog. "Authentication type" einstellen.
    Standardmässig steht es "Digest", nach dem ich das mal umgestellt habe auf "Both - Plain and Digest" bekomme ich zumindest schon mal andere Fehlermeldungen.
    Denn so nach ca. 20 Einträgen meiner Aufnahmen startet TVH einfach neu.

    Einmal editiert, zuletzt von theplayer02 (26. Oktober 2021 um 20:17) aus folgendem Grund: Authentication Type Einstellungen ergänzt.

  • Zur ersten Frage:

    Spoiler anzeigen
    2021-10-27 11:21:19.038 [ ERROR] http: 192.168.1.249: HTTP/1.0 GET (1) /api/dvr/entry/create -- 400


    Assertion failed: nsize < 256 (src/htsmsg.c: htsmsg_field_add: 130)

    Dann kommt der Reboot.

    Es wird aber keine Aufnahme angelegt.

  • Okay, hatte oben etwas wenig zu gesagt.
    Der obige Teil in dem Spoiler ist die direkte Rückmeldung von TVH bevor es sich verabschiedet hat.

    Du wolltest die komplette Ausgabe des python Aufrufs haben:

    Ich habe den Output des Skriptes mal kurz angepasst, damit ich sehe welches file eventuell Probleme macht:

    Spoiler anzeigen

    python tvh_log_import_ds.py
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/01f6f095767d375e3fad4f2220204baf
    Server Answer: {"uuid":"1496ebb76192a50773f0a70c5d897a42"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/02fa8c70243b98bf81813041b5026625
    Server Answer: {"uuid":"9ee8bfa52d03d150947917bd46ff4901"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/031fb8ca7f39b64bdb013f555fb8dc70
    Server Answer: {"uuid":"893c878eb056953d964ace03ef2ea09e"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/038ee8194f23fb682d891ae4a6ad514a
    Server Answer: {"uuid":"dde0121e3891c1f104a7a3cd60619cbb"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/06ea689989a4becdb803b839eeb71c02
    Server Answer: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <HTML><HEAD>
    <TITLE>400 Bad Request</TITLE>
    </HEAD><BODY>
    <H1>400 Bad Request</H1>
    </BODY></HTML>


    File to read: /volume1/video/recordings/_Backup/storage/log-backup/07434602276d4428bf5fd2109a6db5c6
    Server Answer: {"uuid":"962ca4a26d9db7cce81b53270520f7be"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/09869d8afb3e5b14538801c289af0cc0
    Server Answer: {"uuid":"2cfd719c85f425426b588d47fd4c4b0b"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/09e2bc2adcdcbdeb1a74966df23e7b65
    Server Answer: {"uuid":"70a756b4663b6204509af7953dabf1e0"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/0c7f007486803094a22a83181493c153
    Server Answer: {"uuid":"57bda24c8ac2b0a4a720087790ba6b90"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/0ef14f36dd7c9704c8d55b8d2d04f1c6
    Server Answer: {"uuid":"8d305c59c051b6c495c120dc867564c1"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/10bd32e4986cbd100605aba7c52a2307
    Server Answer: {"uuid":"de0ef3b4c10a7700a9ff596d2f74a472"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/12297dbb3a081054434f3784f7ba3775
    Server Answer: {"uuid":"1da3916ea34a6ebc4beb71a967bd6a97"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/12f90ab08ec7e8484468f1ce3b51812b
    Server Answer: {"uuid":"219fea14c1c6bc29a9d26eeebdebbadb"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/1499dee0b2dd00d98a4fdd24db9ec1bc
    Server Answer: {"uuid":"bd6d62a3f06208dca5c9de9d821f4e72"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/157a54dc61103e5e4349b77bd9ee7b91
    Server Answer: {"uuid":"62edd9a11d7f2d2b3dadb69c54855ca6"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/15859f10ce3dbbc8e85fbc856a2d9ed2
    Server Answer: {"uuid":"aa4378cad19af99f43e9d02068f28ea7"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/16b53fca1842511ea7a3a8c58ce6cfeb
    Server Answer: {"uuid":"2230abf9ffb91ff463c978f436278c87"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/170b616678087d5fcf2697c685a23886
    Server Answer: {"uuid":"41a5848620e719e1286f2dc14e70d853"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/1c7e10fb9a63222c8525cc76ffabe0b8
    Server Answer: {"uuid":"882d41c5a5ca79c46256ad1d3edfb69b"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/1d58d13600fff0dcc37d2572f8dc6934
    Server Answer: {"uuid":"7857fb60bd4967c2e23e4d80865e3994"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/21afeedf8acdafe0343a3b695edf73ad
    Server Answer: {"uuid":"8638f9aa0c3213b5697c34d1bdffcfa3"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/21cd41ee1f0acf712eea3203bbeb9300
    Server Answer: {"uuid":"537a6b0a648a1ef0879d0533e4adb11c"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/22ee41440412c99f618beab4a52f65ff
    Server Answer: {"uuid":"86521753c24eb33ac2d59bb4b311a92b"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/26398a9453d9e81c5bf0f2a7571de433
    Server Answer: {"uuid":"d7cb95d96d4682ed7cd86b8cb6d91c43"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/2781d4470821ab2456654ff4e3785407
    Server Answer: {"uuid":"b9fe52bdd52a9e2e536554e092cf191b"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/29c016e31206365ec3ccef2966844eec
    Server Answer: {"uuid":"34b1f12ac318a0e2c5773768c197671b"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/2b718904cab47c2787261fe3e66e342a
    Server Answer: {"uuid":"8acd83969c3188172da7b70651d834b4"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/2c976342d6d8bb2bbd44516a5b918f2e
    Server Answer: {"uuid":"ec7edbbee685145c28dd9033abfdd1d4"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/2e8167a6e27f239da8fdd0eb49cf51e1
    Server Answer: {"uuid":"c1dccd24f20002db0e7b5e75e6fd9866"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/304a74867c95cec8cb1b47c957b29bfe
    Server Answer: {"uuid":"b40e1bc88683bd0a12cf005e4fc8d5ea"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/316a9aac3a0dccf2d0ff79d7addf427d
    Server Answer: {"uuid":"0a1504f422bc777b2c14814f08c34cfc"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/320c17c74a3c47f83bb5e368fada4e3c
    Server Answer: {"uuid":"0ea7118f3029155e68d7df22420c8379"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/358f2bdcb2f9c1a15e2c16b1a8e06931
    Server Answer: {"uuid":"cae21d20126bca86a6b046a8b303f739"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/3651287a9fe82492c0a0c68512c63407
    Server Answer: {"uuid":"e09e4468422b3def3644ff8912341870"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/376c2fc1457591abacd0ebf23bf2b537
    Server Answer: {"uuid":"5f4623313e8eea56703955ed13025843"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/37d4c74b61d446947eefde42f75b43c9
    Server Answer: {"uuid":"dd8a40d4090b39bf5144b170d171c682"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/398466869828d5df6c3aa0ef06ce868a
    Server Answer: {"uuid":"37d977b5288a090045b34312ef43ad35"}
    File to read: /volume1/video/recordings/_Backup/storage/log-backup/39f8ae90b0f1b5b37de7f64cb715af77
    Traceback (most recent call last):
    File "tvh_log_import_ds.py", line 32, in <module>
    importLog(logdir+[definition='1','0']log[/definition], api_url)
    File "tvh_log_import_ds.py", line 25, in importLog
    filehandle = urllib.urlopen(api_string)
    File "/usr/lib/python2.7/urllib.py", line 87, in urlopen
    return opener.open(url)
    File "/usr/lib/python2.7/urllib.py", line 215, in open
    return getattr(self, name)(url)
    File "/usr/lib/python2.7/urllib.py", line 359, in open_http
    'got a bad status line', None)
    IOError: ('http protocol error', 0, 'got a bad status line', None)

  • Hmm. Die vielen Meldungen zeigen eigentlich, dass die Aufnahme angelegt wurde.
    Die zwischenmeldung kann ich nicht einordnen.
    Die letzte Meldung, da ist vermutlich TVH abgeschmiert.

    Warum kann ich dir nicht sagen. Vlt. fragst du noch mal ein paar Experten hier oder bei TVH.

    Falls es was mit den sehr umfangreichen Log Files zu tun hast, kannste natürlich auch den Workaround ausprobieren ohne die [definition='1','0']log[/definition] files. Nur so als Test.

  • So, eine gute und eine schlechte Nachricht.
    Wie immer: Die gute zuerst:

    Also im Prinzip funktioniert der import. Ich konnte 2 Aufnahmen importieren.

    Nun die schlechte Nachricht:
    Das Skript stolpert, wenn zu dem Video File noch eine andere Datei mit im Ordner ist.
    Bei mir ist das die Thumbs.db Datei, Windows sei "Dank".

    Um dem Problem auf die Spur zu kommen habe ich vor jeden Unterfunktionsaufruf ein Print eingefügt um
    den "Übeltäter" einzuschränken. Also nicht wundern, wenn da ein "Call Funktionsname" steht, das ist von mir.

    Ich gehe davon aus, dass ich wahrscheinlich einmal durchgehen muss und alle thumbs.db Dateien entfernen muss.
    Ich habe jetzt auch die ersten beiden Filme 5 oder 6 mal in den Aufnahmen, da ich ja das Skript so oft aufgerufen habe.
    [ap]

    Spoiler anzeigen


    ERROR in filestr2num: file name doesn't start with 'YYYY-MM-DDTHH-MM.ts'. Use Inode Change Time instead.
    call videoDuration
    New File Info:
    {
    "channelname": "Imported",
    "comment": "added by tvh_rec_import.py",
    "enabled": true,
    "files": [
    {
    "filename": "/recordings/Star Wars_ Die letzten Jedi/Star Wars_ Die letzten Jedi-ProSieben2020-03-2300-30.ts"
    }
    ],
    "start": 1584929700,
    "stop": 1584940201,
    "title": {
    "ger": "Star Wars_ Die letzten Jedi-ProSieben2020-03-2300-30"
    }
    }
    call urllib.urlopen
    Server Answer: {"uuid":"3ad242069a733162bf650279e0a1c8b8"}
    call filedate2num: /recordings/Star Wars_ Die letzten Jedi/Thumbs.db
    ERROR in filestr2num: file name doesn't start with 'YYYY-MM-DDTHH-MM.ts'. Use Inode Change Time instead.
    call videoDuration
    Traceback (most recent call last):
    File "tvh_rec_import_direct.py", line 78, in <module>
    importRecord(recdir+folder+"/"+filename, mask, api_url)
    File "tvh_rec_import_direct.py", line 65, in importRecord
    new_mask['stop'] = video_start + videoDuration(filepath)
    File "tvh_rec_import_direct.py", line 53, in videoDuration
    return int(float(js['format']['duration']) + 1.)
    KeyError: 'format'

  • Hi,

    andere Dateien sollten in dem Ordner nicht sein. Das ist halt ein simples Skript und keine ausgefeilte Software, die sämtliche Szenarien abfängt.

    Zu deinen Fehlermeldungen zitiere ich mich in meiner Anleitung selbst:
    "Außerdem erwartet das Skript, dass eure Dateien am Anfang des Dateinamens einen Zeitstempel der Form YYYY-MM-DDTHH-MM haben."

    Deine Dateinamen sjnd anders, weswegen kein Datum aus dem Dateinamen generiert werden kann.

  • Hi,

    vielen Dank für Dein HowTo!
    Ich versuche, es auf Libreelec 10.0.1 (Kodi 19.3.0) nachzuvollziehen und habe folgendes Problem:

    Das Skript stoppt mit

    Code
    KodiKiste:/var/media/DATENPLATTE/backup # python tvh_log_import.py
    Traceback (most recent call last):
    File "tvh_log_import.py", line 29, in <module>
    importLog(logdir+[definition='1','0']log[/definition], api_url)
    File "tvh_log_import.py", line 24, in importLog
    filehandle = urllib.urlopen(api_string)
    AttributeError: module 'urllib' has no attribute 'urlopen'

    Ich habe in der Python-Doku gefunden, dass es in Python 3.8 wohl heißen müsste: filehandle = urllib.request.urlopen(api_string) ...!?
    Aber das habe ich ausprobiert, leider mit demselben Ergebnis (da heißt es dann: module 'urllib' has no attribute 'request').


    Da ich von Python keine Ahnung habe, stoße ich hier an meine Grenzen. Kann mir jemand helfen, das Skript zum Laufen zu kriegen?

    Danke im Voraus!

  • Hab durch Zufall gerade mal wieder reingeschaut.

    Einfache Lösung wäre vermutlich, das Script mit Python 2.7 aufzurufen.

    Ansonsten müsste ich auch erst Doku lesen. Den Part mit urllib.open hatte ich übernommen.

    Eigentlich sollte urllib.request.urlopen() funktionieren. Du kannst auch mal versuchen ganz oben beim import urllib.request statt nur urllib hin zu schreiben.

    Wenn es daran wirklich scheitern sollte, kannst du zum debuggen auch einfach mal mit dem befehl "python" einen Python interpreter starten. Dann gibst du einmal lden import und einmal die Zeile mit dem filehandler ein.

  • Danke schon einmal für die Hilfe!
    Ich habe mal ausprobiert urllib.request zu importieren und dann entsprechend Zeile 23 geändert in:
    filehandle = urllib.request.urlopen(api_string).

    Immerhin: Die Fehlermeldung hat sich geändert. [ag]
    Und so sieht sie aus:

    Spoiler anzeigen

    KodiKiste:/var/media/DATENPLATTE/backup # python ./tvh_log_import.py
    Traceback (most recent call last):
    File "./tvh_log_import.py", line 29, in <module>
    importLog(logdir+[definition='1','0']log[/definition], api_url)
    File "./tvh_log_import.py", line 24, in importLog
    filehandle = urllib.request.urlopen(api_string)
    File "/usr/lib/python3.8/urllib/request.py", line 222, in urlopen
    File "/usr/lib/python3.8/urllib/request.py", line 525, in open
    File "/usr/lib/python3.8/urllib/request.py", line 542, in _open
    File "/usr/lib/python3.8/urllib/request.py", line 502, in _call_chain
    File "/usr/lib/python3.8/urllib/request.py", line 1383, in http_open
    File "/usr/lib/python3.8/urllib/request.py", line 1354, in do_open
    File "/usr/lib/python3.8/http/client.py", line 1252, in request
    File "/usr/lib/python3.8/http/client.py", line 1263, in _send_request
    File "/usr/lib/python3.8/http/client.py", line 1097, in putrequest
    File "/usr/lib/python3.8/http/client.py", line 1197, in _validate_path
    http.client.InvalidURL: URL can't contain control characters. '/api/dvr/entry/create?conf={"enabled": true, "start": 1598031000, "start_extra": 5, "stop": 1598036400, "stop_extra": 10, "channel": "a9889cd26390d2238d1e4ef02656be32", "channelname": "KiKA HD", "title": {"ger": "Amelie rennt"}, "subtitle": {"ger": "Die 13-j\\u00e4hrige Grossstadtg\\u00f6re Amelie und der geheimnisvolle 15-J\\u00e4hrige Bart begeben sich auf eine abenteuerliche Reise."}, "description": {"ger": "Grosser Fernsehabend mit dem mehrfach ausgezeichneten Film \\"Amelie rennt\\": Ein eigensinniges M\\u00e4dchen aus der Grossstadt leidet an Asthma und muss zur Kur in die S\\u00fcdtiroler Berge. Dort trifft sie auf den Bauernjungen Bart und erklimmt sogar einen Gipfel. Amelie (Mia Kasalo) lebt in Berlin und ist ein ziemlich eigensinniger Teenager, der sich von niemanden etwas sagen l\\u00e4sst. Sie hat?Asthma, was sie zu ignorieren versucht. Vor allem hasst sie die Bevormundung durch ihre \\u00c4rzte und die Eltern. Nach einem besonders schlimmen Anfall muss Amelie zur Kur in einer Reha-Klinik in den S\\u00fcdtiroler Bergen. Hier lernt sie den 15-j\\u00e4hrigen Kuhhirten Bart kennen, gespielt vom Rittner Nachwuchsschauspieler Samuel Girardi. Amelie wagt mit Barts Hilfe eine abenteuerliche Bergbesteigung. Ein Grossteil der Aufnahmen erfolgte in S\\u00fcdtirol, und zwar im Wesentlichen bei den Reinbach Wasserf\\u00e4llen und auf der Burgruine Rafenstein ober Bozen. Ein Film von Tobias Wiemann."}, "pri": 2, "retention": 0, "removal": 2147483646, "playposition": 0, "playcount": 0, "config_name": "8d0f5b7ae354d956d7fe5db25f5d0d24", "creator": "127.0.0.1", "errorcode": 0, "errors": 0, "data_errors": 12, "dvb_eid": 0, "noresched": true, "norerecord": false, "fileremoved": 0, "autorec": "", "timerec": "", "parent": "", "child": "", "content_type": 1, "broadcast": 0, "files": [{"filename": "/var/media/DATENPLATTE/PVR/Amelie rennt/Amelie rennt-KiKA HD2020-08-2119-30.ts", "info": [{"type": "H264", "width": 1280, "height": 720, "duration": 1800, "aspect_num": 0, "aspect_den": 0}, {"type": "MPEG2AUDIO", "language": "ger", "audio_type": 0, "audio_version": 2}, {"type": "MPEG2AUDIO", "language": "mis", "audio_type": 0, "audio_version": 2}, {"type": "AC3", "language": "ger", "audio_type": 0, "audio_version": 1}, {"type": "TELETEXT"}, {"type": "DVBSUB", "language": "ger", "composition_id": 1, "ancillary_id": 1}], "start": 1598030700, "stop": 1598034059}, {"filename": "/var/media/DATENPLATTE/PVR/Amelie rennt/Amelie rennt-KiKA HD2020-08-2119-30-1.ts", "info": [{"type": "H264", "width": 1280, "height": 720, "duration": 1800, "aspect_num": 0, "aspect_den": 0}, {"type": "MPEG2AUDIO", "language": "ger", "audio_type": 0, "audio_version": 2}, {"type": "MPEG2AUDIO", "language": "mis", "audio_type": 0, "audio_version": 2}, {"type": "AC3", "language": "ger", "audio_type": 0, "audio_version": 1}, {"type": "TELETEXT"}, {"type": "DVBSUB", "language": "ger", "composition_id": 1, "ancillary_id": 1}], "start": 1598034093, "stop": 1598037000}]}' (found at least ' ')


    Warum wird der zusammengesetzte http-Aufruf nicht akzeptiert?

    Ich freue mich über jeden Hinweis! :/

  • 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!

  • Moin,
    ich nochmal . ;)
    Ich hatte mich mal vertan mit dem Aufnahmeordner. Nun hat TVH für jeden Serienteil einen Ordner gemacht. Das habe ich erkannt und geändert. Trotzdem stören mich jetzt die Ordner wo die einzelnen Dateien drinliegen.
    Kann ich irgendwo in TVH die Aufnahmedatei ändern und die Dateien alle in einen Ordner verschieben?
    Bin nicht mehr so auf dem Laufenden - war zu lange her ;)

    TV-Server: DS920+ ; Datengrab und TVH-Server DVB-C via FitzBox 6591
    MM-Server: DS116 ; Backup für DS920
    Client1: Sony Bravia XR 48OLEDA90K (Google-TV-Kodi 20.5)
    Client2: HP TouchSmart 520-1130ez / LibreELEC-Generic.x86_64 (Küche)
    Client5: Optiplex SSF-i3 / LibreELEC-Generic.x86_64 (Keller)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!