สคริปต์นี้ไม่ควรถูกติดตั้งโดยตรง มันเป็นคลังสำหรับสคริปต์อื่น ๆ เพื่อบรรจุด้วยคำสั่งเมทา // @require https://update.greasyfork.org/scripts/2859/30624/Video%20Url%20Parser.js
// ==UserScript==
// @name Video Url Parser
// @namespace Zod-
// @description urlParser to get extract information like provider, videoId and other from urls
// @source https://github.com/Zod-/jsVideoUrlParser
// @copyright Zod-
// @version 0.5
// @license MIT
// ==/UserScript==
function URLParser() {
"use strict";
this.plugins = {};
}
URLParser.prototype.parse = function(url) {
"use strict";
var th = this,
match = url.match(/(?:https?:\/\/)?(?:[^\.]+\.)?(\w+)\./i),
provider = match ? match[1] : undefined,
result,
createdUrl;
if (match && provider && th.plugins[provider]) {
result = th.plugins[provider].parse.call(this, url);
if (result) {
result.provider = th.plugins[provider].provider;
return result;
}
}
return undefined;
};
URLParser.prototype.bind = function(plugin) {
var th = this;
th.plugins[plugin.provider] = plugin;
if (plugin.alternatives) {
var i;
for (i = 0; i < plugin.alternatives.length; i += 1) {
th.plugins[plugin.alternatives[i]] = plugin;
}
}
};
URLParser.prototype.create = function(op) {
var th = this,
vi = op.videoInfo;
op.format = op.format || 'short';
if (th.plugins[vi.provider].create) {
return th.plugins[vi.provider].create.call(this, op);
}
return undefined;
};
window.urlParser = new URLParser();
//parses strings like 1h30m20s to seconds
window.getTime = function(timeString) {
"use strict";
var totalSeconds = 0,
timeValues = {
's': 1,
'm': 1 * 60,
'h': 1 * 60 * 60,
'd': 1 * 60 * 60 * 24,
'w': 1 * 60 * 60 * 24 * 7
},
timePairs;
//is the format 1h30m20s etc
if (!timeString.match(/^(\d+[smhdw]?)+$/)) {
return 0;
}
//expand to "1 h 30 m 20 s" and split
timeString = timeString.replace(/([smhdw])/g, ' $1 ').trim();
timePairs = timeString.split(' ');
for (var i = 0; i < timePairs.length; i += 2) {
totalSeconds += parseInt(timePairs[i], 10) * timeValues[timePairs[i + 1] || 's'];
}
return totalSeconds;
}
//http://joquery.com/2012/string-format-for-javascript
if (typeof String.prototype.format !== 'function') {
String.prototype.format = function() {
// The string containing the format items (e.g. "{0}")
// will and always has to be the first argument.
var theString = this,
i,
regEx;
// start with the second argument (i = 1)
for (i = 0; i < arguments.length; i += 1) {
// "gm" = RegEx options for Global search (more than one instance)
// and for Multiline search
regEx = new RegExp("\\{" + (i) + "\\}", "gm");
theString = theString.replace(regEx, arguments[i]);
}
return theString;
};
}
urlParser.bind({
'provider': 'dailymotion',
'alternatives': ['dai'],
'parse': function(url) {
"use strict";
var match,
id,
startTime,
result = {};
match = url.match(/(?:\/video|ly)\/([A-Za-z0-9]+)/i);
id = match ? match[1] : undefined;
match = url.match(/[#\?&]start=([A-Za-z0-9]+)/i);
startTime = match ? getTime(match[1]) : undefined;
if (!id) {
return undefined;
}
result.mediaType = 'video';
result.id = id;
if (startTime) {
result.startTime = startTime;
}
return result;
},
'create': function(op) {
"use strict";
var vi = op.videoInfo;
if (vi.startTime) {
return 'https://www.dailymotion.com/video/{0}?start={1}'.format(vi.id, vi.startTime);
}
if (op.format === 'short') {
return 'https://dai.ly/{0}'.format(vi.id);
}
return 'https://www.dailymotion.com/video/{0}'.format(vi.id);
}
});
//not finished
urlParser.bind({
'provider': 'livestream',
'parse': function(url) {
"use strict";
var match,
channel;
match = url.match(/livestream\.com\/(\w+)/i);
channel = match ? match[1] : undefined;
if (!channel) {
return undefined;
}
return {
'mediaType': 'stream',
'channel': channel
};
}
});
urlParser.bind({
'provider': 'twitch',
'parse': function(url) {
"use strict";
var match,
id,
channel,
idPrefix,
result = {};
match = url.match(/twitch\.tv\/(\w+)(?:\/(.)\/(\d+))?/i);
channel = match ? match[1] : undefined;
idPrefix = match ? match[2] : undefined;
id = match ? match[3] : undefined;
match = url.match(/(?:\?channel|\&utm_content)=(\w+)/i);
channel = match ? match[1] : channel;
if (!channel) {
return undefined;
}
if (id) {
result.mediaType = 'video';
result.id = id;
result.idPrefix = idPrefix;
} else {
result.mediaType = 'stream';
}
result.channel = channel;
return result;
},
'create': function(op) {
"use strict";
var url,
vi = op.videoInfo;
if (vi.mediaType === 'stream') {
return 'https://twitch.tv/{0}'.format(vi.channel);
}
return 'https://twitch.tv/{0}/{1}/{2}'.format(vi.channel, vi.idPrefix, vi.id);
}
});
urlParser.bind({
'provider': 'vimeo',
'alternatives': ['vimeopro'],
'parse': function(url) {
"use strict";
var match,
id;
match = url.match(/(?:\/(?:channels\/[\w]+|(?:album\/\d+\/)?videos?))?\/(\d+)/i);
id = match ? match[1] : undefined;
if (!id) {
return undefined;
}
return {
'mediaType': 'video',
'id': id
};
},
'create': function(op) {
"use strict";
return 'https://vimeo.com/{0}'.format(op.videoInfo.id);
}
});
urlParser.bind({
'provider': 'youtube',
'alternatives': ['youtu'],
'parse': function(url) {
"use strict";
var match,
id,
playlistId,
playlistIndex,
startTime,
result = {};
match = url.match(/(?:(?:v|be|videos)\/|v=)([\w\-]{11})/i);
id = match ? match[1] : undefined;
match = url.match(/list=([\w\-]+)/i);
playlistId = match ? match[1] : undefined;
match = url.match(/index=(\d+)/i);
playlistIndex = match ? Number(match[1]) : undefined;
match = url.match(/[#\?&](?:star)?t=([A-Za-z0-9]+)/i);
startTime = match ? getTime(match[1]) : undefined;
if (id) {
result.mediaType = 'video';
result.id = id;
if (playlistId) {
result.playlistId = playlistId;
if (playlistIndex) {
result.playlistIndex = playlistIndex;
}
}
if (startTime) {
result.startTime = startTime;
}
} else if (playlistId) {
result.mediaType = 'playlist';
result.playlistId = playlistId;
} else {
return undefined;
}
return result;
},
'create': function(op) {
"use strict";
var url,
vi = op.videoInfo;
if (vi.mediaType === 'playlist') {
return 'https://www.youtube.com/playlist?feature=share&list={0}'.format(vi.playlistId);
}
if (vi.playlistId) {
url = 'https://www.youtube.com/watch?v={0}&list={1}'.format(vi.id, vi.playlistId);
if (vi.playlistIndex) {
url += '&index={0}'.format(vi.playlistIndex);
}
} else {
if (op.format === 'short') {
url = 'https://youtu.be/{0}'.format(vi.id);
} else {
url = 'https://www.youtube.com/watch?v={0}'.format(vi.id);
}
}
if (vi.startTime) {
url += '#t={0}'.format(vi.startTime);
}
return url;
}
});