Zusammenfassung
- Ich wollte Radiko aufnehmen, und als ich es nachschlug, schrieben verschiedene Leute den Code.
- Ich hätte es einfach klonen und ausführen können, aber ich habe mich gefragt, welche Art von Verarbeitung es macht, also habe ich den Code selbst geschrieben, während ich den Code der Vorgänger gelesen habe.
- Ich habe etwas gelernt, als ich es ausprobiert habe, also habe ich es zusammengefasst.
- Ein in Radiko verwendetes Protokoll namens hls (HTTP Live Streaming)
- Was passiert beim Anhören einer Sendung auf Radiko?
- So finden Sie heraus, welche Spezifikation nicht veröffentlicht wurde
- Was ich zusammengebracht habe, wie ich untersucht habe
Versuchte Umgebung
- OS: Mac OS 10.14.6
- docker desktop community: 2.1.0.5
- docker image: python:3.7.5-buster
- Google Chrome: Version: 78.0.3904.108 Offizieller Build 64-Bit
Was ich gemacht habe
https://github.com/1021ky/radiko_recorder
Was ich fand
Ein Protokoll namens hls, das in Radiko verwendet wird
- Radiko verwendet hls (kurz für HTTP Live Streaming), ein Protokoll zum Verteilen von Mediendateien wie Video und Audio.
- Es scheint, dass ich Flash vor einigen Jahren verwendet habe, aber ich habe angefangen, hls zu verwenden, weil Flash wird 2020 enden.
- Die Spezifikationen von hls sind in RFC8216 angegeben.
- Auf dem Server können Sie zwei Arten von Wiedergabelisten abrufen, eine geteilte Mediendatei und eine Beschreibung der Wiedergabe der geteilten Datei.
- Master-Playlist, die die gesamte Distribution beschreibt
- Media Playlist, die jede der geteilten Dateien beschreibt
- Die Wiedergabeliste ist eine UTF-8-Textdatei mit der Erweiterung .m3u8 oder .m3u und kann vom URI referenziert werden.
- Der Client verweist auf die Wiedergabeliste, erhält die URI der Mediendatei und die zum Abspielen der Mediendatei erforderlichen Informationen daraus und spielt sie ab.
Überblick darüber, was passiert, wenn Sie ein Programm auf Radiko hören
Es stellt sich heraus, dass Client und Server über HTTP miteinander kommunizieren, wie in der folgenden Abbildung dargestellt.
Wie hast du das herausgefunden
Ungefähr so sieht es aus. Ich konnte nicht reibungslos in dieser Reihenfolge vorgehen und ging mehrmals hin und her.
- Lesen Sie den von einer anderen Person geschriebenen Code → Ich verstehe, dass die Autorisierungsverarbeitung und die Verarbeitung der Audiodateierfassung erforderlich sind
- Schreiben Sie den Code → Rufen Sie die API von Radiko auf und erhalten Sie den HTTP-Statuscode 40X, damit Sie wissen, dass etwas fehlt
- Finden Sie heraus, welche Art von Kommunikation mit den Entwicklertools von Google Chrome durchgeführt wird → Verstehen Sie, dass dies nicht ausreichend war, indem Sie sich den spezifischen Kommunikationsinhalt ansehen
- Nachdem ich den Code geschrieben habe, werde ich zusammenfassen, was ich diesmal getan habe → Es gab Wörter, die ich nicht gut erklären konnte → Ich verstehe, dass hls und m3u8 von RFC spezifiziert werden, nicht von Radikos ursprünglichen Spezifikationen
Ich habe den Code aus dem folgenden Artikel gelesen.
- Einfaches Radiko-Aufzeichnungsskript
- [Python] Play Radico
- Ich habe eine Software erstellt, die Radiko, Super A & G, Sound Spring und Sound mit Python3 automatisch sucht und aufzeichnet
- Weg zur Radiko-Aufnahme (Download) Teil 1
Da ich in einem Shell-Skript geschrieben war, googelte ich die Befehle, die ich nicht verstand, und wusste sofort, welche Art von Paket ich brauchte.
- Rtmpdump zum Abspielen von Audiodateien per Flash
- Ffmpeg zum Konvertieren der erfassten Datei in MP3
Ich war mir jedoch nicht sicher, warum die Vorverarbeitung durchgeführt wurde oder was sie tat. (Die Shell-Leistung ist nicht ausreichend.)
Ich habe versucht, einige in Python zu schreiben, die ich normalerweise verwende, daher war es leicht zu verstehen, und ich stellte fest, dass der Prozess, den ich zuvor im Shell-Skript nicht verstanden hatte, der Autorisierungsprozess war.
In 4 fand ich heraus, wie man herausfindet, mit welcher Logik der Teilschlüssel der ursprünglichen Spezifikationen von Radiko generiert wird.
Nachdem wir die benötigten Pakete und Bibliotheken haben, haben wir den Code geschrieben.
Wie oben erwähnt, habe ich die API von Radiko aufgerufen und einen 40-fachen HTTP-Statuscode zurückgegeben. Daher habe ich untersucht, was die Chrome-Entwicklertools im Browser tun, die mit meinem Code fehlschlagen würden.
Das Folgende ist, als ich den Autorisierungsprozess untersucht habe.
Als ich mir den Inhalt der Anfrage ansah, wusste ich, wann und wo ich etwas brauchte, beginnend mit X-Radiko - *** im Anforderungsheader. Als ich mir den Code kurz ansah, hatte ich ihn übersehen. Also fing es endlich an zu arbeiten.
Was ich in dem Artikel bekommen habe
Was ist hls beim Zusammenstellen? Was ist m3u8? Ich fragte mich noch einmal und als ich es nachschlug, stellte ich fest, dass es von RFC entschieden wurde. Wenn es von RFC entschieden wurde, stellte ich auch fest, dass es möglicherweise eine Bibliothek gibt, mit der sie einfach zu handhaben sind.
Die m3u8-Bibliothek war einfach zu bedienen und bereinigte meinen unordentlichen Code.
Das Lesen des RFC und das Verstehen der Begriffe erleichterten auch das Benennen von Methoden und Variablen. Zum Beispiel hatten die Variablen Master Playlist und Media Playlist Namen, die vor dem Lesen des RFC sehr passend waren und beim erneuten Lesen nicht gut verstanden wurden.
Kürzlich gelesenes Buch, Isao Ueda. 101 Prinzipien, die ein Leben lang nützlich sein werden und die Sie bis zum dritten Jahr des Prinzips der Programmierung erwerben möchten.
Es gibt auch das Sprichwort, dass "gute Programmierer guten Code schreiben, gute Programmierer guten Code ausleihen".
Dort war. Als ich es las, verstand ich es irgendwie, aber dieses Mal habe ich das Gefühl, dass das Wissen um den Standard zu einem höheren Verständnis führt.
Zusammenfassung
- Ich habe durch die Erstellung von Radikos Aufnahmeskripten mehr über hls und seine Implementierung erfahren.
- Ich konnte die großen Vorteile des Wissens über den Standard erleben
- Leicht zu findende Bibliothek (keine Notwendigkeit, extra zu machen)
- Einfach zu implementieren
- Es ist eine gute Gelegenheit, an einfach zu lesenden Code zu denken, indem Sie den Code lesen und vergleichen, der dieselbe Funktion implementiert.