Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var lite = isLite();
- localStorage.lite = lite ? '1' : '0';
- var helper = lite ? 'chromelite' : 'chrome';
- // default preferences
- var default_preferences = {
- version: 0,
- enable: 1,
- lmFileHosting: 1,
- lmMediaHosting: 1,
- moduleYoutube: 1,
- moduleDailymotion: 1,
- moduleVimeo: 1,
- moduleVkontakte: 1,
- moduleOdnoklassniki: 1,
- moduleShowDownloadInfo: 1,
- ytHideFLV: 0,
- ytHideMP4: 0,
- ytHideWebM: 1,
- ytHide3GP: 1,
- ytHide3D: 1,
- vkShowBitrate: 0
- };
- var pref_names = {
- youtube: 'moduleYoutube',
- dailymotion: 'moduleDailymotion',
- vimeo: 'moduleVimeo',
- vk: 'moduleVkontakte',
- odnoklassniki: 'moduleOdnoklassniki'
- };
- // localStorage == widget.preferences
- for (var k in default_preferences)
- {
- if (!(k in localStorage))
- localStorage[k] = default_preferences[k]; // set default preference
- }
- // modules[tab.id] = moduleName
- var modules = {};
- chrome.tabs.onRemoved.addListener(function(tabId){
- if (tabId in modules)
- delete modules[tabId];
- });
- // routes[action] = handler
- // handler - function(request, sender) {
- // ... code ...
- // return response;
- // }
- var routes = {
- initModule: function (request, sender, callback)
- {
- var response = {};
- var moduleName = request.moduleName;
- if (sender.tab)
- {
- modules[sender.tab.id] = moduleName;
- response.lite = lite;
- response.moduleEnable = localStorage.enable == '1';
- response.moduleShowDownloadInfo = localStorage.moduleShowDownloadInfo == '1';
- var info = chrome.app.getDetails();
- response.version = info.version;
- if (moduleName == 'lm')
- {
- response.moduleEnable &= localStorage.lmFileHosting == '1'
- || localStorage.lmMediaHosting == '1';
- response.lmMediaHosting = localStorage.lmMediaHosting;
- response.lmFileHosting = localStorage.lmFileHosting;
- }
- else if(moduleName != 'savefrom')
- {
- response.moduleEnable &= localStorage[pref_names[moduleName]] == '1';
- response.ytHideFLV = localStorage.ytHideFLV;
- response.ytHideMP4 = localStorage.ytHideMP4;
- response.ytHideWebM = localStorage.ytHideWebM;
- response.ytHide3GP = localStorage.ytHide3GP;
- response.ytHide3D = localStorage.ytHide3D;
- if(moduleName == 'vk')
- {
- response.vkShowBitrate = localStorage.vkShowBitrate;
- }
- }
- }
- callback(response);
- },
- hideDownloadInfo: function(request, sender){
- localStorage.moduleShowDownloadInfo = '0';
- },
- getVimeoLinks: function (request, sender, callback)
- {
- function callback_links(links, title)
- {
- var response = {
- action: request.action,
- extVideoId: request.extVideoId,
- links: links,
- title: title
- };
- callback(response);
- }
- getVimeoLinks(request.extVideoId, callback_links);
- },
- getVKLinks: function (request, sender, callback)
- {
- function callback_links(vid, links, title)
- {
- var response = {
- action: request.action,
- extVideoId: vid ? vid : request.extVideoId,
- links: links,
- title: title
- };
- callback(response);
- }
- getVKLinks(request.extVideoId, callback_links);
- },
- getYoutubeLinks: function (request, sender, callback)
- {
- function callback_links(links, title, subtitles)
- {
- var response = {
- action: request.action,
- extVideoId: request.extVideoId,
- links: links,
- title: title,
- subtitles: subtitles
- };
- callback(response);
- }
- getYoutubeLinks(sender.tab.url, request.extVideoId, request.checkSubtitles, callback_links);
- },
- getOdnoklassnikiLinks: function (request, sender, callback)
- {
- function callback_links(links)
- {
- var response = {
- action: request.action,
- extVideoId: request.extVideoId,
- links: links,
- title: request.title
- };
- callback(response);
- }
- getOdnoklassnikiLinks(request.extVideoId, callback_links);
- },
- getOdnoklassnikiAudioLinks: function (request, sender, callback)
- {
- function callback_links(data)
- {
- var response = {
- action: request.action,
- trackId: request.trackId,
- jsessionId: request.jsessionId,
- data: data
- };
- callback(response);
- }
- getOdnoklassnikiAudioLinks(sender.tab.url, request.trackId, request.jsessionId, callback_links);
- },
- getFileSize: function (request, sender, callback)
- {
- getFileSize(request.url, callback);
- }
- };
- // content scripts dispatcher
- chrome.extension.onRequest.addListener(function(request, sender, callback){
- //console.log('dispatcher', request, sender, callback);
- routes[request.action](request, sender, callback);
- });
- // is lite version
- function isLite()
- {
- var info = chrome.app.getDetails();
- if(info && info.name && info.name.search(/\s+lite/i) > -1)
- return true;
- return false;
- }
- // actions from menu
- function enableExtension()
- {
- localStorage.enable = (localStorage.enable == '0') ? '1' : '0';
- setButtonParams();
- }
- function downloadFromCurrentPage()
- {
- chrome.tabs.getSelected(null, function(tab)
- {
- var url = 'http://savefrom.net/?url=' + encodeURIComponent(tab.url) +
- '&utm_source=' + helper + '&utm_medium=extensions&utm_campaign=bookmarklet';
- chrome.tabs.create({url: url, selected: true});
- });
- }
- // tab actions
- var tabActions = ['updateLinks', 'downloadPlaylist', 'downloadMP3Files'];
- function tabAction(request, tab)
- {
- if (tab)
- {
- chrome.tabs.sendRequest(tab.id, request);
- }
- else
- {
- chrome.tabs.getSelected(null, function(tab){
- chrome.tabs.sendRequest(tab.id, request);
- });
- }
- }
- function createAction(name, tab)
- {
- return function(){
- tabAction({action: name}, tab);
- };
- }
- for (var i = 0; i < tabActions.length; i++)
- {
- var actionName = tabActions[i];
- window[actionName] = createAction(actionName);
- }
- // ---------
- setButtonParams();
- if(localStorage.enable != '0')
- checkVersion();
- function setButtonParams()
- {
- var icon = {path: 'images/icon_18.png'};
- var title = {title: chrome.i18n.getMessage("titleDefault")};
- if(localStorage.enable == '0')
- {
- title.title = chrome.i18n.getMessage("titleDesabled");
- icon.path = 'images/icon_disabled_18.png';
- }
- chrome.browserAction.setIcon(icon);
- chrome.browserAction.setTitle(title);
- }
- function fixPref(pref)
- {
- for(i = 0; i < pref.length; i++)
- {
- if(localStorage[pref[i].name] != pref[i].check)
- localStorage[pref[i].name] = pref[i].def;
- }
- }
- function checkVersion()
- {
- var url = '';
- var info = chrome.app.getDetails();
- if(!localStorage.version || localStorage.version == '0')
- {
- // first run
- url = 'http://savefrom.net/user.php?helper=' + helper + ';firstrun';
- }
- else if(localStorage.version != info.version)
- {
- // update
- //url = 'http://savefrom.net/user.php?helper=' + helper + ';update';
- }
- if(url)
- {
- localStorage.version = info.version;
- chrome.tabs.create({url: url, selected: true});
- }
- }
- function sendRequest(url, callback, method, referer, post, cookie, header)
- {
- var req = new XMLHttpRequest();
- if (!req)
- return;
- method = method ? method : ((post) ? 'POST' : 'GET');
- req.open(method, url, true);
- if(referer)
- req.setRequestHeader('Referer', referer);
- if(cookie)
- req.setRequestHeader('Cookie', cookie);
- if(post)
- {
- req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
- req.setRequestHeader("Content-Length", post.length);
- }
- if(header)
- {
- for(var i = 0; i < header.length; i++)
- {
- req.setRequestHeader(header[i][0], header[i][1]);
- }
- }
- req.onreadystatechange = function ()
- {
- if (req.readyState != 4)
- return;
- callback(req);
- };
- if (req.readyState == 4)
- {
- return;
- }
- if(post)
- req.send(post);
- else
- req.send();
- }
- function getFileSize(url, callback, referer, cookie, header)
- {
- sendRequest(url, function(req){
- var response = {
- fileSize: 0,
- fileType: ''
- };
- if (req.status == 200)
- {
- var s = req.getResponseHeader('Content-Length');
- if(s)
- {
- s = parseInt(s);
- if(!isNaN(s))
- response.fileSize = s;
- }
- var t = req.getResponseHeader('Content-Type');
- if(t)
- response.fileType = t;
- }
- callback(response);
- }, 'HEAD', referer, null, cookie, header);
- }
- function getVimeoLinks(videoId, callback)
- {
- var links = [], title = '';
- sendRequest('http://vimeo.com/moogaloop/load/clip:' + videoId + '/', function(r){
- try
- {
- if(r.status == 200 && r.responseXML)
- {
- var sig = r.responseXML.querySelector('request_signature');
- if(sig && sig.firstChild.nodeValue)
- {
- if(sig)
- {
- var url = 'http://vimeo.com/moogaloop/play/clip:' +
- videoId + '/' + sig.firstChild.nodeValue + '/';
- var sigExp = r.responseXML.querySelector('request_signature_expires');
- if(sigExp && sigExp.firstChild.nodeValue)
- url += sigExp.firstChild.nodeValue + '/';
- var t = r.responseXML.querySelector('video caption');
- if(t && t.firstChild.nodeValue)
- title = t.firstChild.nodeValue;
- links.push({
- url: url + '?q=sd',
- name: 'SD',
- type: 'mp4',
- ext: 'MP4'
- });
- var hd = r.responseXML.querySelector('isHD');
- if(hd && hd.firstChild.nodeValue == '1')
- {
- links.push({
- url: url + '?q=hd',
- name: 'HD',
- type: 'mp4',
- ext: 'MP4'
- });
- }
- }
- }
- }
- }
- finally
- {
- if(links.length)
- callback(links, title);
- else
- getVimeoNoEmbedLinks(videoId, callback);
- }
- });
- }
- function getVimeoNoEmbedLinks(videoId, callback)
- {
- var links = [], title = '';
- sendRequest('http://vimeo.com/' + videoId, function(r){
- try
- {
- if(r.status == 200 && r.responseText)
- {
- var re = new RegExp('clip' + videoId + '_\\d+\\s*=\\s*(\\{[\\s\\S]+?\\})\\s*;', 'i');
- var config = r.responseText.match(re);
- if(config && config.length > 1)
- {
- config = config[1].replace(/(\{|,)\s*(\w+)\s*:/ig, '$1"$2":').
- replace(/(:\s+)\'/g, '$1"').replace(/\'([,\]\}])/g, '"$1');
- config = JSON.parse(config);
- config = config.config;
- if(config && config.request && config.video &&
- config.request.signature && config.request.timestamp)
- {
- var data = {
- 'clip_id': videoId,
- 'sig': config.request.signature,
- 'time': config.request.timestamp,
- 'type': 'moogaloop_local',
- 'quality': 'sd',
- 'codecs': 'H264,VP8,VP6'
- };
- var title = config.video.title ? config.video.title : '';
- links.push({
- url: 'http://player.vimeo.com/play_redirect?' + getQueryString(data),
- name: 'SD',
- type: 'mp4',
- ext: 'MP4'
- });
- if(config.video.hd == 1)
- {
- data.quality = 'hd';
- links.push({
- url: 'http://player.vimeo.com/play_redirect?' + getQueryString(data),
- name: 'HD',
- type: 'mp4',
- ext: 'MP4'
- });
- }
- if(config.video.files && config.video.files.h264)
- {
- var files = config.video.files.h264;
- if(files.length > 0)
- {
- for(var i = 0; i < files.length; i++)
- {
- if(files[i] != 'sd' && files[i] != 'hd')
- {
- data.quality = files[i];
- links.push({
- url: 'http://player.vimeo.com/play_redirect?' + getQueryString(data),
- name: (files[i].length <= 3) ? files[i].toUpperCase() : ucfirst(files[i].toLowerCase()),
- type: 'mp4',
- ext: 'MP4'
- });
- }
- }
- }
- }
- }
- }
- }
- }
- finally
- {
- callback(links, title);
- }
- });
- }
- function getVKLinks(videoId, callback)
- {
- var links = {}, title = '';
- var vid = videoId;
- if(vid.search(/^video-?\d+_\d+/i) == -1)
- {
- var oid = '', id = '';
- var m = vid.match(/(?:^|&)oid=(-?\d+)/i);
- if(m && m.length > 1)
- oid = m[1];
- m = vid.match(/(?:^|&)id=(-?\d+)/i);
- if(m && m.length > 1)
- id = m[1];
- vid = '';
- if(oid && id)
- vid = 'video' + oid + '_' + id;
- }
- if(!vid)
- {
- callback(vid, links, title);
- return;
- }
- var url = 'http://vk.com/' + vid;
- sendRequest(url, function(r){
- try
- {
- if(r.status == 200 && r.responseText)
- {
- var json = r.responseText.match(/var vars\s*=\s*(\{[^\}]+\})/i);
- if(json)
- {
- try
- {
- json = json[1];
- if(json.search(/^\{\s*\\\"/) > -1)
- json = json.replace(/\\\"/g, '"');
- json = JSON.parse(json);
- if(json)
- {
- links = json;
- }
- }
- catch(err){}
- }
- }
- }
- finally
- {
- callback(vid, links, title);
- }
- });
- }
- function getYoutubeLinks(eurl, videoId, checkSubtitles, callback) {
- var links = {}, title = '';
- eurl = encodeURIComponent(eurl);
- var url = 'http://www.youtube.com/get_video_info?video_id=' + videoId +
- '&asv=3&eurl=' + eurl + '&el=embedded';
- var cookies = 'VISITOR_INFO1_LIVE=; PREF=; GEO=; use_hitbox=';
- sendRequest(url, function(r){
- try
- {
- if(r.status == 200 && r.responseText)
- {
- var fmtMap = r.responseText.match(
- /(?:^|&)(?:fmt_url_map|url_encoded_fmt_stream_map)=([^\s\&\"]+)/i);
- if(fmtMap && fmtMap.length > 1)
- {
- title = r.responseText.match(/(?:^|&)title=([^\s\&\"]+)/i);
- var titleParam = '';
- if(title)
- {
- title = title[1].replace(/\+/g, '%20');
- title = decodeURIComponent(title).
- replace(/[\x2F\x5C\x3A\x7C]/g, '-').
- replace(/[\x2A\x3F]/g, '').
- replace(/\x22/g, '\'').
- replace(/\x3C/g, '(').
- replace(/\x3E/g, ')').
- replace(/(?:^\s+)|(?:\s+$)/g, '');
- titleParam = '&title=' + encodeURIComponent(title);
- }
- var l = {};
- fmtMap = fmtMap[1];
- if(fmtMap.search(/url(=|%3d)http/i) > -1)
- {
- if(fmtMap.search(/url%3dhttp/i) > -1)
- fmtMap = decodeURIComponent(fmtMap);
- fmtMap = fmtMap.split(',');
- for(var i = 0; i < fmtMap.length; ++i)
- {
- var query = parseQuery(fmtMap[i]);
- if(query.url)
- {
- query.url = decodeURIComponent(query.url);
- if(query.url.search(/(\?|&)sig(nature)?=/i) == -1)
- {
- if(query.sig)
- query.url += '&signature=' + query.sig;
- else if(query.signature)
- query.url += '&signature=' + query.signature;
- }
- if(query.url.search(/(\?|&)itag=/i) == -1)
- {
- if(query.itag)
- query.url += '&itag=' + query.itag;
- }
- var fmt = query.url.match(/(?:\?|&)itag=(\d+)/i);
- if(fmt && fmt.length > 1)
- {
- fmt = fmt[1];
- query.url = query.url.replace(/(\?|&)sig=/i, '$1signature=').
- replace(/\\u0026/ig, '&').replace(/\\\//g, '/');
- l[fmt] = query.url;
- if(titleParam)
- l[fmt] += titleParam;
- }
- }
- }
- }
- else
- {
- fmtMap = decodeURIComponent(fmtMap);
- fmtMap = fmtMap.replace(/\\u0026/ig, '&').replace(/\\\//g, '/');
- fmtMap = fmtMap.replace(/,(\d+)\|/g, "\n$1|");
- fmtMap = fmtMap.split('\n');
- for(var i = 0; i < fmtMap.length; i++)
- {
- var t = fmtMap[i].split('|');
- if(t && t.length >= 2)
- {
- l[t[0]] = t[1];
- if(titleParam)
- l[t[0]] += titleParam;
- }
- }
- }
- if(l)
- links = l;
- }
- }
- }
- finally
- {
- if(checkSubtitles)
- {
- checkYoutubeSubtitles(videoId, function(subtitles){
- callback(links, title, subtitles);
- });
- }
- else
- callback(links, title, null);
- }
- }, '', url, '', cookies);
- }
- function checkYoutubeSubtitles(videoId, callback)
- {
- var url = 'http://video.google.com/timedtext?hl=en&v=' + videoId +
- '&type=list&tlangs=1';
- sendRequest(url, function(r){
- var result = false;
- if(r.status == 200 && r.responseXML)
- {
- if(r.responseXML.querySelector('target, track'))
- result = true;
- }
- callback(result);
- });
- }
- function getOdnoklassnikiLinks(extVideoId, callback)
- {
- if(!extVideoId)
- {
- callback(null);
- return;
- }
- var url = 'http://in.video.mail.ru/cgi-bin/video/oklite?eid=' + extVideoId;
- sendRequest(url, function(r){
- if(r.status == 200 && r.responseText)
- {
- var u = 'http://www.okcontent.video.mail.ru/media/';
- var host = r.responseText.match(/\$vcontentHost=([^\s\"'\<\>]+)/i);
- if(host && host.length > 1)
- u = 'http://' + host[1] + '/media/';
- u += extVideoId;
- var links = [];
- links.push({
- url: u + '-v.mp4',
- title: 'SD',
- ext: 'FLV'
- });
- if(r.responseText.search(/\$HDexist=1/i) > -1)
- {
- links.push({
- url: u + '-hv.mp4',
- title: 'HD',
- ext: 'MP4'
- });
- }
- if(links)
- {
- callback(links);
- return;
- }
- }
- callback(null);
- }, '', url);
- }
- function getOdnoklassnikiAudioLinks(pageUrl, trackId, jsessionId, callback)
- {
- if(!trackId || !jsessionId)
- {
- callback(null);
- return;
- }
- var url = 'http://wmf1.odnoklassniki.ru/play;jsessionid=' + jsessionId +
- '?tid=' + trackId + '&';
- sendRequest(url, function(r){
- var data = null;
- if(r.status == 200 && r.responseText)
- {
- data = JSON.parse(r.responseText);
- }
- callback(data);
- }, '', url);
- }
- function parseQuery(query)
- {
- var k = {};
- var re = /[?&]?([^=]+)(?:=([^&]*))?/g;
- while(m = re.exec(query))
- {
- if(m[1] && m[2])
- k[m[1]] = m[2];
- else if(m[1])
- k[m[1]] = '';
- };
- return k;
- }
- function getQueryString(query, key_prefix, key_suffix)
- {
- if(!query || typeof(query) != 'object')
- return '';
- if(key_prefix === undefined)
- key_prefix = '';
- if(key_suffix === undefined)
- key_suffix = '';
- var str = '';
- for(key in query)
- {
- if(str.length)
- str += '&';
- if(query[key] instanceof Object)
- {
- if(!key_prefix)
- key_prefix = '';
- if(!key_suffix)
- key_suffix = '';
- str += getQueryString(query[key], key_prefix + key + "[", "]" + key_suffix);
- }
- else
- str += key_prefix + escape(key) + key_suffix + '=' + escape(query[key]);
- }
- return str;
- }
- function ucfirst(str)
- {
- if(str.length)
- str = str.charAt(0).toUpperCase() + str.slice(1);
- return str;
- }
- fixPref([
- {name: 'button', check: '0', def: '1'},
- {name: 'moduleVimeo', check: '0', def: '1'},
- {name: 'ytHideFLV', check: '1', def: '0'},
- {name: 'ytHideMP4', check: '1', def: '0'},
- {name: 'ytHideWebM', check: '0', def: '1'},
- {name: 'ytHide3GP', check: '0', def: '1'},
- {name: 'ytHide3D', check: '0', def: '1'},
- {name: 'vkShowBitrate', check: '1', def: '0'}
- ]);
Advertisement
Add Comment
Please, Sign In to add comment