<?php

final class PhabricatorYoutubeRemarkupRule extends PhutilRemarkupRule {

  private $uri;

  public function getPriority() {
    return 350.0;
  }

  public function apply($text) {
    $this->uri = new PhutilURI($text);

    if ($this->uri->getDomain() &&
        preg_match('/(^|\.)youtube\.com$/', $this->uri->getDomain()) &&
        idx($this->uri->getQueryParams(), 'v')) {
      return $this->markupYoutubeLink();
    }

    return $text;
  }

  public function markupYoutubeLink() {
    $v = idx($this->uri->getQueryParams(), 'v');
    $text_mode = $this->getEngine()->isTextMode();
    $mail_mode = $this->getEngine()->isHTMLMailMode();

    if ($text_mode || $mail_mode) {
      return $this->getEngine()->storeText('http://youtu.be/'.$v);
    }

    $youtube_src = 'https://www.youtube.com/embed/'.$v;
    $iframe = $this->newTag(
      'div',
      array(
        'class' => 'embedded-youtube-video',
      ),
      $this->newTag(
        'iframe',
        array(
          'width'       => '650',
          'height'      => '400',
          'style'       => 'margin: 1em auto; border: 0px;',
          'src'         => $youtube_src,
          'frameborder' => 0,
        ),
        ''));
    return $this->getEngine()->storeText($iframe);
  }

}

<?php

final class PhabricatorYoutubeRemarkupRule extends PhutilRemarkupRule {

  public function getPriority() {
    return 350.0;
  }

  public function apply($text) {
    try {
      $uri = new PhutilURI($text);
    } catch (Exception $ex) {
      return $text;
    }

    $domain = $uri->getDomain();
    if (!preg_match('/(^|\.)youtube\.com\z/', $domain)) {
      return $text;
    }

    $params = $uri->getQueryParams();
    $v_param = idx($params, 'v');
    if (!strlen($v_param)) {
      return $text;
    }

    $text_mode = $this->getEngine()->isTextMode();
    $mail_mode = $this->getEngine()->isHTMLMailMode();

    if ($text_mode || $mail_mode) {
      return $text;
    }

    $youtube_src = 'https://www.youtube.com/embed/'.$v_param;

    $iframe = $this->newTag(
      'div',
      array(
        'class' => 'embedded-youtube-video',
      ),
      $this->newTag(
        'iframe',
        array(
          'width'       => '650',
          'height'      => '400',
          'style'       => 'margin: 1em auto; border: 0px;',
          'src'         => $youtube_src,
          'frameborder' => 0,
        ),
        ''));

    return $this->getEngine()->storeText($iframe);
  }

}

Fix ambiguous URI parsing in Youtube Remarkup rule
Fix ambiguous URI parsing in Youtube Remarkup rule

Summary:
Fixes T12867. Also:

  - Simplify the code a little.
  - Stop mutating this on text/mobile -- there's no inherent value in the "youtu.be" link so I think this just changes the text the user wrote unnecessarily.

Test Plan: {F5013804}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T12867

Differential Revision: https://secure.phabricator.com/D18149
