NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name CANLI TV IZLE
// @description CANLI TV IZLEYIN
// @author volkan-k
// @version 2.9.6
// @date 12-07-2018
// @namespace canliTV
// @include *
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js
// @require https://cdnjs.cloudflare.com/ajax/libs/hls.js/0.10.0/hls.min.js
// @require-test https://github.com/volkirik/hls.js/raw/master/dist/hls.js
// @require-test https://cdnjs.cloudflare.com/ajax/libs/jquery-fullscreen-plugin/1.1.4/jquery.fullscreen-min.js
// @license MIT
// @run-at document-end
// @grant GM_xmlhttpRequest
// @grant GM_registerMenuCommand
// @connect canlitv.me
// @connect tvizlehd.com
// @connect fmanager.net
// @connect harunyahya.tv
// @connect 98.142.98.125
// @connect streamlock.net
// @connect akamaihd.net
// @connect yayin.com.tr
// @connect streamprovider.net
// @connect radyotelekomtv.com
// @connect 62.113.210.6
// @connect cdnnew.com
// @connect 212.174.58.161
// @connect rocketcdn.com
// @connect dailymotion.com
// @connect listenpowerapp.com
// @connect dogannet.tv
// @connect cloudflare.com
// @connect haberturk.com
// @connect mncdn.com
// ==/UserScript==
var channels=[];
this.$ = this.jQuery = jQuery.noConflict(true);
var debug_internal = 1; // 1=enable debug , 0 =disable debug
var debug_developer = 0; // do not set this to 1, if you are not developer.
var RANDOM=Math.floor(Math.random()*1234567890);
var CONTAINER_ID='canlitv'+RANDOM;
var VOLUME_ID='volume'+RANDOM;
var cnt_id;
var my_hls;
var timer1;
var volume=100;
var size=90; // dialog size in percentage, must be integer, minimum 25, maximum 100, default 90.
var no_1st_fetch, no_2nd_fetch;
function debugLog(message, do_alert) {
if (debug_internal==1) {
console.log("USER-SCRIPT CANLI_TV_IZLE | " + message);
}
if (do_alert && typeof alert === "function") {
alert("USER-SCRIPT CANLI_TV_IZLE | " + message);
}
}
function convert_relative_urls(css,base){
return css.replace(/url\s*\(\s*['"]{1}([^'"]+)['"]{1}\s*\)/ig, function (match, capture) {
if (/^(https?|file|ftps?|mailto|javascript|data:image\/[^;]{2,9};):/i.test(capture)) {
return match; // url is already absolute
}
return "url('"+new URL(capture,base).href+"')";
});
}
function addStyle_external(css_link, once, xhr) {
id=btoa(css_link).replace(/[+\/=]+/ig, "");
if (typeof xhr === "boolean" && xhr === true){
// xhr it
GM_xmlhttpRequest({
method: "GET",
url: css_link,
onerror: function(oEvent){ alert("Error " + oEvent.target.status + " occurred while receiving the document."); },
onload: function(response){
if (response.readyState !== 4 || response.status !== 200) return;
addGlobalStyle(convert_relative_urls(response.responseText,css_link), once,id);
inlineBase64Style(document.getElementById(id));
}
});
return;
}
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) {
return;
}
if (once && $("link[href='"+css_link+"']").length>0) {
return;
}
style = document.createElement('link');
style.setAttribute("rel", "stylesheet");
style.setAttribute("type", "text/css");
style.setAttribute("id", id);
style.setAttribute("href", css_link);
head.appendChild(style);
}
function addGlobalStyle(css, once,id) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) {
return;
}
if (once && document.getElementById(id)) {
return;
}
style = document.createElement('style');
style.setAttribute("type", "text/css");
if (typeof id === "string"){
style.setAttribute("id", id);
}
style.innerHTML = css;
head.appendChild(style);
}
function get_max_z_index(){
return Math.max.apply(null,
$.map($('body *'), function(e,n) {
if ($(e).css('position') != 'static')
return parseInt($(e).css('z-index')) || 1;
}
)
);
}
function SetVolume(val) {
volume=val;
debugLog('Volume Now: ' + volume);
var player = $('video#player_tv'+RANDOM);
if (player.length>0){
debugLog('Volume Before: ' + Math.round(player.prop('volume')*100));
player.prop("volume", val / 100);
}
var player_yt = $("iframe#EXT_FRAME"+RANDOM+"[src*='www.youtube.com']");
if (player_yt.length>0){
player_yt[0].contentWindow.postMessage('{"event":"command","func":"setVolume","args":['+val+']}', '*');
/*var iframe = player_yt[0];
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var ytplayer = innerDoc.querySelector("div.html5-video-player");
if (ytplayer !== null && typeof ytplayer.setVolume==="function") {
debugLog('Volume Before: ' + ytplayer.getVolume());
ytplayer.setVolume(val);
}*/
}
}
function open_volume_dialog() {
if ($('#'+VOLUME_ID).length>0 && $('#'+VOLUME_ID).dialog('isOpen')) {
$('#'+VOLUME_ID).dialog('close').remove();
return;
}
volume_div = $("<div title='SES AYARI' id='"+VOLUME_ID+"'></div>").dialog({
width: 300,
height: 210,
closeText: "KAPAT",
buttons: [
{
text: "KAPAT",
click: function () {
$('#'+VOLUME_ID).dialog('close').remove();
},
icon: "ui-icon-closethick"
}
],
close: function( event, ui ) {
$(this).dialog('destroy').remove();
}
});
$('#'+VOLUME_ID).append('<p class="ui-state-default ui-corner-all ui-helper-clearfix" style="padding:4px;">'
+'<span class="ui-icon ui-icon-volume-on" style="float:left; margin:-2px 5px 0 0;"></span>'
+'Ses duzeyi<span id="handle'+RANDOM+'"></span>'
+'</p>'
+'<div id="master'+RANDOM+'" style="width:220px; margin:15px;"></div>');
$( "#master"+RANDOM ).slider({
value: volume,
create: function() {
$( "#handle"+RANDOM ).text( ' = %'+$( this ).slider( "value" ) );
},
slide: function( event, ui ) {
$( "#handle"+RANDOM ).text( ' = %'+ui.value );
SetVolume(ui.value);
}
});
}
function init_dialog() {
if ($('#'+CONTAINER_ID).length>0 && $('#'+CONTAINER_ID).dialog('isOpen')) {
$('#'+CONTAINER_ID).dialog('close').remove();
}
addStyle_external('https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css', true, true);
var maxZ = get_max_z_index();
addGlobalStyle(".ui-dialog { z-index: "+(maxZ+1)+" !important; position: absolute} .ui-dialog .ui-dialog-buttonpane button { font-weight: bolder;} #"+CONTAINER_ID+" {background-color: white; font-size: 14px;}", true,'gm_added_style_watchTV');
watchtv_div = $("<div title='CANLI TV IZLE' id='"+CONTAINER_ID+"'></div>").dialog({
width: "auto",
height: "auto",
closeText: "KAPAT",
buttons: [
{
text: "SES AYARI",
click: function () {
open_volume_dialog();
},
icon: "ui-icon-volume-on"
},
{
text: "KANAL LISTESI",
click: function () {
show_channels();
},
icon: "ui-icon-home"
},
{
text: "YENILE",
click: function () {
refresh_dialog();
},
icon: "ui-icon-refresh"
}
],
close: function( event, ui ) {
if (typeof my_hls !=="undefined" && typeof my_hls.destroy === "function"){
debugLog("DEBUG: destroying hls");
my_hls.destroy();
}
$('video#player_tv'+RANDOM).each(function() {
$(this)[0].pause();
$(this)[0].currentTime = 0;
$(this).attr('src', '');
$(this)[0].load();
$(this)[0].innerHTML = '';
$(this)[0].load();
$(this).removeAttr('src');
$(this)[0].load();
//$(this).remove();
$(this).hide();
});
$(this).dialog('destroy').remove();
$('#'+VOLUME_ID).dialog('close').remove();
clearTimeout(timer1);
}
}); // width & height: auto, set child height.
//watchtv_div.height($(window).innerHeight()*90/100-$("div.ui-dialog-titlebar").outerHeight()-$("div.ui-dialog-buttonpane").outerHeight());
//watchtv_div.width($(window).innerWidth()*90/100);
/*if (watchtv_div.width() < 650) {
watchtv_div.width(650);
}*/
watchtv_div.parent().position({
my: "center center",
at: "center center",
of: window
});
return CONTAINER_ID;
}
function refresh_dialog(){
if ($('#'+CONTAINER_ID+' [current_channel_id]').length>0) {
// reload channel
fetch_channel_url($('#'+CONTAINER_ID+' [current_channel_id]').attr("current_channel_id"),false);
} else {
// reload channel list
show_channels();
}
}
function CreateIframe() {
iframe = document.createElement('iframe');
iframe.setAttribute("id", "EXT_FRAME"+RANDOM);
iframe.setAttribute("width", "100%");
iframe.setAttribute("height", "100%");
iframe.setAttribute("border", "0");
iframe.setAttribute("scrolling", "yes");
iframe.setAttribute("style", "border: 0 none;");
// allow fullscreen
iframe.setAttribute("webkitAllowFullScreen", "webkitAllowFullScreen");
iframe.setAttribute("mozAllowFullScreen", "mozAllowFullScreen");
iframe.setAttribute("allowFullScreen", "allowFullScreen");
// allow autoplay: If this isn't set, the player will not be able to play without a user gesture.
iframe.setAttribute("allow", "autoplay");
// enable js api for youtube
iframe.setAttribute("enablejsapi", "true");
//iframe.setAttribute("sandbox", "allow-forms allow-pointer-lock allow-popups allow-same-origin allow-scripts allow-top-navigation");
return iframe;
}
function show_channels(append) {
clearTimeout(timer1);
if (typeof append === "undefined"){
var append=false;
}
if (!append){
cnt_id=init_dialog();
}
//document.getElementById(cnt_id).style.overflow = "hidden";
// fill it
//iframe.onload = iframe_loaded;
if (append){
url="http://canlitv.me/?sayfa=2";
} else {
url="http://canlitv.me";
}
GM_xmlhttpRequest({
method: "GET",
url: url,
onerror: function(oEvent){ alert("Error " + oEvent.target.status + " occurred while receiving the document."); },
onload: function(response){
if (response.readyState !== 4 || response.status !== 200) return;
show_channels_html(response.responseText,append);
if (!append){
show_channels(true);
}
}
});
}
function parse_channel_id(img_src){
var myregexp = /poster\/([\w\-]+)\.png/i;
var match = myregexp.exec(img_src);
if (match != null) {
result = match[1];
} else {
result = "";
}
return result;
}
const inlineBase64Images = nodes => {
let imgs = Array.from(nodes).filter(node => node.matches('img'))
return Promise.all(imgs.map(img => new Promise(res => {
GM_xmlhttpRequest({
method: 'GET',
url: img.src,
responseType: 'blob',
onload: function(xhr) {
if (xhr.status !== 200) return res(null)
let headers = {}
for (let header of xhr.responseHeaders.trim().split(/\n/)) {
let parts = header.split(':')
if (parts.length === 1) continue
headers[parts[0].trim()] = parts[1].trim()
}
let type = headers['Content-Type']
if (!/^image\//.test(type)) {
if (/\.jpe?g$/i.test(img.src)) type = 'image/jpeg'
if (/\.png$/i.test(img.src)) type = 'image/png'
if (/\.gif$/i.test(img.src)) type = 'image/png'
}
if (!/^image\//.test(type)) {
console.error(`Can't process "${img.src}" because its type is "${type}"`)
return res(null)
}
let imgEl = new Image()
imgEl.onload = function() {
let canvas = document.createElement('canvas');
canvas.width = imgEl.naturalWidth;
canvas.height = imgEl.naturalHeight;
try {
canvas.getContext('2d').drawImage(imgEl, 0, 0)
img.src = canvas.toDataURL(type, 0.7)
res(img)
} catch (e) {
console.error(`Can't draw "${img.src}" on a canvas`, e)
res(null)
}
}
imgEl.onerror = () => res(null)
imgEl.src = window.URL.createObjectURL(xhr.response)
}
})
})))
// At this point, imgs is an array of all the <img> tags of the page
// who had their content base64'd. Some elements might be null if
// XHR or canvas conversion failed on them. Filter them out.
.then(imgs => Promise.resolve(imgs.filter(img => !!img)))
}
function inlineBase64Style (element) {
var img_urls = [];
var myregexp = /url\s*\(\s*['"]?(https?:\/\/[^'")]+)['"]?\s*\)/ig;
var match = myregexp.exec(element.innerHTML);
while (match != null) {
// matched text: match[0]
// match start: match.index
// capturing group n: match[n]
img_urls.push(match[1]);
match = myregexp.exec(element.innerHTML);
}
var img_url="";
for (var i = 0; i < img_urls.length; i++) {
img_url=img_urls[i];
GM_xmlhttpRequest({
method: 'GET',
url: img_url,
responseType: 'blob',
onload: function(xhr) {
if (xhr.status !== 200) return null;
let headers = {}
for (let header of xhr.responseHeaders.trim().split(/\n/)) {
let parts = header.split(':')
if (parts.length === 1) continue
headers[parts[0].trim()] = parts[1].trim()
}
let type = headers['Content-Type']
if (!/^image\//.test(type)) {
if (/\.jpe?g$/i.test(img_url)) type = 'image/jpeg'
if (/\.png$/i.test(img_url)) type = 'image/png'
if (/\.gif$/i.test(img_url)) type = 'image/png'
}
if (!/^image\//.test(type)) {
console.error(`Can't process "${img_url}" because its type is "${type}"`)
return null;
}
let imgEl = new Image()
imgEl.onload = function() {
let canvas = document.createElement('canvas');
canvas.width = imgEl.naturalWidth;
canvas.height = imgEl.naturalHeight;
try {
canvas.getContext('2d').drawImage(imgEl, 0, 0);
new_img_url = canvas.toDataURL(type, 0.7);
//console.log(img_url); console.log(new_img_url); // for debug
element.innerHTML=element.innerHTML.replace(img_url,new_img_url);
} catch (e) {
console.error(`Can't draw "${img_url}" on a canvas`, e)
return null;
}
}
imgEl.src = window.URL.createObjectURL(xhr.response)
}
});
}
}
function show_channels_html(responseText,append){
//append=false; // for debugging.
if (!append){
channels=[];
}
channels_new=[]
// parse channels
var response_parsed=$.parseHTML(responseText);
var canlitv_list = $('li.canlitvlist', response_parsed);
canlitv_list.each(function() {
channel_id=parse_channel_id($( this ).find("img").prop("src"));
channel_name=$( this ).find("a").attr("title");
channel_logo=$( this ).find("img").prop("src");
channel_url=$( this ).find("a").prop("href");
channels_new.push({channel_id:channel_id, channel_name:channel_name, channel_logo:channel_logo, channel_url:channel_url});
});
channels=channels.concat(channels_new);
//console.log(channels); // for debug
var css = [
"ul#icerik"+RANDOM+" {",
" display: table;",
"}",
"ul#icerik"+RANDOM+", li.canlitvlist"+RANDOM+" {",
" list-style: none;",
"}",
"ul#icerik"+RANDOM+">li.canlitvlist"+RANDOM+" {",
" float: left;",
" width: 200px;",
" margin: 5px 9px;",
"}",
".icerikbaslik"+RANDOM+" {",
" background-color: #efefef;",
" padding: 5px;",
" border-top: 1px solid #abd541;",
" border-bottom: 1px solid #abd541;",
" color: #606056;",
" text-align: center;",
" overflow: hidden;",
" white-space: nowrap;",
" text-overflow: ellipsis;",
"}",
".canlitvlist"+RANDOM+" a {",
" display: block;",
" text-align: center;",
"}",
".canlitvlist"+RANDOM+" img {",
" width: 82px !important;",
" margin: 10px 0px;",
" display: inline;",
"}"
].join("\n");
addGlobalStyle(css, true, "canli_tv_style");
// prepare html for channel list
if (append){
var channels_html = "";
} else {
var channels_html = "<ul id='icerik"+RANDOM+"'>";
}
for (var i = 0; i < channels_new.length; i++) {
channels_html +='<li class="canlitvlist'+RANDOM+'"><a href="javascript:void(0)" channel_id="'+channels_new[i].channel_id+'" original_href="'+channels_new[i].channel_url+'" title="'+channels_new[i].channel_name+'">'
+'<img src="'+channels_new[i].channel_logo+'" alt="'+channels_new[i].channel_name+'" class="block">'
+'<div class="icerikbaslik'+RANDOM+'">'+channels_new[i].channel_name+'</div></a>'
+'</li>';
}
if (append){
channels_html += "";
} else {
channels_html += "</ul>";
}
// show channel list html
if (append) {
$("#icerik"+RANDOM).append(channels_html);
} else {
$("#"+cnt_id).append(channels_html);
}
fix_dialog_size();
if (debug_developer===1) {
$('li.canlitvlist'+RANDOM+' > a:not([processed])').each(function () {
fetch_channel_url(this,true);
});
}
$('li.canlitvlist'+RANDOM+' > a:not([processed])').click(function (event) {
fetch_channel_url(this,false);
});
$('li.canlitvlist'+RANDOM+' > a').each(function(){
$(this).attr("processed", "yes");
});
let startTime = +new Date
inlineBase64Images(document.querySelectorAll('li.canlitvlist'+RANDOM+' img:not([processed])')).then(imgs => {
console.log(imgs.length + ' images converted in ' + ((+new Date) - startTime) / 1000 + 's')
})
$('li.canlitvlist'+RANDOM+' img').each(function(){
$(this).attr("processed", "yes");
});
}
function get_channel_data(channel_id, data_name){
for (var i = 0; i < channels.length; i++) {
if (channels[i].channel_id == channel_id){
return channels[i][data_name];
}
}
}
function fetch_channel_url(element,debug){
clearTimeout(timer1);
if (typeof debug === "undefined"){
var debug=false;
}
// get player url
if (typeof element === "string"){
var channel_id = element;
} else {
var channel_id = $(element).attr("channel_id");
}
debugLog("DEBUG: Channel Selected. ID = "+channel_id);
var channel_name = get_channel_data(channel_id, "channel_name");
var channel_logo = get_channel_data(channel_id, "channel_logo");
no_1st_fetch = false;
no_2nd_fetch = false;
if ( channel_id === "haberturk-tv" ) {
var channel_url = "http://www.haberturk.com/canliyayin";
fetch_haberturk(channel_id,channel_url,debug);
no_1st_fetch=true;
no_2nd_fetch=true;
/* } else if ( channel_id === "ulusal-kanal" ) {
var channel_url = "https://www.dailymotion.com/video/x6c7r09";
//var channel_url = "https://www.dailymotion.com/video/x3b68jn"; // for testing DM API
fetch_dailymotion(channel_id,channel_url,debug);
no_1st_fetch = true;
no_2nd_fetch = true;*/
} else {
var channel_url = get_channel_data(channel_id, "channel_url");
}
debugLog("DEBUG: Channel Selected. URL = "+channel_url);
if (!debug){
$("#"+cnt_id).html("<div id='please_wait_"+RANDOM+"' current_channel_id='"+channel_id+"'>LUTFEN BEKLEYINIZ...</div>");
}
//$("#"+cnt_id).append(channel_url); //for debugging.
if (no_1st_fetch === true){
if (no_2nd_fetch===false){
fetch_iframe_url(channel_id, channel_url,debug);
}
return;
}
GM_xmlhttpRequest({
method: "GET",
url: channel_url,
onerror: function(oEvent){ alert("Error " + oEvent.target.status + " occurred while receiving the document."); },
onload: function(response){
if (response.readyState !== 4 || response.status !== 200) return;
fetch_iframe_url(channel_id, response.responseText,debug);
}
});
}
String.prototype.stripSlashes = function(){
return this.replace(/\\(.)/mg, "$1");
}
function fetch_haberturk(channel_id, channel_url,debug){
debugLog("DEBUG: fetching URL for "+channel_id+": "+channel_url);
// haberturk
GM_xmlhttpRequest({
method: "GET",
url: channel_url,
onerror: function(oEvent){ alert("Error " + oEvent.target.status + " occurred while receiving the document."); },
onload: function(response){
if (response.readyState !== 4 || response.status !== 200) return;
var myregexp_ht = /"ht_stream_m3u8"\s*:\s*"([^"]+)"\s*,/i;
var match_ht = myregexp_ht.exec(response.responseText);
if (match_ht != null) {
result = match_ht[1].stripSlashes();
get_stream_url(channel_id, result,debug);
return;
}
}
});
}
function getDailyMotionId(url) {
//return url.substring(url.lastIndexOf('/') + 1); // old buggy method.
var m = url.match(/^.+dailymotion.com\/(video|hub)\/([^_]+)[^#]*(#video=([^_&]+))?/);
if (m !== null) {
if (m[4] !== undefined) {
return m[4];
}
return m[2];
}
return null;
}
function fetch_dailymotion(channel_id, channel_url,debug){
var video_id = getDailyMotionId(channel_url);
if (video_id === null){
debugLog("DEBUG: fetch_dailymotion() couldnt find video id");
return ;
}
var meta_url = "https://www.dailymotion.com/player/metadata/video/" + video_id;
debugLog("DEBUG: fetching URL for "+channel_id+": "+meta_url);
// dailymotion
GM_xmlhttpRequest({
method: "GET",
url: meta_url,
onerror: function(oEvent){ alert("Error " + oEvent.target.status + " occurred while receiving the document."); },
onload: function(response){
if (response.readyState !== 4 || response.status !== 200) return;
//var myregexp_dm = /"url"\s*:\s*"([^"]+live[^"]+)"/i;
//var match_dm = myregexp_dm.exec(response.responseText);
//if (match_dm != null) {
//result = match_dm[1].stripSlashes();
get_stream_url(channel_id, JSON.parse(response.responseText),debug);
return;
//}
}
});
}
function fetch_iframe_url(channel_id, responseText,debug){
var myregexp = /src="(http:\/\/(?:www\.)?canlitv\.me\/yayin\.php\?kanal=[\w\-]+&security=[\w]+)"/i;
var match = myregexp.exec(responseText);
if (match != null) {
result = match[1];
} else if (no_2nd_fetch===true) {
result = responseText;
get_stream_url(channel_id, result,debug);
return;
} else {
debugLog("DEBUG: couldnt find iframe URL for "+channel_id+"!");
return;
}
GM_xmlhttpRequest({
method: "GET",
url: result,
headers: {
'Referer': 'http://canlitv.me/'
},
onerror: function(oEvent){ alert("Error " + oEvent.target.status + " occurred while receiving the document."); },
onload: function(response){
if (response.readyState !== 4 || response.status !== 200) return;
var myregexp = /src=\s*['"]{1}([^'"]+dailymotion[^'"]+)['"]{1}\s+/i;
var match = myregexp.exec(response.responseText);
if (match != null) {
result = match[1];
fetch_dailymotion(channel_id, result, debug);
} else {
get_stream_url(channel_id, response.responseText,debug);
}
}
});
}
function get_stream_url(channel_id, responseText,debug_only) {
if (typeof responseText === "object" && responseText !== null ) {
var iframe = false;
if (typeof responseText.qualities === "object" && typeof responseText.qualities.auto[0] === "object" && typeof responseText.qualities.auto[0].url === "string" ){
var video_qualities=responseText.qualities;
var result = video_qualities.auto[0].url;
} else {
debugLog("DEBUG: couldnt find stream URL for "+channel_id+"!");
return;
}
} else {
var myregexp = /file:\s*['"]{1}([^'"]+)['"]{1},/i;
var match = myregexp.exec(responseText);
var myregexp2 = /src=\s*['"]{1}([^'"]+)['"]{1}\s+/i;
var match2 = myregexp2.exec(responseText);
var result = null;
var iframe = false;
if (match != null) {
result = match[1];
} else if (match2 !=null) {
result = match2[1];
iframe = true;
} else if (/^(https?|file|ftps?|mailto|javascript|data:image\/[^;]{2,9};):/i.test(responseText)) {
result = responseText;
if (/(youtube|vimeo)/i.test(responseText)) {
iframe = true;
}
} else {
debugLog("DEBUG: couldnt find stream URL for "+channel_id+"!");
return;
}
}
debugLog("DEBUG: Stream URL = "+result+" ; iframe = "+iframe.toString());
if (debug_only){
return;
}
show_channel_player(channel_id, result,iframe);
}
function show_channel_player(channel_id, stream_url, iframe){
// show iframe
if (typeof iframe === "boolean" && iframe===true){
new_iframe = CreateIframe();
document.getElementById(cnt_id).appendChild(new_iframe);
if (stream_url.includes('www.youtube.com')){
new_iframe.setAttribute("src", stream_url+'&embedjsapi=1');
} else {
new_iframe.setAttribute("src", stream_url);
}
new_iframe.setAttribute("current_channel_id", channel_id);
$("#please_wait_"+RANDOM).remove();
return;
}
// show the player
//addStyle_external("https://cdnjs.cloudflare.com/ajax/libs/mediaelement/4.2.9/mediaelementplayer.min.css", true);
$("#"+cnt_id).append('<video current_channel_id="'+channel_id+'" class="mejs__player" id="player_tv'+RANDOM+'" preload="none" controls="controls" style="width: 100%; height:100%;">' +
'<source src="' + stream_url + '" type="application/x-mpegURL">' +
'</video>');
$("#please_wait_"+RANDOM).remove();
refresh_video($('video#player_tv'+RANDOM)[0],stream_url);
SetVolume(volume);
fix_dialog_size();
}
function fix_dialog_size(){
if (typeof size === "number" && size >= 25 && size <= 100){
set_size=size;
} else {
set_size=90;
}
$( "#"+cnt_id ).dialog( "option", "height", $(window).innerHeight()*size/100 );
$( "#"+cnt_id ).dialog( "option", "width", $(window).innerWidth()*size/100 );
}
function iframe_loaded() {
$('#EXT_FRAME')[0].contentWindow.postMessage("abuzitdin","https://www.canlitv.plus");
}
function decide_referer_from_url(stream_url){
if (stream_url.includes("ulusaltv")){
return "http://www.ulusal.com.tr/canliyayin/canliyayin.php";
}
if (stream_url.includes("tvizlehd.com")){
return "http://canlitv.me/";
}
return stream_url;
}
function refresh_video(element,stream_url)
{
if(Hls.isSupported()) {
//console.log(Hls.DefaultConfig);
//return;
var volkanHlsConfig = Hls.DefaultConfig;
volkanHlsConfig.liveSyncDurationCount= 3; // edge of live delay, expressed in multiple of EXT-X-TARGETDURATION.
volkanHlsConfig.liveMaxLatencyDurationCount = 10; // maximum delay allowed from edge of live, expressed in multiple of EXT-X-TARGETDURATION.
volkanHlsConfig.fragLoadingMaxRetry = 6;
volkanHlsConfig.manifestLoadingMaxRetry = 6;
volkanHlsConfig.levelLoadingMaxRetry = 6;
volkanHlsConfig.maxBufferLength = 30; // guaranteed buffer length in seconds.
volkanHlsConfig.maxMaxBufferLength = 600; // maximum buffer length in seconds.
volkanHlsConfig.loader.prototype.loadInternal = function () {
//console.log(this);
//return; // for debug only.
var xhr = void 0,
context = this.context;
var stats = this.stats;
stats.tfirst = 0;
stats.loaded = 0;
this.requestTimeout = window.setTimeout(this.loadtimeout_c.bind(this), this.config.timeout);
var extraheaders = {};
extraheaders["Referer"] = decide_referer_from_url(this.context.url);
if (this.context.rangeEnd) {
extraheaders["Range"] = "bytes=" + this.context.rangeStart + "-" + (this.context.rangeEnd - 1);
}
xhr=this.loader = GM_xmlhttpRequest({
method: "GET",
url: this.context.url,
headers: extraheaders,
responseType: this.context.responseType,
onreadystatechange: this.readystatechange.bind(this),
onprogress: this.loadprogress_c.bind(this),
onerror: this.loaderror_c.bind(this),
});
//console.log(this.loader); // for debug only.
};
//console.log(readystatechangeHook.toString());
//console.log(volkanHlsConfig.loader.prototype.loadtimeout.toString()); // for debug.
volkanHlsConfig.loader.prototype.loadprogress_c = function (t) {
debugLog("XHR load progress called..");
arguments[0].responseURL = arguments[0].finalUrl;
var getResponseHeader = function(header) {
var value = null;
if (this.responseHeaders) {
var regex = new RegExp('^'+header+": (.*)$","igm");
var match = regex.exec(this.responseHeaders);
var result = [];
while (match != null) {
// matched text: match[i]
result.push(match[1]);
match = regex.exec(this.responseHeaders);
}
if (result.length>0){
//console.log(result); // for debug
value=result.join(", ");
}
}
// Return the value
return value;
};
arguments[0].getResponseHeader = getResponseHeader.bind(arguments[0]);
arguments[0].currentTarget = arguments[0];
this.loadprogress.apply(this,arguments);
};
volkanHlsConfig.loader.prototype.loaderror_c = function () {
debugLog("XHR load error called..");
};
var loadtimeoutHook = volkanHlsConfig.loader.prototype.loadtimeout;
volkanHlsConfig.loader.prototype.loadtimeout_c = function () {
debugLog("XHR load timeout called..");
return loadtimeoutHook.apply(this);
};
var readystatechangeHook = volkanHlsConfig.loader.prototype.readystatechange;
volkanHlsConfig.loader.prototype.readystatechange = function () {
debugLog("XHR ready state change called..");
//console.log(this); // for debug only.
//console.log(arguments); // for debug only.
//return ; // for debug only.
arguments[0].responseURL = arguments[0].finalUrl;
var getResponseHeader = function(header) {
var value = null;
if (this.responseHeaders) {
var regex = new RegExp('^'+header+": (.*)$","igm");
var match = regex.exec(this.responseHeaders);
var result = [];
while (match != null) {
// matched text: match[i]
result.push(match[1]);
match = regex.exec(this.responseHeaders);
}
if (result.length>0){
//console.log(result); // for debug
value=result.join(", ");
}
}
// Return the value
return value;
};
arguments[0].getResponseHeader = getResponseHeader.bind(arguments[0]);
arguments[0].currentTarget = arguments[0];
return readystatechangeHook.apply(this, arguments);
};
my_hls = new Hls(volkanHlsConfig);
// bind them together
my_hls.attachMedia(element);
my_hls.on(Hls.Events.MEDIA_ATTACHED, function() {
debugLog("video and hls.js are now bound together !");
my_hls.loadSource(stream_url);
my_hls.on(Hls.Events.MANIFEST_PARSED, function(event, data) {
debugLog("manifest loaded, found " + data.levels.length + " quality level");
element.play();
});
my_hls.on(Hls.Events.ERROR, function(event, data) {
if (data.fatal) {
debugLog("fatal error encountered, refresh dialog");
timer1 = setTimeout(refresh_dialog.bind(this),3000);
return; // other recovery methods are mostly useless
switch (data.type) {
case Hls.ErrorTypes.NETWORK_ERROR:
// try to recover network error
debugLog("fatal network error encountered, try to recover");
my_hls.startLoad();
break;
case Hls.ErrorTypes.MEDIA_ERROR:
debugLog("fatal media error encountered, try to recover");
my_hls.recoverMediaError();
break;
default:
// cannot recover
debugLog("fatal other error encountered, can not recover");
my_hls.destroy();
break;
}
}
});
});
element.onpause = function() {
debugLog("The video has been paused");
//my_hls.stopLoad();
}
element.onplay = function() {
debugLog("The video has started to play");
//my_hls.startLoad();
}
}
}
function inside_frame(event) {
$("a").attr("target","_top");
$("header, div.ustrenk, footer").hide();
}
GM_registerMenuCommand("CANLI TV IZLE", show_channels);
window.addEventListener("message", receiveMessage, false);
function receiveMessage(event)
{
if (event.data==="abuzitdin"){
inside_frame();
}
}