Gemäß der Youtube 2.0-API-Dokumentation und der 3.0-API-Dokumentation ist die videoId eine Zeichenfolge, über den aktuellen Zeichensatz wird nichts angegeben ...
Über die Länge von 11 Zeichen sagt ein Beitrag eines Youtube API-Teams :
Ich sehe nirgendwo in der Dokumentation, wo wir offiziell eine Standardlänge von 11 Zeichen für YouTube-Video-IDs festlegen. Es ist eines der Dinge, bei denen wir eine aktuelle Implementierung haben, und dies kann auf unbestimmte Zeit so bleiben. Wir bieten jedoch keine offizielle Verpflichtung dazu an. Gehen Sie daher auf eigenes Risiko vor.
Und zu guter Letzt klärt ein weiterer Beitrag das Format (oder auch nicht):
Wir geben keine öffentlichen Garantien für das Format von Video-IDs ab. Obwohl es sich derzeit um 11 Zeichenfolgen handelt, die Buchstaben, Zahlen und Interpunktionszeichen enthalten, würde ich nicht empfehlen, diese fest in Ihre Anwendung zu codieren (es sei denn, Sie haben eine einfache Möglichkeit, sie in Zukunft zu ändern).
Das Youtube-Team scheint es vorzuziehen, den Youtube-Server direkt zu fragen, ob die Video_ID korrekt ist oder nicht (siehe vorhandenes Video):
Wenn Sie überprüfen müssen, ob eine zufällige Benutzereingabe einer gültigen Video-ID entspricht, würde ich empfehlen, einen empirischen Test durchzuführen. Versuch zuzugreifen
http://gdata.youtube.com/feeds/api/videos/VIDEO_ID
Wenn Sie eine Antwort von 200 erhalten, ist VIDEO_ID gültig. Wenn Sie eine Nicht-200-Antwort erhalten, haben Sie eine ungültige ID. Es gibt einige Randfälle für neu hochgeladene Videos oder private Videos, aber für die meisten Zwecke würde ich annehmen, dass das in Ordnung wäre.
YouTube- Video-ID- und -Kanal- ID-ID- IDs sind einzelne Ganzzahlwerte, die in einer leicht geänderten Version der Base64-Codierung dargestellt werden . Ein Unterschied zu den IETF RFC4648-Empfehlungen besteht in der Ersetzung von zwei Zeichen im Kodierungsalphabet:
Die Substitution ist wahrscheinlich auf die Tatsache zurückzuführen, dass RFC4648 aus irgendeinem Grund zwei Zeichen auswählte, die in URLs bereits bekannte und gut etablierte Funktionen hatten. [Anmerkung 1.] Offensichtlich wurde für die hier diskutierte Verwendung diese besondere Komplikation am besten vermieden.
Ein weiterer Unterschied zur offiziellen Spezifikation besteht darin, dass YouTube- Bezeichner das
=
Füllzeichen nicht verwenden . Dies ist nicht erforderlich, da die zu erwartenden codierten Längen für die jeweilige decodierte Ganzzahlgröße fest und bekannt sind (11 und 22 codierte 'Ziffern' für 64 bzw. 128 Bit).Mit einer kleinen Ausnahme (siehe unten) können die vollständigen Details der Base64-Zuordnung aus öffentlich zugänglichen Daten abgeleitet werden. Mit einem Minimum an Rätselraten ist es wahrscheinlich, dass das in den videoId- und channelId- Zeichenfolgen verwendete Base64- Schema wie folgt lautet:
Der Grund für die Annahme, dass Base64 verwendet wird, besteht darin, dass Base64, wenn für die Encodereingabe ganzzahlige Standardgrößen von 64 und 128 Bit angenommen werden, die ungewöhnlichen Zeichenlängen (11 und 22 Zeichen) der YouTube- ChannelId- und -VideoId- Bezeichner genau vorhersagt . Darüber hinaus erklären Reste, die gemäß Base64 berechnet wurden, die beobachteten Verteilungsschwankungen, die im l ina̲s̲t̲ c̲h̲a̲r̲a̲c̲t̲e̲r̲ der einzelnen Typen von Bezeichnerzeichenfolgen zu finden sind, perfekt . Die Diskussion dieser Punkte folgt.
In beiden Fällen sind die binären "Daten", die Base64-codiert werden, eine einzelne Ganzzahl (64 oder 128 Bit) für (jeweils) videoId vs. channelId . Unter Verwendung eines Base64-Decoders kann dementsprechend eine einzelne Ganzzahl aus dem Zeichenfolgenbezeichner wiederhergestellt werden. Dies kann sehr nützlich sein, da jede Ganzzahl-ID genau die gleichen Informationen enthält wie die Base64-Zeichenfolge - und dies auch zulässt jederzeit neu erstellt werden - im Vergleich zu Base64-Zeichenfolgen, die als Unicode gespeichert sind, ist die Binärdarstellung 63% kleiner, hat eine maximale Bitdichte von 100%, richtet sich im Speicher besser aus, sortiert und hascht schneller und beseitigt möglicherweise das Wichtigste falsche Kollisionen zwischen Bezeichnern, die sich nur im orthografischen Fall unterscheiden. Dieses letzte Problem ist zwar zahlenmäßig äußerst unwahrscheinlich, kann jedoch nicht ausgeschlossen werden, wenn Base64-IDs wie bei einigen Dateisystemen (z. B. Windows , das auf DOS zurückgeht ) als nicht von Groß- und Kleinschreibung abhängig behandelt werden .
Die Dekodierung in Binärdateien ist für den 64-Bit- Fall trivial, da Sie mit
UInt64
(ulong
in C # ) den zurückkommenden nativen Binärwert speichern können.Für den Fall der 128-Bit- Werte ist dies etwas schwieriger, da Sie, sofern Ihr Compiler keine
__int128
Repräsentation hat, eine Möglichkeit finden müssen, das Ganze zu speichern und es beim Weitergeben kombiniert zu halten . Ein einfacher Wertetyp (oderSystem.Numerics.Vectors.Vector<T>
, falls verfügbar, ein 128-Bit-SIMD-Hardwareregister) erledigt den Trick in .NET (nicht gezeigt).Ein letzter Kommentar dazu ist, dass Sie möglicherweise absichtlich Big-Endian für die Binärinterpretation auswählen möchten, mit der Ihre App intern arbeitet (auch wenn dies heutzutage weniger verbreitet ist als Little-Endian und daher möglicherweise nicht die Art und Weise ist, wie YouTube dies "offiziell" tut es). Der Grund dafür ist, dass es sich um eine doppelte Ansicht mit demselben Wert handelt, sodass die tatsächliche Bytereihenfolge in der Base64-Wiedergabe sichtbar wird. Es ist hilfreich und weniger verwirrend, die Sortierreihenfolge zwischen dem Binärwert und dem (etwas besser) lesbaren Base64-String konsistent zu halten , aber die Sortierung der Little-Endian-Binärwerte ist eine nicht triviale Verwirrung der gewünschten ASCII- / Lexik-Sortierung .
Es gibt keine einfache Lösung für dieses Problem, wenn Sie mit Little-Endian-ID-Werten beginnen (dh das einfache Umkehren der Sortierung funktioniert nicht). Stattdessen müssen Sie die Bytes jedes Binärwerts zum Zeitpunkt der Dekodierung vorausplanen und umkehren . Wenn Sie also Wert darauf legen, dass die alphabetische Anzeige mit der Sortierung der Binärwerte übereinstimmt, möchten Sie möglicherweise die oben gezeigte Funktion so ändern, dass sie stattdessen in Big-Endian-
ulong
Werte decodiert wird . Hier ist der Code:YouTube-IDs
Video-ID
Bei der videoId handelt es sich um eine 8-Byte-Ganzzahl (64-Bit). Das Anwenden der Base64-Codierung auf 8 Datenbytes erfordert 11 Zeichen . Da jedoch jedes Base64-Zeichen genau 6 Bits überträgt (d. H. 2⁶ entspricht 64), könnte diese Zuordnung tatsächlich bis zu
11 × 6 = 66
Bits enthalten - ein Überschuss von 2 Bits gegenüber den 64 Bits, die unsere Nutzlast benötigt. Die überschüssigen Bits werden auf Null gesetzt, was dazu führt, dass bestimmte Zeichen nicht immer an der letzten Position der codierten Zeichenfolge erscheinen. Insbesondere wird garantiert , dass die videoId immer mit einem der folgenden Zeichen endet:Der maximal eingeschränkte reguläre Ausdruck (RegEx) für die videoId lautet daher wie folgt:
ID des Kanals oder der Wiedergabeliste
Die channelId und playlistId Strings werden durch Base64-kodiert , ein 128-Bit (16-Byte) binary integer. Dies ergibt eine 22-stellige Zeichenfolge, der entweder
UC
der Kanal selbst oderUU
eine vollständige Wiedergabeliste der enthaltenen Videos vorangestellt werden kann . Diese Zeichenfolgen mit einem Präfix von 24 Zeichen werden in URLs verwendet . Im Folgenden werden beispielsweise zwei Möglichkeiten gezeigt, auf denselben Kanal zu verweisen. Beachten Sie, dass in der Playlist-Version die Gesamtzahl der Videos im Kanal angezeigt wird (siehe Hinweis 3). Dies ist eine nützliche Information, die auf den Kanalseiten nicht verfügbar gemacht wird.Wie bei der 11- stelligen videoId sagt die Berechnung pro Base64 die beobachtete Stringlänge von 22 Zeichen korrekt voraus . In diesem Fall ist der Ausgang in der Lage,
22 × 6 = 132
Bits zu codieren , ein Überschuss von 4 Bits; Diese Nullen schränken letztendlich das Erscheinen von m̲o̲s̲t̲ der 64 Alphabetsymbole an der letzten Position ein, wobei nur noch 4 zulässig sind. Wir wissen daher, dass das letzte Zeichen in einer YouTube- Kanal-ID eines der folgenden Zeichen sein muss:Dies gibt uns den maximal eingeschränkten regulären Ausdruck für eine channelId :
Als letzte Anmerkung beschreiben die oben gezeigten regulären Ausdrücke nur die bloßen ID-Werte ohne die Präfixe, Schrägstriche, Trennzeichen usw., die in URLs und den anderen verschiedenen Verwendungen vorhanden sein müssen. Die von mir vorgestellten RegEx-Muster sind in Anbetracht der Eigenschaften der Bezeichnerzeichenfolgen so mathematisch minimal wie möglich. Wenn sie jedoch ohne zusätzlichen Kontext verwendet werden, erzeugen sie wahrscheinlich viele falsch-positive Ergebnisse, dh, sie stimmen nicht mit falschem Text überein. Um dieses Problem bei der tatsächlichen Verwendung zu vermeiden, umgeben Sie sie so weit wie möglich mit dem erwarteten angrenzenden Kontext.
Anmerkungen
[1.]
Wie oben versprochen, finden Sie hier einen Auszug aus der Base64-Spezifikation, in dem die Überlegungen zur Auswahl der Alphabetsymbole erläutert werden. Personen, die verstehen möchten, wie der Prozess bei der Auswahl von Zeichen mit URL-Semantik abgeschlossen wurde, werden die Erklärungen möglicherweise als etwas unverbindlich empfinden.
[2.]
Alternativ können Sie das Problem der Verwendung von Base64-codierten ID-Zeichenfolgen als "as-is" -Komponenten von Datei- oder Pfadnamen im NTFS-Dateisystem lösen, bei dem standardmäßig die Groß- und Kleinschreibung nicht beachtet wird (und daher das Risiko besteht, dass eine oder mehrere Zeichen miteinander in Konflikt geraten (ID-Werte unabhängig) kann NTFS unter Berücksichtigung der Groß- und Kleinschreibung des Pfads / der Datei auf Volume-Basis konfiguriert werden . Das Aktivieren des nicht standardmäßigen Verhaltens behebt möglicherweise das hier beschriebene Problem, wird jedoch selten empfohlen, da es die Erwartungen für alle unterschiedlichen Anwendungen ändert, die das Volume überprüfen oder auf das Volume zugreifen. Wenn Sie diese Option überhaupt in Betracht ziehen, lesen und verstehen Sie dies zuerst, und Sie werden wahrscheinlich Ihre Meinung ändern.
[3.]
Ich glaube, die Gesamtzahl der auf der Playlistenseite des Kanals angezeigten Videos berücksichtigt einen Ausschluss für Videos, die gemäß der geografischen Region des HTTP-Clients eingeschränkt sind. Dies erklärt die Diskrepanz zwischen der Anzahl der für die Wiedergabeliste aufgelisteten Videos und dem Kanal.
quelle
UC
vs.UU
channelId- Präfixen enthält.