This AS3 library can parse standard youtube links like https://www.youtube.com/watch?v=QowwaefoCec and will extract different elements of that video like available direct video addresses, video title and video thumbnail. It works with public unrestricted video files only.
I must add that I wrote this library after being inspired by https://github.com/jeckman/YouTube-Downloader
It works on Android/iOS/Windows/Mac AIR projects.
USAGE:
import com.doitflash.remote.youtube.YouTubeLinkParser;
import com.doitflash.remote.youtube.YouTubeLinkParserEvent;
import com.doitflash.remote.youtube.VideoType;
import com.doitflash.remote.youtube.VideoQuality;
var _ytParser:YouTubeLinkParser = new YouTubeLinkParser();
_ytParser.addEventListener(YouTubeLinkParserEvent.COMPLETE, onComplete);
_ytParser.addEventListener(YouTubeLinkParserEvent.ERROR, onError);
_ytParser.parse("https://www.youtube.com/watch?v=QowwaefoCec");
function onError(e:YouTubeLinkParserEvent):void
{
// removing listeners just for clean cosing reasons!
_ytParser.removeEventListener(YouTubeLinkParserEvent.COMPLETE, onComplete);
_ytParser.removeEventListener(YouTubeLinkParserEvent.ERROR, onError);
trace("Error: " + e.param.msg);
}
function onComplete(e:YouTubeLinkParserEvent):void
{
// removing listeners just for clean coding reasons!
_ytParser.removeEventListener(YouTubeLinkParserEvent.COMPLETE, onComplete);
_ytParser.removeEventListener(YouTubeLinkParserEvent.ERROR, onError);
trace("youTube parse completed...");
trace("video thumb: " + _ytParser.thumb);
trace("video title: " + _ytParser.title);
trace("possible found videos: " + _ytParser.videoFormats.length);
trace("you can only access youtube public videos... no age restriction for example!");
trace("some video formats may be null so you should check their availablily...");
trace("to make your job easier, I built another method called getHeaders() which will load video headers for you! you can know the video size using these header information :) ");
// let's find the VideoType.VIDEO_MP4 video format in VideoQuality.MEDIUM for this video
// NOTICE: you should find your own way of selecting a video format! as different videos may not have all formats or qualities available!
var chosenVideo:String;
for (var i:int = 0; i < _ytParser.videoFormats.length; i++)
{
var currVideoData:Object = _ytParser.videoFormats[i];
if (currVideoData.mimeType.indexOf(VideoType.VIDEO_MP4) > -1 && currVideoData.quality == VideoQuality.MEDIUM)
{
chosenVideo = currVideoData.url;
break;
}
}
_ytParser.addEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_RECEIVED, onHeadersReceived);
_ytParser.addEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_ERROR, onHeadersError);
_ytParser.getHeaders(chosenVideo);
}
function onHeadersError(e:YouTubeLinkParserEvent):void
{
_ytParser.removeEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_RECEIVED, onHeadersReceived);
_ytParser.removeEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_ERROR, onHeadersError);
trace("Error: " + e.param.msg)
}
function onHeadersReceived(event:YouTubeLinkParserEvent):void
{
_ytParser.removeEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_RECEIVED, onHeadersReceived);
_ytParser.removeEventListener(YouTubeLinkParserEvent.VIDEO_HEADER_ERROR, onHeadersError);
var lng:int = event.param.headers.length;
var i:int;
var currHeader:*;
for (i = 0; i < lng; i++ )
{
currHeader = event.param.headers[i];
trace(currHeader.name + " = " + currHeader.value);
}
// ok, we are happy! now let's download this video, like any other file you would download:
download(event.param.url);
}