1
0
Fork 0
mirror of https://github.com/Yetangitu/ampache synced 2025-10-03 17:59:21 +02:00

Add broadcast templates

This commit is contained in:
Afterster 2014-02-09 02:06:27 +01:00
parent 265bd394cb
commit 916057fda7
27 changed files with 670 additions and 281 deletions

View file

@ -399,6 +399,11 @@ wanted_types = "album,official"
; DEFAULT: false
;broadcast = "false"
; Web Socket address
; Declare the web socket server address
; DEFAULT: determined automatically
;websocket_address = "ws://localhost:8080"
; Amazon base urls
; An array of Amazon sites to search.
; NOTE: This will search each of these sites in turn so don't expect it

View file

@ -62,15 +62,16 @@ class Broadcast extends database_object
return Dba::write($sql, array($this->id));
}
public static function create($name, $description)
public static function create($name, $description='')
{
if (!empty($name)) {
$sql = "INSERT INTO `broadcast` (`user`, `name`, `description`) VALUES (?, ?, ?)";
$params = array($GLOBALS['user']->id, $name, $description);
return Dba::write($sql, $params);
Dba::write($sql, $params);
return Dba::insert_id();
}
return false;
return 0;
}
public function update($data)
@ -87,7 +88,8 @@ class Broadcast extends database_object
public function format()
{
$this->f_link = '<a href="' . AmpConfig::get('web_path') . '/broadcast.php?id=' . $this->id . '">' . scrub_out($this->name) . '</a>';
$this->f_name = $this->name;
$this->f_link = '<a href="' . AmpConfig::get('web_path') . '/broadcast.php?id=' . $this->id . '">' . scrub_out($this->f_name) . '</a>';
$this->tags = Tag::get_top_tags('broadcast',$this->id);
$this->f_tags = Tag::get_display($this->tags, $this->id, 'broadcast');
}
@ -140,4 +142,33 @@ class Broadcast extends database_object
}
}
public static function get_broadcast_link()
{
$link = "<div class=\"broadcast-action\">";
$link .= "<a href=\"#\" onclick=\"showBroadcastsDialog(event);\">" . UI::get_icon('broadcast', T_('Broadcast')) . "</a>";
$link .= "</div>";
return $link;
}
public static function get_unbroadcast_link($id)
{
$link = "<div class=\"broadcast-action\">";
$link .= Ajax::button('?page=player&action=unbroadcast&broadcast_id=' . $id, 'broadcast', T_('Unbroadcast'), 'broadcast_action');
$link .= "</div>";
$link .= "<div class=\"broadcast-info\">(<span id=\"broadcast_listeners\">0</span>)</div>";
return $link;
}
public static function get_broadcasts($user_id)
{
$sql = "SELECT `id` FROM `broadcast` WHERE `user` = ?";
$db_results = Dba::read($sql, array($user_id));
$broadcasts = array();
while ($results = Dba::fetch_assoc($db_results)) {
$broadcasts[] = $results['id'];
}
return $broadcasts;
}
} // end of broadcast class

View file

@ -23,7 +23,7 @@
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;
class Broadcast_Server extends MessageComponentInterface
class Broadcast_Server implements MessageComponentInterface
{
const BROADCAST_SONG = "SONG";
const BROADCAST_SONG_POSITION = "SONG_POSITION";
@ -31,6 +31,8 @@ class Broadcast_Server extends MessageComponentInterface
const BROADCAST_REGISTER_BROADCAST = "REGISTER_BROADCAST";
const BROADCAST_REGISTER_LISTENER = "REGISTER_LISTENER";
const BROADCAST_ENDED = "ENDED";
const BROADCAST_INFO = "INFO";
const BROADCAST_NB_LISTENERS = "NB_LISTENERS";
protected $clients;
protected $listeners;
@ -79,71 +81,101 @@ class Broadcast_Server extends MessageComponentInterface
protected function notifySong($from, $song_id)
{
$broadcast = $this->getConnectionBroadcast($from);
if ($broadcast) {
if ($this->isBroadcaster($from, $broadcast)) {
if ($this->isBroadcaster($from)) {
$broadcast = $broadcasters[$from];
$clients = $this->getListeners($broadcast);
$this->broadcastMessage($clients, self::BROADCAST_SONG, $song_id);
} else {
debug_event('broadcast', 'Action unauthorized.', '3');
}
}
}
protected function notifySongPosition($from, $song_position)
{
$broadcast = $this->getConnectionBroadcast($from);
if ($broadcast) {
if ($this->isBroadcaster($from, $broadcast)) {
if ($this->isBroadcaster($from)) {
$broadcast = $broadcasters[$from];
$clients = $this->getListeners($broadcast);
$this->broadcastMessage($clients, self::BROADCAST_SONG_POSITION, $song_position);
} else {
debug_event('broadcast', 'Action unauthorized.', '3');
}
}
}
protected function notifyPlayerPlay($from, $play)
{
$broadcast = $this->getConnectionBroadcast($from);
if ($broadcast) {
if ($this->isBroadcaster($from, $broadcast)) {
if ($this->isBroadcaster($from)) {
$broadcast = $broadcasters[$from];
$clients = $this->getListeners($broadcast);
$this->broadcastMessage($clients, self::BROADCAST_PLAYER_PLAY, $play);
} else {
debug_event('broadcast', 'Action unauthorized.', '3');
}
}
}
protected function registerBroadcast($from, $broadcast_key)
{
$broadcast = Broadcast::get_broadcast($broadcast_key);
if ($broadcast) {
$broadcasters[$from] = $broadcast;
$listeners[$broadcast] = array();
}
}
protected function unregisterBroadcast($broadcast)
protected function unregisterBroadcast($conn)
{
$broadcast = $broadcasters[$conn];
$clients = $this->getListeners($broadcast);
$this->broadcastMessage($clients, self::BROADCAST_ENDED);
unset($listeners[$broadcast]);
unset($broadcasters[$conn]);
}
protected function getRunningBroadcast($broadcast_id)
{
$broadcast = null;
foreach ($broadcasters as $conn => $br) {
if ($br->id == $broadcast_id) {
$broadcast = $br;
exit;
}
}
return $broadcast;
}
protected function registerListener($from, $broadcast_id)
{
$broadcast = $this->getRunningBroadcast();
$listeners[$broadcast][] = $from;
}
protected function unregisterListener($conn)
{
foreach ($listeners as $broadcast => $brlisteners) {
$lindex = array_search($brlisteners, $conn);
if ($lindex) {
unset($brlisteners[$lindex]);
break;
}
}
}
protected function getConnectionBroadcast($conn)
protected function notifyNbListeners($broadcast)
{
$broadcaster = array_search(broadcasters, $broadcast);
$clients = $listeners[$broadcast];
$clients[] = $broadcaster;
$this->broadcastMessage($clients, self::BROADCAST_NB_LISTENERS, count($listeners[$broadcast]));
}
protected function getListeners($broadcast)
{
return $listeners[$broadcast];
}
protected function isBroadcaster($conn, $broadcast)
protected function isBroadcaster($conn)
{
return bool(array_search($conn, $broadcasters));
}
protected function broadcastMessage($clients, $cmd, $value='')
@ -156,14 +188,12 @@ class Broadcast_Server extends MessageComponentInterface
public function onClose(ConnectionInterface $conn)
{
$broadcast = $this->getConnectionBroadcast($conn);
if ($broadcast) {
if ($this->isBroadcaster($conn, $broadcast)) {
$this->unregisterBroadcast($broadcast);
if ($this->isBroadcaster($conn)) {
$this->unregisterBroadcast($conn);
} else {
$this->unregisterListener($conn);
}
}
$this->clients->detach($conn);
}
@ -172,4 +202,14 @@ class Broadcast_Server extends MessageComponentInterface
$conn->close();
}
public static function get_address()
{
$websocket_address = AmpConfig::get('websocket_address');
if (empty($websocket_address)) {
$websocket_address = 'ws://' . $_SERVER['HTTP_HOST'] . ':8100';
}
return $websocket_address . '/broadcast';
}
} // end of broadcast_server class

View file

@ -85,6 +85,60 @@ function handlePlaylistAction(url, id) {
$("#playlistdialog").dialog("close");
}
/************************************************************/
/* Dialog selection to start a broadcast */
/************************************************************/
var closebroadcasts;
function showBroadcastsDialog(e) {
$("#broadcastsdialog").dialog("close");
var parent = this;
parent.contentUrl = jsAjaxServer + '/ajax.server.php?page=player&action=show_broadcasts';
parent.editDialogId = '<div id="broadcastsdialog"></div>';
$(parent.editDialogId).dialog({
modal: false,
dialogClass: 'broadcastsdialogstyle',
resizable: false,
draggable: false,
width: 150,
height: 70,
autoOpen: false,
open: function () {
closebroadcasts = 1;
$(document).bind('click', broverlayclickclose);
$(this).load(parent.contentUrl, function() {
$('#broadcastsdialog').focus();
});
},
focus: function() {
closebroadcasts = 0;
},
close: function (e) {
$(document).unbind('click');
$(this).empty();
$(this).dialog("destroy");
}
});
$("#broadcastsdialog").dialog("option", "position", [e.clientX - 180, e.clientY]);
$("#broadcastsdialog").dialog("open");
closebroadcasts = 0;
}
function broverlayclickclose() {
if (closebroadcasts) {
$("#broadcastsdialog").dialog("close");
}
closebroadcasts = 1;
}
function handleBroadcastAction(url, id) {
ajaxPut(url, id);
$("#broadcastsdialog").dialog("close");
}
/***************************************************/
/* Edit modal dialog for artists, albums and songs */
/***************************************************/

View file

@ -82,6 +82,10 @@ switch ($page) {
require_once AmpConfig::get('prefix') . '/server/search.ajax.php';
exit;
break;
case 'player':
require_once AmpConfig::get('prefix') . '/server/player.ajax.php';
exit;
break;
default:
// A taste of compatibility
break;

67
server/player.ajax.php Normal file
View file

@ -0,0 +1,67 @@
<?php
/* vim:set softtabstop=4 shiftwidth=4 expandtab: */
/**
*
* LICENSE: GNU General Public License, version 2 (GPLv2)
* Copyright 2001 - 2013 Ampache.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License v2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
/**
* Sub-Ajax page, requires AJAX_INCLUDE
*/
if (!defined('AJAX_INCLUDE')) { exit; }
switch ($_REQUEST['action']) {
case 'show_broadcasts':
ob_start();
require AmpConfig::get('prefix') . '/templates/show_broadcasts_dialog.inc.php';
$results = ob_get_contents();
ob_end_clean();
echo $results;
exit;
break;
case 'broadcast':
$broadcast_id = $_GET['broadcast_id'];
if (empty($broadcast_id)) {
$broadcast_id = Broadcast::create(T_('My Broadcast'));
}
$broadcast = new Broadcast($broadcast_id);
if ($broadcast->id) {
$key = Broadcast::generate_key();
$broadcast->update_state(true, $key);
$results['broadcast'] = Broadcast::get_unbroadcast_link($broadcast_id) . '' .
'<script type="text/javascript">startBroadcast(\'' . $key . '\');</script>';
}
break;
case 'unbroadcast':
$broadcast_id = $_GET['broadcast_id'];
$broadcast = new Broadcast($broadcast_id);
if ($broadcast->id) {
$broadcast->update_state(false);
$results['broadcast'] = Broadcast::get_broadcast_link($broadcast_id) . '' .
'<script type="text/javascript">stopBroadcast();</script>';
}
break;
default:
$results['rfc3514'] = '0x1';
break;
} // switch on action;
// We always do this
echo xoutput_from_array($results);

View file

@ -552,7 +552,7 @@ CREATE TABLE `preference` (
LOCK TABLES `preference` WRITE;
/*!40000 ALTER TABLE `preference` DISABLE KEYS */;
INSERT INTO `preference` VALUES (1,'download','0','Allow Downloads',100,'boolean','options'),(4,'popular_threshold','10','Popular Threshold',25,'integer','interface'),(19,'sample_rate','32','Transcode Bitrate',25,'string','streaming'),(22,'site_title','Ampache :: Pour l\'Amour de la Musique','Website Title',100,'string','system'),(23,'lock_songs','0','Lock Songs',100,'boolean','system'),(24,'force_http_play','1','Forces Http play regardless of port',100,'boolean','system'),(25,'http_port','80','Non-Standard Http Port',100,'integer','system'),(41,'localplay_controller','0','Localplay Type',100,'special','options'),(29,'play_type','stream','Type of Playback',25,'special','streaming'),(31,'lang','fr_FR','Language',100,'special','interface'),(32,'playlist_type','m3u','Playlist Type',100,'special','playlist'),(33,'theme_name','reborn','Theme',0,'special','interface'),(51,'offset_limit','50','Offset Limit',5,'integer','interface'),(40,'localplay_level','0','Localplay Access',100,'special','options'),(44,'allow_stream_playback','1','Allow Streaming',100,'boolean','system'),(45,'allow_democratic_playback','0','Allow Democratic Play',100,'boolean','system'),(46,'allow_localplay_playback','0','Allow Localplay Play',100,'boolean','system'),(47,'stats_threshold','7','Statistics Day Threshold',25,'integer','interface'),(52,'rate_limit','8192','Rate Limit',100,'integer','streaming'),(53,'playlist_method','default','Playlist Method',5,'string','playlist'),(55,'transcode','default','Transcoding',25,'string','streaming'),(69,'show_lyrics','0','Show Lyrics',0,'boolean','interface'),(70,'mpd_active','0','MPD Active Instance',25,'integer','internal'),(71,'httpq_active','0','HTTPQ Active Instance',25,'integer','internal'),(72,'shoutcast_active','0','Shoutcast Active Instance',25,'integer','internal'),(73,'lastfm_user','','Last.FM Username',25,'string','plugins'),(74,'lastfm_pass','','Last.FM Password',25,'string','plugins'),(75,'lastfm_port','','Last.FM Submit Port',25,'string','internal'),(76,'lastfm_host','','Last.FM Submit Host',25,'string','internal'),(77,'lastfm_url','','Last.FM Submit URL',25,'string','internal'),(78,'lastfm_challenge','','Last.FM Submit Challenge',25,'string','internal'),(80,'features','50','Features',5,'integer','interface');
INSERT INTO `preference` VALUES (1,'download','0','Allow Downloads',100,'boolean','options'),(4,'popular_threshold','10','Popular Threshold',25,'integer','interface'),(19,'sample_rate','32','Transcode Bitrate',25,'string','streaming'),(22,'site_title','Ampache :: For the love of Music','Website Title',100,'string','system'),(23,'lock_songs','0','Lock Songs',100,'boolean','system'),(24,'force_http_play','1','Forces Http play regardless of port',100,'boolean','system'),(25,'http_port','80','Non-Standard Http Port',100,'integer','system'),(41,'localplay_controller','0','Localplay Type',100,'special','options'),(29,'play_type','stream','Type of Playback',25,'special','streaming'),(31,'lang','fr_FR','Language',100,'special','interface'),(32,'playlist_type','m3u','Playlist Type',100,'special','playlist'),(33,'theme_name','reborn','Theme',0,'special','interface'),(51,'offset_limit','50','Offset Limit',5,'integer','interface'),(40,'localplay_level','0','Localplay Access',100,'special','options'),(44,'allow_stream_playback','1','Allow Streaming',100,'boolean','system'),(45,'allow_democratic_playback','0','Allow Democratic Play',100,'boolean','system'),(46,'allow_localplay_playback','0','Allow Localplay Play',100,'boolean','system'),(47,'stats_threshold','7','Statistics Day Threshold',25,'integer','interface'),(52,'rate_limit','8192','Rate Limit',100,'integer','streaming'),(53,'playlist_method','default','Playlist Method',5,'string','playlist'),(55,'transcode','default','Transcoding',25,'string','streaming'),(69,'show_lyrics','0','Show Lyrics',0,'boolean','interface'),(70,'mpd_active','0','MPD Active Instance',25,'integer','internal'),(71,'httpq_active','0','HTTPQ Active Instance',25,'integer','internal'),(72,'shoutcast_active','0','Shoutcast Active Instance',25,'integer','internal'),(73,'lastfm_user','','Last.FM Username',25,'string','plugins'),(74,'lastfm_pass','','Last.FM Password',25,'string','plugins'),(75,'lastfm_port','','Last.FM Submit Port',25,'string','internal'),(76,'lastfm_host','','Last.FM Submit Host',25,'string','internal'),(77,'lastfm_url','','Last.FM Submit URL',25,'string','internal'),(78,'lastfm_challenge','','Last.FM Submit Challenge',25,'string','internal'),(80,'features','50','Features',5,'integer','interface');
/*!40000 ALTER TABLE `preference` ENABLE KEYS */;
UNLOCK TABLES;
@ -978,7 +978,7 @@ CREATE TABLE `user_preference` (
LOCK TABLES `user_preference` WRITE;
/*!40000 ALTER TABLE `user_preference` DISABLE KEYS */;
INSERT INTO `user_preference` VALUES (-1,1,'1'),(-1,4,'10'),(-1,19,'32'),(-1,22,'Ampache :: Pour l\'Amour de la Musique'),(-1,23,'0'),(-1,24,'1'),(-1,25,'80'),(-1,41,'mpd'),(-1,29,'stream'),(-1,31,'en_US'),(-1,32,'m3u'),(-1,33,'reborn'),(-1,34,'27'),(-1,35,'27'),(-1,36,'27'),(-1,51,'50'),(-1,40,'100'),(-1,44,'1'),(-1,45,'1'),(-1,46,'1'),(-1,47,'7'),(-1,49,'1'),(-1,52,'8192'),(-1,53,'default'),(-1,55,'default'),(-1,57,''),(-1,69,'0'),(-1,70,'0'),(-1,71,'0'),(-1,72,'0'),(-1,73,''),(-1,74,''),(-1,75,''),(-1,76,''),(-1,77,''),(-1,78,''),(1,1,'1'),(1,4,'10'),(1,19,'32'),(1,41,'mpd'),(1,29,'stream'),(1,31,'en_US'),(1,32,'m3u'),(1,33,'reborn'),(1,34,'27'),(1,35,'27'),(1,36,'27'),(1,51,'50'),(1,40,'100'),(1,47,'7'),(1,49,'1'),(1,52,'8192'),(1,53,'default'),(1,55,'default'),(1,57,''),(1,69,'0'),(1,70,'0'),(1,71,'0'),(1,72,'0'),(1,73,''),(1,74,''),(1,75,''),(1,76,''),(1,77,''),(1,78,''),(-1,79,'50'),(-1,80,'50'),(1,79,'50'),(1,80,'50');
INSERT INTO `user_preference` VALUES (-1,1,'1'),(-1,4,'10'),(-1,19,'32'),(-1,22,'Ampache :: For the love of Music'),(-1,23,'0'),(-1,24,'1'),(-1,25,'80'),(-1,41,'mpd'),(-1,29,'stream'),(-1,31,'en_US'),(-1,32,'m3u'),(-1,33,'reborn'),(-1,34,'27'),(-1,35,'27'),(-1,36,'27'),(-1,51,'50'),(-1,40,'100'),(-1,44,'1'),(-1,45,'1'),(-1,46,'1'),(-1,47,'7'),(-1,49,'1'),(-1,52,'8192'),(-1,53,'default'),(-1,55,'default'),(-1,57,''),(-1,69,'0'),(-1,70,'0'),(-1,71,'0'),(-1,72,'0'),(-1,73,''),(-1,74,''),(-1,75,''),(-1,76,''),(-1,77,''),(-1,78,''),(1,1,'1'),(1,4,'10'),(1,19,'32'),(1,41,'mpd'),(1,29,'stream'),(1,31,'en_US'),(1,32,'m3u'),(1,33,'reborn'),(1,34,'27'),(1,35,'27'),(1,36,'27'),(1,51,'50'),(1,40,'100'),(1,47,'7'),(1,49,'1'),(1,52,'8192'),(1,53,'default'),(1,55,'default'),(1,57,''),(1,69,'0'),(1,70,'0'),(1,71,'0'),(1,72,'0'),(1,73,''),(1,74,''),(1,75,''),(1,76,''),(1,77,''),(1,78,''),(-1,79,'50'),(-1,80,'50'),(1,79,'50'),(1,80,'50');
/*!40000 ALTER TABLE `user_preference` ENABLE KEYS */;
UNLOCK TABLES;

View file

@ -40,6 +40,7 @@ if (AmpConfig::get('use_rss')) { ?>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=<?php echo AmpConfig::get('site_charset'); ?>" />
<title><?php echo scrub_out(AmpConfig::get('site_title')); ?> - <?php echo $location['title']; ?></title>
<?php require_once AmpConfig::get('prefix') . '/templates/stylesheets.inc.php'; ?>
<link rel="stylesheet" href="<?php echo $web_path; ?>/templates/jquery-editdialog.css" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php echo $web_path; ?>/modules/jquery-ui/jquery-ui.min.css" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php echo $web_path; ?>/modules/tag-it/jquery.tagit.css" type="text/css" media="screen" />
<script src="<?php echo $web_path; ?>/modules/jquery/jquery.min.js" language="javascript" type="text/javascript"></script>

View file

@ -26,7 +26,7 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $htmllang; ?>" lang="<?php echo $htmllang; ?>">
<head>
<title>Ampache :: Pour l'Amour de la Musique - Install</title>
<title>Ampache :: For the love of Music - Install</title>
<link rel="stylesheet" href="templates/install.css" type="text/css" media="screen" />
<meta http-equiv="Content-Type" content="text/html; Charset=<?php echo $charset; ?>" />
</head>

View file

@ -774,7 +774,6 @@ a.jp-shuffle-off:hover {
background-position: -90px -261px;
}
/* @end */
/* @group NO SOLUTION error feedback */
@ -815,12 +814,13 @@ a.jp-shuffle-off:hover {
.broadcast {
position: absolute;
top: 2px;
right:350px;
margin-right: 2px;
right:25%;
font-size: 0.67em;
}
.broadcast-info {
display: none;
display: inline;
}
.broadcast-action {

View file

@ -0,0 +1,256 @@
/***********************************************
jQuery edit dialog
***********************************************/
.editdialogstyle.ui-dialog {
background-image: url('../images/background.png');
background-repeat: repeat;
-webkit-tap-highlight-color: rgba(0,0,0,0);
font-family: "DejaVuSansCondensed",Helvetica,Arial,sans-serif;
font-weight: normal;
font-size: 16px;
line-height: 1.5em;
background-color: #222;
border: 0;
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
.editdialogstyle.ui-dialog .ui-dialog-titlebar {
background: none;
background-color: rgba(255,255,255,0.1);
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
border-color: #1d1d1d;
border: 2px solid rgba(0,0,0,0.15);
-webkit-box-shadow: 0 0 5px rgba(255,255,255,0.05);
-moz-box-shadow: 0 0 5px rgba(255,255,255,0.05);
box-shadow: 0 0 5px rgba(255,255,255,0.05);
padding: 7px;
color: #eee;
}
.editdialogstyle.ui-dialog .ui-dialog-title {
}
.editdialogstyle.ui-dialog .ui-dialog-content {
color: #999;
border: 0;
margin: 20px auto 20px auto;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonpane {
background: none;
background-color: rgba(255,255,255,0.1);
height: 40px;
border: 0;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
border-color: #1d1d1d;
border: 2px solid rgba(0,0,0,0.15);
-webkit-box-shadow: 0 0 5px rgba(255,255,255,0.05);
-moz-box-shadow: 0 0 5px rgba(255,255,255,0.05);
box-shadow: 0 0 5px rgba(255,255,255,0.05);
width: auto;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonset button {
background: none;
background-image: -moz-linear-gradient(top,#ff9d00,#cc6200);
background-image: -ms-linear-gradient(top,#ff9d00,#cc6200);
background-image: -webkit-gradient(linear,0 0,0 100%,from(#ff9d00),to(#cc6200));
background-image: -webkit-linear-gradient(top,#ff9d00,#cc6200);
background-image: -o-linear-gradient(top,#ff9d00,#cc6200);
background-image: linear-gradient(top,#ff9d00,#cc6200);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
position: relative;
line-height: normal;
border: 0;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.2);
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.2);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.2);
cursor: pointer;
color: #fff;
min-width: 100px;
font-size: 15px;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonset button:hover {
background-position: 0 -10px;
background-color: #cc6200;
-webkit-transition: background-position .1s linear;
-moz-transition: background-position .1s linear;
-ms-transition: background-position .1s linear;
-o-transition: background-position .1s linear;
transition: background-position .1s linear;
text-shadow: 0 -1px 0 rgba(0,0,0,0.5);
text-decoration: none;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonset button:focus:active {
-webkit-box-shadow:inset 0 0 3px #000,0 1px 0 rgba(255,255,255,0.1);
-moz-box-shadow:inset 0 0 3px #000,0 1px 0 rgba(255,255,255,0.1);
box-shadow:inset 0 0 3px #000,0 1px 0 rgba(255,255,255,0.1);
-webkit-transition: background-position .1s linear;
-moz-transition: background-position .1s linear;
-ms-transition: background-position .1s linear;
-o-transition: background-position .1s linear;
transition: background-position .1s linear;
}
.edit_dialog_content {
min-height: 29px;
font-size: 14px;
color: #fff;
width: 100%;
text-align: left;
}
.edit_dialog_content td {
min-width: 100px;
padding-bottom: 20px;
}
.edit_dialog_content input[type=text] , .edit_dialog_content select {
width: 450px;
height: 30px;
color: #fff;
background: #333;
background: rgba(255,255,255,0.2);
border-color: #222;
border-color: rgba(0,0,0,0.7);
}
.edit_dialog_content input:focus, .edit_dialog_content select:focus {
color: #555;
background: #fff;
background: rgba(255,255,255,0.9);
border: 2px solid #ffc763;
}
/***********************************************
jQuery add to playlist dialog
***********************************************/
.playlistdialogstyle.ui-dialog {
background-color: #222;
font-size: 10px;
overflow-x: hidden;
overflow-y: auto;
padding: 0;
margin: 0;
width: 100%;
height: 100%;
border-radius: 2px;
border-color: #1d1d1d;
border: 2px solid rgba(0,0,0,0.15);
}
.playlistdialogstyle.ui-widget-content a {
background-color: #222;
color: #eee;
text-decoration: none;
text-align: left;
padding: 0.4em;
}
.playlistdialogstyle.ui-widget-content a:hover {
color: #ff9d00;
cursor: pointer;
}
.playlistdialogstyle.ui-dialog .ui-dialog-titlebar {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-title {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-content {
background-color: #222;
color: #999;
border: 0;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonpane {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonset button {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonset button:hover {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonset button:focus:active {
display: none;
}
/***********************************************
jQuery broadcasts dialog
***********************************************/
.broadcastsdialogstyle.ui-dialog {
background-color: #222;
font-size: 10px;
overflow-x: hidden;
overflow-y: auto;
padding: 0;
margin: 0;
width: 100%;
height: 100%;
border-radius: 2px;
border-color: #1d1d1d;
border: 2px solid rgba(0,0,0,0.15);
}
.broadcastsdialogstyle.ui-widget-content a {
background-color: #222;
color: #eee;
text-decoration: none;
text-align: left;
padding: 0.4em;
}
.broadcastsdialogstyle.ui-widget-content a:hover {
color: #ff9d00;
cursor: pointer;
}
.broadcastsdialogstyle.ui-dialog .ui-dialog-titlebar {
display: none;
}
.broadcastsdialogstyle.ui-dialog .ui-dialog-title {
display: none;
}
.broadcastsdialogstyle.ui-dialog .ui-dialog-content {
background-color: #222;
color: #999;
border: 0;
}
.broadcastsdialogstyle.ui-dialog .ui-dialog-buttonpane {
display: none;
}
.broadcastsdialogstyle.ui-dialog .ui-dialog-buttonset button {
display: none;
}
.broadcastsdialogstyle.ui-dialog .ui-dialog-buttonset button:hover {
display: none;
}
.broadcastsdialogstyle.ui-dialog .ui-dialog-buttonset button:focus:active {
display: none;
}

View file

@ -0,0 +1,40 @@
<?php
/* vim:set softtabstop=4 shiftwidth=4 expandtab: */
/**
*
* LICENSE: GNU General Public License, version 2 (GPLv2)
* Copyright 2001 - 2013 Ampache.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License v2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
*/
?>
<ul>
<?php
$broadcasts = Broadcast::get_broadcasts($GLOBALS['user']->id);
foreach ($broadcasts as $broadcast_id) {
$broadcast = new Broadcast($broadcast_id);
$broadcast->format();
?>
<li>
<a href="javascript:void(0);" id="rb_append_dbroadcast_<?php echo $broadcast->id; ?>" onclick="handleBroadcastAction('<?php echo AmpConfig::get('ajax_url').'?page=player&action=broadcast&broadcast_id='.$broadcast->id; ?>', 'rb_append_dbroadcast_<?php echo $broadcast->id; ?>');">
<?php echo $broadcast->f_name; ?>
</a>
</li>
<?php } ?>
</ul><br />
<a href="javascript:void(0);" id="rb_append_dbroadcast_new" onclick="handleBroadcastAction('<?php echo AmpConfig::get('ajax_url'). '?page=player&action=broadcast'; ?>', 'rb_append_dbroadcast_new');">
<?php echo T_('New broadcast'); ?>
</a>

View file

@ -43,7 +43,7 @@
</p>
<div id="bottom">
<p><strong>Ampache</strong><br />
Pour l'Amour de la Musique.</p>
For the love of Music.</p>
</div>
</body>
</html>

View file

@ -13,10 +13,19 @@ if (!$iframed || $is_share) {
require_once AmpConfig::get('prefix') . '/templates/stylesheets.inc.php';
}
?>
<link rel="stylesheet" href="<?php echo AmpConfig::get('web_path'); ?>/templates/jquery-editdialog.css" type="text/css" media="screen" />
<link rel="stylesheet" href="<?php echo AmpConfig::get('web_path'); ?>/modules/jquery-ui/jquery-ui.min.css" type="text/css" media="screen" />
<script src="<?php echo AmpConfig::get('web_path'); ?>/modules/jquery/jquery.min.js" language="javascript" type="text/javascript"></script>
<script src="<?php echo AmpConfig::get('web_path'); ?>/modules/jquery-ui/jquery-ui.min.js" language="javascript" type="text/javascript"></script>
<script src="<?php echo AmpConfig::get('web_path'); ?>/modules/jquery/jquery.cookie.js" language="javascript" type="text/javascript"></script>
<script src="<?php echo AmpConfig::get('web_path'); ?>/modules/jquery-jplayer/jquery.jplayer.min.js" language="javascript" type="text/javascript"></script>
<script src="<?php echo AmpConfig::get('web_path'); ?>/modules/jquery-jplayer/jplayer.playlist.min.js" language="javascript" type="text/javascript"></script>
<script src="<?php echo AmpConfig::get('web_path'); ?>/lib/javascript/base.js" language="javascript" type="text/javascript"></script>
<script src="<?php echo AmpConfig::get('web_path'); ?>/lib/javascript/ajax.js" language="javascript" type="text/javascript"></script>
<script src="<?php echo AmpConfig::get('web_path'); ?>/lib/javascript/tools.js" language="javascript" type="text/javascript"></script>
<script type="text/javascript" charset="utf-8">
var jsAjaxServer = "<?php echo AmpConfig::get('ajax_server') ?>";
</script>
<?php
if ($iframed) {
?>
@ -199,16 +208,17 @@ if ($isVideo) {
<?php
}
?>
$("#jquery_jplayer_1").bind($.jPlayer.event.timeupdate, function (event) {
sendBroadcastMessage('SONG_POSITION', event.jPlayer.status.currentTime);
<?php
if (AmpConfig::get('waveform') && !$is_share) {
?>
$("#jquery_jplayer_1").bind($.jPlayer.event.timeupdate, function (event) {
if (event.jPlayer.status.duration > 0) {
var leftpos = 400 * (event.jPlayer.status.currentTime / event.jPlayer.status.duration);
$(".waveform-time").css({left: leftpos});
}
});
<?php } ?>
});
$("#jquery_jplayer_1").bind($.jPlayer.event.volumechange, function(event) {
$.cookie('jp_volume', event.jPlayer.options.volume, { expires: 7, path: '/'});
});
@ -253,6 +263,87 @@ function HideWaveform()
$('.waveform').css('visibility', 'hidden');
}
<?php } ?>
var brkey = '';
var brconn = null;
function startBroadcast(key)
{
brkey = key;
listenBroadcast();
sendBroadcastMessage('REGISTER_BROADCAST', brkey);
}
function listenBroadcast()
{
if (brconn != null) {
stopBroadcast();
}
brconn = new WebSocket('<?php echo Broadcast_Server::get_address(); ?>');
brconn.onmessage = receiveBroadcastMessage;
}
function receiveBroadcastMessage(e)
{
var jp = $("#jquery_jplayer_1").data("jPlayer");
var msgs = e.data.split(';');
for (var i = 0; i < msgs.length; ++i) {
var msg = msgs[i].split('=');
if (msg.count == 2) {
switch (msg[0]) {
case 'PLAY':
if (msg[1] == '1') {
if (jp.status.paused) {
jp.play();
}
} else {
if (!jp.status.paused) {
jp.pause();
}
}
break;
case 'SONG':
break;
case 'SONG_POSITION':
jp.play(msg[1]);
break;
case 'NB_LISTENERS':
$('#broadcast_listeners').text($msg[1]);
break;
case 'INFO':
// Display information notification to user here
break;
case 'ENDED':
jp.stop();
break;
}
}
}
}
function sendBroadcastMessage(cmd, value)
{
if (brconn != null) {
var msg = cmd + '=' + value + ';';
brconn.send(cmd);
}
}
function stopBroadcast()
{
brkey = '';
brconn.close();
brconn = null;
}
<?php if ($iframed && AmpConfig::get('webplayer_confirmclose') && !$is_share) { ?>
window.parent.onbeforeunload = function (evt) {
if (!$("#jquery_jplayer_1").data("jPlayer").status.paused) {
@ -391,11 +482,8 @@ if ($isVideo) {
</div>
</div>
<?php if (AmpConfig::get('broadcast')) { ?>
<div class="broadcast">
<div class="broadcast-action">
<?php echo Ajax::button('?page=player&action=broadcast', 'broadcast', T_('Broadcast'), 'broadcast_action'); ?>
</div>
<div class="broadcast-info">(<span id="broadcast_listeners">0</span>)</div>
<div id="broadcast" class="broadcast">
<?php echo Broadcast::get_broadcast_link(); ?>
</div>
<?php } ?>
<div class="jp-playlist" style="position: absolute;">

View file

@ -85,7 +85,7 @@ require $prefix . '/templates/install_header.inc.php';
</div>
<div id="bottom">
<p><strong>Ampache Installation.</strong><br />
Pour l'Amour de la Musique</p>
For the love of Music</p>
</div>
</div>

View file

@ -46,7 +46,7 @@ $web_path = AmpConfig::get('web_path');
</div><!--end <div>id="maincontainer-->
<div id="bottom">
<p><strong>Ampache</strong><br />
Pour l'Amour de la Musique.</p>
For the love of Music.</p>
</div>
</body>
</html>

View file

@ -46,7 +46,7 @@
</div>
<div id="bottom">
<p><strong>Ampache Debug.</strong><br />
Pour l'Amour de la Musique.</p>
For the love of Music.</p>
</div>
</body>
</html>

View file

@ -75,7 +75,7 @@ This variable no longer exists, all downsampling/transcoding is handled by the t
</div>
<div id="bottom">
<p><strong>Ampache Debug.</strong><br />
Pour l'Amour de la Musique.</p>
For the love of Music.</p>
</div>
</body>
</html>

View file

@ -59,7 +59,7 @@ $web_path = AmpConfig::get('web_path');
</div><!--end <div>id="maincontainer-->
<div id="bottom">
<p><strong>Ampache</strong><br />
Pour l'Amour de la Musique.</p>
For the love of Music.</p>
</div>
</body>
</html>

View file

@ -189,203 +189,6 @@ input[type=button]:focus:active, input[type=submit]:focus:active {
margin-bottom: 10px;
}
/***********************************************
jQuery edit dialog
***********************************************/
.editdialogstyle.ui-dialog {
background-image: url('../images/background.png');
background-repeat: repeat;
-webkit-tap-highlight-color: rgba(0,0,0,0);
font-family: "DejaVuSansCondensed",Helvetica,Arial,sans-serif;
font-weight: normal;
font-size: 16px;
line-height: 1.5em;
background-color: #222;
border: 0;
padding: 0;
margin: 0;
width: 100%;
height: 100%;
}
.editdialogstyle.ui-dialog .ui-dialog-titlebar {
background: none;
background-color: rgba(255,255,255,0.1);
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
border-color: #1d1d1d;
border: 2px solid rgba(0,0,0,0.15);
-webkit-box-shadow: 0 0 5px rgba(255,255,255,0.05);
-moz-box-shadow: 0 0 5px rgba(255,255,255,0.05);
box-shadow: 0 0 5px rgba(255,255,255,0.05);
padding: 7px;
color: #eee;
}
.editdialogstyle.ui-dialog .ui-dialog-title {
}
.editdialogstyle.ui-dialog .ui-dialog-content {
color: #999;
border: 0;
margin: 20px auto 20px auto;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonpane {
background: none;
background-color: rgba(255,255,255,0.1);
height: 40px;
border: 0;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
border-color: #1d1d1d;
border: 2px solid rgba(0,0,0,0.15);
-webkit-box-shadow: 0 0 5px rgba(255,255,255,0.05);
-moz-box-shadow: 0 0 5px rgba(255,255,255,0.05);
box-shadow: 0 0 5px rgba(255,255,255,0.05);
width: auto;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonset button {
background: none;
background-image: -moz-linear-gradient(top,#ff9d00,#cc6200);
background-image: -ms-linear-gradient(top,#ff9d00,#cc6200);
background-image: -webkit-gradient(linear,0 0,0 100%,from(#ff9d00),to(#cc6200));
background-image: -webkit-linear-gradient(top,#ff9d00,#cc6200);
background-image: -o-linear-gradient(top,#ff9d00,#cc6200);
background-image: linear-gradient(top,#ff9d00,#cc6200);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
position: relative;
line-height: normal;
border: 0;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.2);
-moz-box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.2);
box-shadow: inset 0 1px 0 rgba(255,255,255,0.2),0 1px 2px rgba(0,0,0,0.2);
cursor: pointer;
color: #fff;
min-width: 100px;
font-size: 15px;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonset button:hover {
background-position: 0 -10px;
background-color: #cc6200;
-webkit-transition: background-position .1s linear;
-moz-transition: background-position .1s linear;
-ms-transition: background-position .1s linear;
-o-transition: background-position .1s linear;
transition: background-position .1s linear;
text-shadow: 0 -1px 0 rgba(0,0,0,0.5);
text-decoration: none;
}
.editdialogstyle.ui-dialog .ui-dialog-buttonset button:focus:active {
-webkit-box-shadow:inset 0 0 3px #000,0 1px 0 rgba(255,255,255,0.1);
-moz-box-shadow:inset 0 0 3px #000,0 1px 0 rgba(255,255,255,0.1);
box-shadow:inset 0 0 3px #000,0 1px 0 rgba(255,255,255,0.1);
-webkit-transition: background-position .1s linear;
-moz-transition: background-position .1s linear;
-ms-transition: background-position .1s linear;
-o-transition: background-position .1s linear;
transition: background-position .1s linear;
}
.edit_dialog_content {
min-height: 29px;
font-size: 14px;
color: #fff;
width: 100%;
text-align: left;
}
.edit_dialog_content td {
min-width: 100px;
padding-bottom: 20px;
}
.edit_dialog_content input[type=text] , .edit_dialog_content select {
width: 450px;
height: 30px;
color: #fff;
background: #333;
background: rgba(255,255,255,0.2);
border-color: #222;
border-color: rgba(0,0,0,0.7);
}
.edit_dialog_content input:focus, .edit_dialog_content select:focus {
color: #555;
background: #fff;
background: rgba(255,255,255,0.9);
border: 2px solid #ffc763;
}
/***********************************************
jQuery add to playlist dialog
***********************************************/
.playlistdialogstyle.ui-dialog {
background-color: #222;
font-size: 10px;
overflow-x: hidden;
overflow-y: auto;
padding: 0;
margin: 0;
width: 100%;
height: 100%;
border-radius: 2px;
border-color: #1d1d1d;
border: 2px solid rgba(0,0,0,0.15);
}
.playlistdialogstyle.ui-widget-content a {
background-color: #222;
color: #eee;
text-decoration: none;
text-align: left;
padding: 0.4em;
}
.playlistdialogstyle.ui-widget-content a:hover {
color: #ff9d00;
cursor: pointer;
}
.playlistdialogstyle.ui-dialog .ui-dialog-titlebar {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-title {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-content {
background-color: #222;
color: #999;
border: 0;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonpane {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonset button {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonset button:hover {
display: none;
}
.playlistdialogstyle.ui-dialog .ui-dialog-buttonset button:focus:active {
display: none;
}
/***********************************************
Main
***********************************************/

View file

@ -52,7 +52,7 @@ $htmllang = str_replace("_","-",AmpConfig::get('lang'));
<body>
<div id="header">
<h1><?php echo T_('Ampache Update'); ?></h1>
<p>Pour l'Amour de la Musique.</p>
<p>For the love of Music.</p>
</div>
<div id="text-box">
<div class="notify">
@ -69,7 +69,7 @@ $htmllang = str_replace("_","-",AmpConfig::get('lang'));
</div>
<div id="bottom">
<p><b><?php echo T_('Ampache Installation.'); ?></b><br />
Pour l'Amour de la Musique.</p>
For the love of Music.</p>
</div>
</div>
</body>