VulpesOS/gaia/tv_apps/dlna-player/js/service_manager.js
OverSu b38dea0597 Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
2026-09-30 23:13:03 +02:00

145 lines
4.4 KiB
JavaScript
Executable file

/* globals Plug, deviceManager */
'use strict';
(function(exports) {
var DEBUG = false;
function ServiceManager() {
}
ServiceManager.prototype = {
listElementId: 'elementList',
serviceName: 'ConnectionManager',
serviceType: 'upnp:urn:schemas-upnp-org:service:ConnectionManager:1',
serviceConstructor: Plug.UPnP_ContentDirectory,
savedServices: {},
init: function sm_init() {
this.debugEl = document.getElementById('debug');
this.listElement = document.getElementById(this.listElementId);
this.discover();
return this;
},
debugLog: function sm_debugLog(msg, level) {
if (!DEBUG && level == 'debug') {
return;
}
var logEl = document.createElement('div');
logEl.textContent = msg;
this.debugEl.appendChild(logEl);
},
appendMixinProperties: function sm_appendConfigDocument(serviceWrapper) {
var parser = new DOMParser();
serviceWrapper.configDocument =
parser.parseFromString(serviceWrapper.svc.config, 'text/xml');
serviceWrapper.friendlyName = serviceWrapper.configDocument.
getElementsByTagName('friendlyName')[0].textContent;
},
updateService: function sm_updateService(service) {
if (!this.savedServices[service.id]) {
var mediaServer =
new this.serviceConstructor(service, { debug: false });
this.appendMixinProperties(mediaServer);
this.savedServices[service.id] = mediaServer;
deviceManager.addService(mediaServer);
var serverItem = this.serverView(mediaServer);
this.listElement.appendChild(serverItem);
mediaServer.serverItem = serverItem;
}
},
removeService: function sm_removeService(service) {
for(var id in this.savedServices) {
if (service.id === id) {
var serverItem = this.savedServices[service.id].serverItem;
this.removeSiblingList(serverItem);
serverItem.parentElement.removeChild(serverItem);
delete this.savedServices[service.id];
}
}
},
serverView: function sm_serverView(serviceWrapper) {
// Add server node
var serverItem = document.createElement('li');
var serverName = serviceWrapper.friendlyName;
serverItem.className = 'server';
serverItem.textContent = serverName;
serverItem.dataset.serviceId = serviceWrapper.svc.id;
return serverItem;
},
onServices: function sm_onServices(services) {
services.addEventListener('servicefound', function servicefound(e) {
for (var i = 0; i < services.length; i++) {
if (services[i].online) {
this.updateService(services[i]);
}
}
}.bind(this));
services.addEventListener('servicelost', function servicelost(e) {
for (var i = 0; i < services.length; i++) {
if (!services[i].online) {
this.removeService(services[i]);
}
}
}.bind(this));
this.debugLog(services.length + ' service' +
(services.length !== 1 ? 's' : '') +
' found in the current network');
// Remove offline services
for (var savedServiceId in this.savedServices) {
var removed = true;
for (var i = 0; i < services.length; i++) {
if (services[i].id == savedServiceId) {
removed = false;
break;
}
}
if (removed) {
this.remove(savedServiceId);
}
}
// Update services individually
for (var j = 0; j < services.length; j++) {
this.updateService(services[j]);
}
},
get currentService() {
return deviceManager.getSelectedService(this.serviceName);
},
removeSiblingList: function sm_remove(elem) {
if (elem.nextElementSibling.classList.contains('sublist')) {
elem.parentElement.removeChild(elem.nextElementSibling);
}
},
discover: function sm_discover() {
if (navigator.getNetworkServices) {
this.debugLog('Searching for UPnP services in the current network...');
navigator.getNetworkServices(this.serviceType)
.then(this.onServices.bind(this), function(e) {
this.debugLog('An error occurred obtaining UPnP Services [CODE: ' +
e.code + ']');
});
} else {
this.debugLog(
'navigator.getNetworkServices API is not supported in this browser');
}
}
};
exports.ServiceManager = ServiceManager;
})(window);