{"id":17473,"date":"2020-11-08T21:34:14","date_gmt":"2020-11-08T20:34:14","guid":{"rendered":"https:\/\/tuxproject.de\/blog\/?p=17473"},"modified":"2020-11-09T14:41:06","modified_gmt":"2020-11-09T13:41:06","slug":"in-eigener-sache-youtube-wie-schwer-kann-es-schon-sein","status":"publish","type":"post","link":"https:\/\/tuxproject.de\/blog\/2020\/11\/in-eigener-sache-youtube-wie-schwer-kann-es-schon-sein\/","title":{"rendered":"In eigener Sache: YouTube \u2014 wie schwer kann es schon sein?"},"content":{"rendered":"<p>Als <code>youtube-dl<\/code>, ein bekan\u00adntes Werkzeug zum Offlineguck\u00aden von lang\u00adweiligem Unsinn, vor zwei Wochen <a href=\"https:\/\/linuxnews.de\/2020\/10\/youtube-dl-von-github-entfernt\/\">rechtliche Prob\u00adleme bekam<\/a>, weil die RIAA anscheinend der Ansicht ist, dass das Besor\u00adgen urhe\u00adber\u00adrechtlich gesch\u00fctzten Pop\u00adm\u00fclls kein legit\u00adimes Nutzungs\u00adbeispiel sein sollte, geri\u00adet <em>das Netz<\/em> wieder ein\u00admal in hek\u00adtis\u00adche Angst, was die Zukun\u00adft des Herun\u00adter\u00adladens bet\u00adrifft. <!--more-->Ich habe der Sit\u00adu\u00ada\u00adtion ver\u00adgle\u00adich\u00adsweise entspan\u00adnt zuge\u00adse\u00adhen, denn mir war etwas aufge\u00adfall\u00aden:<\/p>\n<p>Die ver\u00adgle\u00adich\u00adsweise oft genan\u00adnte Alter\u00adna\u00adtive <code>you-get<\/code> teilt mit <code>youtube-dl<\/code> und vie\u00adlen anderen Optio\u00adnen das wesentliche Prob\u00adlem, dass sie in Python geschrieben ist. Python mag <em>en vogue<\/em> sein, weil es schnelle L\u00f6sun\u00adgen ver\u00adspricht, aber das tat BASIC sein\u00aderzeit eben auch \u2014 und BASIC war <em>nicht<\/em> daf\u00fcr bekan\u00adnt, vor allem elend langsam zu sein. Mehr noch: Nicht sel\u00adten fand ich auf meinen Sys\u00adte\u00admen nach einem Pythonup\u00adgrade manche Anwen\u00addungssoft\u00adware nicht mehr lauf\u00adf\u00e4hig vor, meist wegen inkom\u00adpat\u00adi\u00adbler Abh\u00e4ngigkeit\u00aden. Meine let\u00adzte eigene Python\u00adsoft\u00adware \u2014 die <a href=\"https:\/\/twitter.com\/die_kuckucksuhr\">Kuck\u00aduck\u00adsuhr<\/a> \u2014 ist deshalb inzwis\u00adchen auch in Rust (dazu unten mehr) geschrieben. Je mehr Pro\u00adgramme, die ich ein\u00adset\u00adze, sta\u00adtisch gelinkt wer\u00adden, desto weniger wahrschein\u00adlich geht nach einem gr\u00f6\u00dferen Update irgend\u00adwas kaputt.<\/p>\n<p><a href=\"https:\/\/github.com\/mlvzk\/piko\">piko<\/a> sah als Go-Anwen\u00addung daher inter\u00ades\u00adsant aus, hat von <code>youtube-dl<\/code> aber die bei\u00adden Design\u00e4rg\u00adernisse abgeguckt, dass es <em>erstens<\/em> nicht nur Video\u2011, son\u00addern auch Bilder\u00adplat\u00adtfor\u00admen unter\u00adst\u00fctzen will, was die Kom\u00adplex\u00adit\u00e4t unn\u00f6tig erh\u00f6ht, und <em>zweit\u00adens<\/em> \u2014 f\u00fcr <em>mich selb\u00adst<\/em> ganz inter\u00ades\u00adsant \u2014 keine ein\u00adheitliche M\u00f6glichkeit anbi\u00adetet, nach dem Down\u00adload nur noch die Audio\u00addat\u00aden zu behal\u00adten. Der zus\u00e4t\u00adzliche Befehl kann bei h\u00e4u\u00adfiger Nutzung doch recht l\u00e4stig wer\u00adden.<\/p>\n<p>In einem Anflug geistiger Umnach\u00adtung habe ich daher <a href=\"https:\/\/www.linux-bibel-oesterreich.at\/2020\/10\/24\/youtube-dl-am-ende-ersatz\/#comment-1911\">laut gedacht<\/a>, so was k\u00f6n\u00adnte ich auch. Lei\u00adder wollte es dann auch jemand haben. Schade.<\/p>\n<p>Die wesentlichen Funk\u00adtio\u00adnen soll\u00adten fol\u00adgende sein:<\/p>\n<ol>\n<li>Keine unn\u00f6ti\u00adgen Spiel\u00adereien. Es sollen Videos (option\u00adal: nur die Audiostreams) in der besten ver\u00adf\u00fcg\u00adbaren Qual\u00adit\u00e4t herun\u00adterge\u00adladen wer\u00adden k\u00f6n\u00adnen. Keine Bilder. Keine GIFs.<\/li>\n<li>Kein Python. Aus Gr\u00fcn\u00adden.<\/li>\n<li>Ein\u00adfache Erweit\u00ader\u00adbarkeit. Zwar muss <em>nat\u00fcr\u00adlich<\/em> YouTube unter\u00adst\u00fctzt wer\u00adden, aber sp\u00e4tere Erweiterun\u00adgen um andere Seit\u00aden soll\u00adten so wenig dop\u00adpel\u00adten Code wie m\u00f6glich erfordern.<\/li>\n<\/ol>\n<p>Ich habe also <a href=\"https:\/\/code.rosaelefanten.org\/yaydl\"><code>yaydl<\/code><\/a> in Rust pro\u00adgram\u00admiert, ein\u00ader Sprache, mit der ich \u2014 schon wegen des beachtlich guten <code>cargo<\/code>-Sys\u00adtems \u2014 sowieso mal mehr machen wollte als blo\u00df ein biss\u00adchen Text auszugeben. Zwar nutze ich in let\u00adzter Zeit vor allem Go (und Perl), aber das w\u00e4re ja keine Her\u00adaus\u00adforderung. Das <code>trait<\/code>-Konzept ist auch recht \u00fcberzeu\u00adgend: Um eine weit\u00adere Web\u00adsite neben YouTube hinzuzuf\u00fc\u00adgen, muss in <code>yaydl<\/code> <em>nur<\/em> ein Inter\u00adface mit <a href=\"https:\/\/code.rosaelefanten.org\/yaydl\/file?name=src\/definitions.rs&amp;ci=tip\">jew\u00adeils sechs Funk\u00adtio\u00adnen<\/a> imple\u00admen\u00adtiert wer\u00adden. Das sollte schaff\u00adbar sein.<\/p>\n<p>\u00dcber Vor- und Nachteile von Go und Rust, auch gegen\u00fcber anderen von mir gemocht\u00aden Sprachen, m\u00f6chte ich an dieser Stelle nicht disku\u00adtieren, das \u00fcber\u00adlasse ich irgendwelchen Quatschblogs, die mit so was ihr Geld ver\u00addi\u00adenen. Stattdessen m\u00f6chte ich die ein\u00adgangs gestellte Frage selb\u00adst beant\u00adworten: YouTube macht es einem <em>wirk\u00adlich nicht leicht<\/em>, Videos herun\u00adterzu\u00adladen, denn direk\u00adte URLs <em>gibt es nicht<\/em>.<\/p>\n<p>Daher muss man zu einem Video erst die <code>get_video_info<\/code>-Datei herun\u00adter\u00adladen, dort das JSON-Objekt mit den Video\u00addat\u00aden her\u00adaus\u00adsuchen und in diesem in ein\u00ader undoku\u00admen\u00adtierten Liste an num\u00admerierten For\u00admat\u00aden das beste her\u00adaus\u00adsuchen und dessen URL extrahieren. Meine erste Ver\u00adsion macht <em>genau das<\/em>, jedoch scheint es <a href=\"https:\/\/tyrrrz.me\/blog\/reverse-engineering-youtube\">emp\u00adfohlen zu sein<\/a>, aus diesen vier Schrit\u00adten (min\u00addestens) zw\u00f6lf zu machen. Ich ver\u00admute, die Mach\u00ader von YouTube haben sich etwas dabei gedacht, ich werde den Code nach Abklin\u00adgen mein\u00ader Kopf\u00adschmerzen m\u00f6glicher\u00adweise entsprechend erweit\u00adern.<\/p>\n<p>Immer\u00adhin: Ich beginne zu ver\u00adste\u00adhen, warum es bish\u00ader so wenige gute Alter\u00adna\u00adtiv\u00aden gab.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als youtube-dl, ein bekan\u00adntes Werkzeug zum Offlineguck\u00aden von lang\u00adweiligem Unsinn, vor zwei Wochen rechtliche Prob\u00adleme bekam, weil die RIAA anscheinend der Ansicht ist, dass das Besor\u00adgen urhe\u00adber\u00adrechtlich gesch\u00fctzten Pop\u00adm\u00fclls kein legit\u00adimes Nutzungs\u00adbeispiel sein sollte, geri\u00adet das Netz wieder ein\u00admal in hek\u00adtis\u00adche Angst, was die Zukun\u00adft des Herun\u00adter\u00adladens bet\u00adrifft.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"wp_typography_post_enhancements_disabled":false,"footnotes":""},"categories":[5,19],"tags":[],"series":[],"class_list":["post-17473","post","type-post","status-publish","format-standard","hentry","category-projekte","category-nerdkrams"],"share_on_mastodon":{"url":"","error":""},"wp-worthy-pixel":{"ignored":false,"public":null,"server":null,"url":null},"wp-worthy-type":"normal","_links":{"self":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/posts\/17473","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/comments?post=17473"}],"version-history":[{"count":0,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/posts\/17473\/revisions"}],"wp:attachment":[{"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/media?parent=17473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/categories?post=17473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/tags?post=17473"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/tuxproject.de\/blog\/wp-json\/wp\/v2\/series?post=17473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}