Hashwert im Dateinamen von Downloads, Debugging in VS Code
-
Hallo,
ich versuche, in Python ein kleines Skript zu schreiben, das überprüfen soll, ob ich einen mit MediathekView gefundenen Film bereits heruntergeladen habe. Mein Ansatz ist, den standardmäßig im Dateinamen enthaltenenen Hashwert mit dem Hashwert der URL des Kandidaten zu vergleichen.
In src/main/java/mediathek/daten/DatenDownload.java habe ich die Funktion getHash() gefunden, mit der der Hashwert berechnet wird. Eine Reimplementation von hashCode() in Python habe ich hier gefunden und mit einem kleinen Java-Programm an einer URL verifiziert. Trotzdem stimmen die von mir berechneten Hashwerte nicht mit denen in den Dateinamen meiner Downloads überein. Wo könnte mein Fehler liegen?
Ich habe den Quellcode von MediathekView von GitHub heruntergeladen. Ich würde das Programm gerne im Debugger ausführen und mit einem Breakpunkt in getHash() herausfinden, was schiefläuft. Wenn ich im Debugger von VS Code Main.java starte, erhalte ich nur eine Fülle von import-Fehlern. Leider entwickle ich selbst nicht in Java. Kann mir jeman einen Tip geben, was ich tun müsste, um das Programm auszuführen?
Danke im Voraus,
maf -
hast du ein JDK 21 installiert und wie in der VS Code Extension konfiguriert? (vgl. Anleitung)
-
Installiert ist OpenJDK 17, das in Debian Bookworm standardmäßig enthalten ist. Damit konnte ich in VS Code aicj problemlos das Java-Programm ausführen, das ich für den Vergleich der Ergebnisse von hashCode() in Java und meiner Reimplementation in Python benutzt habe.
Meine Vermutung ist, dass ich die Import-Fehler beheben könnte, indem ich mit Maven die (in pom.xml beschriebenen ?) Abhängigkeiten auflöse. Nur wie gesagt: Mangels Erfahrung mit Java und Maven weiß ich nicht, wie ich das - speziell in VS Code mit der Erweiterung Maven for Java - anstellen soll.
-
Erst beim Test mit Maven habe ich verstanden, dass für die Entwicklung JDK 21 erforderlich ist. Bisher hatte ich geglaubt Version 14 sei ausreichend, weil Java 14 in den Systemvoraussetzungen für die Ausführung von MediathekView genannt wird.
OpenJDK 21 ist in Debian Bookworm nicht enthalten, ließe sich natürlich trotzdem mit etwas Aufwand installieren. Das würde ich mir gerne ersparen.
Vielleicht findet sich also doch jemand, der mir einen Tipp gegeben kann, warum in den Dateinamen beim Download andere Hashwerte benutzt werden, als hashCode() für die URLs berechnet?
-
wenn ich für die Download-Url in einem simplen Java-Programm String.hashCode() aufrufe, bekomme ich den gleichen absoluten Wert für den Hash wie beim Download in MV.
Beispiel:
"https://nrodlzdf-a.akamaihd.net/none/zdf/25/02/250225_rosendahl_charles_hde/1/250225_rosendahl_charles_hde_3360k_p36v17.mp4".hashCode()
liefert den Hash -1776013421, beim Download bekomme ich *1776013421
die Implementierung von String.hashCode ist laut API-Spec vorgegeben, so dass unterschiedliche JVM sich auch gleich verhalten.
-
/** * Returns a hash code for this string. The hash code for a * {@code String} object is computed as * <blockquote><pre> * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] * </pre></blockquote> * using {@code int} arithmetic, where {@code s[i]} is the * <i>i</i>th character of the string, {@code n} is the length of * the string, and {@code ^} indicates exponentiation. * (The hash value of the empty string is zero.) * * @return a hash code value for this object. */ public int hashCode() { // The hash or hashIsZero fields are subject to a benign data race, // making it crucial to ensure that any observable result of the // calculation in this method stays correct under any possible read of // these fields. Necessary restrictions to allow this to be correct // without explicit memory fences or similar concurrency primitives is // that we can ever only write to one of these two fields for a given // String instance, and that the computation is idempotent and derived // from immutable state int h = hash; if (h == 0 && !hashIsZero) { h = isLatin1() ? StringLatin1.hashCode(value) : StringUTF16.hashCode(value); if (h == 0) { hashIsZero = true; } else { hash = h; } } return h; }
Aber Vorsicht, die String.hashCode() Methode verhält sich unterschiedlich bzgl. ASCII vs. UFT-16 strings.
BeiLatin1Strings
wird am Ende diese Funktion aufgerufen:private static int unsignedHashCode(int result, byte[] a, int fromIndex, int length) { int end = fromIndex + length; for (int i = fromIndex; i < end; i++) { result = 31 * result + Byte.toUnsignedInt(a[i]); } return result; }
result
wird hier mit 0 initialisiert.Ich würde dir empfehlen IntelliJ Community Edition herunterzuladen. Damit kannst du MV als maven Projekt öffnen. Das Debuggen mit IntelliJ ist bedeutend besser und man kann sehr einfach über context menu oder Tastatur den function calls folgen.
-
Ich habe meine Reimplementation von hashCode() in Python mit der oben als Beispiel benutzten URL “https://nrodlzdf-a.akamaihd.net/none/zdf/25/02/250225_rosendahl_charles_hde/1/250225_rosendahl_charles_hde_3360k_p36v17.mp4” getestet. Wie die Bibliotheksfunktion in Java liefert sie den Wert -1776013421. Die Python-Version scheint also korrekt zu sein.
Das Problem steckt an einer anderen Stelle: Die im Suchergebnis angegebene URL unterscheidet sich von der URL, die in der Infodatei genannt wird. Und deren Hashwert wird beim Download benutzt. Beispiel: Die KiKa-Sendung “Ein warmes Plätzchen” aus der Serie “Shaun das Schaf” wird als “Shaun das Schaf-Ein warmes Plätzchen-1126590016.mp4” heruntergeladen. Laut Infodatei ist die URL der Sendung “https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk0/230/2307570/2307570_56461426.mp4”. Der Hashwert dieser URL ist tatsächlich 1126590016. Aber laut Suchergebnis hat die Sendung die URL “https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk0/230/2307570/2307570_56461430.mp4”. Die letzten beiden Ziffern vor dem Punkt der URLs unterscheiden sich, und somit auch ihr Hashwert. Wie kommt das denn?
-
@maf sagte: Die letzten beiden Ziffern vor dem Punkt der URLs unterscheiden sich, und somit auch ihr Hashwert. Wie kommt das denn?
- “26”: URL, welche in der Filmliste steht (allgemein: URL der Version in mittlerer Auflösung, was du vermutlich mit “Suchergebnis” gemeint hast)
- “30”: URL der höchsten Auflösung (allgemein: URL der Version für die vom Benutzer beim Download selektiertem Auflösung, die dann auch im Info-File erscheint)
-
solltest auch bedenken (z.B. aktueller Tatort, die sammle ich): gleiche Filme werden oft bei unterschiedlichen Sendern / mit unterschiedlichen Titeln («Charlie» – Der neue Fall aus München oder Charlie) und auch unterschiedlichen URLs angeboten. Der Vergleich über die URL wird den Film nicht wiedererkennen.
Ich vergleiche über den Titel mit einem “großzügigen” Vergleich
-
@Georg-J sagte in Hashwert im Dateinamen von Downloads, Debugging in VS Code:
Erster Record der Filmliste: “Url_Klein” steht 4 Felder hinter “Url”, “Url_HD” steht 6 Felder hinter “Url”. Diese Inhalte verändern den Wert von “Url”.
Die unterschiedlichen URLs habe ich noch nicht gefunden. Im Ergebnis der Suche (= Filmliste?) gibt es bei mir folgende Spalter: Nr, Sender, Thema, Titel, (3 x Buttons), Datum, Zeit, Dauer, Größe, HQ, UT, Geo und URL. Diese Daten erhalten ich auch mit Ctrl-A Ctrl-C. Kann ich die Spalten vielleicht konfigurieren?
-
@maf sagte in Hashwert im Dateinamen von Downloads, Debugging in VS Code:
@Georg-J sagte in Hashwert im Dateinamen von Downloads, Debugging in VS Code:
Erster Record der Filmliste: “Url_Klein” steht 4 Felder hinter “Url”, “Url_HD” steht 6 Felder hinter “Url”. Diese Inhalte verändern den Wert von “Url”.
Die unterschiedlichen URLs habe ich noch nicht gefunden. Im Ergebnis der Suche (= Filmliste?) gibt es bei mir folgende Spalter: Nr, Sender, Thema, Titel, (3 x Buttons), Datum, Zeit, Dauer, Größe, HQ, UT, Geo und URL. Diese Daten erhalten ich auch mit Ctrl-A Ctrl-C. Kann ich die Spalten vielleicht konfigurieren?
Georg spricht von der eigentlichen Filmliste, du von der Liste die du unter dem Tab Filme im Client zu sehen bekommst. Zwei verschiedene Dinge.
-
@vitusson sagte in Hashwert im Dateinamen von Downloads, Debugging in VS Code:
Georg spricht von der eigentlichen Filmliste, du von der Liste die du unter dem Tab Filme im Client zu sehen bekommst. Zwei verschiedene Dinge.
Ist diese “eigentliche Filmliste” die Datei filme.json im Ordner “.mediathek3”? Dann kann ich also in der Filmliste nach dem Eintrag mit der URL suchen, die ich im Suchergebnis finde, und dann sechs Felder weiter die URL für die HD-Version finden?
Mein Test: Die URL der Sendung “Shaun auf der Flucht” in der Liste der Suchergebnisse ist “https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk0/222/2227824/2227824_56161383.mp4”. Diese USR finde ich auch in filme.json. Vier Felder weiter steht “82|1.mp4” (was ist das?) und sechs Felder weiter steht “https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk0/222/2227824/2227824_56161379.mp4”. Der Hash-Wert dieser URL ist 740055391. Und der Download der Sendung hat tatsächlich den Dateinamen “Shaun das Schaf-Shaun auf der Flucht-0740055391.mp4”. Bingo!
-
[ "Sender", "Thema", "Titel", "Datum", "Zeit", "Dauer", "Größe [MB]", "Beschreibung", "Url", "Website", "Untertitel", "UrlRTMP", "Url_Klein", "UrlRTMP_Klein", "Url_HD", "UrlRTMP_HD", "DatumL", "Url_History", "Geo", "neu" ] [ "", "", "Shaun auf der Flucht", "15.03.2025", "18:05:00", "00:07:03", "111", "Als Shaun er in der Küche des Farmers Chaos anrichtet und überall Torte verteilt, können ihm die Schafe nicht mehr helfen. Der Farmer ist stinksauer.", "https://wdrmedien-a.akamaihd.net/medp/ondemand/de/fsk0/222/2227824/2227824_56161383.mp4", "https://www.kika.de/shaun-das-schaf/videos/shaun-auf-der-flucht-102", "", "", "82|1.mp4", "", "81|79.mp4", "", "1742058300", "", "DE", "true" ],
-
Danke euch allen, jetzt klappt es.
Da ich die Suche nun in der Filmliste selbst durchführe, benötige ich das GUI eigentlich nur, falls eine neue Sendung heruntergeladen werden muss. Deshalb, für die reine Suche: Ist es möglich, MediathekView so aufzurufen, dass die Filmliste aktualisiert aber das GUI nicht geöffnet wird. Und für den Fall eines Downloads: Ist es möglich, MediathekView zu starten ohne die Filmliste zu aktualisieren?
-
@maf sagte in Hashwert im Dateinamen von Downloads, Debugging in VS Code:
: Ist es möglich, MediathekView so aufzurufen, dass die Filmliste aktualisiert aber das GUI nicht geöffnet wird.
Ja, mit dem Parameter -dq oder --download-quit aufrufen
-
@vitusson sagte: Ja, mit dem Parameter -dq oder --download-quit aufrufen
Das könnte man ja selbst mal testen, bevor man eine Aussage dazu macht (wie nennst du das schon wieder: “Glauben vs. Wissen”?)
@maf: Du kannst mit der besagten Funktion, welche du mit einem Startskript aufrufst, anstehende Downloads z.B. aus Abos runterladen, wonach sich das Programm automatisch beendet (das geht allerdings nicht, ohne dass dabei “das GUI geöffnet” wird).
@maf sagte: Und für den Fall eines Downloads: Ist es möglich, MediathekView zu starten ohne die Filmliste zu aktualisieren?
Ja, ich empfehle dir mal die Programmeinstellungen durchzugehen. Die Art des Ladens der Filmliste kann dort ein- bzw. auf manuell umgestellt werden. Mal abgesehen davon, aktualisiert sich die Filmliste v.a. automatisch, wenn sie älter als 3 h ist und MV neu gestartet wird.
-