Skip to content

Commit 81ac54e

Browse files
committed
media-player (wip, alpha2); some code optimizations;
1 parent 0671018 commit 81ac54e

File tree

7 files changed

+120
-66
lines changed

7 files changed

+120
-66
lines changed

www/css/sepiaFW-cards.css

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -405,12 +405,15 @@
405405
.sepiaFW-cards-flexSize-container.sepia-embedded-player-card {
406406
margin-bottom: 10px;
407407
}
408-
.sepiaFW-cards-flexSize-container .sepiaFW-embedded-player-container iframe {
408+
.sepiaFW-cards-flexSize-container .cardBodyItem.embeddedWebPlayer {
409+
position: relative;
410+
}
411+
.sepiaFW-cards-flexSize-container .cardBodyItem.embeddedWebPlayer iframe {
409412
border: 0;
410413
border-radius: 3px;
411414
transition: height .3s;
412415
}
413-
.sepiaFW-cards-flexSize-container .sepiaFW-embedded-player-container .cardItemOverlay {
416+
.sepiaFW-cards-flexSize-container .cardBodyItem.embeddedWebPlayer .cardItemOverlay {
414417
position: absolute;
415418
top: 0;
416419
left: 0;
@@ -422,7 +425,7 @@
422425
justify-content: center;
423426
align-items: center;
424427
}
425-
.sepiaFW-cards-flexSize-container .sepiaFW-embedded-player-container .cardItemOverlay p {
428+
.sepiaFW-cards-flexSize-container .cardBodyItem.embeddedWebPlayer .cardItemOverlay p {
426429
animation: sepiaFW-animation-blink 3s infinite;
427430
}
428431

www/css/sepiaFW-frames.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@
195195
}
196196
.sepiaFW-frames-page .group .set-button {
197197
margin: 0 8px !important;
198-
min-width: 56px;
198+
min-width: 36px;
199199
flex: 0 0 auto;
200200
}
201201
.sepiaFW-frames-page .group .trigger-button {

www/scripts/sepiaFW.ui.cards.embed.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ function sepiaFW_build_ui_cards_embed(){
1111
- Implement async. callback with msgId and timeout
1212
*/
1313
var playerWidgets = {
14+
default: "<assist_server>/widgets/mp-default.html",
1415
spotify: "<assist_server>/widgets/mp-spotify.html",
1516
apple_music: "<assist_server>/widgets/mp-apple-music.html",
1617
youtube: "<assist_server>/widgets/mp-youtube.html"
@@ -76,7 +77,7 @@ function sepiaFW_build_ui_cards_embed(){
7677

7778
//MediaPlayer interface
7879
Embed.MediaPlayer = function(options){
79-
if (!options || !options.parentElement || !options.widgetUrl){
80+
if (!options || !options.parentElement || !(options.widgetUrl || options.widget)){
8081
SepiaFW.debug.error("Embedded MediaPlayer - Invalid options!");
8182
return;
8283
}
@@ -89,12 +90,12 @@ function sepiaFW_build_ui_cards_embed(){
8990
}
9091

9192
//Widget URL
92-
options.widgetUrl = SepiaFW.config.replacePathTagWithActualPath(options.widgetUrl);
93-
console.error("URL", options.widgetUrl); //DEBUG
94-
//<custom_data>/embedded-player.html
93+
var widgetUrl = options.widgetUrl || playerWidgets[options.widget];
94+
widgetUrl = SepiaFW.config.replacePathTagWithActualPath(widgetUrl);
95+
console.error("URL", widgetUrl); //DEBUG
9596

9697
//Create card (DOM element)
97-
var mpObj = createMediaPlayerDomElement(playerId, options.widgetUrl, function(){
98+
var mpObj = createMediaPlayerDomElement(playerId, widgetUrl, function(){
9899
//on-load
99100
console.error("on-load", playerId); //DEBUG
100101
sendEvent({text: "World Hello"});

www/scripts/sepiaFW.ui.cards.js

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,8 +1227,13 @@ function sepiaFW_build_ui_cards(){
12271227
//default link icon
12281228
leftElement = "<div class='itemLeft linkCardLogo'>" + "<i class='material-icons md-mnu'>link</i>" + "</div>"; //language
12291229
}else if (data.type == "musicSearch" || data.type == "videoSearch"){
1230-
//we could check the brand here: data.brand, e.g. Spotify, YouTube, ...
1231-
linkCardEle.className += (" " + data.brand);
1230+
//default music icon
1231+
if (!linkLogo){
1232+
leftElement = "<div class='itemLeft linkCardLogo'>" + "<i class='material-icons md-mnu'>music_video</i>" + "</div>";
1233+
}else if (data.brand && data.brand != "default"){
1234+
//we could check the brand here: data.brand, e.g. Spotify, YouTube, ...
1235+
linkCardEle.className += (" " + data.brand);
1236+
}
12321237
}
12331238
}else if (!linkLogo){
12341239
//default link icon
@@ -1261,16 +1266,22 @@ function sepiaFW_build_ui_cards(){
12611266
cardBody.appendChild(linkCardEle);
12621267

12631268
//Experimenting with web players - note: use data.embedded ?
1264-
var embedWebPlayer = Cards.canEmbedWebPlayer(data.brand) && linkUrl && data.type && (data.type == "musicSearch" || data.type == "videoSearch");
1269+
console.error("TEST", "embedWebPlayer", data); //DEBUG
1270+
var embedWebPlayer = data.type && (data.type == "musicSearch" || data.type == "videoSearch")
1271+
&& data.typeData && Cards.canEmbedWebPlayer(data.typeData.service);
12651272
if (embedWebPlayer){
12661273
var allowIframe;
12671274
if (isSafeSource){
12681275
allowIframe = 'autoplay *; encrypted-media *;';
12691276
}else{
12701277
allowIframe = 'encrypted-media *;';
12711278
}
1279+
//Embedded player
1280+
if (data.brand == "default"){
1281+
addEmbeddedPlayerToCard(cardBody, data.type, data.typeData);
1282+
12721283
//Spotify
1273-
if (data.brand == "Spotify"){
1284+
}else if (data.brand == "Spotify"){
12741285
var webPlayerDiv = document.createElement('DIV');
12751286
webPlayerDiv.className = "spotifyWebPlayer embeddedWebPlayer cardBodyItem fullWidthItem";
12761287
var contentUrl = "https://" + linkUrl.replace("spotify:", "open.spotify.com/embed/").replace(":play", "").replace(/:/g, "/").trim();
@@ -2156,6 +2167,13 @@ function sepiaFW_build_ui_cards(){
21562167
});
21572168
cardBody.appendChild(cardEle);
21582169
}
2170+
function addEmbeddedPlayerToCard(cardBody, type, data){
2171+
//cardBody class should be -> 'sepiaFW-embedded-player-container'
2172+
var player = new SepiaFW.ui.cards.embed.MediaPlayer({
2173+
parentElement: cardBody,
2174+
widget: "default"
2175+
});
2176+
}
21592177

21602178
//-- Plot cards --
21612179

www/scripts/sepiaFW.ui.js

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1437,6 +1437,52 @@ function sepiaFW_build_ui(){
14371437
messagePopupAutoActionTry = 0;
14381438
}
14391439

1440+
//Create basic input popup
1441+
UI.showInputPopup = function(infoContent, inputLabel,
1442+
inputCallback, abortCallback, buttonLabel1, buttonLabel2){
1443+
return SepiaFW.ui.showPopup(infoContent, {
1444+
inputLabelOne: inputLabel || "Input",
1445+
buttonOneName: buttonLabel1 || SepiaFW.local.g('ok'),
1446+
buttonOneAction: function(btn, inputVal1){
1447+
if (inputCallback) inputCallback(inputVal1);
1448+
},
1449+
buttonTwoName: buttonLabel2 || SepiaFW.local.g('abort'),
1450+
buttonTwoAction: function(btn, inputVal1){
1451+
if (abortCallback) abortCallback(inputVal1);
1452+
}
1453+
});
1454+
}
1455+
1456+
//Create a special select popup
1457+
UI.showSelectPopup = function(textInfo, selectOptions, selectCallback, abortCallback){
1458+
var text = document.createElement("p");
1459+
text.textContent = textInfo || "";
1460+
var selector = document.createElement("select");
1461+
selector.style.maxWidth = "100%";
1462+
selectOptions.forEach(function(sel, i){
1463+
var opt = document.createElement("option");
1464+
opt.value = sel.value;
1465+
opt.textContent = sel.text;
1466+
if (sel.selected) opt.selected = true;
1467+
selector.appendChild(opt);
1468+
});
1469+
var config = {
1470+
buttonOneName: SepiaFW.local.g('select'),
1471+
buttonOneAction: function(){
1472+
var selectedOpt = selector.options[selector.selectedIndex];
1473+
if (selectCallback) selectCallback(selectedOpt.value, selectedOpt.textContent);
1474+
},
1475+
buttonTwoName: SepiaFW.local.g('abort'),
1476+
buttonTwoAction: function(){
1477+
if (abortCallback) abortCallback();
1478+
}
1479+
};
1480+
var content = document.createElement("div");
1481+
content.appendChild(text);
1482+
content.appendChild(selector);
1483+
return SepiaFW.ui.showPopup(content, config);
1484+
}
1485+
14401486
//Use pop-up to ask for permission
14411487
UI.askForPermissionToExecute = function(question, allowedCallback, refusedCallback){
14421488
var request = SepiaFW.local.g('allowedToExecuteThisCommand') + "<br>" + question;
@@ -1456,7 +1502,7 @@ function sepiaFW_build_ui(){
14561502
UI.askForConfirmation = function(question, allowedCallback, refusedCallback, alternativeCallback, alternativeLabel){
14571503
var config = {
14581504
buttonOneName: SepiaFW.local.g('ok'),
1459-
buttonOneAction : function(){
1505+
buttonOneAction: function(){
14601506
//yes
14611507
if (allowedCallback) allowedCallback();
14621508
},

www/scripts/sepiaFW.wakeWordSettings.js

Lines changed: 34 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -108,33 +108,23 @@ function sepiaFW_build_wake_word_settings() {
108108

109109
//Select engine file URL
110110
WakeWordSettings.engineFileUrlPopup = function(){
111-
var text = document.createElement("p");
112-
text.textContent = "Suggestions for engine file URLs. Adapt as required. Note: <...> parts are special tags that the client will convert automatically.";
113-
var selector = document.createElement("select");
114-
selector.style.maxWidth = "100%";
115111
var suggestedEngineFolder = (SepiaFW.wakeTriggers.engine || "porcupine").toLowerCase();
116-
[{info: "SEPIA Server (self-hosted)", url: "<assist_server>/files/wake-words/" + suggestedEngineFolder + "/"},
117-
{info: "Device (local app folder or filesystem)", url: "<custom_data>/" + suggestedEngineFolder + "/"},
118-
{info: "SEPIA Website (public URL)", url: "<sepia_website>/files/" + suggestedEngineFolder + "/"},
119-
{info: "Any Website with SSL (public URL)", url: "https://..."}
120-
].forEach(function(sugg, i){
121-
var opt = document.createElement("option");
122-
opt.value = sugg.url;
123-
opt.textContent = sugg.info;
124-
selector.appendChild(opt);
125-
});
126-
var config = {
127-
buttonOneName : SepiaFW.local.g('select'),
128-
buttonOneAction : function(){
129-
$("#sepiaFW-wake-word-remote-url").val(selector.value);
130-
},
131-
buttonTwoName : SepiaFW.local.g('abort'),
132-
buttonTwoAction : function(){}
133-
};
134-
var content = document.createElement("div");
135-
content.appendChild(text);
136-
content.appendChild(selector);
137-
SepiaFW.ui.showPopup(content, config);
112+
var currentVal = $("#sepiaFW-wake-word-remote-url").val();
113+
var selectOptions = [
114+
{text: "SEPIA Server (self-hosted)", value: "<assist_server>/files/wake-words/" + suggestedEngineFolder + "/"},
115+
{text: "Device (local app folder or filesystem)", value: "<custom_data>/" + suggestedEngineFolder + "/"},
116+
{text: "SEPIA Website (public URL)", value: "<sepia_website>/files/" + suggestedEngineFolder + "/"},
117+
{text: "Any Website with SSL (public URL)", value: "https://..."}
118+
];
119+
selectOptions.forEach(function(o){ if (o.value == currentVal){ o.selected = true; }});
120+
SepiaFW.ui.showSelectPopup(
121+
"Suggestions for engine file URLs. Adapt as required. Note: <...> parts are special tags that the client will convert automatically.",
122+
selectOptions,
123+
function(val, tex){
124+
$("#sepiaFW-wake-word-remote-url").val(val);
125+
},
126+
function(){}
127+
);
138128
}
139129

140130
//Select keyword pop-up
@@ -143,32 +133,28 @@ function sepiaFW_build_wake_word_settings() {
143133
SepiaFW.ui.showPopup("Please load engine first to get a list of available wake-words.");
144134
return;
145135
}
136+
var currentVal = $("#sepiaFW-wake-word-name").val();
137+
var selectOptions = [
138+
{text: "Default", value: ""}
139+
];
146140
var akw = SepiaFW.wakeTriggers.getAvailableWakeWords() || {};
147-
var text = document.createElement("p");
148-
text.textContent = "Choose your wake-word:";
149-
var selector = document.createElement("select");
150-
selector.innerHTML = '<option value=\'{"v": "", "kw": ""}\'>Default</option>';
151-
Object.keys(akw).forEach(function(kw, i){
152-
var opt = document.createElement("option");
153-
opt.value = JSON.stringify({v: akw[kw], kw: kw});
154-
opt.textContent = kw + " (v" + akw[kw] + ")";
155-
selector.appendChild(opt);
141+
Object.keys(akw).forEach(function(kw){
142+
selectOptions.push({
143+
text: (kw + " (v" + akw[kw] + ")"),
144+
value: JSON.stringify({v: akw[kw], kw: kw}),
145+
selected: (currentVal == kw)
146+
});
156147
});
157-
var config = {
158-
buttonOneName : SepiaFW.local.g('select'),
159-
buttonOneAction : function(){
160-
//select
161-
var vkw = JSON.parse(selector.value);
148+
SepiaFW.ui.showSelectPopup(
149+
"Choose your wake-word:",
150+
selectOptions,
151+
function(val, tex){
152+
var vkw = val? JSON.parse(val) : {v: "", kw: ""};
162153
$("#sepiaFW-wake-word-version").val(vkw.v);
163154
$("#sepiaFW-wake-word-name").val(vkw.kw);
164-
},
165-
buttonTwoName : SepiaFW.local.g('abort'),
166-
buttonTwoAction : function(){}
167-
};
168-
var content = document.createElement("div");
169-
content.appendChild(text);
170-
content.appendChild(selector);
171-
SepiaFW.ui.showPopup(content, config);
155+
},
156+
function(){}
157+
);
172158
}
173159

174160
//Test-function for wake-word

www/wake-word-settings.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ <h3>Wake-Word Settings</h3>
5151
title="Paths you can use: empty or '<assist_server>/files/...' (self-hosted), '<custom_data>/...' (device), '<sepia_website>/files/porcupine/' (remote) as shortcuts.">
5252
</div>
5353
<button class="trigger-button" onclick="SepiaFW.wakeWordSettings.engineFileUrlPopup()"><i class="material-icons md-txt">search</i></button>
54-
<button class="set-button" onclick="SepiaFW.wakeWordSettings.storeWakeWordRemoteDownloadUrl()">SET</button>
54+
<button class="set-button" onclick="SepiaFW.wakeWordSettings.storeWakeWordRemoteDownloadUrl()"><i class="material-icons md-txt">save</i></button>
5555
</div>
5656
<div class="group fit expert-setting" id="sepiaFW-wake-word-switcher" style="display: none;">
5757
<div class="entry-content">
@@ -60,7 +60,7 @@ <h3>Wake-Word Settings</h3>
6060
<input id="sepiaFW-wake-word-name" style="max-width: calc(100% - 80px);" placeholder="Hey SEPIA" value="Hey SEPIA" spellcheck="false">
6161
</div>
6262
<button class="trigger-button" onclick="SepiaFW.wakeWordSettings.keywordSelectPopup()"><i class="material-icons md-txt">search</i></button>
63-
<button class="set-button" onclick="SepiaFW.wakeWordSettings.updateWakeWordFile()">SET</button>
63+
<button class="set-button" onclick="SepiaFW.wakeWordSettings.updateWakeWordFile()"><i class="material-icons md-txt">save</i></button>
6464
</div>
6565
<div class="group fit expert-setting" id="sepiaFW-wake-word-confirm-sound" style="display: none;">
6666
<div class="entry-content">
@@ -69,14 +69,14 @@ <h3>Wake-Word Settings</h3>
6969
title="Some options: sounds/bleep.mp3, sounds/blob.mp3, sounds/chirp.mp3 (default: coin.mp3)">
7070
</div>
7171
<button class="trigger-button" onclick="SepiaFW.wakeWordSettings.testMicConfirmationSound()"><i class="material-icons md-txt">play_arrow</i></button>
72-
<button class="set-button" onclick="SepiaFW.wakeWordSettings.setMicConfirmationSound()">SET</button>
72+
<button class="set-button" onclick="SepiaFW.wakeWordSettings.setMicConfirmationSound()"><i class="material-icons md-txt">save</i></button>
7373
</div>
7474
<div class="group fit hidden-expert-setting" id="sepiaFW-wake-word-buffer" style="display: none;">
7575
<div class="entry-content">
7676
<label>Buffer Length:</label>
7777
<input id="sepiaFW-wake-word-buffer-length" placeholder="512" value="512" spellcheck="false">
7878
</div>
79-
<button class="set-button" onclick="SepiaFW.wakeWordSettings.setBufferLength()">SET</button>
79+
<button class="set-button" onclick="SepiaFW.wakeWordSettings.setBufferLength()"><i class="material-icons md-txt">save</i></button>
8080
</div>
8181
<div class="group fit debug-setting" style="display: none; flex-direction: column;">
8282
<p>Debug Log &nbsp;<button class="trigger-button" onclick="document.getElementById('sepiaFW-wake-word-audio-info').textContent='';"><i class="material-icons md-txt">delete_sweep</i></button></p>

0 commit comments

Comments
 (0)