// ==SiteScript==
// @siteName HighStream(ClipWatching)
// @siteUrl https://highstream.tv/
// @author mayan
// @authorUrl
// @scriptUrl
// @description
// @date 2021/04/04
// @version 0.1.8
// ==/SiteScript==
function CravingSiteScript() {
this._initialize();
}
CravingSiteScript.prototype = {
_xhr: null,
_initialize: function() {},
_getXmlHttpRequest: function() {
if ( this._xhr != null ) {
return this._xhr;
}
var xhr = null;
var these = [
function() { return new XMLHttpRequest(); }
, function() { return new ActiveXObject( "Msxml2.XMLHTTP" ); }
, function() { return new ActiveXObject( "Microsoft.XMLHTTP" ); }
, function() { return new ActiveXObject( "Msxml2.XMLHTTP.4.0" ); }
];
for ( var i = 0, length = these.length; i < length; i++ ) {
var func = these[ i ];
try {
xhr = func();
break;
}
catch( e ) {}
}
this._xhr = xhr;
return this._xhr;
},
_load: function( url, data, method ) {
var req = this._getXmlHttpRequest();
var mtd = ( method == null ) ? "GET" : "POST";
req.open( mtd, url, false );
if ( mtd == "POST" ) {
req.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded" );
}
req.send( data );
return req.responseText;
},
getResponseText: function( url, data, method ) {
return this._load( url, data, method );
},
getResponseJSON: function( url, data, method ) {
var text = this._load( url, data, method );
return eval( "("+text+")" );
},
/// Math
random: function( limit ) {
return Math.floor( Math.random() * limit );
},
/// String
decodeHtml: function( str ) {
return str.replace( /&(quot|#0*34);/ig, "\"" )
.replace( /&(amp|#0*38);/ig, "&" )
.replace( /&(apos|#0*39);/ig, "'" )
.replace( /&(lt|#0*60);/ig, "<" )
.replace( /&(gt|#0*62);/ig, ">" )
.replace( /&(nbsp|#0*160);/ig, " " )
.replace( /&(frasl|#8260);/ig, "/" );
}
}
var _Gbl = {};
_Gbl.showSrt = true;
_Gbl.showM3U = false;
_Gbl.sendM3U = true;
_Gbl.estimateRealUrl = false;
function isSiteUrl( url ) {
if ( url.match( /https?:\/\/(?:www\.)?clipwatching\.com\/embed-[0-9a-z]{12}(?:-\d+x\d+)?\.html/ ) ) return true;
if ( url.match( /https?:\/\/(?:www\.)?clipwatching\.com\/[0-9a-z]{12}(?:\/|\.html|$|[?])/ ) ) return true;
//if ( url.match( /https?:\/\/(?:www\.)?clipw\.live\/embed-[0-9a-z]{12}(?:-\d+x\d+)?\.html/ ) ) return true;
//if ( url.match( /https?:\/\/(?:www\.)?clipw\.live\/[0-9a-z]{12}(?:\/|\.html|$|[?])/ ) ) return true;
if ( url.match( /https?:\/\/(?:www\.)?highstream\.tv\/embed-[0-9a-z]{12}(?:-\d+x\d+)?\.html/ ) ) return true;
if ( url.match( /https?:\/\/(?:www\.)?highstream\.tv\/[0-9a-z]{12}(?:\/|\.html|$|[?])/ ) ) return true;
return false;
}
function getVideoDetail( url ) {
if ( typeof _Gbl !== "object" ) _Gbl = {};
url = url.replace( /^\s*http:\/\//, "https://" );
url = url.replace( /:\/\/www\./, "://" );//www.ありはつながらない
url = url.replace( /:\/\/(?:www\.)?clipwatching\.com\//, "://highstream.tv/" );//2021/04/04現在
if ( url.match( /https?:\/\/(?:www\.)?(clipwatching\.com|highstream\.tv)\/embed-([0-9a-z]{12})(?:-\d+x\d+)?\.html/ ) ) {
var domain = RegExp.$1;
var vid = RegExp.$2;
var type = "embed";
var embedurl = url;
} else
if ( url.match( /https?:\/\/(?:www\.)?(clipwatching\.com|highstream\.tv)\/([0-9a-z]{12})(?:\/|\.html|$|[?])/ ) ) {
domain = RegExp.$1;
vid = RegExp.$2;
type = "page";
var pageurl = url;
} else {
//return null;
type = "unknown";
pageurl = url;
}
var craving = new CravingSiteScript();
var title = "";
var objRef_e = {"url":"", "text": "", "arrSrt":[], "arrM3u":[], "arrMpd":[]};
var objRef_p = {"url":"", "text": "", "arrSrt":[], "arrM3u":[], "arrMpd":[]};
//page優先、type不要
if ( !pageurl && vid ) pageurl = "https://" + domain + "/" + vid + "/dummy.html";
if ( pageurl ) {
objRef_p.url = pageurl;
objRef_p = getDetail_page( pageurl, craving, objRef_p );
if ( objRef_p.realUrl ) {
title = getTitle( objRef_p, objRef_e, vid );
if ( _Gbl.showSrt ) showSrt( objRef_p.arrSrt );
return { "videoUrl0": objRef_p.realUrl, "videoTitle0": title };
}
}
if ( !embedurl && vid ) embedurl = "https://" + domain + "/embed-" + vid + ".html";
if ( embedurl ) {
objRef_e.url = embedurl;
objRef_e = getDetail_embed( embedurl, craving, objRef_e );
if ( objRef_e.realUrl ) {
title = getTitle( objRef_e, objRef_p, vid );
if ( _Gbl.showSrt ) showSrt( objRef_e.arrSrt );
return { "videoUrl0": objRef_e.realUrl, "videoTitle0": title };
}
}
//M3U
var objRef = ( objRef_p.arrM3u.length > 0 )? objRef_p: objRef_e;
if ( objRef.arrM3u.length > 0 ) {
title = getTitle( objRef_p, objRef_e, vid );
if ( _Gbl.showSrt ) showSrt( objRef.arrSrt );
if ( _Gbl.showM3U ) {
var msg = "";
if ( objRef.arrM3u.length > 0 ) {
msg = msg + (msg? "\n\n":"") + "HLS配信のリストファイルがあるかもしれません。\n" + objRef.arrM3u.join( "\n\n" );
}
if ( objRef.arrMpd.length > 0 ) {
msg = msg + (msg? "\n\n":"") + "DASH配信のMPDファイルがあるかもしれません。\n" + objRef.arrMpd.join( "\n\n" );
}
if ( msg ) {
var objBx = new clsMsgBox();
if ( objBx.isOK ) {
objBx.MsgBox( msg, "from clipwatching.site.js", 0 );
}
}
}
if ( _Gbl.estimateRealUrl ) {
var realUrl = estimateRealUrl( objRef.arrM3u );
if ( realUrl ) {
return { videoTitle0: title, videoUrl0: realUrl };
}
}
if ( _Gbl.sendM3U ) {
return { videoTitle0: title, videoUrl0: objRef.arrM3u[0] };
}
}
return null;
function getTitle( objRef_1, objRef_2, vid ) {
var title = objRef_1.title || objRef_2.title;
if ( !title ) title = "highstream_" + ( vid || new Date().getTime() );
title = title.replace(/[\\\/:*?"<>|]/g, "_");
return title;
}
function getDetail_embed( embedurl, craving, objRef ) {
if ( !objRef || typeof objRef != "object" ) objRef = { "url":embedurl, "text":"", "arrSrt":[], "arrM3u":[], "arrMpd":[], "realUrl":"", "title":"", "jw_title":"" };
try {
objRef.text = craving.getResponseText( embedurl );
} catch ( e ) {
objRef.text = "";
var errnum = e.number & 0xffff;
if ( errnum == 5 ) {
var rdurl = getRedirect( embedurl );
if ( rdurl != embedurl ) {
objRef.preurl = objRef.url;
objRef.url = rdurl;
try {
objRef.text = craving.getResponseText( objRef.url );
} catch ( e ) {
objRef.text = "";
}
}
}
}
if ( !objRef.text ) return objRef;
objRef.realUrl = getRealUrl_dean_jw( objRef, true, true );//2020/05/08現在、deanなし
if ( !objRef.realUrl && objRef.arrM3u.length <= 0 && objRef.arrMpd.length <= 0 ) {
objRef.realUrl = getRealUrl_dean_hola( objRef, true, true );//2020/05/08現在、deanなし
}
if ( !objRef.realUrl && objRef.arrM3u.length <= 0 && objRef.arrMpd.length <= 0 ) {
objRef.realUrl = getRealUrl_clappr( objRef, true, true );//2020/04/12現在、deanなし
}
if ( !objRef.title && objRef.jw_title ) {
objRef.title = craving.decodeHtml( objRef.jw_title );
}
return objRef;
}
function getDetail_page( pageurl, craving, objRef ) {
if ( !objRef || typeof objRef != "object" ) objRef = { "url":pageurl, "text":"", "arrSrt":[], "arrM3u":[], "arrMpd":[], "realUrl":"", "title":"", "jw_title":"" };
try {
objRef.text = craving.getResponseText( pageurl );
} catch ( e ) {
objRef.text = "";
var errnum = e.number & 0xffff;
if ( errnum == 5 ) {
var rdurl = getRedirect( pageurl );
if ( rdurl != pageurl ) {
objRef.preurl = objRef.url;
objRef.url = rdurl;
try {
objRef.text = craving.getResponseText( objRef.url );
} catch ( e ) {
objRef.text = "";
}
}
}
}
if ( !objRef.text ) return objRef;
objRef.realUrl = getRealUrl_dean_jw( objRef, true, true );//2021/03/07現在、deanなし
if ( !objRef.realUrl && objRef.arrM3u.length <= 0 && objRef.arrMpd.length <= 0 ) {
objRef.realUrl = getRealUrl_dean_hola( objRef, true, true );//2020/05/08現在、deanなし
}
if ( !objRef.realUrl && objRef.arrM3u.length <= 0 && objRef.arrMpd.length <= 0 ) {
objRef.realUrl = getRealUrl_clappr( objRef, true, true );//2020/04/12現在、deanなし
}
if ( !objRef.title && objRef.text.match( /
]*?)?>\s*(.*?)\s*<\/title\s*>/im ) ) {
objRef.title = craving.decodeHtml( RegExp.$1 ).replace( /^\s*Watch\s*/i,"" );
}
if ( !objRef.title && objRef.jw_title ) {
objRef.title = craving.decodeHtml( objRef.jw_title );
}
return objRef;
}
}
function getRealUrl_dean_jw( objRef, boolDean, boolSrt ) {
//rq:getExtension, setArrSrt
//objRef.arrM3u, objRef.arrMpd
if ( boolSrt === true ) objRef.arrSrt = [];
if ( !( objRef.arrM3u instanceof Array ) ) objRef.arrM3u = [];
if ( !( objRef.arrMpd instanceof Array ) ) objRef.arrMpd = [];
if ( !objRef.text || typeof objRef.text != "string" ) return "";
var objReg_stup = /jwplayer\s*\([^)]*\)\.setup\(([\s\S]*?)\)\s*;/im;
var code = objReg_stup.test( objRef.text )? RegExp.$1: "";
if ( !code && boolDean === true ) {
var objReg_evl = /eval\((\s*function\s*\(\s*p\s*,\s*a\s*,\s*c\s*,\s*k\s*,\s*e\s*,\s*d\s*\)\s*\{[\s\S]*?\.split\(\s*'\|'\s*\)\))\)/gm;
while ( objReg_evl.test( objRef.text ) ) {
var tmp = RegExp.$1;
if ( tmp.match( /jwplayer/ ) ) {
try {
tmp = ( new Function( "var a=" + tmp + ";return a;" ) )();
} catch ( e ) {
tmp = "";
}
if ( tmp && typeof tmp == "string" && objReg_stup.test( tmp ) ) {
code = RegExp.$1;
break;
}
}
}
}
if ( !code || typeof code != "string" ) return "";
code = code.replace( /\r|\n/g,"" );
if ( boolSrt === true ) {
objRef.arrSrt = [];
if ( code.match( /[,{]\s*("|')?tracks\1\s*:\s*(\[[^]]*\])\s*[,}]/m ) ) {
var tracks = RegExp.$2;
var objReg_tracks = /[[,]\s*(\{[^>]*?\})\s*(?=[,\]])/gm;
while ( objReg_tracks.test( tracks ) ) {
var track = RegExp.$1;
var track_file = track.match( /[{,]\s*("|')?file\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
if ( !track_file ) continue;
if ( track_file.match( /\/empty\.srt\s*(?:$|[?])/i ) ) continue;
var track_kind = track.match( /[{,]\s*("|')?kind\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
if ( !track_kind || track_kind.toLowerCase() != "captions" ) continue;
var track_label = track.match( /[{,]\s*("|')?label\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
objRef.arrSrt.push( {"file":track_file, "label":track_label} );
}
} else
if ( code.match( /[{,]\s*("|')?plugins\1\s*:\s*\{\s*("|')?captions-2\2\s*:\s*(\{[^}]*?\})/m ) ) {
var cp2 = RegExp.$3;
var cp2_files = cp2.match( /[{,]\s*("|')?files\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
var cp2_labels = cp2.match( /[{,]\s*("|')?labels\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
if ( cp2_files ) objRef.arrSrt.push( { "file":cp2_files, "label":cp2_labels } );
}
}//srt end
//jw_title
if ( code.match( /[,{]\s*("|')?title\1\s*:\s*("|')(.*?)\2\s*[,}]/m ) ) {
objRef.jw_title = RegExp.$3;
}//jw_title end
code = code.replace( /[,{]\s*("|')?tracks\1\s*:\s*(\[[^]]*\])\s*[,}]/m, "," );
code = code.replace( /("|')?logo\1\s*:\s*\{[^}]*\}/, "" ).replace( /("|')?related\1\s*:\s*\{[^}]*\}/, "" );
var realUrl = "";
if ( code.match( /[,{]\s*("|')?sources\1\s*:\s*(\[[^]]*\])\s*[,}]/m ) ) {
var plst = RegExp.$2;
var objReg = /\{[^}]*\}/gm;
var arrDat = [];
while ( objReg.test( plst ) ) {
var dat = RegExp.lastMatch;
var file = dat.match( /[{,]\s*("|')?file\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
if ( !file ) continue;
var etn = getExtension( file );
if ( etn != "flv" && etn != "mp4" ) continue;
if ( etn == "m3u8" ) {
objRef.arrM3u.push( file );
continue;
}
if ( etn == "mpd" ) {
objRef.arrMpd.push( file );
continue;
}
var label = dat.match( /[{,]\s*("|')?label\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
var rate = label.match( /(\d+)p/i )? parseInt( RegExp.$1, 10 ): 0;
if ( isNaN( rate ) ) rate = 0;
if ( label.toLowerCase() === "sd" ) rate = 480;
if ( label.toLowerCase() === "hd" ) rate = 720;
var obj = {};
obj.file = file;
obj.label = label;
obj.rate = rate;
arrDat.push( obj );
}
if ( arrDat.length > 0 ) {
arrDat.sort( function(a,b){ return b.rate - a.rate; } );
realUrl = arrDat[0].file;
}
}
if ( !realUrl ) {
code = code.replace( /[,{]\s*("|')?sources\1\s*:\s*(\[[^]]*\])\s*[,}]/m,"" );
if ( code.match( /[,{]\s*("|')?file\1\s*:\s*("|')(.*?)\2\s*[,}]/m ) ) {
realUrl = RegExp.$3;
}
}
if ( !realUrl &&
code.match( /\{\s*("|')?type\1\s*:\s*("|')html5\2\s*,\s*("|')?config\3\s*:\s*\{\s*("|')?file\4\s*:\s*('|")(.*?)\5/ ) ) {
realUrl = RegExp.$6;
}
return realUrl;
}
function getRealUrl_dean_hola( objRef, boolDean, boolSrt ) {
//rq:getExtension, setArrSrt
//objRef.arrM3u, objRef.arrMpd
//objReg_stupなど、hola_player向け書き換え、file->src
//hola_player書式のsrt取得、未確認。->setArrSrt()を使用。
if ( boolSrt === true ) objRef.arrSrt = [];
if ( !( objRef.arrM3u instanceof Array ) ) objRef.arrM3u = [];
if ( !( objRef.arrMpd instanceof Array ) ) objRef.arrMpd = [];
if ( !objRef.text || typeof objRef.text != "string" ) return "";
var objReg_stup = /window\.hola_player\s*\(([\s\S]*?)\)\s*;/im;
var code = objReg_stup.test( objRef.text )? RegExp.$1: "";
if ( !code && boolDean === true ) {
var objReg_evl = /eval\((\s*function\s*\(\s*p\s*,\s*a\s*,\s*c\s*,\s*k\s*,\s*e\s*,\s*d\s*\)\s*\{[\s\S]*?\.split\(\s*'\|'\s*\)[^)]*?\))\)/gm;
while ( objReg_evl.test( objRef.text ) ) {
var tmp = RegExp.$1;
if ( tmp.match( /hola_player/ ) ) {
try {
tmp = ( new Function( "var a=" + tmp + ";return a;" ) )();
} catch ( e ) {
tmp = "";
}
if ( tmp && typeof tmp == "string" && objReg_stup.test( tmp ) ) {
code = RegExp.$1;
break;
}
}
}
}
if ( !code || typeof code != "string" ) return "";
code = code.replace( /\r|\n/g,"" );
if ( boolSrt === true ) {
//objRef.arrSrt = [];
setArrSrt( objRef );
}//srt end
code = code.replace( /[,{]\s*("|')?tracks\1\s*:\s*(\[[^]]*\])\s*[,}]/m, "," );
code = code.replace( /("|')?logo\1\s*:\s*\{[^}]*\}/, "" ).replace( /("|')?related\1\s*:\s*\{[^}]*\}/, "" );
var realUrl = "";
if ( code.match( /[,{]\s*("|')?sources\1\s*:\s*(\[[^]]*\])\s*[,}]/m ) ) {
var plst = RegExp.$2;
var objReg = /\{[^}]*\}/gm;
var arrDat = [];
while ( objReg.test( plst ) ) {
var dat = RegExp.lastMatch;
var file = dat.match( /[{,]\s*("|')?src\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
if ( !file ) continue;
var etn = getExtension( file );
if ( etn == "m3u8" ) {
objRef.arrM3u.push( file );
continue;
}
if ( etn == "mpd" ) {
objRef.arrMpd.push( file );
continue;
}
if ( etn != "flv" && etn != "mp4" ) continue;
var label = dat.match( /[{,]\s*("|')?label\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
var rate = label.match( /(\d+)p?/i )? parseInt( RegExp.$1, 10 ): 0;
if ( isNaN( rate ) ) rate = 0;
if ( label.toLowerCase() === "sd" ) rate = 480;
if ( label.toLowerCase() === "hd" ) rate = 720;
var res = dat.match( /[{,]\s*("|')?res\1\s*:\s*(\d+)\s*[},]/m )? parseInt( RegExp.$2,10 ): 0;
var obj = {};
obj.file = file;
obj.label = label;
obj.rate = rate;
obj.res = res;
arrDat.push( obj );
}
if ( arrDat.length > 0 ) {
arrDat.sort( function(a,b){
if ( b.res != a.res ) return b.res - a.res;
return b.rate - a.rate; } );
realUrl = arrDat[0].file;
}
}
if ( !realUrl ) {
code = code.replace( /[,{]\s*("|')?sources\1\s*:\s*(\[[^]]*\])\s*[,}]/m,"" );
if ( code.match( /[,{]\s*("|')?src\1\s*:\s*("|')(.*?)\2\s*[,}]/m ) ) {
file = RegExp.$3;
if ( file ) {
etn = getExtension( file );
if ( etn == "m3u8" ) {
objRef.arrM3u.push( file );
} else if ( etn == "mpd" ) {
objRef.arrMpd.push( file );
} else if ( etn == "flv" || etn == "mp4" ) {
realUrl = file;
}
}
}
}
if ( !realUrl &&
code.match( /\{\s*("|')?type\1\s*:\s*("|')html5\2\s*,\s*("|')?config\3\s*:\s*\{\s*("|')?file\4\s*:\s*('|")(.*?)\5/ ) ) {
file = RegExp.$6;
if ( file ) {
etn = getExtension( file );
if ( etn == "m3u8" ) {
objRef.arrM3u.push( file );
} else if ( etn == "flv" || etn == "mp4" ) {
realUrl = file;
}
}
}
return realUrl;
}
function getRealUrl_clappr( objRef, boolDean, boolSrt ) {
//rq:getExtension
if ( boolSrt === true ) objRef.arrSrt = [];
if ( !( objRef.arrM3u instanceof Array ) ) objRef.arrM3u = [];
if ( !( objRef.arrMpd instanceof Array ) ) objRef.arrMpd = [];
if ( !objRef.text || typeof objRef.text != "string" ) return "";
var objReg_clapper = /new\s+Clappr\.Player\s*\(([\s\S]*?)\)\s*;/m;
var code = objReg_clapper.test( objRef.text )? RegExp.$1: "";
if ( !code && boolDean === true ) {
var objReg_evl = /eval\((\s*function\s*\(\s*p\s*,\s*a\s*,\s*c\s*,\s*k\s*,\s*e\s*,\s*d\s*\)\s*\{[\s\S]*?\.split\(\s*'\|'\s*\)\))\)/gm;
while ( objReg_evl.test( objRef.text ) ) {
var tmp = RegExp.$1;
if ( tmp.match( /Clappr/ ) ) {
try {
tmp = ( new Function( "var a=" + tmp + ";return a;" ) )();
} catch ( e ) {
tmp = "";
}
if ( tmp && typeof tmp == "string" && objReg_clapper.test( tmp ) ) {
code = RegExp.$1;
break;
}
}
}
}
if ( !code || typeof code != "string" ) return "";
code = code.replace( /\r|\n/g,"" );
//srt
if ( boolSrt === true ) {
//objRef.arrSrt = [];
if ( code.match( /[,{]\s*("|')?externalTracks\1\s*:\s*(\[[^]]*\])\s*[,}]/m ) ) {
var tracks = RegExp.$2;
var objReg_tracks = /[[,]\s*(\{[^>]*?\})\s*(?=[,\]])/gm;
while ( objReg_tracks.test( tracks ) ) {
var track = RegExp.$1;
var track_file = track.match( /[{,]\s*("|')?src\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
if ( !track_file ) continue;
if ( track_file.match( /\/empty\.srt\s*(?:$|[?])/i ) ) continue;
//var track_kind = track.match( /[{,]\s*("|')?kind\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
//if ( !track_kind || track_kind.toLowerCase() != "captions" ) continue;
var track_label = track.match( /[{,]\s*("|')?label\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
var track_lang = track.match( /[{,]\s*("|')?lang\1\s*:\s*("|')(.*?)\2\s*[},]/m )? RegExp.$3: "";
objRef.arrSrt.push( {"file":track_file, "label":track_label, "lang":track_lang} );
}
}
}//srt end
var srcz = code.match( /[{,]\s*("|')?sources\1\s*:\s*(\[[^\]]*?\])\s*[,}]/m )? RegExp.$2: "";
if ( !srcz ) return "";
var objReg_elm = /[[,]\s*("|')(.*?)\1\s*(?=[,\]])/gm;
var arr = [];
while ( objReg_elm.test( srcz ) ) {
var elm = RegExp.$2;
if ( !elm ) continue;
if ( !elm.match( /\s*^http/ ) ) continue;
var etn = getExtension( elm );
if ( etn == "m3u8" || etn == "m3u" ) {
objRef.arrM3u.push( elm );
continue;
}
if ( etn != "mp4" && etn != "flv" ) continue;
arr.push( elm );
}
if ( arr.length <= 0 ) return "";
return arr[0];//最初のものが高画質と仮定、仕様不明
}
function getExtension( str ) {
var fn = str.split( /[?]/ )[0].split( "/" ).pop();
if ( !fn ) return "";
var pos = fn.lastIndexOf( "." );
if ( pos < 0 ) return "";
var extension = fn.substr( pos + 1 );
if ( extension ) return extension.toLowerCase();
else return "";
}
function setArrSrt( objRef ) {
//