mediathekview / plugin.video.mediathekview

Kodi plugin that gives access to most video-platforms from German public service broadcasters using the database of MediathekView.de
https://mediathekview.de/download/#mediathekview-f%C3%BCr-kodi-fr%C3%BCher-xbmc
MIT License
55 stars 25 forks source link

[WIP] Use server time for checking update necessity (full/interval) #164

Closed TpmKranz closed 4 years ago

TpmKranz commented 4 years ago

Auszug aus dem Log des Standalone-mvupdate (noch vor #163, also „Version 0.0“):

May 02 01:00:58 nas python3[32280]: 2020-05-02 01:00:58.314331 DEBUG [mvupdate-0.0:MediathekViewUpdater]: Last update was not today. do full update once a day
…
May 02 01:01:38 nas python3[32280]: 2020-05-02 01:01:38.283545 NOTICE [mvupdate-0.0:MediathekViewUpdater]: Filmliste dated 01.05.2020, 23:31

Danach gab es dann nur noch Diffs und ich glaube, das ist der Grund, warum ich heute Morgen nicht die aktuellen Tagesthemen im MediathekView-Addon hatte. Die PR sollte das beheben, indem nun nicht mehr das aktuelle Datum und das Datum des letzten Updates, sondern das ungefähre Datum der letzten Änderung der Online-Filmliste und das Datum des letzten Updates der lokalen Filmliste verglichen wird, um ein volles Update anzustoßen. In Fällen mit schlechtem Timing könnten nun unnötige Vollupdates gefahren werden, aber die meisten Nutzer werden vermutlich eh erst ein Update fahren, wenn sie das Addon zum ersten Mal an einem gegebenen Tag anschmeißen. *: Die Last-Modified-Zeit ist immer ungefähr eine Viertelstunde nach der echten Filmlisten-Zeit. Wird also ein Filmlisten-Crawl um 23:55 Uhr gestartet und um 0:10 Uhr veröffentlicht (last modified), würde mvupdate um bspw. 1:00 Uhr ein Vollupdate fahren und das mvupdate um 3:00 Uhr (oder 4:00 Uhr) wäre dann wieder ein Vollupdate. Es würden aber zu keinem Zeitpunkt unnötig Sendungen in der lokalen Datenbank fehlen. Die Tagesthemen hat man dann ggf. bis zum Ende des Vier-Uhr-Updates nicht, aber das wäre ja ohnehin passiert. Wenn man so früh Tagesthemen schauen möchte, muss man wohl in jedem Fall rechtzeitig einen Vollupdate-Wecker stellen. :)

TpmKranz commented 4 years ago

Log der letzten Nacht Vor den Änderungen wäre das 0:00-Uhr-Update ein volles gewesen und die Diffs des Tages hätten auf der Liste des Vortages (von 23:29 Uhr) basiert. Ein Problem dabei könnte die Zeitzone des Clients sein, da die Datumsbestimmung dadurch verschoben werden kann. Ist irgendwo dokumentiert, zu welchen Zeitpunkten eine Org-Liste erstellt wird? Ich kann nirgends eine API-Dokumentation finden und MServer bezieht sich für die Org-Listenerstellung scheinbar auf eine XML-Konfiguration, die ich auch noch nicht gefunden habe. https://github.com/mediathekview/MServer/blob/77d4dcf26e333acaedbd7a41dc52a5e87b1e78d9/dist/mserver.xml#L46-L47 Das, zusammen mit dem Crawler-Zeitplan, deutet darauf hin, dass um 5:00 Uhr deutscher Zeit die Org-Liste erstellt wird, auf die sich die Diffs des Tages beziehen. Laut meinem Log repräsentierte diese heute den Stand von 5:24 Uhr und wurde um 5:44:03 Uhr veröffentlicht. Wenn also ein Client während unserer Sommerzeit in UTC-4 liegt, interpretiert er seinen letzten Filmlisten-Stand als 2020-05-03 5:29 UTC (die Zeit in der Filmliste kommt ohne Zeitzone, siehe https://github.com/mediathekview/plugin.video.mediathekview/blob/86233722378a59e6655656230e833c1d21067605/resources/lib/updater.py#L261-L262), liest eine Last-Modified-Zeit von 2020-05-03 03:44:03 UTC und macht daraus naive datetime-Objekte zu 2020-05-03 1:29 und 2020-05-02 23:44:03, sodass es zu keinem vollen Update kommt, da die lokale Filmliste ja „aktueller“ als die aktuelle ist. So kommt es tatsächlich nur zu einem vollen Update, wenn mehr als einen Tag lang gar kein Update mehr gemacht wurde.

Für Hinweise auf Fehler in meinem Verständnis der Zeitfunktionen in Python wäre ich sehr dankbar, aber wenn das alles korrekt ist, bräuchte es konsequente Angaben von Zeitzonen, die auch die Sommerzeit korrekt behandeln.

codingPF commented 4 years ago

Ich versuche das auch grade rauszufinden...ist nicht so einfach.... Kommentar Alex: "Es wird jede Stunde (jeder Crawler durchlauf" eine neue Org Liste erstellt. Aus dieser wird die SqlLite Datei erstellt". Jetzt bleibt noch die Frage woraus sich die Diff liste bezieht...

codingPF commented 4 years ago

Ich grabe mich jetzt noch ein wenig durch den source code um das zu verstehen... Generell finde ich die Idee ein "last modified url" zu verwenden extrem nice... Ich könnte mir da sowas vorstellen wie: Wenn last modified Orglist > my last update dann full Wenn last modified Diff > my last update dann diff Zeitzonen etc müsste man dann nochmal schauen aber in der Diff Liste gibt es einen UTC TS

alex1702 commented 4 years ago

Codacy Here is an overview of what got changed by this pull request:


Issues
======
- Added 1

See the complete overview on Codacy

TpmKranz commented 4 years ago

Wenn ich das Format der Filmliste richtig verstehe, müsste der zweite Zeitstempel im ersten Filmliste-Array in UTC sein; momentan wird aber der erste Zeitstempel (vermutlich in lokaler Serverzeit, also UTC+1 oder +2) in die Datenbank gespeichert: https://github.com/mediathekview/plugin.video.mediathekview/blob/e5e25bf769b4320097217da61f3e5d61e0c9e8db/resources/lib/updater.py#L255-L267 Das ist nur korrekt, wenn der Client sich in derselben Zeitzone befindet wie der Server. Für die Feststellung, ob ein volles Update nötig ist, bräuchte man aber immer noch die lokale Zeitzone des Servers, weil diese ja bestimmt, wann das Datum sich geändert hat. Die ganze Diskussion ist aber ohnehin hinfällig, weil die Last-Modified-Zeit auf den Servern scheinbar nichts mit den tatsächlichen Zeiten der letzten Bearbeitung der Dateien zu tun hat:

May 10 18:29:43 nas python3[32413]: 2020-05-10 18:29:43.982825 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-10 18:25:15
May 10 19:00:16 nas python3[15337]: 2020-05-10 19:00:16.329602 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-10 19:00:03
May 10 21:00:21 nas python3[11613]: 2020-05-10 21:00:21.791068 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-10 21:00:15
May 10 22:00:14 nas python3[1092]: 2020-05-10 22:00:14.840867 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-10 21:55:15
May 10 23:00:22 nas python3[18479]: 2020-05-10 23:00:22.559661 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-10 23:00:05
May 11 00:00:10 nas python3[24087]: 2020-05-11 00:00:10.774995 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-10 23:55:14
May 11 01:00:11 nas python3[16438]: 2020-05-11 01:00:11.060021 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 01:00:09
May 11 02:12:21 nas python3[14486]: 2020-05-11 02:12:21.899915 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 02:10:16
May 11 03:23:55 nas python3[10038]: 2020-05-11 03:23:55.495110 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 03:20:11
May 11 04:36:09 nas python3[6094]: 2020-05-11 04:36:09.841653 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 04:35:08
May 11 05:47:35 nas python3[27081]: 2020-05-11 05:47:35.840658 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 05:45:05
May 11 06:58:18 nas python3[17666]: 2020-05-11 06:58:18.607123 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 06:55:16
May 11 07:00:10 nas python3[19132]: 2020-05-11 07:00:10.896893 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 06:55:16
May 11 09:10:38 nas python3[31581]: 2020-05-11 09:10:38.444768 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 09:10:17
May 11 10:00:10 nas python3[9056]: 2020-05-11 10:00:10.876283 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 10:00:01
May 11 11:00:10 nas python3[28454]: 2020-05-11 11:00:10.988176 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 10:55:16
May 11 12:01:04 nas python3[20075]: 2020-05-11 12:01:04.169667 DEBUG [mvupdate-0.6.2:MediathekViewUpdater]: List at https://liste.mediathekview.de/Filmliste-akt.xz last modified on 2020-05-11 12:00:05

Insbesondere zwischen Mitternacht und fünf ergeben die Zeiten keinen Sinn. Ich prüfe gerade, ob die etags sich als Fingerabdrücke eignen, sodass zumindest irgendeine Möglichkeit besteht, unnötige Updates zu vermeiden.

codingPF commented 4 years ago

Die beiden Listen (Full & Diff) werden jede Stunde neu erstellt und somit hat man das Datum der ORG Liste leider nicht. Ich sehe da nur die Möglichkeit diese Zeit über die Konfig mitzugeben (5:00 & 22:00) und dann entsprechen um 5:00 einen Full zu triggern... Dafür muss ich mir den Update Flow nochmal ansehen, wie man das geschickt anstellt...