Résumé
- Je voulais enregistrer Radiko, et quand je l'ai recherché, plusieurs personnes écrivaient le code.
- Je pourrais simplement le cloner et l'exécuter, mais je me demandais quel type de traitement cela faisait, alors j'ai écrit le code moi-même en lisant le code des prédécesseurs.
- J'ai appris quelque chose en l'essayant, alors je l'ai résumé.
- Un protocole appelé hls (HTTP Live Streaming) utilisé dans Radiko
- Que se passe-t-il lors de l'écoute d'un programme sur Radiko
- Comment savoir ce que la spécification n'est pas publiée
- Ce que j'ai réuni comment j'ai enquêté
Environnement éprouvé
- 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 Version officielle 64 bits
Ce que j'ai fait
https://github.com/1021ky/radiko_recorder
Ce que j'ai trouvé
Un protocole appelé hls utilisé dans Radiko
- Radiko utilise hls (abréviation de HTTP Live Streaming), un protocole de distribution de fichiers multimédias tels que la vidéo et l'audio.
- Il semble que j'ai utilisé le flash il y a quelques années, mais j'ai commencé à utiliser hls à cause de l'influence de le flash se terminera en 2020.
- Les spécifications de hls sont spécifiées dans la RFC8216.
- Le serveur vous permet d'obtenir deux types de listes de lecture, l'un est un fichier multimédia divisé et l'autre est une description de la façon de lire le fichier divisé.
- Liste de lecture principale qui décrit toute la distribution
- Liste de lecture multimédia qui décrit chacun des fichiers divisés
- Playlist est un fichier texte UTF-8 avec une extension de .m3u8 ou .m3u et peut être référencé par URI.
- Le client se réfère à la liste de lecture, obtient l'URI du fichier multimédia et les informations nécessaires pour lire le fichier multimédia à partir de celle-ci, et le lit.
Aperçu de ce qui se passe lorsque vous écoutez un programme sur Radiko
Il s'avère que le client et le serveur communiquent entre eux via HTTP, comme indiqué dans la figure ci-dessous.
Comment avez-vous trouvé
En gros, ça ressemble à ça. Je ne suis pas allé bien dans cet ordre et j'ai fait plusieurs allers-retours.
- Lire le code écrit par une autre personne → Je comprends que le traitement des autorisations et l'acquisition de fichiers audio sont nécessaires
- Écrivez le code → Appelez l'API de Radiko et obtenez le code d'état HTTP 40X, afin de savoir qu'il manque quelque chose
- Découvrez quel type de communication est effectué avec les outils de développement de Google Chrome → Comprenez que cela était insuffisant en regardant le contenu de communication spécifique
- Après avoir écrit le code, je vais résumer ce que j'ai fait cette fois → Il y avait des mots que je ne pouvais pas bien expliquer → Je comprends que hls et m3u8 sont spécifiés par RFC, pas par les spécifications originales de Radiko
J'ai lu le code de l'article suivant.
- Simple script d'enregistrement Radiko
- [Python] Play Radico
- J'ai créé un logiciel qui recherche et enregistre automatiquement radiko, super A & G, sound spring et son avec Python3
- Enregistrement Road to radiko (téléchargement) Partie 1
Depuis 1 a été écrit dans un script shell, j'ai recherché sur Google les commandes que je ne comprenais pas et j'ai immédiatement su de quel type de paquet j'avais besoin.
- Rtmpdump pour obtenir des fichiers audio lus par flash
- Ffmpeg pour convertir le fichier acquis en MP3
Cependant, je ne savais pas trop pourquoi le prétraitement avait été effectué ni ce qu'il faisait. (La puissance de la coque est insuffisante.)
J'essayais d'en écrire quelques-uns en Python, que j'utilise habituellement, donc c'était facile à comprendre, et j'ai trouvé que le processus que je ne comprenais pas dans le script shell auparavant était le processus d'autorisation.
En 4, j'ai découvert comment savoir quel type de logique est utilisé pour générer la clé partielle des spécifications originales de Radiko.
Maintenant que nous avons les packages et les bibliothèques dont nous avons besoin, nous avons écrit le code.
Ainsi, comme mentionné ci-dessus, j'ai appelé l'API de Radiko et renvoyé un code d'état HTTP 40X.J'ai donc étudié ce que font les outils de développement Chrome sur le navigateur qui échoueraient avec mon code.
Voici le moment où j'ai enquêté sur le processus d'autorisation.
En regardant le contenu de la demande, je savais quand et où j'avais besoin de quelque chose dans l'en-tête de demande qui commençait avec X-Radiko - ***. Quand j'ai jeté un coup d'œil rapide au code, je l'avais oublié. Donc, cela a finalement commencé à fonctionner.
Ce que j'ai dans l'article
Qu'est-ce que hls lors de sa mise en place? Qu'est-ce que m3u8? Je me suis demandé à nouveau, et quand je l'ai recherché, j'ai trouvé que c'était décidé par RFC. Si cela a été décidé par RFC, j'ai également trouvé qu'il pourrait y avoir une bibliothèque qui les rend faciles à manipuler.
La bibliothèque m3u8 était facile à utiliser et nettoyait mon code en désordre.
De plus, la lecture de la RFC et la compréhension des termes ont facilité le nom des méthodes et des variables. Par exemple, les variables Master Playlist et Media playlist avaient des noms très appropriés avant la lecture du RFC et n'étaient pas bien compris lors de la relecture.
Un livre récemment lu, Isao Ueda.101 principes qui vous seront utiles pour toute une vie que vous voudrez apprendre d'ici la troisième année des principes de programmation.
Il y a aussi le dicton que "les bons programmeurs écrivent du bon code, les grands programmeurs empruntent du bon code".
Il y avait. Quand je l'ai lu, je l'ai compris d'une manière ou d'une autre, mais cette fois, j'ai le sentiment que savoir quelle est la norme mènera à un niveau de compréhension plus élevé.
Résumé
- J'ai découvert hls et son implémentation grâce à la création du script d'enregistrement de Radiko.
- J'ai pu découvrir les grands avantages de savoir ce qui est standard
- Bibliothèque facile à trouver (pas besoin de faire un supplément)
- Facile à mettre en œuvre
- C'est une bonne opportunité de penser à un code facile à lire en lisant et en comparant le code qui implémente la même fonction.