|
|
|
|
|
|
|
|
|
|
|
const shared = (function () { |
|
|
'use strict'; |
|
|
|
|
|
const patterns = { |
|
|
video_id: [ |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/watch\?v=([\w_-]+)(?:[\/&].*)?/i, |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/(?:v|embed|shorts|video|watch|live)\/([\w_-]+)(?:[\/&].*)?/i, |
|
|
/(?:http[s]?:\/\/)?youtu.be\/([\w_-]+)(?:\?.*)?/i, |
|
|
/(?:http[s]?:\/\/)?filmot.com\/video\/([\w_-]+)(?:[?\/&].*)?/i, |
|
|
/(?:http[s]?:\/\/)?filmot.com\/sidebyside\/([\w_-]+)(?:[?\/&].*)?/i, |
|
|
/^([\w-]{11})$/i |
|
|
], |
|
|
playlist_id: [ |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/playlist\?list=([\w_-]+)(?:&.*)?/i, |
|
|
/^((UU|UUSH|PL|FL|SP|OLAK)[A-Za-z0-9_-]+)$/i |
|
|
], |
|
|
channel_id: [ |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/channel\/([\w_-]+)(?:\?.*)?/i, |
|
|
/(?:http[s]?:\/\/)?filmot.com\/channel\/([\w_-]+)(?:[?\/&].*)?/i, |
|
|
/^((UC|SC)[\w-]{22})$/i |
|
|
], |
|
|
channel_user: [ |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/user\/([\w_-]+)(?:\?.*)?/i |
|
|
], |
|
|
channel_handle: [ |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/@([^\/?]+)(?:\?.*)?/i, |
|
|
], |
|
|
channel_custom: [ |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/c\/([^\/?]+)(?:\?.*)?/i, |
|
|
/(?:http[s]?:\/\/)?(?:\w+\.)?youtube.com\/([^\/?]+)(?:\?.*)?/i |
|
|
] |
|
|
}; |
|
|
|
|
|
return { |
|
|
|
|
|
|
|
|
|
|
|
idx: (p, o) => p.reduce((xs, x) => (xs && xs[x]) ? xs[x] : null, o), |
|
|
|
|
|
determineInput: function (value) { |
|
|
value = decodeURIComponent(value); |
|
|
const parsed = { |
|
|
type: 'unknown', |
|
|
mayHideOthers: true, |
|
|
original: value |
|
|
}; |
|
|
for (let type in patterns) { |
|
|
for (let i = 0; i < patterns[type].length; i++) { |
|
|
const regex = patterns[type][i]; |
|
|
const result = regex.exec(value); |
|
|
|
|
|
if (result) { |
|
|
parsed.type = type; |
|
|
parsed.value = result[1]; |
|
|
return parsed; |
|
|
} |
|
|
} |
|
|
} |
|
|
return parsed; |
|
|
}, |
|
|
|
|
|
|
|
|
isValidVideoId: function (videoId) { |
|
|
return videoId !== undefined && videoId !== null && |
|
|
String(videoId).match(/[A-Za-z0-9_-]{10}[AEIMQUYcgkosw048]/); |
|
|
}, |
|
|
|
|
|
isValidChannelId: function (channelId) { |
|
|
return channelId !== undefined && channelId !== null && |
|
|
String(channelId).match(/[A-Za-z0-9_-]{21}[AQgw]/); |
|
|
}, |
|
|
|
|
|
parseQuery: function (queryString) { |
|
|
const query = {}; |
|
|
const pairs = (queryString[0] === '?' ? queryString.substr(1) : queryString).split('&'); |
|
|
for (let i = 0; i < pairs.length; i++) { |
|
|
let pair = pairs[i].split('='); |
|
|
query[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1] || ''); |
|
|
} |
|
|
return query; |
|
|
}, |
|
|
|
|
|
formatDuration: function (duration, includeMs, ignoreTime) { |
|
|
const years = duration.years(); |
|
|
const months = duration.months(); |
|
|
const days = duration.days(); |
|
|
const hours = duration.hours(); |
|
|
const minutes = duration.minutes(); |
|
|
const seconds = duration.seconds(); |
|
|
const millis = duration.milliseconds(); |
|
|
const format = [ |
|
|
(years > 0 ? years + " years" : ""), |
|
|
(months > 0 ? months + " months" : ""), |
|
|
(days > 0 ? days + " days" : ""), |
|
|
(!ignoreTime && hours > 0 ? hours + "h" : ""), |
|
|
(!ignoreTime && minutes > 0 ? minutes + "m" : ""), |
|
|
(!ignoreTime && seconds > 0 ? seconds + "s" : ""), |
|
|
includeMs ? (millis > 0 ? millis + "ms" : "") : "" |
|
|
].join(" "); |
|
|
|
|
|
if (format.trim() === "") { |
|
|
return "0s"; |
|
|
} |
|
|
|
|
|
return format; |
|
|
}, |
|
|
|
|
|
sortObject: function (unordered, sortArrays = false) { |
|
|
if (!unordered || typeof unordered !== 'object') { |
|
|
return unordered; |
|
|
} |
|
|
|
|
|
if (Array.isArray(unordered)) { |
|
|
const newArr = unordered.map((item) => this.sortObject(item, sortArrays)); |
|
|
if (sortArrays) { |
|
|
newArr.sort(); |
|
|
} |
|
|
return newArr; |
|
|
} |
|
|
|
|
|
const ordered = {}; |
|
|
Object.keys(unordered) |
|
|
.sort() |
|
|
.forEach((key) => { |
|
|
ordered[key] = this.sortObject(unordered[key], sortArrays); |
|
|
}); |
|
|
return ordered; |
|
|
}, |
|
|
|
|
|
safeFileName: function (fileName) { |
|
|
return fileName.replace(/[<>:"\/\\|?*]+/g, ''); |
|
|
}, |
|
|
|
|
|
randomFromList(list) { |
|
|
let index = 0; |
|
|
for (let i = 0; i < 5; i++) { |
|
|
index = rando(0, list.length - 1); |
|
|
} |
|
|
return list[index]; |
|
|
} |
|
|
} |
|
|
})(); |
|
|
|