Zgodnie z dokumentacją interfejsu API Youtube 2.0 i dokumentacją API 3.0 , identyfikator wideo jest ciągiem, nic nie jest określone w bieżącym zestawie używanych znaków ...
O długości 11 znaków post z zespołu interfejsu YouTube mówi:
Nigdzie nie widzę w dokumentacji, w której oficjalnie ustalamy standardową długość 11 znaków dla identyfikatorów filmów na YouTube. Jest to jedna z tych rzeczy, w których mamy bieżące wdrożenie i może tak pozostać na czas nieokreślony. Ale nie oferujemy żadnych oficjalnych zobowiązań, więc postępuj na własne ryzyko.
I na koniec, inny post wyjaśnił (lub nie) format:
Nie udzielamy żadnych publicznych gwarancji dotyczących formatu identyfikatorów wideo. Chociaż obecnie są to 11 ciągów znaków, które zawierają litery, cyfry i niektóre znaki interpunkcyjne, nie polecam wpisywania tego na stałe w twojej aplikacji (chyba że masz łatwy sposób na zmianę tego w przyszłości).
Wydaje się, że zespół YouTube woli bezpośrednio pytać serwer Youtube, czy identyfikator Video_ID jest poprawny, czy nie (patrz istniejące wideo):
Jeśli chcesz zweryfikować, czy losowe dane wejściowe użytkownika odpowiadają prawidłowemu identyfikatorowi wideo, polecam wykonanie testu empirycznego. Próba dostępu
http://gdata.youtube.com/feeds/api/videos/VIDEO_ID
Jeśli otrzymasz odpowiedź 200, identyfikator VIDEO_ID jest prawidłowy. Jeśli otrzymasz odpowiedź inną niż 200, masz nieprawidłowy identyfikator. Istnieją pewne wyjątkowe przypadki dotyczące nowo przesłanych filmów lub prywatnych filmów, ale w większości przypadków zakładam, że byłoby to w porządku.
Identyfikatory videoId i channelId na YouTube są pojedynczymi liczbami całkowitymi reprezentowanymi w nieco zmodyfikowanej wersji kodowania Base64 . Jedną różnicą w porównaniu z zaleceniami IETF RFC4648 jest podstawienie dwóch znaków w alfabecie kodującym:
Podstawienie prawdopodobnie wynika z faktu, że z jakiegoś powodu RFC4648 wybrał dwa znaki, które miały już znaczące i dobrze ugruntowane funkcje w adresach URL. [uwaga 1.] Oczywiście, w przypadku omawianego tutaj zastosowania najlepiej unikać tej szczególnej komplikacji.
Inną różnicą w stosunku do oficjalnej specyfikacji jest to, że identyfikatory YouTube nie używają
=
znaku dopełniającego; nie jest to konieczne, ponieważ zakodowane długości oczekiwane dla każdego zdekodowanego rozmiaru liczby całkowitej są stałe i znane (11 i 22 zakodowanych „cyfr” odpowiednio dla 64 i 128 bitów).Z jednym drobnym wyjątkiem (omówionym poniżej), pełne szczegóły mapowania Base64 można wywnioskować z publicznie dostępnych danych. Przy minimalnym zgadywaniu prawdopodobne jest, że schemat Base64 użyty w ciągach videoId i channelId wygląda następująco:
Powodem, aby sądzić, że Base64 jest używany jest to, że gdy przyjmiemy standardowe rozmiary całkowitą od 64 do 128 bitów dla wejścia enkodera, Base64 przewiduje się niezwykłych znaków długości (11 i 22 znaki) YouTube ID kanału i videoID identyfikatory dokładnie. Ponadto, reszty obliczone zgodnie z Base64 doskonale wyjaśniają zaobserwowane zmiany dystrybucyjne znalezione w l̲a̲s̲t̲ c̲h̲a̲r̲a̲c̲t̲e̲r̲ każdego typu łańcucha identyfikacyjnego. Omówienie tych punktów następuje.
W obu przypadkach binarne „dane”, które są kodowane w standardzie Base64, to pojedyncza liczba całkowita, 64 lub 128 bitów, odpowiednio dla videoID i ChannelID . Odpowiednio, za pomocą dekodera Base64 można odzyskać pojedynczą liczbę całkowitą z identyfikatora ciągu i może to być bardzo przydatne, ponieważ chociaż każdy identyfikator liczby całkowitej zawiera dokładnie takie same informacje jak ciąg Base64 - a także pozwala ciągowi na być odtworzone w dowolnym momencie - w porównaniu do ciągów Base64 przechowywanych jako Unicode, reprezentacja binarna jest o 63% mniejsza, ma maksymalną gęstość bitów wynoszącą 100%, lepiej wyrównuje się w pamięci, szybciej sortuje i hashuje, a co najważniejsze, eliminuje fałszywe kolizje między identyfikatorami, które różnią się jedynie wielkością ortograficzną. Ten ostatni problem, choć liczbowo niezwykle nieprawdopodobny, nie można jednak wykluczyć, gdy identyfikatory Base64 są traktowane jako bez rozróżniania wielkości liter, tak jak robią to niektóre systemy plików (np. Windows , pochodzące z DOS ).
Dekodowanie do pliku binarnego jest trywialne w przypadku wersji 64-bitowej, ponieważ można użyć
UInt64
(ulong
w języku C # ) do przechowywania natywnej wartości binarnej, która powraca.W przypadku wartości 128-bitowych jest to nieco trudniejsze, ponieważ jeśli twój kompilator nie ma
__int128
reprezentacji, musisz wymyślić sposób na przechowanie całości i utrzymanie jej w kombinacji podczas przekazywania. Prosty typ wartości (lubSystem.Numerics.Vectors.Vector<T>
, który przejawia się jako 128-bitowy rejestr sprzętowy SIMD, jeśli jest dostępny), sprawdzi się w .NET (nie pokazano).Ostatnim komentarzem na ten temat jest to, że faktycznie możesz celowo wybrać big-endian do interpretacji binarnej, z którą aplikacja współpracuje wewnętrznie (nawet jeśli obecnie jest mniej powszechna niż little-endian, a zatem może nie być to sposób, w jaki YouTube „oficjalnie” robi to). Powodem jest to, że jest to przypadek podwójnego widoku tej samej wartości, tak że rzeczywista kolejność bajtów jest widocznie widoczna w wersji Base64. Utrzymanie zgodności sortowania między wartością binarną a (nieco bardziej) czytelnym dla człowieka łańcuchem Base64 jest pomocne i mniej mylące , ale rodzaj wartości binarnych little-endian jest nietrywialną mieszanką pożądanego sortowania ASCII / leksykalnego .
Nie ma prostej naprawy tego problemu, jeśli zaczniesz od wartości identyfikatora little-endian (tzn. Po prostu odwrócenie ich sortowania nie zadziała). Zamiast tego musisz zaplanować z wyprzedzeniem i odwrócić bajty każdej wartości binarnej w momencie dekodowania . Jeśli więc zależy Ci na wyświetlaniu alfabetycznym zgodnym z sortowaniem wartości binarnych, możesz zmienić funkcję pokazaną powyżej, aby zamiast tego dekodowała się na wartości big-endian
ulong
. Oto ten kod:Identyfikatory YouTube
Identyfikator wideo
Dla videoId jest to 8-bajtowa (64-bitowa) liczba całkowita. Zastosowanie kodowania Base64 do 8 bajtów danych wymaga 11 znaków . Ponieważ jednak każdy znak Base64 przenosi dokładnie 6 bitów (tzn. 2⁶ równa się 64), alokacja ta może faktycznie wytrzymać do
11 × 6 = 66
bitów - nadwyżka 2 bitów nad 64 bitami, których potrzebuje nasz ładunek. Nadmiarowe bity są ustawiane na zero, co powoduje, że pewne znaki nigdy nie pojawią się na ostatniej pozycji zakodowanego ciągu. W szczególności na videoId zawsze kończy się jeden z następujących znaków:Zatem maksymalnie ograniczone wyrażenie regularne (RegEx) dla videoId byłoby następujące:
Identyfikator kanału lub listy odtwarzania
W ID kanału i playlistId łańcuchy wytwarzane są przez base64 kodujący 128-bitowej (16 bajtów) całkowitą binarną. Daje to 22-znakowy ciąg, który może być poprzedzony albo
UC
identyfikacją samego kanału, alboUU
oznaczeniem pełnej listy odtwarzania zawartych w nim filmów. Te 24-znakowe ciągi znaków są używane w adresach URL . Na przykład poniżej pokazano dwa sposoby odwoływania się do tego samego kanału. Zauważ, że wersja listy odtwarzania pokazuje całkowitą liczbę filmów na kanale, [patrz uwaga 3] użyteczna informacja, której strony kanału nie ujawniają.Podobnie jak w przypadku 11-znakowego wideoId , obliczenia dla Base64 poprawnie przewidują obserwowaną długość ciągu 22 znaków . W takim przypadku dane wyjściowe mogą kodować
22 × 6 = 132
bity, co stanowi nadwyżkę 4 bitów; te zera ostatecznie ograniczają pojawianie się na ostatniej pozycji 64 znaków alfabetu, przy czym tylko 4 kwalifikują się. Wiemy zatem, że ostatni znak w łańcuchu kanału YouTube musi być jednym z następujących:To daje nam maksymalnie ograniczone wyrażenie regularne dla channelId :
Ostatnia uwaga: wyrażenia regularne pokazane powyżej opisują tylko same wartości identyfikatora, bez prefiksów, ukośników, separatorów itp., Które muszą być obecne w adresach URL i innych różnych zastosowaniach. Wzory RegEx, które przedstawiłem, są tak matematycznie minimalne, jak to możliwe, biorąc pod uwagę właściwości ciągów identyfikatora, ale jeśli zostaną użyte w niezmienionej postaci bez dodatkowego kontekstu, prawdopodobnie wygenerują wiele fałszywych trafień, to znaczy: niepoprawnie dopasują fałszywy tekst. Aby uniknąć tego problemu w rzeczywistym użyciu, należy otoczyć je możliwie dużą ilością oczekiwanego kontekstu sąsiedniego.
Uwagi
[1.]
Jak obiecano powyżej, oto fragment specyfikacji Base64, który omawia ich rozważania przy wyborze symboli alfabetu. Osoby, które chcą zrozumieć, w jaki sposób proces zakończył się przy wyborze znaków z semantyką adresów URL, mogą uznać wyjaśnienia za mało pouczające.
[2.]
Alternatywnie, aby rozwiązać problem używania ciągów znaków zakodowanych w Base64 jako „takie, jakie są” składników plików lub ścieżek w systemie plików NTFS, który domyślnie nie rozróżnia wielkości liter (a zatem ryzykuje technicznie splątanie jednego lub więcej niepowiązanych wartości identyfikatora), zdarza się, że NTFS można skonfigurować z rozróżnianiem wielkości liter w ścieżce / nazwach plików dla poszczególnych woluminów. Włączenie działania innego niż domyślne może rozwiązać opisany tutaj problem, ale rzadko jest zalecane, ponieważ zmienia oczekiwania dla dowolnych / wszystkich różnych aplikacji, które sprawdzają lub uzyskują dostęp do woluminu. Jeśli nawet rozważasz tę opcję, przeczytaj ją i najpierw zrozum , a prawdopodobnie zmienisz zdanie.
[3.]
Uważam, że całkowita liczba filmów pokazanych na stronie listy odtwarzania kanału uwzględnia wykluczenie filmów, które są ograniczone zgodnie z regionem geograficznym klienta HTTP. Jest to przyczyną wszelkich rozbieżności między liczbą filmów wymienionych na liście odtwarzania a kanałem.
źródło
UC
vs.UU
ID kanału prefiksów.