XCDYouTubeKit Нет функции подписи в скрипте игрока - PullRequest
1 голос
/ 06 июля 2019

Я не могу найти регулярное выражение, соответствующее этим ссылкам на Youtube, и я действительно не знаю, на что смотрю

https://www.youtube.com/watch?v=2BS3oePljr8

http://www.youtube.com/watch?v=iwGFalTRHDA

http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related

http://youtu.be/iwGFalTRHDA

http://youtu.be/n17B_uFF4cA

http://www.youtube.com/embed/watch?feature=player_embedded&v=r5nB9u4jjy4

http://www.youtube.com/watch?v=t-ZRX8984sc

http://youtu.be/t-ZRX8984sc

Я не уверен, есть ли регулярное выражение, которое я могу поставитьздесь, чтобы охватить большинство из них, но мне нужна помощь, пожалуйста.

Ошибки (при попытке загрузить / воспроизвести видео):

[XCDYouTubeKit] No signature function in player script

[XCDYouTubeKit] Video operation finished with error: This video is unavailable.

Domain: XCDYouTubeVideoErrorDomain

Code:   150

NSLocalizedDescription = "This video is unavailable.";

NSURL = "https://www.youtube.com/get_video_info?el=embedded&hl=en&ps=default&video_id=2BS3oePljr8";

Код:

  NSArray<NSString *>*patterns = @[@"\\.sig\\|\\|([a-zA-Z0-9$]+)\\(",

                                 @"[\"']signature[\"']\\s*,\\s*([^\\(]+)",

                                 @"yt\\.akamaized\\.net/\\)\\s*\\|\\|\\s*.*?\\s*c\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*(?:encodeURIComponent\\s*\\()?([a-zA-Z0-9$]+)\\(",

                                 @"\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*(?:encodeURIComponent\\s*\\()?\\s*([a-zA-Z0-9$]+)\\(",

                                  @"\\bc\\s*&&\\s*d\\.set\\([^,]+\\s*,\\s*\\([^)]*\\)\\s*\\(\\s*([a-zA-Z0-9$]+)\\("
                                 ];

Здесь также есть следующее: // Смотрите список шаблонов регулярных выражений здесь https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/youtube.py#L1179

Но, честно говоря, для меня это выглядит как иероглифы, так что да.

Дополнительный код для воспроизведения видео с YouTube:

  XCDYouTubeClient.default().getVideoWithIdentifier("2BS3oePljr8") { (video: XCDYouTubeVideo?, error: Error?) in
            if let streamURL = video?.streamURLs[XCDYouTubeVideoQuality.medium360.rawValue] {
                player = AVPlayer(url: streamURL)
                playerLayer = AVPlayerLayer(player: player)
                let playerLayerView = UIView()
                playerLayerView.frame.size = CGSize(width: self.page3View.frame.width / 1.25, height: self.page3View.frame.height / 2)
                playerLayerView.center = CGPoint(self.page3View.frame.width * 0.5, self.page3View.frame.height * 0.5)
                playerLayer.frame = CGRect(0.0, 0.0, playerLayerView.frame.width, playerLayerView.frame.height)
                playerLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
                playerLayer.zPosition = 2
                playerLayer.backgroundColor = UIColor.black.cgColor
                playerLayerView.layer.addSublayer(playerLayer)
                self.page3View.insertSubview(playerLayerView, at: 2)
                player.seek(to: kCMTimeZero)
                player.play()

1 Ответ

1 голос
/ 06 июля 2019

Это выражение

https?:\/\/(?:www\.)?(youtu(\.?be)?(\.com)?)\/(?:embed\/)?(?:watch\?(?:feature=player_embedded&)?v=)?([A-Za-z0-9_-]{11})

, кажется, передает желаемые данные, и я предполагаю, что вы можете извлечь те идентификаторы, которые захватываются с помощью этой группы захвата,

([A-Za-z0-9_-]{11})

и вы можете проверить, все ли необходимые символы уже включены в этот класс символов:

[A-Za-z0-9_-]

и, если не просто, добавьте их.


Выражение дополнительно объяснено в верхней правой части этой демонстрации , если вы хотите изучить его дальше или изменить его, а в этой ссылке вы можете посмотреть, как оно будет сопоставьте с некоторыми примерами входных данных, если хотите.


Или, если мы хотим захватить различные компоненты URL, мы бы включили в наше выражение больше групп захвата, а не групп захвата:

^https?:\/\/(www\.)?((music\.)?youtu(\.?be)?(\.com)?)\/(embed\/)?(watch\?(feature=player_embedded&(?:amp;)*?)?v=)?(get_video_info\?el=embedded&hl=en&ps=default&video_id=)?([A-Za-z0-9_-]{11})(.*)$

и наши желаемые идентификаторы находятся в группе захвата $10 в этом длинном выражении, которое на самом деле не так сложно спроектировать.

Как создать выражение для всех URL-адресов?

Мы просто перечислим все возможные URL-адреса, затем сначала захватили бы 11-значные идентификаторы и добавили бы необязательные группы ? для различных компонентов URL-адресов слева от идентификаторов, и все.

DEMO

Экранирование

Похоже, что для экранирования метачаров мы бы удваивали обратную косую черту, \\ вместо \, например, наш шаблон может выглядеть примерно так:

^https?:\\/\\/(www\\.)?((music\\.)?youtu(\\.?be)?(\\.com)?)\\/(embed\\/)?(watch\\?(feature=player_embedded&(?:amp;)*?)?v=)?(get_video_info\\?el=embedded&hl=en&ps=default&video_id=)?([A-Za-z0-9_-]{11})(.*)$

Вы можете дополнительно проверить эту демонстрацию , чтобы увидеть, как изменится экранирование в примере, который вы предоставили в комментарии.

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

Ссылка

Формат регулярного выражения Swift?

NSRegularExpression

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...