-
Notifications
You must be signed in to change notification settings - Fork 0
/
pocketcasts-network-error-retry.user.js
executable file
·75 lines (70 loc) · 2.91 KB
/
pocketcasts-network-error-retry.user.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
// ==UserScript==
// @name PocketCasts network error retry
// @namespace pocketcasts-network-error-retry
// @description When PocketCasts gets a network error, this script tries to start the stream again
// @match https://play.pocketcasts.com/*
// @grant none
// @version 0.2.1
// @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @updateURL https://github.com/Denocle/pocketcasts-network-error-retry/raw/master/pocketcasts-network-error-retry.user.js
// @downloadURL https://openuserjs.org/install/Denocle/PocketCasts_network_error_retry.user.js
// @run-at document-start
// ==/UserScript==
// This "addEventListener" override example code is taken from: https://stackoverflow.com/a/22841712/1713635
(function() {
Element.prototype._addEventListener = Element.prototype.addEventListener;
Element.prototype.addEventListener = function(a, b, c) {
this._addEventListener(a, b, c);
if (!this.eventListenerList) {
this.eventListenerList = {};
}
if (!this.eventListenerList[a]) {
this.eventListenerList[a] = [];
}
this.eventListenerList[a].push(b);
};
})();
function networkErrorRetryHandler(event) {
console.log('[Network Error Retry] Error event triggered', event);
if (!event.target.error) {
console.log('[Network Error Retry] No MediaError, nothing to handle');
return;
}
console.log('[Network Error Retry] MediaError found', event.target.error);
// Just empty src attribute, not real error
if (event.target.error.code === 4) {
console.log('[Network Error Retry] Just missing src attribute, nothing to fix');
return;
}
console.log('[Network Error Retry] Playing audio again');
event.target.play();
}
function attachHandler() {
// Run as interval in case the player element hasn't rendered yet
const i = setInterval(() => {
const player = document.querySelector('.audio');
if (player) {
player.addEventListener('error', networkErrorRetryHandler);
console.log('[Network Error Retry] Handler attached!');
clearInterval(i);
return;
}
console.log('[Network Error Retry] No player found');
}, 100);
}
// Start by attaching the handler
console.log('[Network Error Retry] Running');
attachHandler();
// Every 5 seconds, make sure that our handler is still attached.
// PocketCasts have a habit of removing our event listener.
setInterval(() => {
const player = document.querySelector('.audio');
if (!player) {
return;
}
const attachedHandlers = player.eventListenerList.error.map(f => f.name);
if (!attachedHandlers.includes('networkErrorRetryHandler')) {
console.error('[Network Error Retry] Our handler is gone! Attaching again', player.eventListenerList.error);
attachHandler();
}
}, 5000);