Weder Episodennummer noch Season trotz OMDB

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.

BBCode ist eingeschaltet
[img] ist eingeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Ansicht erweitern Die letzten Beiträge des Themas: Weder Episodennummer noch Season trotz OMDB

Re: Weder Episodennummer noch Season trotz OMDB

von ds10 » 22 Aug 2013, 00:23

Die Android-Version ist uralt, wie man am Datum der letzten Änderung erkennen kann und war auch nie im Einsatz.

Ich werde mich demnächst aber wohl an eine komplett neue Android-Version setzen, dann komme ich vielleicht auf das Angebot zurück.

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 21 Aug 2013, 23:45

Ja sauber, habe bis jetzt keinen Hänger mehr feststellen können. Hoffentlich hat der Fix keine Nebenwirkungen. :wink:

Ach ja, beim SVN-Checkout habe ich gesehen, dass es so etwas wie eine Android-Version gibt. Wird die aktiv von euch TVBrowsern-Machern weiterentwickelt? Oder ist das eine App von ein, zwei Usern hier aus dem Forum? Ich selbst verdiene meine Brötchen mit Android und würde gerne ein Paar Tips beisteuern (z.B. Verwendung von LoaderManager, AsyncTasks, Fragments).

Viele Grüße, Wolpers

Re: Weder Episodennummer noch Season trotz OMDB

von ds10 » 20 Aug 2013, 23:26

Du kannst auch die Quellen der neuen Beta-Version nehmen: http://hilfe.tvbrowser.org/viewtopic.ph ... 09#p102809

[ Post made via Android ] Bild

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 20 Aug 2013, 23:15

Hmmm, ich stehe mit SVN aufs Kriegsfuß. Wo finde ich die Änderung zum Ausprobieren?

Re: Weder Episodennummer noch Season trotz OMDB

von ds10 » 19 Aug 2013, 10:03

Ich habe jetzt einfach den Aufruf von getCacheEntryBlocking entfernt, damit kann es ja dort nicht mehr zum Blockieren kommen. Das kannst du ja mit dem aktuellen Code aus dem SVN probieren, bei meinen Test blockiert mit dem geänderten Ablauf nichts und das Datenupdate läuft schnell durch.

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 19 Aug 2013, 00:56

Ja, das "synchronized" von getCacheEntryBlocking ist der Grund, warum der "handle tv data added" angehalten bzw. blockiert wird. Ich kann zwar nicht sagen, warum das so ist, weil ich die Multithreading-Mechanismen vom TVBrowser nicht so ganz verstehe. Aber der Debugger von Eclipse behauptet, der Thread "TV data update" sei der Grund.
Um zumindest das ursächliche Szenario weiter einzugrenzen, habe ich mal ein abgespecktes Plugin (s.Anhang) geschrieben, das dem Titel und der Beschreibung jeder Sendung ein "*" voransetzt, damit man nicht behaupten kann, es liege am allzu sehr ausgeuferten Plugin selbst. :wink:

Code: Alles auswählen

public void handleTvDataAdded(MutableChannelDayProgram newProg) {
  long in = System.currentTimeMillis();
  String sNewProg = newProg.getChannel() + " " + newProg.getDate();
  System.out.println("==> handleTvDataAdded: " + sNewProg);
  System.out.println("... handleTvDataAdded: " + sNewProg);

  Iterator<Program> it = newProg.getPrograms();
  while ((it != null) && (it.hasNext())) {
    MutableProgram program = (MutableProgram)it.next();
    if (program == null) {
      continue;
    }
    String sTitle = program.getTitle();
    program.setTitle("*" + sTitle);
    
    String sDescription = program.getDescription();
    program.setDescription("*" + sDescription);
  }
  long out = System.currentTimeMillis();
  System.out.println("<== handleTvDataAdded (" + (out - in) + "ms): " + sNewProg);
}
Über die System.out.println-Aufrufe kann man in der Konsole sehen, dass die Callback-Methode aufgerufen wurde und dass sie wieder verlassen wurde. Beim Verlassen wird noch die Verweildauer in handleTvDataAdded ausgegeben. Werte um bzw. größer 10000ms bedeuten abgebrochene Threads (t.join(10000)), die bei getCacheEntryBlocking hängengeblieben waren. Wenn ich meinen Beobachtungen trauen kann, tritt das Blockade-Problem dann ein, wenn ein Tag ganz neu heruntergeladen wird und der vormals letzte Tag (also der Vortag des neuen Tages) ebenfalls die Sendungen nach 24Uhr aktualisieren muss.
Mit anderen Worten: TVBrowser hat z.B. Daten fürs ZDF bis zum 22.8.. Bei der Datenaktualisierung kommt der 23.8. dazu. handleTvDataAdded wird während der Ausführung für die Sendungen des 22.8. nach 24 Uhr blockiert.
Interessanterweise passiert dies nicht immer, aber sehr, sehr oft. Hier mal die Log-Ausgabe einer solchen Blockade, die durch einfaches Löschen des ZDF-tvdata vom 23.8. mit anschließender Datenaktualisierung reproduziert werden konnte:

Code: Alles auswählen

==> handleTvDataAdded: ZDF Fr, 23. Aug
... handleTvDataAdded: ZDF Fr, 23. Aug
<== handleTvDataAdded (0ms): ZDF Fr, 23. Aug
==> handleTvDataAdded: ZDF Do, 22. Aug
... handleTvDataAdded: ZDF Do, 22. Aug
<== handleTvDataAdded (10001ms): ZDF Do, 22. Aug
Das sollte ich sich vielleicht noch mal jemand anderes als ich anschauen, der einfach mehr Ahnung mit den Zusammenhängen der TVBrowser-Innereien hat. In meinen Augen erscheint ja selbst das Spawnen eines neuen Threads pro handleTvDataAdded-Aufruf unnötig bzw. overkill, zumal ja bereits aus einem Thread heraus gespawnt wird, der nicht der Haupt-UI-Thread ist. Es ist also eigentlich gar kein Grund bzw. Nutzen dieser Multithreading-Orgie erkennbar. Naja, ein einziger Nutzen vielleicht schon: man kann durch den Timeout in join eventuelle Deadlock-Knoten zerschlagen. Allerdings ist dieser Deadlock TVBrowser-hausgemacht und sollte an der Wurzel und nicht durch Abwürgen des Plugins gelöst werden.
Mit der (Er-)Kenntnis, dass der spawnende Thread ("TV data update") den gespawnten Thread ("handle tv data added") im beschriebenen Szenario blockiert, und dass der spawnende Thread im Normalfall sowieso 10 Sekunden auf die Beendigung des gespawnten Threads wartet, also Multithreading hier ad absurdum geführt wird, würde ich eher dafür plädieren, dass "TV data update" handleTvDataAdded direkt und ohne Thread-Gedöns aufruft. Das behebt auf jeden Fall schon mal das Blockade-Problem.

Jetzt wird man zwar bestimmt wieder sagen: "Was ist mit den Plugins, die möglicherweise schlecht programmiert sind und den TVBrowser lahmlegen? Die muss der TVBrowser doch nach 10 Sekunden abwürgen können." Ich bin eher der Meinung, dass man das dem Benutzer überlassen sollte, dass also der TVBrowser anzeigt, welches Plugin gerade wie lange schon läuft, so dass sich der Benutzer sein eigenes Urteil bilden kann und die lahmen Krücken unter den Plugins dann abschaltet. Oder auch nicht... :)
Dateianhänge
TVBTEST.zip
(4.65 KiB) 243-mal heruntergeladen

Re: Weder Episodennummer noch Season trotz OMDB

von ds10 » 18 Aug 2013, 13:32

Wenn es ein Deadlock sein sollte, müsste der aber rein logisch immer auftreten, denn die Abfolge der Methodenaufrufe ist immer dieselbe. Da aber z.B. DescriptionInfoTextEraserPlugin keinen Deadlock produziert müssen noch weitere Bedingungen ursächlich sein.

Der Quellcode von TV-Browser ist ja frei verfügbar, vielleicht siehst du mal selber nach, wo das Problem liegen könnte, denn mir fällt an den entsprechenden Stellen nichts auf, außer der Verwendung von synchronized, was aber dort notwendig ist.

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 18 Aug 2013, 13:06

ds10 hat geschrieben:Es ist ganz einfach TV-Browser speichert nur zu einem Zeitpunkt die Daten ab und ein Plugin hat 10 Sekunden Zeit Änderungen an den Daten vorzunehmen. Ganz einfach deshalb, damit nicht ein Plugin, was nicht sauber arbeitet, den Update-Vorgang blockieren kann.
Hier muss ich leider nach mal einhaken, weil ich glaube, dass unter bestimmten Umständen sogar der TVBrowser selbst und nicht das Plugin eine Blockade verursacht. Im angehängten Screenshot ist meiner Meinung nach eine Deadlock-Situation zu sehen, die dafür sorgt, dass der simple Aufruf von setDescription aus dem Plugin (im Thread "handle tv data added") festhängt, weil der Thread "TV data update" den Zugriff auf das TvDataBase-Objekt nicht ermöglicht.
deadlock.png
deadlock.png (69.03 KiB) 5954 mal betrachtet
Man kann natürlich sagen, dass sich dieses Problem nach 10 Sekunden durch den Timeout auflöst. Allerdings bedeutet dies wiederum, dass "setDescription" aus dem Plugin ohne Wirkung bleibt, was natürlich sehr unerfreulich ist, weil dann das Plugin nicht wie erwartet funktioniert. Schöner wäre es natürlich, wenn die eigentliche Ursache dafür behoben werden würde, dass der Thread "TV data update" das TvDataBase-Objekt nicht freigibt. Dann wäre für solch eine Konstellation auch gar kein Timeout nötig. :wink:

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 15 Aug 2013, 15:11

Das Internet abgrasen? Das würde doch niemand tun. :wink:

Aber die Begründung kann ich natürlich verstehen. Danke für die Info!

Re: Weder Episodennummer noch Season trotz OMDB

von ds10 » 15 Aug 2013, 14:36

Es ist ganz einfach TV-Browser speichert nur zu einem Zeitpunkt die Daten ab und ein Plugin hat 10 Sekunden Zeit Änderungen an den Daten vorzunehmen. Ganz einfach deshalb, damit nicht ein Plugin, was nicht sauber arbeitet, den Update-Vorgang blockieren kann. 10 Sekunden sind sehr viel Zeit für die Bearbeitung von Sendungen, es ist auch nicht vorgesehen, dass ein Plugin erst das ganze Internet abgrast um Änderungen vorzunehmen.

Wenn man sich vorstellt man hat 30 Sender und aktualisiert für 14 Tage und hat 10 Plugins installiert, dann ergibt die Wartezeit von 10 Sekunden 30 Sender * 14 Tage * 10 Plugins * 10 Sekunden = 42000 Sekunden oder 11 Stunden 40 Minuten wenn alle Plugins die Wartezeit ausnutzen. Daran sieht man die 10 Sekunden sind schon sehr großzügig.

Könnten auch zwischen den Datenupdates Änderungen vorgenommen werden, wären die Daten nicht konsistent, denn wenn dein Plugin dies könnte, dann könnten das auch alle anderen.

Auf jeden Fall wären am Ende wir es, die die Klagen bekämen, dass das Datenupdate nicht funktioniert.

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 15 Aug 2013, 12:57

OK, Gründe, warum man nachträglich keine Daten mehr ändern kann sondern nur innerhalb von handleTvDataAdded(MutableChannelDayProgram channelDayProgram), fallen mir keine ein. :)

Dennoch gibt es auch innerhalb von handleTvDataAdded Situationen, in denen die im Plugin definitiv veränderten Daten nicht als solche im TVBrowser angezeigt werden. Das passiert dann, wenn man sich mit dem Debugger "zu lange" in handleTvDataAdded aufhält oder wenn die Verarbeitung in handleTvDataAdded "zu lange" dauert. Es sieht so aus, als gibt es irgendwo im TVBrowser einen Timeout, der beim Erreichen dafür sorgt, dass Änderungen an diesem zu langsam veränderten channelDayProgram ignoriert werden.
Noch mal mit anderen Worten: wenn zwischen Betreten und Verlassen von handleTvDataAdded zu viel Zeit vergeht, werden Änderungen an channelDayProgram nicht berücksichtigt.

Warum ist das so? Wie groß ist dieser Timeout? Kann man ihn verändern?

Viele ratlose Grüße, Wolpers

Re: Weder Episodennummer noch Season trotz OMDB

von ds10 » 29 Jul 2013, 15:10

Ein Beispiel für das Verändern der Daten ist das DescriptionInfoTextEraserPlugin, und dort sieht die entscheidende Methode so aus:

Code: Alles auswählen

  public void handleTvDataAdded(MutableChannelDayProgram channelDayProgram) {
    if(channelDayProgram.getChannel().getDataServiceProxy().getId().equals("tvbrowserdataservice.TvBrowserDataService")) {
      for(int i = 0; i < channelDayProgram.getProgramCount(); i++) {
        if(channelDayProgram.getProgramAt(i).getShortInfo() != null &&
            channelDayProgram.getProgramAt(i).getShortInfo().indexOf("keine Beschreibung") != -1 &&
            channelDayProgram.getProgramAt(i).getShortInfo().indexOf("WirSchauen") != -1) {
          ((MutableProgram)channelDayProgram.getProgramAt(i)).setShortInfo(null);
          ((MutableProgram)channelDayProgram.getProgramAt(i)).setDescription(null);
        }
      }
    }
  }
Die Beschreibung ist auch nach einem Neustart von TV-Browser weiterhin gelöscht, sie werden also auch gespeichert.
Dass Änderungen außerhalb dieser Methode nur temporär wirken ist klar, denn die werden nicht gespeichert.

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 29 Jul 2013, 14:55

Einerseits verwende ich a) handleTvDataAdded(MutableChannelDayProgram newProg), um neu hinzugefügte Sendungen zu verarbeiten. Andererseits nutze ich getButtonAction(), um über alle bereits vorhandenen, noch nicht verarbeiteten Sendung "drüberzulaufen". D.h. Episodennummer und Season aus der Beschreibung in die entsprechenden Felder kopieren. Und umgekehrt. Bei Sky Atlantic HD hat es sich als äußerst sinnvoll/hilfreich erwiesen, wenn die Beschreibung mit Season und Episodennummer beginnt.

Das Setzen der Episodennummer- und Season-Felder funktioniert sowohl bei a) als auch bei b), das Ergänzen der Beschreibung bei a) bzw. bei b) nur temporär. D.h. nach einem TVBrowser-Neustart sind die Beschreibungen wieder auf ihrem vorherigen Stand.

Aber wenn das eh alles nicht erlaubt ist, ist es eh Wurscht. :cry:

Re: Weder Episodennummer noch Season trotz OMDB

von ds10 » 27 Jul 2013, 21:49

wolpers0815 hat geschrieben:1) Naja, dann stimmt aber die JavaDoc von setWasChangedByPlugin nicht... :wink:
Es schadet auch nicht, wenn man das aufruft und es kann auch gut sein, dass TV-Browser das bei 2.2.2 noch nicht selbst aufgerufen hat. Und dadurch wird das JavaDoc dieser Methode auch nicht falsch, denn die macht genau das, was das JavaDoc sagt. Falsch ist wohl eher, dass dort nicht mehr die richtige Methode genannt wird.
wolpers0815 hat geschrieben:2) Nee, ich meine sogar Unterschiede zwischen dem, was ich zunächst im Debugger und anschließend im TVBrowser gesehen habe.
3) setDescription erwartet einen String. Ist also nicht möglich, hier großartig was falsch zu machen.
Ich dachte du wolltest die Episodennummern einfügen, dafür gibt es ja spezielle Felder.

Code: Alles auswählen

mutableProgram.setIntField(ProgramFieldType.EPISODE_NUMBER_TYPE,1);
mutableProgram.setIntField(ProgramFieldType.SEASON_NUMBER_TYPE,3);
Und du hast auch die richtige Methode überschrieben?

Code: Alles auswählen

public void handleTvDataAdded(MutableChannelDayProgram newProg) {
und nicht etwa:

Code: Alles auswählen

public void handleTvDataAdded(ChannelDayProgram newProg) {
wolpers0815 hat geschrieben:4) Hmmmmmm, ich "kopiere" doch lediglich Episoden- und Season-Info aus der Beschreibung/Originalfolge in die eigentlich dafür vorgesehenen aber nicht verwendeten Felder.
Spielt keine Rolle, du holst es aus einer Datenbank und die ist geschützt, es sei denn sie erlauben die Verwendung der Daten.

Re: Weder Episodennummer noch Season trotz OMDB

von wolpers0815 » 27 Jul 2013, 21:25

1) Naja, dann stimmt aber die JavaDoc von setWasChangedByPlugin nicht... :wink:
2) Nee, ich meine sogar Unterschiede zwischen dem, was ich zunächst im Debugger und anschließend im TVBrowser gesehen habe.
3) setDescription erwartet einen String. Ist also nicht möglich, hier großartig was falsch zu machen.
4) Hmmmmmm, ich "kopiere" doch lediglich Episoden- und Season-Info aus der Beschreibung/Originalfolge in die eigentlich dafür vorgesehenen aber nicht verwendeten Felder.

Nach oben