mirror of
https://github.com/lxsang/ant-http
synced 2025-07-27 02:59:47 +02:00
new init
This commit is contained in:
47
build/htdocs/dist/packages/default/MusicPlayer/api.php
vendored
Normal file
47
build/htdocs/dist/packages/default/MusicPlayer/api.php
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
<?php
|
||||
|
||||
if ( !defined("MusicPlayerCommand") ) define("MusicPlayerCommand", "/usr/bin/mediainfo");
|
||||
|
||||
class ApplicationMusicPlayer
|
||||
{
|
||||
|
||||
public static function call($method, $args) {
|
||||
if ( $method === 'info' ) {
|
||||
list($dirname, $fname, $protocol) = getRealPath($args['filename']);
|
||||
|
||||
if ( !class_exists('SimpleXMLElement') ) {
|
||||
throw new Exception("Cannot get media information -- No XML parser found");
|
||||
}
|
||||
if ( !function_exists('exec') ) {
|
||||
throw new Exception("Cannot get media information -- Exec not allowed");
|
||||
}
|
||||
|
||||
$cmd = sprintf("%s --Output=XML %s", MusicPlayerCommand, escapeshellcmd($fname));
|
||||
@exec($cmd, $content);
|
||||
if ( !$content ) {
|
||||
throw new Exception("Cannot get media information -- Query failed");
|
||||
}
|
||||
|
||||
try {
|
||||
$xml = new SimpleXMLElement(implode("\n", preg_replace("/_+/", "", $content)));
|
||||
} catch ( Exception $e ) {
|
||||
$xml = $e;
|
||||
}
|
||||
|
||||
if ( $xml !== null ) {
|
||||
if ( isset($xml->File[0]) && isset($xml->File[0]->track) && ($node = $xml->File->track) ) {
|
||||
return Array(
|
||||
'Artist' => isset($node->Performer) ? htmlspecialchars($node->Performer) : null,
|
||||
'Album' => isset($node->Album) ? htmlspecialchars($node->Album) : null,
|
||||
'Track' => isset($node->Track_name) ? htmlspecialchars($node->Track_name) : null
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
47
build/htdocs/dist/packages/default/MusicPlayer/combined.css
vendored
Normal file
47
build/htdocs/dist/packages/default/MusicPlayer/combined.css
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
/*!
|
||||
* OS.js - JavaScript Cloud/Web Desktop Platform
|
||||
*
|
||||
* Copyright (c) 2011-2015, Anders Evenrud <andersevenrud@gmail.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* @author Anders Evenrud <andersevenrud@gmail.com>
|
||||
* @licence Simplified BSD License
|
||||
*/
|
||||
|
||||
/*.ApplicationMusicPlayerWindow {
|
||||
}*/
|
||||
|
||||
.ApplicationMusicPlayerWindow gui-slider {
|
||||
margin : 4px;
|
||||
margin-top : 10px;
|
||||
margin-bottom : 10px;
|
||||
}
|
||||
.ApplicationMusicPlayerWindow gui-vbox[data-id="Metadata"] {
|
||||
margin : 4px;
|
||||
}
|
||||
.ApplicationMusicPlayerWindow gui-audio {
|
||||
display : none;
|
||||
}
|
||||
.ApplicationMusicPlayerWindow gui-button-bar {
|
||||
text-align : center;
|
||||
}
|
541
build/htdocs/dist/packages/default/MusicPlayer/combined.js
vendored
Normal file
541
build/htdocs/dist/packages/default/MusicPlayer/combined.js
vendored
Normal file
@ -0,0 +1,541 @@
|
||||
/*!
|
||||
* OS.js - JavaScript Cloud/Web Desktop Platform
|
||||
*
|
||||
* Copyright (c) 2011-2016, Anders Evenrud <andersevenrud@gmail.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* @author Anders Evenrud <andersevenrud@gmail.com>
|
||||
* @licence Simplified BSD License
|
||||
*/
|
||||
(function(Application, Window, GUI, Dialogs, VFS) {
|
||||
// jscs:disable validateQuoteMarks
|
||||
'use strict';
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// LOCALES
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
var _Locales = {
|
||||
bg_BG : {
|
||||
'Playlist' : 'Плейлист',
|
||||
'Playback aborted' : 'Прекратено изпълнение',
|
||||
'Network or communication error' : 'Проблем с връзка към мрежа',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Провалено декодиране, повереден файл или неподдържан формат',
|
||||
'Media source not supported' : 'Източника на медия не се поддържа',
|
||||
'Failed to play file' : 'Изпълнението на файла се провали',
|
||||
'Artist' : 'Изпълнител',
|
||||
'Album' : 'Албум',
|
||||
'Track' : 'Песен',
|
||||
'Time' : 'Време',
|
||||
'Media information query failed' : 'Получаване на информация провалено',
|
||||
'seek unavailable in format' : 'Невъществуващ формат',
|
||||
'The audio type is not supported: {0}' : 'Аудио формата не се поддържа'
|
||||
},
|
||||
de_DE : {
|
||||
'Playlist' : 'Wiedergabeliste',
|
||||
'Playback aborted' : 'Wiedergabe abgebrochen',
|
||||
'Network or communication error' : 'Netzwerk Kommunikationsfehler',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Dekodierung gescheitert. Fehlerhafte oder nicht unterstützte Datei',
|
||||
'Media source not supported' : 'Medienquelle nicht unterstützt',
|
||||
'Failed to play file' : 'Wiedergabe der Datei gescheitert',
|
||||
'Artist' : 'Künstler',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Titel',
|
||||
'Time' : 'Zeit',
|
||||
'Media information query failed' : 'Media Informationssuche gescheitert',
|
||||
'seek unavailable in format' : 'Spulen im Format nicht verfügbar',
|
||||
'The audio type is not supported: {0}' : 'Der Audio-Typ {0} ist nicht unterstützt'
|
||||
},
|
||||
es_ES : {
|
||||
'Playlist' : 'Lista de reproducción',
|
||||
'Playback aborted' : 'Playback anulado',
|
||||
'Network or communication error' : 'Error de red o de comunicación',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Fallo en el desentrelazado. Medio corrupto o no soportado',
|
||||
'Media source not supported' : 'Medio no soportado',
|
||||
'Failed to play file' : 'Error reproduciendo archivo',
|
||||
'Artist' : 'Artista',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Pista',
|
||||
'Time' : 'Tiempo',
|
||||
'Media information query failed' : 'Error recupersqndo información del medio',
|
||||
'seek unavailable in format' : 'búsqueda no disponible en este formato',
|
||||
'The audio type is not supported: {0}' : 'El tipo de audio no está soportado: {0}'
|
||||
},
|
||||
fr_FR : {
|
||||
'Playlist' : 'Liste de lecture',
|
||||
'Playback aborted' : 'Lecture interrompue',
|
||||
'Network or communication error' : 'Erreur de communication ou de réseau',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Décodage raté. Média corrompus ou non pris en charge',
|
||||
'Media source not supported' : 'Source de médias non pris en charge',
|
||||
'Failed to play file' : 'Impossible de lire le fichier',
|
||||
'Artist' : 'Artiste',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Piste',
|
||||
'Time' : 'Durée',
|
||||
'Media information query failed' : 'Requête des informations média échoué',
|
||||
'seek unavailable in format' : 'recherche indisponible dans ce format',
|
||||
'The audio type is not supported: {0}' : 'Le type audio n\'est pas pris en charge: {0}'
|
||||
},
|
||||
ar_DZ : {
|
||||
'Playlist' : 'قائمة القرائة',
|
||||
'Playback aborted' : 'قطع التشغيل',
|
||||
'Network or communication error' : 'خطأ في الإتصال بالشبكة',
|
||||
'Decoding failed. Corruption or unsupported media' : 'فشل في فك التشفير. وسائط غير صالحة أو غير مدعومة',
|
||||
'Media source not supported' : 'وسائط غير مدعومة',
|
||||
'Failed to play file' : 'لايمكن قراءة الملف',
|
||||
'Artist' : 'الفنان',
|
||||
'Album' : 'الألبوم',
|
||||
'Track' : 'المقطع',
|
||||
'Time' : 'المدة',
|
||||
'Media information query failed' : 'خطأ في قراءة معلومات الوسائط',
|
||||
'seek unavailable in format' : 'بحث غير ممكن في هذا النوع',
|
||||
'The audio type is not supported: {0}' : 'نوع الملف الصوتي غير مدعوم: {0}'
|
||||
},
|
||||
it_IT : {
|
||||
'Playlist' : 'Playlist',
|
||||
'Playback aborted' : 'Riproduzione terminata',
|
||||
'Network or communication error' : 'Errore di rete o di comunicazione',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Decodifica fallita. Supporto corroto o non supportato.',
|
||||
'Media source not supported' : 'Sorgente multimediale non supportata',
|
||||
'Failed to play file' : 'Riproduzione file fallita',
|
||||
'Artist' : 'Artista',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Traccia',
|
||||
'Time' : 'Tempo',
|
||||
'Media information query failed' : 'Recupero informazioni media fallita',
|
||||
'seek unavailable in format' : 'ricerca non disponibile nel formato',
|
||||
'The audio type is not supported: {0}' : 'Tipo di audio non supportato: {0}'
|
||||
},
|
||||
ko_KR : {
|
||||
'Playlist' : '재생목록',
|
||||
'Playback aborted' : '일시중지',
|
||||
'Network or communication error' : '네트워크 등 통신 문제가 발생했습니다',
|
||||
'Decoding failed. Corruption or unsupported media' : '디코딩에 실패했습니다. 손상되었거나 지원하지 않는 형식입니다',
|
||||
'Media source not supported' : '지원하지 않는 미디어 소스입니다',
|
||||
'Failed to play file' : '파일을 재생하는데 실패했습니다',
|
||||
'Artist' : '아티스트',
|
||||
'Album' : '앨범',
|
||||
'Track' : '트랙',
|
||||
'Time' : '시간',
|
||||
'Media information query failed' : '미디어 정보 조회에 실패했습니다',
|
||||
'seek unavailable in format' : '탐색을 지원하지 않는 형식입니다',
|
||||
'The audio type is not supported: {0}' : '이 오디오 형식은 지원하지 않습니다: {0}'
|
||||
},
|
||||
nl_NL : {
|
||||
'Playlist' : 'Afspeellijst',
|
||||
'Playback aborted' : 'Afspelen afgebroken',
|
||||
'Network or communication error' : 'Netwerk of communicatie fout',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Decoderen mislukt: bestandstype wordt niet ondersteund',
|
||||
'Media source not supported' : 'Mediabron wordt niet ondersteund',
|
||||
'Failed to play file' : 'Afspelen van bestand mislukt',
|
||||
'Artist' : 'Artiest',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Nummer',
|
||||
'Time' : 'Tijd',
|
||||
'Media information query failed' : 'Zoeken naar media is niet gelukt',
|
||||
'seek unavailable in format' : 'Voor/achteruit spoelen is niet beschikbaar in dit formaat',
|
||||
'The audio type is not supported: {0}' : 'Audio type {0} wordt niet ondersteund'
|
||||
},
|
||||
no_NO : {
|
||||
'Playlist' : 'Spilleliste',
|
||||
'Playback aborted' : 'Avspilling avbrutt',
|
||||
'Network or communication error' : 'Nettverks- eller kommunikasjonsfeil',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Dekoding feilet. Korrupt eller ustøttet media',
|
||||
'Media source not supported' : 'Media-kilde ikke støttet',
|
||||
'Failed to play file' : 'Klarte ikke spille av fil',
|
||||
'Artist' : 'Artist',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Låt',
|
||||
'Time' : 'Tid',
|
||||
'Media information query failed' : 'Media-informasjon forespursel feil',
|
||||
'seek unavailable in format' : 'spoling utilgjenglig i format',
|
||||
'The audio type is not supported: {0}' : 'Denne lyd-typen er ikke støttet: {0}'
|
||||
},
|
||||
pl_PL : {
|
||||
'Playlist' : 'Playlista',
|
||||
'Playback aborted' : 'Odtwarzanie Przerwane',
|
||||
'Network or communication error' : 'Błąd Sieci lub Komunikacji',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Dekodowanie nie powiodło się. Uszkodzony lub nieobsługiwany plik',
|
||||
'Media source not supported' : 'Plik nie jest wspierany',
|
||||
'Failed to play file' : 'Nie można odtworzyć pliku',
|
||||
'Artist' : 'Artysta',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Ścieżka',
|
||||
'Time' : 'Czas',
|
||||
'Media information query failed' : 'Brak informacji',
|
||||
'seek unavailable in format' : 'Przewijanie nie jest obsługiwane w tym formacie',
|
||||
'The audio type is not supported: {0}' : 'Ten typ audio nie jest obsługiwany: {0}'
|
||||
},
|
||||
ru_RU : {
|
||||
'Playlist' : 'Список воспроизведения',
|
||||
'Playback aborted' : 'Воспроизведение прервано',
|
||||
'Network or communication error' : 'Ошибка соединения',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Не удалось декодировать файл. Файл поврежден или данынй формат не поддерживается',
|
||||
'Media source not supported' : 'Тип файла не поддерживается',
|
||||
'Failed to play file' : 'Ошибка воспроизведения',
|
||||
'Artist' : 'Артист',
|
||||
'Album' : 'Альбом',
|
||||
'Track' : 'Трек',
|
||||
'Time' : 'Время',
|
||||
'Media information query failed' : 'Ошибка в запросе медиа-информации',
|
||||
'seek unavailable in format' : 'Перемотка недоступна в этом формате',
|
||||
'The audio type is not supported: {0}' : 'Тип аудио не поддерживается: {0}'
|
||||
},
|
||||
sk_SK : {
|
||||
'Playlist' : 'Zoznam skladieb',
|
||||
'Playback aborted' : 'Prehrávanie prerušené',
|
||||
'Network or communication error' : 'Chyba v sieťovej komunikácii',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Dekódovanie sa nepodarilo alebo médium je nepodporované',
|
||||
'Media source not supported' : 'Zdrojové médium nie je podporované',
|
||||
'Failed to play file' : 'Chyba pri prehrávaní súboru',
|
||||
'Artist' : 'Umelec',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Skladba',
|
||||
'Time' : 'Čas',
|
||||
'Media information query failed' : 'Chyba pri získavaní informácii o médiu',
|
||||
'seek unavailable in format' : 'Formát média nepodporuje preskakovanie (seek)',
|
||||
'The audio type is not supported: {0}' : 'Nepodporovaný formát: {0}'
|
||||
},
|
||||
|
||||
tr_TR : {
|
||||
'Playlist' : 'Oynatma listesi',
|
||||
'Playback aborted' : 'kayıt çalma/dinleme durduruldu',
|
||||
'Network or communication error' : 'ağ veya iletişim hatası',
|
||||
'Decoding failed. Corruption or unsupported media' : 'çözümleme hatası. Bozuk veya çalışmıyor.',
|
||||
'Media source not supported' : 'medya kaynağı bulunamadı',
|
||||
'Failed to play file' : 'Oynatma hatası',
|
||||
'Artist' : 'Artist',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Parça',
|
||||
'Time' : 'zaman',
|
||||
'Media information query failed' : 'medya bilgisini elde etmede hata oluştu',
|
||||
'seek unavailable in format' : 'bu formatta ileri saramazsınız',
|
||||
'The audio type is not supported: {0}' : 'Bu format desteklenmiyor: {0}'
|
||||
},
|
||||
vi_VN : {
|
||||
'Playlist' : 'Danh sách phát',
|
||||
'Playback aborted' : 'Phát lại bị hủy',
|
||||
'Network or communication error' : 'Mạng hoặc thông tin liên lạc bị lỗi',
|
||||
'Decoding failed. Corruption or unsupported media' : 'Giải mã thất bại. Tập tin bị hỏng hoặc không được hỗ trợ',
|
||||
'Media source not supported' : 'Nguồn phương tiện không được hỗ trợ',
|
||||
'Failed to play file' : 'Không thể chơi tập tin',
|
||||
'Artist' : 'Ca sĩ',
|
||||
'Album' : 'Album',
|
||||
'Track' : 'Bài hát',
|
||||
'Time' : 'Thời gian',
|
||||
'Media information query failed' : 'Truy vấn thông tin tập tin thất bại',
|
||||
'seek unavailable in format' : 'không tua được trong định dạng này',
|
||||
'The audio type is not supported: {0}' : 'Loại âm thanh {0} không được hỗ trợ'
|
||||
}
|
||||
};
|
||||
|
||||
function _() {
|
||||
var args = Array.prototype.slice.call(arguments, 0);
|
||||
args.unshift(_Locales);
|
||||
return OSjs.API.__.apply(this, args);
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// EXPORTS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
OSjs.Applications = OSjs.Applications || {};
|
||||
OSjs.Applications.ApplicationMusicPlayer = OSjs.Applications.ApplicationMusicPlayer || {};
|
||||
OSjs.Applications.ApplicationMusicPlayer._ = _;
|
||||
|
||||
})(OSjs.Core.Application, OSjs.Core.Window, OSjs.GUI, OSjs.Dialogs, OSjs.VFS);
|
||||
|
||||
/*!
|
||||
* OS.js - JavaScript Cloud/Web Desktop Platform
|
||||
*
|
||||
* Copyright (c) 2011-2016, Anders Evenrud <andersevenrud@gmail.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice, this
|
||||
* list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
|
||||
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* @author Anders Evenrud <andersevenrud@gmail.com>
|
||||
* @licence Simplified BSD License
|
||||
*/
|
||||
(function(DefaultApplication, DefaultApplicationWindow, Application, Window, Utils, API, VFS, GUI) {
|
||||
'use strict';
|
||||
// TODO: Playlist
|
||||
// TODO: Server seek support: https://gist.github.com/codler/3906826
|
||||
|
||||
function formatTime(secs) {
|
||||
var hr = Math.floor(secs / 3600);
|
||||
var min = Math.floor((secs - (hr * 3600)) / 60);
|
||||
var sec = Math.floor(secs - (hr * 3600) - (min * 60));
|
||||
|
||||
if (min < 10) {
|
||||
min = '0' + min;
|
||||
}
|
||||
if (sec < 10) {
|
||||
sec = '0' + sec;
|
||||
}
|
||||
|
||||
return min + ':' + sec;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// WINDOWS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
function ApplicationMusicPlayerWindow(app, metadata, scheme, file) {
|
||||
DefaultApplicationWindow.apply(this, ['ApplicationMusicPlayerWindow', {
|
||||
icon: metadata.icon,
|
||||
title: metadata.name,
|
||||
allow_drop: true,
|
||||
allow_resize: false,
|
||||
allow_maximize: false,
|
||||
width: 370,
|
||||
height: 260
|
||||
}, app, scheme, file]);
|
||||
|
||||
this.updated = false;
|
||||
}
|
||||
|
||||
ApplicationMusicPlayerWindow.prototype = Object.create(DefaultApplicationWindow.prototype);
|
||||
ApplicationMusicPlayerWindow.constructor = DefaultApplicationWindow.prototype;
|
||||
|
||||
ApplicationMusicPlayerWindow.prototype.init = function(wm, app, scheme) {
|
||||
var root = DefaultApplicationWindow.prototype.init.apply(this, arguments);
|
||||
var self = this;
|
||||
|
||||
// Load and set up scheme (GUI) here
|
||||
scheme.render(this, 'MusicPlayerWindow', root, null, null, {
|
||||
_: OSjs.Applications.ApplicationMusicPlayer._
|
||||
});
|
||||
|
||||
var label = this._scheme.find(this, 'LabelTime');
|
||||
var seeker = this._scheme.find(this, 'Seek');
|
||||
|
||||
var player = scheme.find(this, 'Player');
|
||||
var audio = player.$element.firstChild;
|
||||
|
||||
scheme.find(this, 'ButtonStart').set('disabled', true);
|
||||
scheme.find(this, 'ButtonRew').set('disabled', true);
|
||||
var buttonPlay = scheme.find(this, 'ButtonPlay').set('disabled', true).on('click', function() {
|
||||
audio.play();
|
||||
});
|
||||
var buttonPause = scheme.find(this, 'ButtonPause').set('disabled', true).on('click', function() {
|
||||
audio.pause();
|
||||
});
|
||||
scheme.find(this, 'ButtonFwd').set('disabled', true);
|
||||
scheme.find(this, 'ButtonEnd').set('disabled', true);
|
||||
|
||||
seeker.on('change', function(ev) {
|
||||
if ( audio && !audio.paused ) {
|
||||
try {
|
||||
audio.pause();
|
||||
if ( ev ) {
|
||||
audio.currentTime = ev.detail || 0;
|
||||
}
|
||||
audio.play();
|
||||
} catch ( e ) {}
|
||||
}
|
||||
});
|
||||
|
||||
player.on('play', function(ev) {
|
||||
seeker.set('disabled', false);
|
||||
buttonPause.set('disabled', false);
|
||||
buttonPlay.set('disabled', true);
|
||||
});
|
||||
player.on('ended', function(ev) {
|
||||
seeker.set('disabled', true);
|
||||
buttonPause.set('disabled', true);
|
||||
});
|
||||
player.on('pause', function(ev) {
|
||||
seeker.set('disabled', true);
|
||||
buttonPause.set('disabled', false);
|
||||
buttonPlay.set('disabled', false);
|
||||
});
|
||||
player.on('loadeddata', function(ev) {
|
||||
});
|
||||
player.on('timeupdate', function(ev) {
|
||||
self.updateTime(label, seeker);
|
||||
});
|
||||
player.on('error', function(ev) {
|
||||
if ( !player.$element.src ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var msg = null;
|
||||
try {
|
||||
switch ( ev.target.error.code ) {
|
||||
case ev.target.error.MEDIA_ERR_ABORTED:
|
||||
msg = OSjs.Applications.ApplicationMusicPlayer._('Playback aborted');
|
||||
break;
|
||||
case ev.target.error.MEDIA_ERR_NETWORK:
|
||||
msg = OSjs.Applications.ApplicationMusicPlayer._('Network or communication error');
|
||||
break;
|
||||
case ev.target.error.MEDIA_ERR_DECODE:
|
||||
msg = OSjs.Applications.ApplicationMusicPlayer._('Decoding failed. Corruption or unsupported media');
|
||||
break;
|
||||
case ev.target.error.MEDIA_ERR_SRC_NOT_SUPPORTED:
|
||||
msg = OSjs.Applications.ApplicationMusicPlayer._('Media source not supported');
|
||||
break;
|
||||
default:
|
||||
msg = OSjs.API._('ERR_APP_UNKNOWN_ERROR');
|
||||
break;
|
||||
}
|
||||
} catch ( e ) {
|
||||
msg = OSjs.API._('ERR_GENERIC_APP_FATAL_FMT', e);
|
||||
}
|
||||
|
||||
if ( msg ) {
|
||||
API.createDialog('Alert', {title: self._title, message: msg}, null, self);
|
||||
}
|
||||
});
|
||||
|
||||
return root;
|
||||
};
|
||||
|
||||
ApplicationMusicPlayerWindow.prototype.showFile = function(file, content) {
|
||||
if ( !file || !content ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var self = this;
|
||||
var scheme = this._scheme;
|
||||
var player = scheme.find(this, 'Player');
|
||||
var seeker = this._scheme.find(this, 'Seek');
|
||||
var audio = player.$element.firstChild;
|
||||
|
||||
var artist = file ? file.filename : '';
|
||||
var album = file ? Utils.dirname(file.path) : '';
|
||||
|
||||
var labelArtist = this._scheme.find(this, 'LabelArtist').set('value', '');
|
||||
var labelTitle = this._scheme.find(this, 'LabelTitle').set('value', artist);
|
||||
var labelAlbum = this._scheme.find(this, 'LabelAlbum').set('value', album);
|
||||
this._scheme.find(this, 'LabelTime').set('value', '');
|
||||
seeker.set('min', 0);
|
||||
seeker.set('max', 0);
|
||||
seeker.set('value', 0);
|
||||
|
||||
this.updated = false;
|
||||
|
||||
function getInfo() {
|
||||
self._app._api('info', {filename: file.path}, function(err, info) {
|
||||
if ( info ) {
|
||||
if ( info.Artist ) {
|
||||
labelArtist.set('value', info.Artist);
|
||||
}
|
||||
if ( info.Album ) {
|
||||
labelAlbum.set('value', info.Album);
|
||||
}
|
||||
if ( info.Title ) {
|
||||
labelTitle.set('value', info.Track);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
audio.src = content || '';
|
||||
audio.play();
|
||||
getInfo();
|
||||
};
|
||||
|
||||
ApplicationMusicPlayerWindow.prototype.updateTime = function(label, seeker) {
|
||||
if ( this._destroyed ) {
|
||||
return; // Important because async
|
||||
}
|
||||
|
||||
var player = this._scheme.find(this, 'Player');
|
||||
var audio = player.$element.firstChild;
|
||||
|
||||
var total = audio.duration;
|
||||
var current = audio.currentTime;
|
||||
var unknown = false;
|
||||
|
||||
if ( isNaN(current) || !isFinite(current) ) {
|
||||
current = 0.0;
|
||||
}
|
||||
|
||||
if ( isNaN(total) || !isFinite(total) ) {
|
||||
total = current;
|
||||
unknown = true;
|
||||
}
|
||||
|
||||
var time = Utils.format('{0} / {1}', formatTime(current), unknown ? '<unknown>' : formatTime(total));
|
||||
|
||||
if ( !this.updated ) {
|
||||
seeker.set('min', 0);
|
||||
seeker.set('max', total);
|
||||
}
|
||||
|
||||
label.set('value', time);
|
||||
seeker.set('value', current);
|
||||
|
||||
this.updated = true;
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// APPLICATION
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
var ApplicationMusicPlayer = function(args, metadata) {
|
||||
DefaultApplication.apply(this, ['ApplicationMusicPlayer', args, metadata, {
|
||||
readData: false
|
||||
}]);
|
||||
};
|
||||
|
||||
ApplicationMusicPlayer.prototype = Object.create(DefaultApplication.prototype);
|
||||
ApplicationMusicPlayer.constructor = DefaultApplication;
|
||||
|
||||
ApplicationMusicPlayer.prototype.destroy = function() {
|
||||
return DefaultApplication.prototype.destroy.apply(this, arguments);
|
||||
};
|
||||
|
||||
ApplicationMusicPlayer.prototype.init = function(settings, metadata, scheme) {
|
||||
Application.prototype.init.call(this, settings, metadata, scheme);
|
||||
var file = this._getArgument('file');
|
||||
this._addWindow(new ApplicationMusicPlayerWindow(this, metadata, scheme, file));
|
||||
};
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// EXPORTS
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
OSjs.Applications = OSjs.Applications || {};
|
||||
OSjs.Applications.ApplicationMusicPlayer = OSjs.Applications.ApplicationMusicPlayer || {};
|
||||
OSjs.Applications.ApplicationMusicPlayer.Class = Object.seal(ApplicationMusicPlayer);
|
||||
|
||||
})(OSjs.Helpers.DefaultApplication, OSjs.Helpers.DefaultApplicationWindow, OSjs.Core.Application, OSjs.Core.Window, OSjs.Utils, OSjs.API, OSjs.VFS, OSjs.GUI);
|
47
build/htdocs/dist/packages/default/MusicPlayer/metadata.json
vendored
Normal file
47
build/htdocs/dist/packages/default/MusicPlayer/metadata.json
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
{
|
||||
"className": "ApplicationMusicPlayer",
|
||||
"name": "Music Player",
|
||||
"names": {
|
||||
"bg_BG": "Музикален плеър",
|
||||
"de_DE": "Musikspieler",
|
||||
"es_ES": "Music Player",
|
||||
"fr_FR": "Lecteur de musique",
|
||||
"it_IT": "Lettore Musicale",
|
||||
"ko_KR": "뮤직 플레이어",
|
||||
"nl_NL": "Audio speler",
|
||||
"no_NO": "Musikkspiller",
|
||||
"pl_PL": "Odtwarzacz muzyki",
|
||||
"ru_RU": "Аудиоплеер",
|
||||
"sk_SK": "Prehrávač hudby",
|
||||
"tr_TR": "Muzik Çalar",
|
||||
"vi_VN": "Nghe nhạc"
|
||||
},
|
||||
"mime": [
|
||||
"^audio",
|
||||
"osjs\\/playlist"
|
||||
],
|
||||
"category": "multimedia",
|
||||
"icon": "status/audio-volume-high.png",
|
||||
"singular": true,
|
||||
"compability": [
|
||||
"audio"
|
||||
],
|
||||
"preload": [
|
||||
{
|
||||
"type": "javascript",
|
||||
"src": "combined.js"
|
||||
},
|
||||
{
|
||||
"type": "stylesheet",
|
||||
"src": "combined.css"
|
||||
},
|
||||
{
|
||||
"src": "scheme.html",
|
||||
"type": "scheme"
|
||||
}
|
||||
],
|
||||
"type": "application",
|
||||
"path": "default/MusicPlayer",
|
||||
"build": {},
|
||||
"repo": "default"
|
||||
}
|
88
build/htdocs/dist/packages/default/MusicPlayer/scheme.html
vendored
Normal file
88
build/htdocs/dist/packages/default/MusicPlayer/scheme.html
vendored
Normal file
@ -0,0 +1,88 @@
|
||||
<application-window data-id="MusicPlayerWindow">
|
||||
|
||||
<gui-vbox>
|
||||
<!-- MENU BAR -->
|
||||
<gui-vbox-container data-grow="0" data-shrink="1" data-basis="auto">
|
||||
<gui-menu-bar>
|
||||
|
||||
<gui-menu-bar-entry data-label="LBL_FILE">
|
||||
<gui-menu data-id="SubmenuFile">
|
||||
<gui-menu-entry data-id="MenuOpen" data-label="LBL_OPEN"></gui-menu-entry>
|
||||
<gui-menu-entry data-id="MenuClose" data-label="LBL_CLOSE"></gui-menu-entry>
|
||||
</gui-menu>
|
||||
</gui-menu-bar-entry>
|
||||
|
||||
</gui-menu-bar>
|
||||
</gui-vbox-container>
|
||||
|
||||
<!-- CONTENT -->
|
||||
<gui-vbox-container data-shrink="1" data-basis="auto">
|
||||
|
||||
<gui-vbox data-id="Metadata">
|
||||
<gui-vbox-container data-shrink="1">
|
||||
<gui-hbox>
|
||||
<gui-hbox-container data-basis="80">
|
||||
<gui-label class="gui-bold">Artist</gui-label>
|
||||
</gui-hbox-container>
|
||||
<gui-hbox-container>
|
||||
<gui-label data-id="LabelArtist"></gui-label>
|
||||
</gui-hbox-container>
|
||||
</gui-hbox>
|
||||
</gui-vbox-container>
|
||||
|
||||
<gui-vbox-container data-shrink="1">
|
||||
<gui-hbox>
|
||||
<gui-hbox-container data-basis="80">
|
||||
<gui-label class="gui-bold">Album</gui-label>
|
||||
</gui-hbox-container>
|
||||
<gui-hbox-container>
|
||||
<gui-label data-id="LabelAlbum"></gui-label>
|
||||
</gui-hbox-container>
|
||||
</gui-hbox>
|
||||
</gui-vbox-container>
|
||||
|
||||
<gui-vbox-container data-shrink="1">
|
||||
<gui-hbox>
|
||||
<gui-hbox-container data-basis="80">
|
||||
<gui-label class="gui-bold">Title</gui-label>
|
||||
</gui-hbox-container>
|
||||
<gui-hbox-container>
|
||||
<gui-label data-id="LabelTitle"></gui-label>
|
||||
</gui-hbox-container>
|
||||
</gui-hbox>
|
||||
</gui-vbox-container>
|
||||
|
||||
<gui-vbox-container data-shrink="1">
|
||||
<gui-hbox>
|
||||
<gui-hbox-container data-basis="80">
|
||||
<gui-label class="gui-bold">Time</gui-label>
|
||||
</gui-hbox-container>
|
||||
<gui-hbox-container>
|
||||
<gui-label data-id="LabelTime"></gui-label>
|
||||
</gui-hbox-container>
|
||||
</gui-hbox>
|
||||
</gui-vbox-container>
|
||||
</gui-vbox>
|
||||
|
||||
|
||||
</gui-vbox-container>
|
||||
|
||||
<gui-vbox-container data-expand="true" data-grow="1">
|
||||
<gui-slider data-id="Seek"></gui-slider>
|
||||
</gui-vbox-container>
|
||||
|
||||
<gui-vbox-container data-shrink="1" data-align="center">
|
||||
<gui-button-bar data-id="Controls">
|
||||
<gui-button data-id="ButtonStart" data-icon="stock://32x32/actions/player_start.png" data-icon-size="32"></gui-button>
|
||||
<gui-button data-id="ButtonRew" data-icon="stock://32x32/actions/player_rew.png" data-icon-size="32"></gui-button>
|
||||
<gui-button data-id="ButtonPlay" data-icon="stock://32x32/actions/player_play.png" data-icon-size="32"></gui-button>
|
||||
<gui-button data-id="ButtonPause" data-icon="stock://32x32/actions/player_pause.png" data-icon-size="32"></gui-button>
|
||||
<gui-button data-id="ButtonFwd" data-icon="stock://32x32/actions/player_fwd.png" data-icon-size="32"></gui-button>
|
||||
<gui-button data-id="ButtonEnd" data-icon="stock://32x32/actions/player_end.png" data-icon-size="32"></gui-button>
|
||||
</gui-button-bar>
|
||||
|
||||
<gui-audio data-id="Player"></gui-audio>
|
||||
</gui-vbox-container>
|
||||
</gui-vbox>
|
||||
|
||||
</application-window>
|
Reference in New Issue
Block a user