В соответствии с Youtube 2.0 API документации и документации 3.0 API , то VideoID строка, ничего не указано о текущем наборе символов , используемых ...
О длине 11 символов в сообщении от команды API YouTube говорится:
Я не вижу нигде в документации, где мы официально фиксируем стандартную длину 11 символов для идентификаторов видео на YouTube. Это одна из тех вещей, где у нас есть текущая реализация, и она может оставаться такой до бесконечности. Но мы не предлагаем никаких официальных обязательств, поэтому действуйте на свой страх и риск.
И последнее, но не менее важное, еще один пост прояснить (или нет) формат:
Мы не даем никаких публичных гарантий о формате видео идентификаторов. Хотя в настоящее время они состоят из 11 символьных строк, которые содержат буквы, цифры и знаки препинания, я бы не рекомендовал жестко кодировать их в своем приложении (если у вас нет простого способа изменить его в будущем).
Команда YouTube, похоже, предпочитает напрямую спрашивать у сервера Youtube правильность идентификатора Video_ID или нет (см. Существующее видео):
Если вам нужно проверить, что случайный пользовательский ввод соответствует действительному идентификатору видео, я бы рекомендовал провести эмпирический тест. Попытка доступа
http://gdata.youtube.com/feeds/api/videos/VIDEO_ID
Если вы получили ответ 200, то VIDEO_ID действителен. Если вы получили ответ не из 200, у вас есть неверный идентификатор. Есть некоторые крайние случаи для недавно загруженных видео или частных видео, но для большинства целей я бы предположил, что это будет хорошо.
YouTube VideoID и channelId идентификаторы являются одиночными целые значения , представленные в слегка модифицированном варианте кодирования Base64 . Одно отличие от рекомендаций IETF RFC4648 заключается в замене двух символов в алфавите кодировки:
Замена, вероятно, связана с тем, что по какой-то причине RFC4648 выбрал два символа, которые уже имели выдающиеся и хорошо зарекомендовавшие себя функции в URL-адресах. [примечание 1.] Очевидно, что для обсуждаемого здесь использования этого конкретного осложнения лучше избегать.
Другое отличие от официальной спецификации заключается в том, что идентификаторы YouTube не используют
=
символ заполнения; в этом нет необходимости, поскольку ожидаемые кодированные длины для соответствующего декодированного целочисленного размера являются фиксированными и известными (11 и 22 кодированные «цифры» для 64 и 128 битов соответственно).За одним незначительным исключением (обсуждается ниже), полные детали отображения Base64 могут быть получены из общедоступных данных. С минимумом догадок, то, скорее всего , что Base64 схема , используемая в VideoID и channelId строк выглядит следующим образом :
Основания полагать , что Base64 используется в том , что, когда мы предполагаем стандартные целочисленные размеры 64 и 128 бит для входа энкодера, Base64 предсказывает необычные длины символов (11 и 22 символов) на YouTube channelId и VideoID идентификаторы точно. Кроме того, остатки, рассчитанные в соответствии с Base64, прекрасно объясняют наблюдаемое изменение распределения, найденное в l̲a̲s̲t̲ c̲h̲a̲r̲a̲c̲t̲e̲r̲ каждого типа строки идентификатора. Обсуждение этих моментов следует.
В обоих случаях, двоичный «данные» , который получает кодировкой Base64 это одно целое число, либо 64 или 128 бит, для (соответственно) VideoID против channelId . Соответственно, используя декодер Base64, одно целое число может быть восстановлено из строкового идентификатора, и это может быть весьма полезно сделать, потому что, хотя каждый целочисленный идентификатор содержит точно такую же информацию, что и строка Base64, а также позволяет строке быть воссозданным в любое время - по сравнению со строками Base64, хранящимися как Unicode, двоичное представление на 63% меньше, имеет максимальную битовую плотность 100%, лучше выравнивается в памяти, быстрее сортирует и хеширует и, что, возможно, самое главное, устраняет ложные столкновения между идентификаторами, которые отличаются только в орфографическом случае, Эта последняя проблема, хотя и чрезвычайно маловероятная в численном отношении, тем не менее не может быть исключена, когда идентификаторы Base64 обрабатываются как регистрозависимые, как это делают некоторые файловые системы (например, Windows , восходящая к DOS ).
Декодирование в двоичный файл является тривиальным для 64-битного случая, потому что вы можете использовать
UInt64
(ulong
в C # ) для хранения собственного двоичного значения, которое возвращается.В случае 128-битных значений это немного сложнее, потому что, если у вашего компилятора нет
__int128
представления, вам нужно будет найти способ хранить все это и сохранять его комбинацию при передаче. Простой тип значения (илиSystem.Numerics.Vectors.Vector<T>
, который доступен как 128-битный аппаратный регистр SIMD, если он доступен) поможет в .NET (не показан).Последний комментарий по этому поводу заключается в том, что на самом деле вы можете намеренно выбрать порядок с прямым порядком байтов для двоичной интерпретации, с которой ваше приложение работает внутренне (даже несмотря на то, что это менее распространено, чем метод с прямым порядком байтов в наше время, и, таким образом, это может быть не так, как YouTube официально) Это). Причина в том, что это случай двойных представлений с одним и тем же значением, так что фактический порядок байтов отображается в представлении Base64. Полезно и менее запутанно поддерживать порядок сортировки между двоичным значением и (несколько более) понятной для человека строкой Base64, но сортировка двоичных значений с прямым порядком байтов является нетривиальной схваткой желаемой ASCII / лексической сортировки ,
Простого решения этой проблемы не существует, если вы начинаете с значений порядка байтов с прямым порядком байтов (т. Е. Просто изменение их сортировки не будет работать). Вместо этого вы должны планировать заранее и инвертировать байты каждого двоичного значения во время декодирования . Так что, если вы заботитесь о алфавитном отображении, совпадающем с сортировкой двоичных значений, вы можете изменить показанную выше функцию, чтобы она вместо этого декодировалась в значения с прямым порядком байтов
ulong
. Вот этот код:Идентификаторы YouTube
Идентификатор видео
Для videoId это 8-байтовое (64-битное) целое число. Применение кодировки Base64 к 8 байтам данных требует 11 символов . Однако, поскольку каждый символ Base64 передает ровно 6 битов (то есть, 2⁶ равен 64), это распределение может фактически содержать до
11 × 6 = 66
битов - избыток в 2 бита по сравнению с 64 битами, необходимыми для нашей полезной нагрузки. Лишние биты устанавливаются в ноль, что исключает появление определенных символов в последней позиции кодированной строки. В частности, videoId всегда заканчивается одним из следующих символов:Таким образом, максимально ограниченное регулярное выражение (RegEx) для videoId будет выглядеть следующим образом:
Идентификатор канала или плейлиста
В channelId и playlistId строки производятся в Base64-кодирующий 128 бит (16 байт) двоичное число. Это дает 22-символьную строку, к которой можно добавить префикс либо
UC
для идентификации самого канала, либоUU
для идентификации полного списка воспроизведения видео, которое он содержит. Эти 24-символьные строки с префиксом используются в URL . Например, ниже показаны два способа обращения к одному и тому же каналу. Обратите внимание, что версия списка воспроизведения показывает общее количество видео в канале, [см. Примечание 3.] полезную информацию, которую не раскрывают страницы канала.Как и в случае с 11-символьным videoId , расчет на Base64 правильно предсказывает наблюдаемую длину строки в 22 символа . В этом случае выход способен кодировать
22 × 6 = 132
биты, избыток 4 бита; эти нули в конечном итоге ограничивают m̲o̲s̲t̲ из 64 символов алфавита от появления в последней позиции, и только 4 из них остаются приемлемыми. Поэтому мы знаем, что последний символ в строке channelId YouTube должен быть одним из следующих:Это дает нам максимально ограниченное регулярное выражение для channelId :
В качестве последнего примечания, регулярные выражения, показанные выше, описывают только голые значения идентификаторов, без префиксов, косых черт, разделителей и т. Д., Которые должны присутствовать в URL-адресах и других различных целях. Шаблоны RegEx, которые я представил, настолько математически минимальны, насколько это возможно, учитывая свойства строк идентификаторов, но если они используются как есть, без дополнительного контекста, они, вероятно, будут генерировать много ложных срабатываний, то есть неправильно соответствовать ложному тексту. Чтобы избежать этой проблемы при реальном использовании, окружите их как можно большей частью ожидаемого смежного контекста.
Примечания
[1.]
Как было обещано выше, здесь приведен отрывок из спецификации Base64, в котором обсуждаются их соображения по выбору символов алфавита. Люди, стремящиеся понять, как процесс, завершающийся в выборе символов с семантикой URL, может найти объяснения несколько неубедительными.
[2.] В
качестве альтернативы, для решения проблемы использования строк идентификаторов в кодировке Base64 в качестве «как есть» компонентов имен файлов или путей в файловой системе NTFS, которая по умолчанию не чувствительна к регистру (и, таким образом, технически рискует объединить одно или несколько не связанные значения идентификаторов), так получается, что NTFS может быть настроен с учетом пути / имен файлов с учетом регистра для каждого тома. Включение поведения не по умолчанию может решить проблему, описанную здесь, но редко рекомендуется, так как это изменяет ожидания для любых / всех разрозненных приложений, которые проверяют или получают доступ к тому. Если вы даже рассматриваете этот вариант, сначала прочитайте и поймите это , и вы, вероятно, передумали.
[3.]
Я полагаю, что общее количество видео, отображаемых на странице списка воспроизведения канала, учитывает исключение для видео, которое ограничено в соответствии с географическим регионом клиента HTTP. Это объясняет любое несоответствие между количеством видео, перечисленных для плейлиста, и каналом.
источник
UC
vs.UU
channelId .