-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathbackground.js
112 lines (103 loc) · 3.45 KB
/
background.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
var webRequestParams = {
urls: ["https://*.fbcdn.net/*"],
types: ['xmlhttprequest']
};
var webRequestLastFound = [];
var contentType;
var isLoading = {};
chrome.browserAction.onClicked.addListener(onIconClick);
chrome.webRequest.onCompleted.addListener((details) => onWebRequest(details, 'onCompleted'), webRequestParams);
chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
console.log("on action", request, sender);
let { action } = request;
let response = {ok: true};
switch (action) {
case 'clickIcon':
chrome.tabs.getSelected(null, onIconClick);
break;
case 'getLastRequests':
response = {webRequestLastFound};
break;
case 'setLoading':
isLoading[sender.tab.id] = request.value;
if (request.value) {
generateIcons(sender.tab.id, 'spinner');
} else {
analyzeTab();
}
break;
}
sendResponse({action, ...response});
});
chrome.tabs.onActivated.addListener(function(info) {
console.log('[FED] tab activated', info);
analyzeTab();
});
chrome.tabs.onUpdated.addListener(function(tabId, info, tab) {
console.log('[FED] tab updated', tabId, tab, info);
if (tab.selected && tab.status != "unloaded") analyzeTab();
});
function onIconClick(tab) {
let { url, status } = tab;
if (status != "complete") return;
if (!contentType) {
if (url.includes("www.facebook.com")) {
alert('Open Facebook photo, video, or story you wish to download.');
}
return;
}
console.log('[FED] download', contentType, 'from', tab);
chrome.tabs.executeScript(+tab.id, {code: `dl['${contentType}']();`}, function(results) {
let {lastError} = chrome.runtime;
console.log('script execution result', lastError ? lastError.message : results);
});
}
function onWebRequest(details, type) {
let {url} = details;
if (url.includes('.mp4?') && url.includes('&bytestart=')) {
let mediaUrl = url.split('&bytestart=')[0];
console.log('[FED] media request', type, mediaUrl);
if (webRequestLastFound[0] != mediaUrl) {
webRequestLastFound.unshift(mediaUrl);
webRequestLastFound = webRequestLastFound.slice(0,2);
}
}
}
function generateIcons(tabId, name) {
console.log('[FED] set browser icon', tabId, name);
chrome.browserAction.setIcon({tabId, path: isLoading[tabId] ? {
"32": "icons/spinner.gif"
} : {
"16": "icons/" + name + "16.png",
"24": "icons/" + name + "24.png",
"32": "icons/" + name + "32.png"
}});
}
function analyze(tab) {
console.log("[FED] analyze", tab);
let { url, status } = tab;
let tabId = tab.id;
let site;
contentType = null;
if (url.includes("www.facebook.com")) {
if (url.includes("/photo")) contentType = 'photo';
else if (url.includes("/stories/")) contentType = 'story';
else if (url.includes("/video")) contentType = 'video';
site = 'Facebook';
}
if (status == "complete") {
chrome.browserAction.setTitle({title: contentType ? `Download ${site} ${contentType} (or press Ctrl+S)` : "Open a Facebook media you wish to download.", tabId});
chrome.browserAction.setBadgeText({'text': contentType});
chrome.browserAction.setBadgeBackgroundColor({'color': '#333333'});
generateIcons(tabId, site ? 'icon' : 'disabled');
} else {
chrome.browserAction.setTitle({title: "Please wait ...", tabId});
}
if (contentType) {
console.log('[FED] content found', site, contentType);
}
};
function analyzeTab() {
chrome.tabs.getSelected(null, analyze);
}
analyzeTab();