When uploading a new youtube movie an error occurs:
The YouTube video ID is invalid or the video was deleted.
The problem has to do with the caching, because media_youtube_valid_id() returns FALSE, probably because $ids[$id] is empty while $id is not.

Comments

maartenstorm’s picture

StatusFileSize
new499 bytes

To get things working again i fixed it for myself this way. I'm not sure if this is the way to solve it, but for me it works.

dddave’s picture

Status: Active » Needs review
syp’s picture

Do you have Open SSL extension enabled in php.ini?
Validation of youtube video ids is done with an https url (MEDIA_YOUTUBE_REST_API, not the typed url).

The same notice appeared to me.
Debuging the code I found $response was returning code -5 (error: ssl transport unavaliable).
So, caching is working the right way.

May be media_youtube_valid_id should print $response->error if $response->code < 0.

RobW’s picture

I'm getting this as well, on ~50% of the videos I try to embed. Doesn't seem to be any rhyme or reason to which work and which don't.

robcarr’s picture

I'm seeing this too - tried long and short URLs and Embed code. Issue was reported as fixed at #1446944: Cannot embed youtube videos but not working with latest DEV release (25 April 2012)

robcarr’s picture

The patch at #1 grabs the video BTW. If someone else could review the patch (a bit more thoroughly than me perhaps), please change status to RTBC.

RobW’s picture

Checked on 10+ videos, all seemed good.

Before we RTBC, does anyone (@maartenstorm?) know where are $id and $ids array set? It would be nice if we could add checks and normalize there so every function that may need to use ids can use the $ids array.

RobW’s picture

Priority: Normal » Major
Status: Needs review » Reviewed & tested by the community
Issue tags: +D7 stable release blocker

Been using the patch in #1 for a while, fixes the problem and no errors so far. Upping the priority and adding the stable release blocker since about 50% of the videos I try to use without the patch fail incorrectly as "invalid or deleted". I think this one is necessary for a working install.

RobW’s picture

Status: Reviewed & tested by the community » Fixed

To my chagrin I forgot I applied this patch while working on the theming issue. This fix snuck into dev with http://drupalcode.org/project/media_youtube.git/commit/a1381d5. Would have gotten there eventually I suppose.

Status: Fixed » Closed (fixed)

Automatically closed -- issue fixed for 2 weeks with no activity.

crissanis’s picture

Version: 7.x-2.x-dev » 7.x-2.0-rc2
Issue tags: -D7 stable release blocker +D7 stable media_youtube
StatusFileSize
new33.74 KB

When uploading a new youtube movie an error occurs:
i work actually in local

doors’s picture

I am getting this same error and no one seems to be looking into this error.

joneldesouza’s picture

Status: Closed (fixed) » Needs work

Hello,

Someone managed to fix this error?

I've tried several other issues patch and nothing worked.

delisov’s picture

I have fixed this error by pasting youtube embed code in a field of "long text and summary" type with FULL HTML.

Now I only wonder why should I need a separate module with this simple functionality which does not work

dddave’s picture

Version: 7.x-2.0-rc2 » 7.x-2.0-rc3
Status: Needs work » Postponed (maintainer needs more info)

I've a very hard time recreating this issue (on various installs). Unless someone can do some deeper digging on his install to narrow this down there is hardly anything the maintainer (disclosure: not me) could do.

wlftn’s picture

I'm getting this error too with

Media: YouTube
7.x-2.0-rc3

Media
7.x-2.0-alpha2

Media Internet Sources
7.x-2.0-alpha2

It wasn't there one day, and then it was.

beskid’s picture

StatusFileSize
new1.35 KB

Please help
Hi. I see that you are the experts in Drupal. I have a small web tv. Recently I can not add my videos to the site. The message "The YouTube video ID is invalid or the video was deleted." How to fix it. Please help me. Regards Luke

file to change
www.mhv.pl/MediaInternetYouTubeHandler.inc

www.beskid.tv

Rahul Tiwari1’s picture

replace this file sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
from this

<?php

/**
 * @file media_youtube/includes/MediaInterenetYouTubeHandler.inc
 *
 * Contains MediaInternetYouTubeHandler.
 */

/**
 * Implementation of MediaInternetBaseHandler.
 *
 * @see hook_media_internet_providers().
 */
class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
  /**
   * Check if a YouTube video id is valid.
   *
   * Check against the oembed stream instead of the gdata api site to
   * avoid "yt:quota too_many_recent_calls" errors.
   *
   * @return
   *   Boolean.
   */
 static public function validId($id) {
    $url = 'http://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D'. $id;
    $response = drupal_http_request($url, array('method' => 'HEAD'));
    if ($response->code != 200) {
//new lines below
      watchdog('video field', "The following YouYube video is invalid: " . $id);
      return TRUE;
// original code that caused the migration to stop when it encountered an error. --     throw new MediaInternetValidationException("The YouTube video ID is invalid or the video was deleted.");
        }
    return TRUE;
  }

  public function parse($embedCode) {
    $patterns = array(
      '@youtube\.com/watch[#\?].*?v=([^"\& ]+)@i',
      '@youtube\.com/embed/([^"\&\? ]+)@i',
      '@youtube\.com/v/([^"\&\? ]+)@i',
      '@youtube\.com/\?v=([^"\& ]+)@i',
      '@youtu\.be/([^"\&\? ]+)@i',
      '@gdata\.youtube\.com/feeds/api/videos/([^"\&\? ]+)@i',
    );
    foreach ($patterns as $pattern) {
      preg_match($pattern, $embedCode, $matches);
      // @TODO: Parse is called often. Refactor so that valid ID is checked
      // when a video is added, but not every time the embedCode is parsed.
      if (isset($matches[1]) && self::validId($matches[1])) {
        return file_stream_wrapper_uri_normalize('youtube://v/' . $matches[1]);
      }
    }
  }

  public function claim($embedCode) {
    if ($this->parse($embedCode)) {
      return TRUE;
    }
  }

  public function getFileObject() {
    $uri = $this->parse($this->embedCode);
    $file = file_uri_to_object($uri, TRUE);

    if (empty($file->fid) && $info = $this->getOEmbed()) {
      $file->filename = truncate_utf8($info['title'], 255);
    }

    return $file;
  }

  /**
   * Returns information about the media. See http://video.search.yahoo.com/mrss.
   *
   * @return
   *   If ATOM+MRSS information is available, a SimpleXML element containing
   *   ATOM and MRSS elements, as per those respective specifications.
   *
   * @todo Would be better for the return value to be an array rather than a
   *   SimpleXML element, but media_retrieve_xml() needs to be upgraded to
   *   handle namespaces first.
   */
  public function getMRSS() {
    $uri = $this->parse($this->embedCode);
    $video_id = arg(1, file_uri_target($uri));
    $rss_url = url('http://gdata.youtube.com/feeds/api/videos/' . $video_id, array('query' => array('v' => '2')));
    // @todo Use media_retrieve_xml() once it's upgraded to include elements
    //   from all namespaces, not just the document default namespace.
    $request = drupal_http_request($rss_url);
    if (!isset($request->error)) {
      $entry = simplexml_load_string($request->data);
    }
    else {
      throw new Exception("Error Processing Request. (Error: {$response->code}, {$response->error})");

      //if request wasn't successful, create object for return to avoid errors
      $entry = new SimpleXMLElement();
    }
    return $entry;
  }

  /**
   * Returns information about the media. See http://www.oembed.com/.
   *
   * @return
   *   If oEmbed information is available, an array containing 'title', 'type',
   *   'url', and other information as specified by the oEmbed standard.
   *   Otherwise, NULL.
   */
 public function getOEmbed() {
    $uri = $this->parse($this->embedCode);
    $external_url = file_create_url($uri);
    $oembed_url = url('http://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));
    $response = drupal_http_request($oembed_url);
    if (!isset($response->error)) {
      return drupal_json_decode($response->data);
    }
    else {
      // commented out because caused migrate to stop when encountered an error --  throw new Exception("Error Processing Request. (Error: {$response->code}, {$response->error})");
      return ;
    }
  }
}

This Should be work...

vlooivlerke’s picture

Thanks, @Rahul Tiwari1 patch #18 works.

marthinal’s picture

The module works as expected I think. Probably the problem is that the youtube user doesn't agree to share the video. In my case, I can add perfectly other videos and I have this error only when the video is hidden.

Go to the video (youtube website) and verify the Share option.

Rahul Tiwari1’s picture

@vlooivlerke my pleasure

vlooivlerke’s picture

I encountered this problem mainly when importing a media field with a mixture of images, files,and embed links. The patch fix the import of embed media via feeds module. Embedding a single youtube movie directly into a media field works without the patch - BUT NOT ALL THE TIME. I reckon this patch needs to be committed as I have extensively imported media in a single field, via a csv file using the tamper module to explode the list of media. Without this patch I will not import media if there is a youtube movie in the list, no matter what its "share" status is. Thanks again for the patch

john mark maina’s picture

Thanks Rahul Tiwari1 it worked

aklouie’s picture

Still having issues. I replaced the .inc file with the one from Rahul, refreshed (dumped cache) and no change.

Essentially it times out on the screen but the log message gives me an error

The following YouYube video is invalid: xxxxxx where xxxx is the proper ID of the youtube video i'm linking (and the mispelling of YouYube is intentional, it's as it is on the log message)

Is there anything I can do to provide more data? I have tried multiple videos, even ones posted recently on my website. This was working fine till 7 Jan 2014, tried linking in a video today with no avail, nothing changed except the theme.

Thanks,
Alan

john mark maina’s picture

Noticed also that it takes very long to load the video from YouTube almost 3 mins per vid.. I'm even contemplating just creating an embed field and use the

embed code if this persists and no help s forthcoming.
aklouie’s picture

Switched to embedded media and it works now.

willowdigit’s picture

Issue summary: View changes

I can confirm that patch #18 works. It just takes a loooong time to upoad.

ethiel88’s picture

Guys, before applying any patch, please check this, after debugging I figured out that the problem was in the server, outgoing (external) connections are limited by a firewall or disabled by default (SELinux)

I experienced this problem with Media: Youtube, and Media: Vimeo modules.

Hope this helps to other users, when you got this problem with drupal_http_request or others like curl, the problem is the server, in case of SELinux the solution is execute as superuser:

setsebool httpd_can_network_connect=1

but when you dont have access to shell / super user credentials don't hesitate to contact with hosting support and tell them, that you need outgoing connections to the ip addresses or domains you want to connect, they should add those entries in the firewall, or in case of SELinux enable the external connections.

For getting ip address to vimeo I simply hit in a console

host vimeo.com

the ip address I've added to the ip address accepted list and it worked like a charm.

Regards to everybody, especially those who implemented these modules.

brightbold’s picture

Status: Postponed (maintainer needs more info) » Active

Same problem here, on a site upgraded from D6 (but a new field as I couldn't get the old emfield_video field to upgrade), and on my local machine. When I push the site to Pantheon I will see if I can reproduce the error which if I can should rule out #28. I have confirmed that the video is available for sharing which rules out #20. Regarding #25, it also seems to take a long time without the patch (but less than 3 minutes).

Moving this back from postponed since the code in #18 might help people figure out what's going on. Or if #18 has the correct solution, then it can be converted to a real patch and marked for review.

willowdigit’s picture

I can confirm @ethiel88 advice (#28) to work. Thanks for that one. I now get the video to load in 2 - 3 seconds.

kiova’s picture

Hi

We have the same error...

Our setup was working in our test server but when we migrated to our new dedicated we stared to get this error. We think it is a connection problem but we could not find out...

how can we debug the errors?

we tried #28 but noting changed...

Any other advice for us?

willowdigit’s picture

I forked the issue to drupal_http_request fails or extremely slow as it seems to be a server setup issue and not a module bug.

Let's see if it can be solved over there.

evanmwillhite’s picture

Are we sure this is a server bug? When you comment out the validId() function below and the check on line 40 for it (&& self::validId($matches[1])), it works fine and there is no delay.

static public function validId($id) {
    $url = 'http://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D'. $id;
    $response = drupal_http_request($url, array('method' => 'HEAD'));
    return TRUE;
  }

Obviously, this isn't a long-term solution as a check for a valid ID is necessary, but I wondered if that code could be altered somehow.

irgnet’s picture

I have the same problem,
Vimeo works , but Youtube not.
I try pach, but it not works for me.
I try put off firewall on host, but same s**t

drcelus’s picture

Please note that this message can also come from the fact that Youtube is blocking your request. If you are developing from the localhost it is enough to input this URL on a web browser (change [VIDEO_ID] with your own) :

http://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D[VIDEO_ID]

If a captcha appears, it means Youtube has blocked the request as a result of a violation of their TOS from your IP or an IP inside your network.
This has just happened to me while I was using a VPS for development, turned out that all the IP addresses from my provider where blocked.

Maybe showing more details from the http status response code could help people debug this error.
The HTTP status code returned by Google (Youtube) in this case was 503 Service Unavailable.

Anonymous’s picture

I've now the same problem with my setup...

When analyzing the error I get an http 503 error from here:

static public function validId($id) {
    $url = 'http://www.youtube.com/oembed?url=http://youtube.com/watch?v='. $id;
    $response = drupal_http_request($url, array('method' => 'HEAD')); //==> IPV6 not handled by Youtube
    if ($response->code != 200) {
    //if ($status = 200) {
      throw new MediaInternetValidationException("The YouTube video ID is invalid or the video was deleted.");
    }
    return TRUE;
  }

==> looking at it on google, I arrived to the conclusion that it was using IPV6 and not IPV4 and this was not supported...

However, I'm not reaching the point of solving this issue, as I tried with drupal_http_request without any success.

I tried also with curl (http://stackoverflow.com/questions/26089067/youtube-oembed-api-302-then-...) but couldn't get it to work neither..

a small help would be really much appreciated.

gaëlg’s picture

These 503/302 errors are very frustating. I figured out that Scald manage to get video info from YouTube, when Media can't. It actually uses the gdata API instead of the oEmbed one.
It was the same for Media: YouTube before this commit.

I managed to get something working by changing the $url in validId() to $url = 'http://gdata.youtube.com/feeds/api/videos/'. $id; and adding a fallback in the getOEmbed() method, like this:

public function getOEmbed() {
    $uri = $this->parse($this->embedCode);
    $external_url = file_create_url($uri);
    $oembed_url = url('http://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));
    $response = drupal_http_request($oembed_url);
    if (!isset($response->error)) {
      return drupal_json_decode($response->data);
    }
    else {
      // Fallback: try gdata API (adapted from scald_youtube).
      preg_match('/.+\/(.+)?/', $uri, $matches);
      $id = $matches['1'];
      $url2 = 'http://gdata.youtube.com/feeds/api/videos/' . $id;
      $response2 = drupal_http_request($url2);
      if ($response2->code >= 200 && $response2->code < 400 && !empty($response2->data)) {
        $dom = new DOMDocument();
        if ($dom->loadXML($response2->data)) {
          $item = $dom->getElementsByTagName('entry')->item(0);
          $title = $item->getElementsByTagName('title')->item(0);
          // Apparently we only need the title.
          return array('title' => $title);
        }
      }
      throw new Exception("Error Processing Request. (Error: {$response->code}, {$response->error})");
      return;
    }
  }
learnbydrop’s picture

Module: Media_youtube 7.x-3.0

Showing error: The YouTube video ID is invalid or the video was deleted.

None of the above patches are not working with 3.0 version.

learnbydrop’s picture

Solution to resolve::

Change the line 93:

Previous Line:
$oembed_url = url('http://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));

New Line:
$oembed_url = url('http://www.youtube.com/embed', array('query' => array('url' => $external_url, 'format' => 'json')));

The youtube Embed URL shoule be
http://www.youtube.com/embed

The issue is resolved.

eeyorr’s picture

#39 doesn't resolve the issue for me.

hongpong’s picture

That URL definitely has to change to http://www.youtube.com/embed tho for sure. oembed is 404 now.

c2webdev’s picture

I'm having the same issue with Vimeo, has anyone else?

jon.girard’s picture

#39 resolved the issue for me on 7.x-3.0

jon.girard’s picture

StatusFileSize
new841 bytes

7.x-3.0 patch attached per details in #39

vlooivlerke’s picture

Hi

is the url not https ?

currently: url('http://www.youtube.com/embed'

I have loads of 404 pages that state www.youtube.com/embed/Lp4MWK0Kjsg can not be found, but https://www.youtube.com/embed/Lp4MWK0Kjsg can be found

ZalemCitizen’s picture

In case some of you still encounter the problem.
We tried some of the patches indicated here without success.

The problem is youtube service refuses IPv6 when server is resolving address under drupal_http_request().
We modified /etc/gai.conf to give precedence to IPv4 over IPv6 and this solves the issue.

More info about this

erwangel’s picture

either #39/44 nor #46 worked for me. It worked before Not sure but I think it worked even with latest 7.x-3.0+9-dev (2015-aoû-17) I don't see what could me changed. Getting 503 error not available in $response and message "The YouTube video ID is invalid or the video was deleted".

erwangel’s picture

I tried to investigate a little further:

calling something like

function get_contents() {
  file_get_contents("http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch%3Fv%3{youtube_video_id}&format=json");
  var_dump($http_response_header);
}
get_contents();

returns this string "HTTP/1.0 503 Service Unavailable" which doesn't help.

calling the url directly from my browser (so with a different ip) I get correctly the json data. So I can see that the service is available

{"author_url": "https:\/\/www.youtube.com\/user\/{video_user}", "version": "1.0", "provider_name": "YouTube", "provider_url": "https:\/\/www.youtube.com\/", "thumbnail_url": "https:\/\/i.ytimg.com\/vi\/{youtube_video_id}\/hqdefault.jpg", "author_name": "{author_name}", "type": "video", "width": 480, "height": 270, "title": "{video_title}", "thumbnail_width": 480, "html": "\u003ciframe width=\"480\" height=\"270\" src=\"https:\/\/www.youtube.com\/embed\/{youtube_video_id}?feature=oembed\" frameborder=\"0\" allowfullscreen\u003e\u003c\/iframe\u003e", "thumbnail_height": 360}

by calling a youtube url by curl

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'http://www.youtube.com/oembed?url=http%3A//www.youtube.com/watch%3Fv%3{youtube_video_id}&format=json'); // this is the $oembed_url created by getOEmbed()
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
//curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_exec($curl_handle);
//$query = curl_exec($curl_handle);
//dpm($query);
curl_close($curl_handle);

The response on my browser is a google message:

Our systems have detected unusual traffic from your computer network. Please try your request again later. Why did this happen?
IP address: {my server's ipv6}
Time: 2015-11-20T11:39:43Z
URL: http://www.google.com/

So it seems that youtube either blocked my server's ip or it doesn't like the curl request. I can't see a reason for why server ip is blocked, I'm not doing anything special with their videos, my site calls just some videos embedded with media module in a very classic way with a moderate traffic (some hundreds/day, so some dozens/day on pages containing videos). Anyway, I don't think that traffic is the cause as the display of videos loaded before the problem appears to be okay ; the problem is that I can't "download" embed videos anymore with media youtube module in File Library. Has there been any change in youtube/google policy about the way to call their videos ?

Perhaps other people encounter the 503 error and message "The YouTube video ID is invalid or the video was deleted", but maybe the problem is not coming from media_youtube module but by the way Drupal calls the url (drupal_http_request), which youtube/google may not like and leads to some kind of banning.

(edit)
After 3 days without using the module (so no calls to youtube service), it works nicely as before. Automatically unbanned or just a temporary problem with youtube ? Never mind, it works !

dorficus’s picture

I have to disagree with #39. Oembed is not dead and the results from embed v. oembed are very different. I copied the majority of what #48 did, but I still did not get the unusual traffic error.

I am still getting the "YouTube video ID is invalid or the video was deleted." error despite the same URL coming back with good JSON on cURL and and file_get_contents()

This is failing silently, as I am unable to find anything in the logs regarding the error.

R.Sungatov’s picture

Module 7.x-3.0

After re-saving of node, Error occur:
The YouTube video ID is invalid or the video was deleted.

I noticed that after re-saving video, address in the field change by himself: protocol https to http.

Problem is in the MediaYouTubeStreamWrapper.inc

line 23: $oembed_url = url('http://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));

I change it on $oembed_url = url('https://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));

Also in MediaInternetYouTubeHandler.inc, I change all "http" on "https". And all work fine for me.

vvs’s picture

#50 Please make the patch.

hongpong’s picture

StatusFileSize
new1.16 KB

Here is a patch and I switched the $base_url to secure http which I'm pretty sure is a good idea, but people should test.
protected $base_url = 'https://www.youtube.com/watch';

hongpong’s picture

Status: Active » Needs review
Phantom_63rus’s picture

And again...

Drupal 7.56, media 7.x-2.11 and 2.10, php 7.0.16(CGI) and 5.4.16(Apache module), centos 7.

Openssl, curl, json, etc is enabled
#52,50 - is already https
selinux is disable
access.log, error.log - none interesting

Any ideas?

calvez’s picture

this problem is back with my
php 7.3,
drupal 7.69,
media 7.x-2.24
media_youtube 7.x-3.9

module worked as it should be before, it could be some youtube modification but there are no errors or warnings just the message above:

The YouTube video ID is invalid or the video was deleted.

Any kind of solution would be good urgently, right now i just don't have an idea what is wrong.

Thanks!

joseph.olstad’s picture

Status: Needs review » Needs work

patch no longer applies to head.

If you have a new patch, please upload it and set to needs review

avpaderno’s picture

Version: 7.x-2.0-rc3 » 7.x-2.x-dev
Issue tags: -D7, -stable, -media_youtube
wasid’s picture

Today I faced the same problem and could not find out the solution and then figured out the problem was created due to the web hosting server's firewall or access controller error it was not the problem created by dupal or module itself.

naurisr’s picture

Here is the patch that fixed the problem for me.

Nightwalker3000’s picture

I've the same issue. For me it was enough to change the request Method from HEAD to GET to solve the issue.

/includes/MediaInternetYouTubeHandler.inc

$response = drupal_http_request($oembed_url, array('method' => 'HEAD'));

changed to

$response = drupal_http_request($oembed_url, array('method' => 'GET'));
avpaderno’s picture

Status: Needs work » Needs review
joseph.olstad’s picture

@Nightwalker3000 can you please provide a patch or comment upon patch 59?

Is patch 59 going to work for 'everyone'?

what web server are you using, nginx / apache ?
iis?

will this change work on all web servers

joseph.olstad’s picture

ok looking at this patch it seems like a needed improvement.

suggested change:

FROM:

-    if ($response->code == 401) {
+    if (strpos($headers[0], '401')) {
       throw new MediaInternetValidationException('Embedding has been disabled for this YouTube video.');
     }
-    elseif ($response->code != 200) {
+    elseif (!strpos($headers[0], '200')) {
       throw new MediaInternetValidationException('The YouTube video ID is invalid or the video was deleted.');
     }

TO:

-    if ($response->code == 401) {
+    if (isset($headers[0]) && strpos($headers[0], '401')) {
       throw new MediaInternetValidationException('Embedding has been disabled for this YouTube video.');
     }
-    elseif ($response->code != 200) {
+    elseif (isset($headers[0]) && !strpos($headers[0], '200')) {
       throw new MediaInternetValidationException('The YouTube video ID is invalid or the video was deleted.');
     }
joseph.olstad’s picture

and to be safer and catch all exceptions,

should also have an else without if

so maybe also add this:

else {
  throw new MediaInternetValidationException('The YouTube video headers are not comming through.');
}
joseph.olstad’s picture

if someone can review my suggestions that'd be great, I could push in the patch as-is but I suspect we need to improve the patch slightly.

Nightwalker3000’s picture

Patch #59 works for me on Apache 2 - PHP 7.3.22 .
It is also better than my suggestion. Better only check the headers instead of Downloading the whole JSON file as suggested by me.

caesius’s picture

StatusFileSize
new1.6 KB

@joseph.olstad I've implemented your suggestions as well as added a bit more info to the error messages to help with future debugging. Your comment in #64 threw me for a loop though since an unqualified `else` causes the code to always throw an error :)

Anyway, I was having a lot of trouble on a production site with this error (maybe because YT was down earlier today?) and the patch definitely helps.

tyler.frankenstein’s picture

StatusFileSize
new1.36 KB

Looks like @caesius and I were working in tandem. Here's my (very similar) patch based off of #59 and suggestions from #63. I don't think we should add debug info to the error message because it'd likely scare end users even more. Also, there is/was a huge Google/Gmail/YouTube outage today, right? Maybe that has something to do with it.

joseph.olstad’s picture

lol for comment 64, sorry about that

jeffreysmattson’s picture

Using patch #68 I get this warning:

Warning: get_headers(): This function may only be used against URLs in MediaInternetYouTubeHandler->validId() (line 115 of /var/www/dartmydart/docroot/sites/all/modules/contrib/media_youtube/includes/MediaInternetYouTubeHandler.inc).

joseph.olstad’s picture

jeffrysmattson, what is your web server type? apache2 , nginx, iis, something else?

looks like we maybe need an extra validation for line 115 or else what?

jeffreysmattson’s picture

We are using apache2. Not sure what the solution is yet. The patch seems to work just fine. Just throws those warnings. I am still looking into it.

joseph.olstad’s picture

Version: 7.x-2.x-dev » 7.x-3.x-dev

seems like all the patches are for 3.x not 2.x

inteldesk’s picture

Problem persisting, using 7.x-3.9

MediaInternetValidationException: The YouTube video ID is invalid or the video was deleted. in MediaInternetYouTubeHandler->validId() (line 120 of /~media_youtube/includes/MediaInternetYouTubeHandler.inc).

stefan.korn’s picture

@jeffreysmattson:
I am seeing the warning from get_headers() too. There is one more warning on my site, telling:
Warning: get_headers(): https:// wrapper is disabled in the server configuration by allow_url_fopen=0
So seems this is something about the server setting.

That said, on a server that puts out this warning you can insert an invalid Youtube ID and it will get thru with embedding showing the Youtube error icon.

So I suppose get_headers() is not usable for some environments. Or is a Drupal installation expected to have allow_url_fopen in any case?

stefan.korn’s picture

Proposing a patch that does not use get_headers()

jeffreysmattson’s picture

Version: 7.x-3.x-dev » 7.x-2.x-dev

Applying patch #76, works without warnings for me. I removed the "return" statements after the "throw" statements as they where unreachable. Thanks for the fix @stefan.korn

kris77’s picture

Patch in #76 works for me too.

Thank you so much @stefan.korn

loze’s picture

Status: Needs review » Reviewed & tested by the community

Confirming #76 Works

tyler.frankenstein’s picture

Status: Reviewed & tested by the community » Needs review

seems like all the patches are for 3.x not 2.x

@joseph.olstad, that's what I thought while tinkering with patches yesterday.

@stefan.korn and @jeffreysmattson, are you both on 2.x?

FYI, #68 is for 3.x.

Regarding #76, is that patch for 2.x or 3.x? Also, is it wise to get rid of the "HEAD" method there?

This issue itself is very old and seemed to be inactive for about 4-5 years until about 2 days ago. If folks are still using 2.x, then it seems OK to leave this issue as 2.x and then we probably need to track a separate issue for the 3.x branch, right? Or perhaps this issue should be marked as 3.x since that's the recommended version of the module.

I'll move this back to "Needs review" for now.

loze’s picture

Version: 7.x-2.x-dev » 7.x-3.x-dev

I applied the patch to media_youtube 7.x-3.9

I believe this error is because of a recent change on you tubes end. This stopped working a day or two ago for me on a handful of D7 sites where I had been using this module without any issues for a while.

stefan.korn’s picture

@tyler.frankenstein: Patch is for the 3.x version, 2.x version is not really existing anymore I suppose. If you do a update of a 2.x version you will get to 3.x as well.

getting rid of the "HEAD" method is crucial for #76 to work. I suppose the "HEAD" method does not work the way is has done before, probably because YT changed something.

The way checking for headers in #68
if (isset($headers[0])) { ...
is not taking care for general problems with get_headers(), which can return FALSE. If FALSE is returned #68 sees this as a valid ID, which can actually lead to letting invalid IDs pass.

Since get_headers() does not seem as reliable as drupal_http_request(), I opted for keeping drupal_http_request.

It seems Youtube is delivering a pure string to drupal_http_request as $response->data if something is wrong (like "Unauthorized" oder "Bad request") and if this is put thru drupal_json_encode the result will be empty. This allows to catch an error by checking for empty drupal_json_encode output and then using the plain string as error message.

We tested #76 somewhat intensive today and seems to be working fine.

tyler.frankenstein’s picture

Status: Needs review » Reviewed & tested by the community

Great, thank you! #76 works fine for me too.

dystopianblue’s picture

#76 works for me as well. Thanks!

javiereduardo’s picture

#76 works on media_youtube-7.x-3.9

+1

Thanks

rbomhof’s picture

Confirming that #76 worked for us as well. Thank you so much!

marcelschmitz’s picture

#76 did remove the error message for me but now the embeded videos are not showing up on the frontend. Any idea how to fix that?

stefan.korn’s picture

@marcelschmitz: Are only new videos not showing up in the frontend or also older ones? Do you get the thumbnail for the video?

jvdkolk’s picture

#76 works for me (7.x-3.9).

Only Netbeans whines about the (unreachable) 'return;' statements after the 'throw' statements in line 126 and 132 of the patched code.

maskedjellybean’s picture

#76 works for me. Thank you!!

jpoesen’s picture

#76 works for me (debian, nginx, 7.x-3.9).

Thanks!

eloivaque’s picture

#76 forks for me

Sam_Rad’s picture

Hello,

I get the same error and it seems that it comes from the way the Youtube URL are called.

The URL must be changed from http:// to https:// and be called via the GET HTTP method.

Here is the patch for the version 2.x i have used:

diff --git a/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc b/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
index 65b9496..6d1b760 100644
--- a/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
+++ b/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
@@ -22,8 +22,8 @@ class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
    *   Boolean.
    */
   static public function validId($id) {
-    $url = 'http://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D'. $id;
-    $response = drupal_http_request($url, array('method' => 'HEAD'));
+    $url = 'https://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D'. $id;
+    $response = drupal_http_request($url);
     if ($response->code == 401) {
       throw new MediaInternetValidationException("Embedding has been disabled for this video.");
     }
@@ -83,7 +83,7 @@ class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
   public function getMRSS() {
     $uri = $this->parse($this->embedCode);
     $video_id = arg(1, file_uri_target($uri));
-    $rss_url = url('http://gdata.youtube.com/feeds/api/videos/' . $video_id, array('query' => array('v' => '2')));
+    $rss_url = url('https://gdata.youtube.com/feeds/api/videos/' . $video_id, array('query' => array('v' => '2')));
     // @todo Use media_retrieve_xml() once it's upgraded to include elements
     //   from all namespaces, not just the document default namespace.
     $request = drupal_http_request($rss_url);
@@ -110,7 +110,7 @@ class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
   public function getOEmbed() {
     $uri = $this->parse($this->embedCode);
     $external_url = file_create_url($uri);
-    $oembed_url = url('http://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));
+    $oembed_url = url('https://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));
     $response = drupal_http_request($oembed_url);
     if (!isset($response->error)) {
       return drupal_json_decode($response->data);

A better patch would make adding a constant for the URL https://www.youtube.com/oembed and using the existing constant MEDIA_YOUTUBE_REST_API in media_youtube.module instead of using the URL "https://gdata.youtube.com/feeds/api/videos"

Best regards
Sam
EDIT: adding the version

wstocker’s picture

#76 works for me as well. Drupal 7.77

stefan.korn’s picture

@Sam_Rad: I suppose your patch is targeting 2.x version of the module and also not the recent 2.x version, because there is code in your patch that neither is in the 3.x nor the last 2.x version.

Be warned that just changing from HEAD to GET will probably let more or less anything pass through the valid id check, because the response code will then usually be 200 except there is something completely broken with the connection. So you might not spot invalid video IDs or videos that are not allowed to embed.

kpolychr’s picture

This seems to be a youtube issue actually with oembed, maybe a few servers have issues. an example bellow, video is public - no restrictions - no copyrights. GET requests works perfectly though. Bellow 3 consecutive HEAD requests.

curl -I https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=xxx&f...
HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-cache
Expires: Tue, 27 Apr 1971 19:44:06 GMT
P3P: CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=de for more info."
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000
Date: Mon, 14 Dec 2020 09:44:50 GMT
Server: YouTube Frontend Proxy
X-XSS-Protection: 0
Transfer-Encoding: chunked
Alt-Svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Accept-Ranges: none
Vary: Accept-Encoding

curl -I https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=xxx&f...
HTTP/1.1 404 Not Found
Content-Type: text/html
Date: Mon, 14 Dec 2020 09:45:05 GMT
Server: scaffolding on HTTPServer2
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
Transfer-Encoding: chunked
Alt-Svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"

curl -I https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v=xxx&f...
HTTP/1.1 200 OK
Strict-Transport-Security: max-age=31536000
Expires: Tue, 27 Apr 1971 19:44:06 GMT
X-Content-Type-Options: nosniff
Cache-Control: no-cache
P3P: CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=de for more info."
Content-Type: application/json
Date: Mon, 14 Dec 2020 09:45:24 GMT
Server: YouTube Frontend Proxy
X-XSS-Protection: 0
Transfer-Encoding: chunked
Alt-Svc: h3-29=":443"; ma=2592000,h3-T051=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
Accept-Ranges: none
Vary: Accept-Encoding

Sam_Rad’s picture

@setfan.korn: yes this is for the version 2.x.
The patch does not only change HEAD to GET but also replaces http:// to https:// in the URL of the Youtube API.
It must be done because using HEAD and http does not work anymore.
It can be easily tested with cURL: a HTTP request with HEAD returns a 404 even with the use of https whereas a HTTP GET request with http returns an error 403 "SSL is required to perform this operation."
The right combination is GET with https.
So this patch does not remove the check of the video ID, it is just updating the way to do it.

Best regards,
Sam

stefan.korn’s picture

StatusFileSize
new58.36 KB

@Sam_Rad: Yes, https is necessary, but this has been already changed in 3.x version.

But the way you do it, makes the valid id check rather useless. Try for example an invalid youtube ID. It will pass as valid ID, because the response code will be 200 anyway. The head method was used to get information about the validity, but HEAD method does (currently?) not work reliable anymore on YT.

Take this example from Postman, this is query for an invalid ID. The response code is 200 (will pass valid ID), though the data response is "Bad request" (invalid ID):

Post man request

Sam_Rad’s picture

Thank you @stefan.korn.
I now get the point.
So what about adding the following test ($response->data==='Bad Request') into the method validId() :

diff --git a/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc b/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
index 6d1b760..932f01c 100644
--- a/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
+++ b/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
@@ -27,7 +27,7 @@ class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
     if ($response->code == 401) {
       throw new MediaInternetValidationException("Embedding has been disabled for this video.");
     }
-    elseif ($response->code != 200) {
+    elseif ($response->code != 200 || $response->data==='Bad Request') {
       throw new MediaInternetValidationException("The YouTube video ID is invalid or the video was deleted.");
     }
     return TRUE;

Local tests seem to validate the right video IDs and trigger an error for the wrong ones.

Best regards,
Sam

stefan.korn’s picture

@Sam_Rad: Yes you could do it like this. Or take a look how it is solved in patch from#76, there are more possible "invalid" response data (like "Unauthorized" for a YT video that does not allow embedding). Patch from #76 is for 3.x, though you might take the response checking part for 2.x as well.

Sam_Rad’s picture

Thank you again @stefan.korn.

For those who still use the version 2.x, here is the patch :

diff --git a/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc b/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
index 65b9496..3a344e7 100644
--- a/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
+++ b/sites/all/modules/media_youtube/includes/MediaInternetYouTubeHandler.inc
@@ -22,14 +22,19 @@ class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
    *   Boolean.
    */
   static public function validId($id) {
-    $url = 'http://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D'. $id;
-    $response = drupal_http_request($url, array('method' => 'HEAD'));
+    $url = 'https://www.youtube.com/oembed?url=http%3A//youtube.com/watch%3Fv%3D'. $id;
+    $response = drupal_http_request($url);
     if ($response->code == 401) {
       throw new MediaInternetValidationException("Embedding has been disabled for this video.");
     }
     elseif ($response->code != 200) {
       throw new MediaInternetValidationException("The YouTube video ID is invalid or the video was deleted.");
     }
+    elseif(null===drupal_json_decode($response->data)) {
+      $error_data = $response->data.' (code='.json_last_error().' '.json_last_error_msg().')';
+      throw new MediaInternetValidationException("The YouTube video ID is invalid or the video was deleted. Error: {$error_data}");
+    }
+
     return TRUE;
   }
 
@@ -83,7 +88,7 @@ class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
   public function getMRSS() {
     $uri = $this->parse($this->embedCode);
     $video_id = arg(1, file_uri_target($uri));
-    $rss_url = url('http://gdata.youtube.com/feeds/api/videos/' . $video_id, array('query' => array('v' => '2')));
+    $rss_url = url('https://gdata.youtube.com/feeds/api/videos/' . $video_id, array('query' => array('v' => '2')));
     // @todo Use media_retrieve_xml() once it's upgraded to include elements
     //   from all namespaces, not just the document default namespace.
     $request = drupal_http_request($rss_url);
@@ -110,7 +115,7 @@ class MediaInternetYouTubeHandler extends MediaInternetBaseHandler {
   public function getOEmbed() {
     $uri = $this->parse($this->embedCode);
     $external_url = file_create_url($uri);
-    $oembed_url = url('http://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));
+    $oembed_url = url('https://www.youtube.com/oembed', array('query' => array('url' => $external_url, 'format' => 'json')));
     $response = drupal_http_request($oembed_url);
     if (!isset($response->error)) {
       return drupal_json_decode($response->data);

Best regards,
Sam

anthonyroundtree’s picture

@sam_rad, Shouldn't the 2.x fix be a separate issue as well as a separate patch file?

joseph.olstad’s picture

ok so looks like a lot of positive feedback on patch 76

I will try to review it tonight, if good then I'll push a new release with this patch

griff phillips’s picture

Hit this issue today, patch #76 fixed for me.

hossein425’s picture

Patch #76 fixed for me too.

drupalviking’s picture

My client was experiencing the same problems as listed before. When I applied patch #76, everything worked again. My customer is super happy. I can confirm that the patch works as described and is Reviewed and approved by me (as one of the community ;) )

joseph.olstad’s picture

Ok I will push this soon and cut a new release.
If this is not done within 2 weeks, ping or private message me or leave a wake up call here.

surendrasingh1’s picture

I have applied patch #76 and everything is working again.

joseph.olstad’s picture

Status: Reviewed & tested by the community » Fixed

Tagged new release with this fix, 3.10

Thanks everyone.

joseph.olstad’s picture

joseph.olstad’s picture

for those that haven'T upgraded to 7.x-3.x either do so or please work on this issue:

#3190134: 7.x-2.x backport The YouTube video ID is invalid or the video was deleted.

luksak’s picture

Works, thank you!

creatile’s picture

Patch #76 works for me, Thanks

solideogloria’s picture

The return statements after the throw lines should have been removed before committing.

joseph.olstad’s picture

RE: 115

If someone writes a patch for this I'll quickly review it and throw it in.

solideogloria’s picture

StatusFileSize
new941 bytes

Removed extraneous return lines. Applies on dev.

duntuk’s picture

Thanks! Latest patch works media_youtube-1572550-117.patch on latest version 7.x-3.10

solideogloria’s picture

Status: Fixed » Reviewed & tested by the community

Marking RTBC so that #117 can be committed.

joseph.olstad’s picture

Assigned: Unassigned » solideogloria

New maintainer solideogloria added and permissions updated.

  • solideogloria committed 9991b77 on 7.x-3.x
    Issue #1572550 by stefan.korn, HongPong, tyler.frankenstein,...
solideogloria’s picture

Status: Reviewed & tested by the community » Fixed
solideogloria’s picture

Assigned: solideogloria » Unassigned
axle_foley00’s picture

I still seem to be having an issue, despite updating to 7.x-3.10. Whenever I try to add a video, I'm getting a 502 Bad Gateway error. When I print out the response, I'm getting the following:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html><head>
<meta type="copyright" content="Copyright (C) 1996-2019 The Squid Software Foundation and contributors">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>ERROR: The requested URL could not be retrieved</title>
<style type="text/css"><!-- 
 /*
 * Copyright (C) 1996-2020 The Squid Software Foundation and contributors
 *
 * Squid software is distributed under GPLv2+ license and includes
 * contributions from numerous individuals and organizations.
 * Please see the COPYING and CONTRIBUTORS files for details.
 */

/*
 Stylesheet for Squid Error pages
 Adapted from design by Free CSS Templates
 http://www.freecsstemplates.org
 Released for free under a Creative Commons Attribution 2.5 License
*/

/* Page basics */
* {
	font-family: verdana, sans-serif;
}

html body {
	margin: 0;
	padding: 0;
	background: #efefef;
	font-size: 12px;
	color: #1e1e1e;
}

/* Page displayed title area */
#titles {
	margin-left: 15px;
	padding: 10px;
	padding-left: 100px;
	background: url('/squid-internal-static/icons/SN.png') no-repeat left;
}

/* initial title */
#titles h1 {
	color: #000000;
}
#titles h2 {
	color: #000000;
}

/* special event: FTP success page titles */
#titles ftpsuccess {
	background-color:#00ff00;
	width:100%;
}

/* Page displayed body content area */
#content {
	padding: 10px;
	background: #ffffff;
}

/* General text */
p {
}

/* error brief description */
#error p {
}

/* some data which may have caused the problem */
#data {
}

/* the error message received from the system or other software */
#sysmsg {
}

pre {
}

/* special event: FTP / Gopher directory listing */
#dirmsg {
    font-family: courier, monospace;
    color: black;
    font-size: 10pt;
}
#dirlisting {
    margin-left: 2%;
    margin-right: 2%;
}
#dirlisting tr.entry td.icon,td.filename,td.size,td.date {
    border-bottom: groove;
}
#dirlisting td.size {
    width: 50px;
    text-align: right;
    padding-right: 5px;
}

/* horizontal lines */
hr {
	margin: 0;
}

/* page displayed footer area */
#footer {
	font-size: 9px;
	padding-left: 10px;
}


body
:lang(fa) { direction: rtl; font-size: 100%; font-family: Tahoma, Roya, sans-serif; float: right; }
:lang(he) { direction: rtl; }
 --></style>
</head><body id=ERR_READ_ERROR>
<div id="titles">
<h1>ERROR</h1>
<h2>The requested URL could not be retrieved</h2>
</div>
<hr>

<div id="content">
<p>The following error was encountered while trying to retrieve the URL: <a href="https://www.youtube.com/oembed?">https://www.youtube.com/oembed?</a></p>

<blockquote id="error">
<p><b>Read Error</b></p>
</blockquote>

<p id="sysmsg">The system returned: <i>[No Error]</i></p>

<p>An error condition occurred while reading data from the network. Please retry your request.</p>

<p>Your cache administrator is <a href="mailto:webmaster?subject=CacheErrorInfo%20-%20ERR_READ_ERROR&amp;body=CacheHost%3A%20squid1%0D%0AErrPage%3A%20ERR_READ_ERROR%0D%0AErr%3A%20%5Bnone%5D%0D%0ATimeStamp%3A%20Wed,%2020%20Jan%202021%2004%3A23%3A13%20GMT%0D%0A%0D%0AClientIP%3A%20196.3.0.53%0D%0AServerIP%3A%20www.youtube.com%0D%0A%0D%0AHTTP%20Request%3A%0D%0AGET%20%2Foembed%3Furl%3Dhttps%253A%2F%2Fwww.youtube.com%2Fwatch%253Fv%253DCoBcoVGxrFU%26format%3Djson%20HTTP%2F1.0%0AUser-Agent%3A%20Drupal%20(+http%3A%2F%2Fdrupal.org%2F)%0D%0AX-Forwarded-For%3A%2010.20.21.237%0D%0AHost%3A%20www.youtube.com%0D%0A%0D%0A%0D%0A">webmaster</a>.</p>
<br>
</div>

<hr>
<div id="footer">
<p>Generated Wed, 20 Jan 2021 04:23:13 GMT by squid1 (squid/4.10)</p>
<!-- ERR_READ_ERROR -->
</div>
</body></html>

I should note that I am behind a Proxy Server being run on Squid. However, when I try to use "curl" at the command line on my server to retrieve the same YouTube link, it returns the JSON output. But once I use the Drupal UI to try to add that video I get the 502 Bad Gateway error. The curl request also goes through the same Squid Proxy Server so I'm really not sure why it doesn't work in the Drupal UI. Any ideas?

stefan.korn’s picture

Drupal 7 and Proxy never really got best friends ...

You can maybe give this module a try: https://www.drupal.org/project/chr

axle_foley00’s picture

@stefan.korn:

That works! Thank you!

solideogloria’s picture

Then it must be a header or some setting that was wrong.

If you decide you want to figure out why it didn't work, look at common.inc at the source code of drupal_http_request(), and try stepping through with debug messages to see if everything was as you expected.

amitajgaonkar’s picture

StatusFileSize
new3.22 KB

Patch for 7.x.3.0

solideogloria’s picture

This issue has already been fixed in dev. See the commits above.

Status: Fixed » Closed (fixed)

Automatically closed - issue fixed for 2 weeks with no activity.