nativescript-youtube-parser
Version:
Simple YouTube video parser
612 lines (601 loc) • 14.6 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", { value: true });
// http://en.wikipedia.org/wiki/YouTube#Quality_and_formats
export const FORMATS = {
'5': {
container: 'flv',
resolution: '240p',
encoding: 'Sorenson H.283',
profile: null,
bitrate: '0.25',
audioEncoding: 'mp3',
audioBitrate: 64
},
'6': {
container: 'flv',
resolution: '270p',
encoding: 'Sorenson H.263',
profile: null,
bitrate: '0.8',
audioEncoding: 'mp3',
audioBitrate: 64
},
'13': {
container: '3gp',
resolution: null,
encoding: 'MPEG-4 Visual',
profile: null,
bitrate: '0.5',
audioEncoding: 'aac',
audioBitrate: null
},
'17': {
container: '3gp',
resolution: '144p',
encoding: 'MPEG-4 Visual',
profile: 'simple',
bitrate: '0.05',
audioEncoding: 'aac',
audioBitrate: 24
},
'18': {
container: 'mp4',
resolution: '360p',
encoding: 'H.264',
profile: 'baseline',
bitrate: '0.5',
audioEncoding: 'aac',
audioBitrate: 96
},
'22': {
container: 'mp4',
resolution: '720p',
encoding: 'H.264',
profile: 'high',
bitrate: '2-3',
audioEncoding: 'aac',
audioBitrate: 192
},
'34': {
container: 'flv',
resolution: '360p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.5',
audioEncoding: 'aac',
audioBitrate: 128
},
'35': {
container: 'flv',
resolution: '480p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.8-1',
audioEncoding: 'aac',
audioBitrate: 128
},
'36': {
container: '3gp',
resolution: '240p',
encoding: 'MPEG-4 Visual',
profile: 'simple',
bitrate: '0.175',
audioEncoding: 'aac',
audioBitrate: 36
},
'37': {
container: 'mp4',
resolution: '1080p',
encoding: 'H.264',
profile: 'high',
bitrate: '3-5.9',
audioEncoding: 'aac',
audioBitrate: 192
},
'38': {
container: 'mp4',
resolution: '3072p',
encoding: 'H.264',
profile: 'high',
bitrate: '3.5-5',
audioEncoding: 'aac',
audioBitrate: 192
},
'43': {
container: 'webm',
resolution: '360p',
encoding: 'VP8',
profile: null,
bitrate: '0.5',
audioEncoding: 'vorbis',
audioBitrate: 128
},
'44': {
container: 'webm',
resolution: '480p',
encoding: 'VP8',
profile: null,
bitrate: '1',
audioEncoding: 'vorbis',
audioBitrate: 128
},
'45': {
container: 'webm',
resolution: '720p',
encoding: 'VP8',
profile: null,
bitrate: '2',
audioEncoding: 'vorbis',
audioBitrate: 192
},
'46': {
container: 'webm',
resolution: '1080p',
encoding: 'vp8',
profile: null,
bitrate: null,
audioEncoding: 'vorbis',
audioBitrate: 192
},
'82': {
container: 'mp4',
resolution: '360p',
encoding: 'H.264',
profile: '3d',
bitrate: '0.5',
audioEncoding: 'aac',
audioBitrate: 96
},
'83': {
container: 'mp4',
resolution: '240p',
encoding: 'H.264',
profile: '3d',
bitrate: '0.5',
audioEncoding: 'aac',
audioBitrate: 96
},
'84': {
container: 'mp4',
resolution: '720p',
encoding: 'H.264',
profile: '3d',
bitrate: '2-3',
audioEncoding: 'aac',
audioBitrate: 192
},
'85': {
container: 'mp4',
resolution: '1080p',
encoding: 'H.264',
profile: '3d',
bitrate: '3-4',
audioEncoding: 'aac',
audioBitrate: 192
},
'100': {
container: 'webm',
resolution: '360p',
encoding: 'VP8',
profile: '3d',
bitrate: null,
audioEncoding: 'vorbis',
audioBitrate: 128
},
'101': {
container: 'webm',
resolution: '360p',
encoding: 'VP8',
profile: '3d',
bitrate: null,
audioEncoding: 'vorbis',
audioBitrate: 192
},
'102': {
container: 'webm',
resolution: '720p',
encoding: 'VP8',
profile: '3d',
bitrate: null,
audioEncoding: 'vorbis',
audioBitrate: 192
},
// DASH (video only)
'133': {
container: 'mp4',
resolution: '240p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.2-0.3',
audioEncoding: null,
audioBitrate: null
},
'134': {
container: 'mp4',
resolution: '360p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.3-0.4',
audioEncoding: null,
audioBitrate: null
},
'135': {
container: 'mp4',
resolution: '480p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.5-1',
audioEncoding: null,
audioBitrate: null
},
'136': {
container: 'mp4',
resolution: '720p',
encoding: 'H.264',
profile: 'main',
bitrate: '1-1.5',
audioEncoding: null,
audioBitrate: null
},
'137': {
container: 'mp4',
resolution: '1080p',
encoding: 'H.264',
profile: 'high',
bitrate: '2-3',
audioEncoding: null,
audioBitrate: null
},
'138': {
container: 'mp4',
resolution: '2160p',
encoding: 'H.264',
profile: 'high',
bitrate: '13.5',
audioEncoding: null,
audioBitrate: null
},
'160': {
container: 'mp4',
resolution: '144p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.1',
audioEncoding: null,
audioBitrate: null
},
'242': {
container: 'webm',
resolution: '240p',
encoding: 'VP9',
profile: null,
bitrate: '0.14',
audioEncoding: null,
audioBitrate: null
},
'243': {
container: 'webm',
resolution: '360p',
encoding: 'VP9',
profile: null,
bitrate: '0.26',
audioEncoding: null,
audioBitrate: null
},
'244': {
container: 'webm',
resolution: '480p',
encoding: 'VP9',
profile: null,
bitrate: '0.585',
audioEncoding: null,
audioBitrate: null
},
'247': {
container: 'webm',
resolution: '720p',
encoding: 'VP9',
profile: null,
bitrate: '1.184',
audioEncoding: null,
audioBitrate: null
},
'248': {
container: 'webm',
resolution: '1080p',
encoding: 'VP9',
profile: null,
bitrate: '1.895',
audioEncoding: null,
audioBitrate: null
},
'264': {
container: 'mp4',
resolution: '1440p',
encoding: 'H.264',
profile: 'high',
bitrate: '4-5',
audioEncoding: null,
audioBitrate: null
},
'266': {
container: 'mp4',
resolution: '2160p',
encoding: 'H.264',
profile: 'high',
bitrate: '12.5-13.5',
audioEncoding: null,
audioBitrate: null
},
'271': {
container: 'webm',
resolution: '1440p',
encoding: 'VP9',
profile: null,
bitrate: '9',
audioEncoding: null,
audioBitrate: null
},
'272': {
container: 'webm',
resolution: '2160p',
encoding: 'VP9',
profile: null,
bitrate: '20',
audioEncoding: null,
audioBitrate: null
},
'278': {
container: 'webm',
resolution: '144p',
encoding: 'VP9',
profile: null,
bitrate: '0.08',
audioEncoding: null,
audioBitrate: null
},
'298': {
container: 'mp4',
resolution: '720p',
encoding: 'H.264',
profile: 'main',
bitrate: '3-3.5',
audioEncoding: null,
audioBitrate: null
},
'299': {
container: 'mp4',
resolution: '1080p',
encoding: 'H.264',
profile: 'high',
bitrate: '5.5',
audioEncoding: null,
audioBitrate: null
},
'302': {
container: 'webm',
resolution: '720p',
encoding: 'VP9',
profile: null,
bitrate: '2.5',
audioEncoding: null,
audioBitrate: null
},
'303': {
container: 'webm',
resolution: '1080p',
encoding: 'VP9',
profile: null,
bitrate: '5',
audioEncoding: null,
audioBitrate: null
},
// DASH (audio only)
'139': {
container: 'mp4',
resolution: null,
encoding: null,
profile: null,
bitrate: null,
audioEncoding: 'aac',
audioBitrate: 48
},
'140': {
container: 'mp4',
resolution: null,
encoding: null,
profile: null,
bitrate: null,
audioEncoding: 'aac',
audioBitrate: 128
},
'141': {
container: 'mp4',
resolution: null,
encoding: null,
profile: null,
bitrate: null,
audioEncoding: 'aac',
audioBitrate: 256
},
'171': {
container: 'webm',
resolution: null,
encoding: null,
profile: null,
bitrate: null,
audioEncoding: 'vorbis',
audioBitrate: 128
},
'172': {
container: 'webm',
resolution: null,
encoding: null,
profile: null,
bitrate: null,
audioEncoding: 'vorbis',
audioBitrate: 192
},
// Live streaming
'92': {
container: 'ts',
resolution: '240p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.15-0.3',
audioEncoding: 'aac',
audioBitrate: 48
},
'93': {
container: 'ts',
resolution: '480p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.5-1',
audioEncoding: 'aac',
audioBitrate: 128
},
'94': {
container: 'ts',
resolution: '720p',
encoding: 'H.264',
profile: 'main',
bitrate: '0.8-1.25',
audioEncoding: 'aac',
audioBitrate: 128
},
'95': {
container: 'ts',
resolution: '1080p',
encoding: 'H.264',
profile: 'main',
bitrate: '1.5-3',
audioEncoding: 'aac',
audioBitrate: 256
},
'96': {
container: 'ts',
resolution: '720p',
encoding: 'H.264',
profile: 'main',
bitrate: '2.5-6',
audioEncoding: 'aac',
audioBitrate: 256
},
'120': {
container: 'flv',
resolution: '720p',
encoding: 'H.264',
profile: 'Main@L3.1',
bitrate: '2',
audioEncoding: 'aac',
audioBitrate: 128
},
'127': {
container: 'ts',
resolution: null,
encoding: null,
profile: null,
bitrate: null,
audioEncoding: 'aac',
audioBitrate: 96
},
'128': {
container: 'ts',
resolution: null,
encoding: null,
profile: null,
bitrate: null,
audioEncoding: 'aac',
audioBitrate: 96
},
'132': {
container: 'ts',
resolution: '240p',
encoding: 'H.264',
profile: 'baseline',
bitrate: '0.15-0.2',
audioEncoding: 'aac',
audioBitrate: 48
},
'151': {
container: 'ts',
resolution: '720p',
encoding: 'H.264',
profile: 'baseline',
bitrate: '0.05',
audioEncoding: 'aac',
audioBitrate: 24
}
};
export const URL = {
parseURL: parseURL,
parseQuery: parseQuery
};
function parseQuery(url) {
var parts, subpart, name, value, index,
obj = {};
if (!url) {
return obj;
}
if (url[0] === '?') {
url = url.substring(1);
}
parts = url.split('&');
for (var i = 0, il = parts.length; i < il; i++) {
subpart = parts[i];
index = subpart.indexOf('=');
if (index === -1) {
obj[decodeURIComponent(subpart)] = '';
continue;
}
name = subpart.substring(0, index);
if (name) {
value = subpart.substring(index + 1);
obj[decodeURIComponent(name)] = value || '';
}
}
return obj;
}
function parseURL(url) {
var isRelative = /^(ftp|file|gopher|https?|wss?)(:|$)/.test(url),
urlRegex, urlMatch, authorityRegex, authorityMatch;
var ALPHA = 'a-zA-Z';
var DIGIT = '0-9';
var SUB_DELIMITERS = '\!\$&\'\(\)\*\+\,;\=\\[\\]';
var UNRESERVED = ALPHA + DIGIT + '\-\._~';
var SCHEME = '(([' + ALPHA + ']+[' + ALPHA + DIGIT + '\+\-\.' + ']*):)';
var PATH = '([' + SUB_DELIMITERS + UNRESERVED + '@%\:\/ ' + ']*)';
var QUERY = '(\\?([' + SUB_DELIMITERS + UNRESERVED + '@%\:\/\? ' + ']*))?';
var FRAGMENT = '(#([' + SUB_DELIMITERS + UNRESERVED + '@%\:\/\? ' + ']*))?';
if (isRelative) {
urlRegex = new RegExp('^' + SCHEME + '(\/\/([^/?#]*))?' + PATH + QUERY + FRAGMENT + '$');
authorityRegex = new RegExp('^((([' + SUB_DELIMITERS + UNRESERVED + '%' + ']+)?(:([' +
SUB_DELIMITERS + UNRESERVED + '%\:' + ']*))?)@)?' + '([' + SUB_DELIMITERS +
UNRESERVED + '%' + ']*)?(:([' + DIGIT + ']+))?$');
} else {
urlRegex = /^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/;
authorityRegex = /^((([^:/?#@]+)?(:([^/?#@]*))?)@)?([^/?#:]*)?(:([0-9]+))?$/;
}
urlMatch = url.match(urlRegex);
if (!urlMatch) {
return null;
}
authorityMatch = urlMatch[4] && urlMatch[4].match(authorityRegex);
if (!authorityMatch) {
return null;
}
return {
scheme: urlMatch[2] || '',
path: urlMatch[5] || '',
search: urlMatch[7] || '',
fragment: urlMatch[9] || '',
query: parseQuery(urlMatch[7]),
username: authorityMatch[3] || '',
password: authorityMatch[5] || '',
hostname: authorityMatch[6] || '',
port: authorityMatch[8] || '',
host: authorityMatch[6] + (authorityMatch[8] ? ':' + authorityMatch[8] : ''),
schemeData: url.slice(urlMatch[2].length + 1)
};
}