Guest User

Untitled

a guest
Nov 20th, 2010
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var iViewFox = {
  2.         log:function(msg){
  3.             var lg = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
  4.             lg.logStringMessage(msg);
  5.         },
  6.         seriesIndex:null,
  7.         hashReg:new RegExp(/http:\/\/www.abc.net.au\/iview\/#\/view\/[0-9]{6}/),
  8.         uA:null,
  9.         osString:Components.classes["@mozilla.org/xre/app-info;1"].getService(Components.interfaces.nsIXULRuntime).OS,     
  10.         prefs:Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefService).getBranch("extensions.iViewFox."),
  11.         extItem:null,
  12.         hideIViewFoxStatusBeforeUnload:function(){
  13.             document.getElementById('iViewFoxStatus').setAttribute('hidden','true');
  14.             gBrowser.contentWindow.removeEventListener('beforeunload',iViewFox.hideIViewFoxStatusBeforeUnload,false);              
  15.         },
  16.         status:function(){
  17.             if(!iViewFox.prefs.getBoolPref("enabled")){
  18.                 document.getElementById('iViewFoxStatus').src="chrome://iViewFox/content/abc_logo2.png";
  19.             }
  20.             gBrowser.tabContainer.addEventListener("TabSelect", function(){
  21.                 if(gBrowser.selectedBrowser.contentWindow.location.toString().match("http://www.abc.net.au/iview/")){
  22.                     document.getElementById('iViewFoxStatus').setAttribute('hidden','false');
  23.                 }
  24.                 else{
  25.                     document.getElementById('iViewFoxStatus').setAttribute('hidden','true');
  26.                 }
  27.             }, false);
  28.             document.getElementById('iViewFoxStatus').addEventListener('click', function(e){
  29.                     window.openDialog('chrome://iViewFox/content/iViewFoxoptions.xul');
  30.             },false);          
  31.         },     
  32.         init:function(event){
  33.        
  34.             if(Number(iViewFox.extItem.replace(/\./g,'')) > iViewFox.prefs.getIntPref('version') && iViewFox.osString=="Darwin"){
  35.                 iViewFox.prefs.setIntPref("version", Number(iViewFox.extItem.replace(/\./g,'')));
  36.                 gBrowser.selectedTab = gBrowser.addTab('chrome://iViewFox/content/ohHai.html');
  37.             }          
  38.        
  39.             if(event.originalTarget instanceof HTMLDocument && event.originalTarget.location && event.originalTarget.location.toString().match("http://www.abc.net.au/iview/")){
  40.  
  41.                 iViewFox.iVtabDoc=event.originalTarget;
  42.                 if(!iViewFox.uA){
  43.                     iViewFox.uA=gBrowser.contentWindow.navigator.userAgent;
  44.                 }
  45.                 if(gBrowser.selectedBrowser.contentDocument.location.href==event.originalTarget.location.href){
  46.                     document.getElementById('iViewFoxStatus').setAttribute('hidden','false');
  47.                 }
  48.                 gBrowser.contentWindow.addEventListener('beforeunload',iViewFox.hideIViewFoxStatusBeforeUnload,false); 
  49.                
  50.                 var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);
  51.                 req.onload = function(data){
  52.                     var rT = req.responseText;
  53.                     iViewFox.seriesIndex=JSON.parse(rT);
  54.                 };
  55.                 req.onerror = function(err){
  56.                     iViewFox.log(err);
  57.                 };
  58.                 req.open("GET", 'http://tviview.abc.net.au/iview/api2/?seriesIndex', true);
  59.                 req.send(null);
  60.                
  61.                 gBrowser.contentWindow.addEventListener('hashchange',function(e){
  62.                     var tL = this.location;
  63.                     if(tL.href.match(iViewFox.hashReg) && iViewFox.prefs.getBoolPref("enabled")){
  64.                         var locSplit=tL.href.split('#/view/');
  65.                         iViewFox.findEpDetails(locSplit[1]);
  66.                         //https://developer.mozilla.org/en/nsITimer
  67.                         //have to add a small delay here otherwise flash sometimes doesn't seem to notice the hashchange if it's too quick
  68.                         var event = {
  69.                             notify: function(timer) {
  70.                                 tL.href=locSplit[0]+'#';
  71.                             }
  72.                         }
  73.                         var timer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer);
  74.                         var secs=2000;
  75.                         if(locSplit[1].match(/587926|597007/)){
  76.                             secs=5000;
  77.                         }
  78.                         timer.initWithCallback(event,secs, Components.interfaces.nsITimer.TYPE_ONE_SHOT);                      
  79.                     }
  80.                 },false);              
  81.             }
  82.         },
  83.         findEpDetails:function(epNumber){
  84.             iViewFox.seriesIndex.forEach(function(sitem, sindex, sarray){
  85.                 var seriesNum = sitem.a;
  86.                 sitem.f.forEach(function(item, index, array){
  87.                     if(item.a==epNumber){
  88.                         var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);
  89.                         req.onload = function(data){
  90.                             var rT = req.responseText;
  91.                             var jPar=JSON.parse(rT);
  92.                             if(jPar[0].f.length){
  93.                                 jPar[0].f.forEach(function(jfitem, jfindex, jfarray){
  94.                                     if(jfitem.a == epNumber){
  95.                                         iViewFox.handshake(jfitem.n, seriesNum, jfitem.b);                             
  96.                                     }
  97.                                 });
  98.                             }
  99.                         };
  100.                         req.onerror = function(err){
  101.                             iViewFox.log(err);
  102.                         };
  103.                         req.open("GET", 'http://tviview.abc.net.au/iview/api2/?series='+seriesNum, true);
  104.                         req.send(null);                        
  105.                     }
  106.                 });
  107.             });
  108.        
  109.         },
  110.         unload:function(aEvent){
  111.             if (aEvent.originalTarget instanceof HTMLDocument && aEvent.originalTarget.location.href.match("http://www.abc.net.au/iview/")) {
  112.                 iViewFox.iVtab=null;
  113.                 iViewFox.iVtabDoc=null;
  114.             }
  115.         },
  116.         handshake:function(epDS, seriesNum, epName){
  117.             var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);
  118.             req.onload = function(data){
  119.                 var rT = req.responseText;
  120.                 var x= new DOMParser().parseFromString(rT, "text/xml");
  121.                 var xStore={};
  122.                 [].forEach.call(x.querySelectorAll('*'),function(item,index,array){xStore[item.nodeName]=item.textContent;});   //may as well store it all
  123.                 iViewFox.grabEpisode(epDS, xStore, seriesNum, epName);             
  124.             };
  125.             req.onerror = function(err){
  126.                 iViewFox.log(err);
  127.             };
  128.             req.open("GET", 'http://tviview.abc.net.au/iview/auth/?v2', true);
  129.             req.send(null);            
  130.         },
  131.         parseCaptionsXML:function(f, x){
  132.             var data="";
  133.             [].forEach.call(x.querySelectorAll('title'), function (element, index, array) {
  134.                 data+=(index+1)+"\n"+(element.getAttribute('start')+"0 --> "+
  135.                     element.getAttribute('end')+"0\n").replace(/((?:\d{2}:){2}\d{2}):(\d{3})/g, "$1,$2")+
  136.                         element.textContent.replace(/\|/g,'\n')+"\n\n";
  137.             });
  138.             iViewFox.writeTextFile(f, data);       
  139.         },
  140.         writeTextFile:function(fyle, data){
  141.             var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  142.            
  143.             foStream.init(fyle, 0x02 | 0x08 | 0x20, 0666, 0);
  144.             var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream);
  145.             converter.init(foStream, "UTF-8", 0, 0);   
  146.            
  147.             converter.writeString(data);
  148.             converter.close();         
  149.         },
  150.         grabEpisode:function(epDS, xStore, seriesNum, epName){
  151.  
  152.             var dirService = Components.classes["@mozilla.org/file/directory_service;1"].getService(Components.interfaces.nsIProperties);
  153.  
  154.             var pathAndExeText='/extensions/[email protected]/rtmpdump/';
  155.             if(iViewFox.osString=="WINNT"){
  156.                 pathAndExeText='\\extensions\\[email protected]\\rtmpdump\\rtmpdump.exe';
  157.             }
  158.             var getrtDump = dirService.get("ProfD", Components.interfaces.nsIFile).path+pathAndExeText;
  159.             var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
  160.             var nsIFilePicker = Components.interfaces.nsIFilePicker;
  161.  
  162.             var fp = Components.classes["@mozilla.org/filepicker;1"].createInstance(nsIFilePicker);
  163.             fp.init(window, "Save To...", nsIFilePicker.modeSave);
  164.             /*var defString=epDS;
  165.             if(defString.indexOf('/')>-1){
  166.                 defString=defString.slice(defString.lastIndexOf('/')+1);
  167.             }   */     
  168.             var fTypeSplit = epDS.split('.');          
  169.             var serCheq=(seriesNum=='2932730');
  170.             fp.defaultString=epName+'.'+fTypeSplit[1];
  171.             if(serCheq){
  172.                 fp.defaultString=epName+' '+new Date().toString()+'.'+fTypeSplit[1];
  173.             }
  174.            
  175.  
  176.             if(serCheq){ //if 24 hour news stream
  177.                     var params = {time:'30', quality:'news24-hi@28773'};
  178.                     if(epName.match('Medium Bandwidth')){
  179.                         params.quality='news24-med@28772';
  180.                     }
  181.                     window.openDialog("chrome://iViewFox/content/24streamchoice.xul", "", "chrome, dialog, modal, resizable=yes", params).focus();
  182.             }
  183.             var rv = fp.show();
  184.             if (rv == nsIFilePicker.returnOK || rv == nsIFilePicker.returnReplace) {
  185.                 var filePathAndName = fp.file.path;
  186.                 //http://rtmpdump.mplayerhq.hu/rtmpdump.1.html
  187.                 var args = [];
  188.                 if(serCheq){    //if 24 hour news stream
  189.                     args = ["-r",
  190.                             "rtmp://cp81899.live.edgefcs.net/",
  191.                             "-y",
  192.                             params.quality,
  193.                             "-a",
  194.                             "live/"+params.quality+"?auth="+xStore.token,
  195.                             "-W",
  196.                             "http://www.abc.net.au/iview/images/iview.jpg",
  197.                             "-o",
  198.                             filePathAndName,
  199.                             "-v",
  200.                             "-B",
  201.                             (Number(params.time)*60).toString()];                  
  202.                 }
  203.                 else{
  204.                     args = ['-r',
  205.                         'rtmp://cp53909.edgefcs.net////flash/playback/_definst_/'+epDS,
  206.                         '-a',
  207.                         'ondemand?auth='+xStore.token,
  208.                         '-o',
  209.                         filePathAndName,
  210.                         '-W',
  211.                         'http://www.abc.net.au/iview/images/iview.jpg'];
  212.                     if(xStore.host=='Hostworks'){
  213.                         var fileEx;
  214.                         if(fTypeSplit[1]=='mp4'){
  215.                             fileEx='mp4:';
  216.                         }
  217.                         else{
  218.                             fileEx='flv:';
  219.                         }
  220.                         args = ['-r',
  221.                             'rtmp://203.18.195.10/',
  222.                             '-a',
  223.                             'ondemand?auth='+xStore.token,
  224.                             '-y',
  225.                             fileEx+fTypeSplit[0],
  226.                             '-o',
  227.                             filePathAndName,
  228.                             '-W',
  229.                             'http://www.abc.net.au/iview/images/iview.jpg'];           
  230.                     }              
  231.                 }
  232.                 iViewFox.log(args);
  233.                 if(iViewFox.prefs.getBoolPref("downloadSubtitles")){
  234.                     var subFile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
  235.                     var fName = fp.file.path;
  236.                     if(fName.match('.')){
  237.                         fName=fName.slice(0,fName.lastIndexOf('.'));
  238.                     }
  239.                     subFile.initWithPath(fName+'.srt');
  240.                     var req = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Components.interfaces.nsIXMLHttpRequest);
  241.                     req.onreadystatechange = function (aEvt) {
  242.                         if (req.readyState == 4) {
  243.                             if(req.status == 200){
  244.                                 var subbersXML=new DOMParser().parseFromString(req.responseText, "text/xml");
  245.                                 iViewFox.parseCaptionsXML(subFile,subbersXML);
  246.                             }
  247.                             else{
  248.                                 iViewFox.log("No Captions Available");
  249.                             }
  250.                         }
  251.                     };                 
  252.                     req.onerror = function(err){
  253.                         iViewFox.log(err);
  254.                     };
  255.                     req.open("GET", 'http://www.abc.net.au/iview/captions/'+fTypeSplit[0]+'.xml', true);
  256.                     req.send(null);                
  257.                 }              
  258.                 if(iViewFox.osString=="Darwin"){
  259.                     var dfile = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);                
  260.                     dfile.initWithPath(getrtDump+'b.command');
  261.                     var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream);
  262.                    
  263.                     foStream.init(dfile, 0x02 | 0x08 | 0x20, 0666, 0);
  264.                     var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].createInstance(Components.interfaces.nsIConverterOutputStream);
  265.                     converter.init(foStream, "UTF-8", 0, 0);
  266.                    
  267.                     var data='#!/bin/bash\n"'+getrtDump+'rtmpdump-OSX-Intel" ';
  268.                     if(iViewFox.uA.match('PPC Mac')){
  269.                         data='#!/bin/bash\n"'+getrtDump+'rtmpdump-OSX-PPC" ';
  270.                     }
  271.                     args.forEach(function(item,index,array){
  272.                         if(index%2){
  273.                             data+=' "'+item+'" ';
  274.                         }
  275.                         else{
  276.                             data+=item;
  277.                         }
  278.                     });
  279.                     converter.writeString(data);
  280.                     converter.close();
  281.                     dfile.launch();
  282.                 }
  283.                 else{
  284.                     var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);                                     
  285.                     file.initWithPath(getrtDump);
  286.                     process.init(file);
  287.                     process.run(false, args, args.length);     
  288.                 }      
  289.             }
  290.  
  291.         }
  292. };
  293.  
  294. window.addEventListener("load", function() {
  295.    
  296.     if (typeof(Components.classes["@mozilla.org/extensions/manager;1"]) != 'undefined') { //borrowed from ^critter's extension - http://netusage.iau5.com/
  297.         iViewFox.extItem= Components.classes["@mozilla.org/extensions/manager;1"].getService(Components.interfaces.nsIExtensionManager).getItemForID("[email protected]").version;             
  298.     }
  299.     else{
  300.         Components.utils.import("resource://gre/modules/AddonManager.jsm");
  301.         AddonManager.getAddonByID("[email protected]", function(aAddon) {iViewFox.extItem=aAddon.version;});
  302.     }  
  303.     iViewFox.status();
  304.     gBrowser.addEventListener("DOMContentLoaded", iViewFox.init, false);
  305. }, false);
  306.  
  307. window.addEventListener("pagehide", iViewFox.unload, false);
Advertisement
Add Comment
Please, Sign In to add comment