'''
// UserScript
// @name ZXDL
// @namespace http://zoox18.com/
// @version 1.5.3
// @description View and download private videos from ZX18.
// @author Narkuh
// @match http://.zoox18.com/*
// @connect pastebin.com
// @grant GM_download
// @grant GM_xmlhttpRequest
// @require http://code.jquery.com/jquery-3.4.1.min.js
// @require https://cdn.plyr.io/3.5.6/plyr.js
// /UserScript
/**********/
/ This program is free software. It comes without any warranty, to /
/ the extent permitted by applicable law. You can redistribute it /
/ and/or modify it under the terms of the Do What The Fuck You Want /
/ To Public License, Version 2. /
/ See http://www.wtfpl.net/ for more details. /
/***********/
var id = window.location.pathname.split("/")[2];
var key0 = "";
var key1 = "";
var key2 = "";
var paths = [];
var downloading = false;
var found = false;
var isPrivateWindow = false;
var vidUrl = '';
var uploader = 'Unknown';
var title = 'Unknown';
var description = 'None';
var linkCheckThisSession = false;
$('.navbar').after('<div class="container" id="rip-div" style="width: 560px;"></div>')
$('.top-menu > .pull-left').append('<li id="zxdl-header"><span id="zx-ver">ZXDL 1.5.3</span><span><a data-toggle="modal" href="#zxdl-modal"><span class="caret"></span></span></a></li>');
$('body').append('<div class="modal fade in" id="zxdl-modal"><div class="modal-dialog zxdl-modal"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h4 class="modal-title">ZXDL</h4> </div> <div class="modal-body">Version 1.5.3 | by Lowfo and Narkuh<br><span class="link-status"></span></div></div></div></div>');
// Remove annoyances
document.querySelectorAll('.img-private').forEach(elm => elm.style.filter = 'brightness(1)');
document.querySelectorAll('.label-private').forEach(elm => elm.style.filter = 'opacity(0.5)');
// Functions
function formatBytes(a,b=2) {
if (0===a) return "0 bytes";
const c=0>b?0:b,d = Math.floor(Math.log(a) / Math.log(1024));
return parseFloat((a / Math.pow(1024, d)).toFixed(c)) + " " +["bytes","KB","MB","GB"][d];
}
function dl_progress(res) {
if (res.lengthComputable === false) return;
$('#dl-data').html(formatBytes(res.done) +' / '+ formatBytes(res.total));
$('#dl-bar').attr("aria-valuenow", Math.floor(res.done / res.total * 100));
$('#dl-bar').css("width", Math.floor(res.done / res.total * 100) + "%");
$('#dl-bar').html(Math.floor(res.done / res.total * 100) + "%");
}
function dl_load(res) {
if (res.lengthComputable === false) return;
$('#dl-data').html("Complete!");
$('#dl-bar').addClass("progress-bar-success");
}
function dl_error(res) {
if (res.lengthComputable === false) return;
$('#dl-data').html("Oops, there was an error. Refresh page to try again");
$('#dl-bar').addClass("progress-bar-danger");
}
function chkPrnt(url, cb) {
$.ajax({
url: url,
dataType: 'jsonp',
type: 'GET',
complete: function (xhr) {
if (typeof cb === 'function') {
cb.apply(this, [xhr.status]);
}
}
});
}
function menuLinkCheck(){
if (!linkCheckThisSession){
linkCheckThisSession = true
for (let i = 0; i < paths.length; i++) {
let pstrip = paths[i].substring(0, paths[i].lastIndexOf("/"));
$('#zxdl-modal .link-status').append('<div class="link-'+i+'">Link '+(i+1)+':</div>')
chkPrnt(pstrip, function (status) {
if (status === 200) {
$('#zxdl-modal .link-'+i).append(' <i class="fa fa-check"></i>')
} else {
$('#zxdl-modal .link-'+i).append(' <i class="fa fa-times"></i>')
}
});
}
}
}
function scan(url) {
if (found == false){
var v = document.createElement('VIDEO');
v.addEventListener('loadeddata', function () { // If video found
console.log('ZXDL: Video found! ' + url);
found = true;
vidUrl = url;
}
function getItems(getLinksToo) {
return new Promise(resolve => {
try {
GM_xmlhttpRequest({
method: "GET",
url: "https://pastebin.com/raw/pnEwmQ2f",
headers: {
"Cache-Control": "max-age=1200, must-revalidate"
},
onload: function(response) {
var json = JSON.parse(response.responseText);
if (getLinksToo) {
key0 = json.key0
key1 = json.key1
key2 = json.key2
paths = [atob(json.host0)+key0+'/media/videos/h264/'+id+'_SD.mp4', atob(json.host1)+key1+'/media/videos/h264/'+id+'_SD.mp4', atob(json.host2)+key2+'/media/videos/iphone/'+id+'.mp4', atob(json.host2)+key2+'/media/videos/h264/'+id+'_SD.mp4']
resolve()
}
if (json.revision) {
$("#zx-ver").append("."+json.revision)
}
if (json.announcement) {
$("#zxdl-header").append('<div style="display:inline; width: 100%;font-size:11px;margin-left:10px;background: #252e51;padding: 2px 5px;color: white;"><i class="fa fa-info-circle"></i> '+json.announcement+'</div>')
}
}
});
}
catch (err) {
alert("ZXDL: There was an error retrieving links for this session. Try refreshing the page, otherwise if you keep receiving this message, please contact us")
}
})
}
// On load
async function init() {
};
$( "a[href='#zxdl-modal']" ).click(function() {
menuLinkCheck();
});
window.onload=init();
'''