/
embedly.js
141 lines (125 loc) · 3.95 KB
/
embedly.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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
export default class Embedly {
constructor(player) {
this.origin = document.referrer.split("/").slice(0,3).join("/");
this.player = player;
this.listeners = {};
this.events = ["play", "pause", "timeupdate", "ended"];
this.methods = ["play", "pause", "getPaused", "setLoop", "getLoop",
"getVolume", "setVolume", "mute", "unmute", "getMuted", "getDuration",
"setCurrentTime", "getCurrentTime", "addEventListener",
"removeEventListener"];
window.addEventListener("message", (event) => { this.receive(event); });
window.addEventListener("load", (event) => { this.sendHeight(); })
window.addEventListener("resize", (event) => { this.sendHeight(); })
this.send("ready", {
src: window.location.toString(),
events: this.events,
methods: this.methods
});
}
send(event, value, listener) {
let message = {
context: "player.js",
version: "0.0.11",
event: event
}
let origin = this.origin == "" ? "*" : this.origin;
if (value != undefined) {
message.value = value;
}
if (listener != undefined) {
message.listener = listener;
}
window.parent.postMessage(JSON.stringify(message), origin);
}
sendHeight() {
let message = {
src: window.location.toString(),
context: "iframe.resize",
height: 220
}
let origin = "*";
window.parent.postMessage(JSON.stringify(message), origin);
}
receive(event) {
const message = JSON.parse(event.data);
if (message.context !== "player.js") return false;
if (!message.method) return false;
switch (message.method) {
case "play":
this.player.isLoaded() ? this.player.play() : this.player.load();
break;
case "pause":
this.player.pause();
break;
case "getPaused":
this.send("getPaused", !this.player.isPlaying(), message.listener);
break;
case "setLoop":
this.player.loop(message.value);
break;
case "getLoop":
this.send("getLoop", this.player.willLoop(), message.listener);
break;
case "getVolume":
this.send("getVolume", (this.player.audio.volume() * 100), message.listener);
break;
case "setVolume":
this.player.audio.setVolume(message.value);
break;
case "mute":
this.player.mute();
break;
case "unmute":
this.player.unmute();
break;
case "getMuted":
this.send("getMuted", this.player.isMuted(), message.listener);
break;
case "getDuration":
this.send("getDuration", this.player.episodeDuration(), message.listener);
break;
case "setCurrentTime":
this.player.scrubEnd(message.value);
break;
case "getCurrentTime":
this.send("getCurrentTime", this.player.currentTime(), message.listener);
break;
case "addEventListener":
this.addListener(message.value, message.listener);
break;
case "removeEventListener":
this.removeListener(message.value, message.listener);
break;
default:
console.log("method not supported", message.method);
}
}
addListener(event, listener) {
if (this.listeners.hasOwnProperty(event)) {
if (this.listeners[event].indexOf(listener) == -1) {
this.listeners[event].push(listener);
}
} else {
this.listeners[event] = [listener];
}
}
removeListener(event, listener) {
if (this.listeners.hasOwnProperty(event)) {
let index = this.listeners[event].indexOf(listener);
if (index > -1) {
this.listeners[event].splice(index, 1);
}
if (this.listeners[event].length == 0) {
delete this.listeners[event];
}
}
}
emit(event, value) {
if (!this.listeners.hasOwnProperty(event)) return false;
for (var i = 0; i < this.listeners[event].length; i++) {
var listener = this.listeners[event][i];
this.send(event, value, listener);
}
}
}