Merge branch 'devel' of dev.sourcefabric.org:airtime into devel
This commit is contained in:
commit
d642a48e8c
9 changed files with 68 additions and 88 deletions
57
Changelog
57
Changelog
|
@ -1,4 +1,56 @@
|
||||||
1.8.2 - May 25, 2011
|
1.9.0 - ???, 2011
|
||||||
|
|
||||||
|
The cool stuff:
|
||||||
|
* New file storage system.
|
||||||
|
* Human-readable file structure. The directory structure and file names on disk are now
|
||||||
|
human-readable. This means you can easily find files using your file browser on your
|
||||||
|
server.
|
||||||
|
|
||||||
|
* Magic file synchronization. Edits to your files are automatically noticed by Airtime. If
|
||||||
|
you edit any files on disk, such as trimming the length of a track, Airtime will
|
||||||
|
automatically notice this and adjust the playlist lengths and shows for that audio file.
|
||||||
|
|
||||||
|
* Auto-import and multiple-directory support. You can set any number of directories to be
|
||||||
|
watched by Airtime. Any new files you add to watched directories will be automatically
|
||||||
|
imported into Airtime, and any deleted files will be automatically removed.
|
||||||
|
|
||||||
|
* Graceful recovery from reboot. If the playout engine starts up and detects that a show
|
||||||
|
should be playing at the current time, it will skip to the right point in the track and
|
||||||
|
start playing. Previously, Airtime would not play anything until the next show started.
|
||||||
|
This also fixes a problem where the metadata on the stream was lost when a file had
|
||||||
|
cue-in/out values set. Thanks to the Liquidsoap developers for implementing the ability
|
||||||
|
to do all of this!
|
||||||
|
|
||||||
|
* Output to Shoutcast. Now both Shoutcast and Icecast are supported.
|
||||||
|
|
||||||
|
* No more rebooting after install! Airtime now uses standard SystemV initd scripts instead of
|
||||||
|
non-standard daemontools. This also makes for a much faster install.
|
||||||
|
|
||||||
|
* Extensible daemon monitoring system. The tool "monit" is being used to monitor the
|
||||||
|
daemon processes(playout engine, media monitor, etc) and automatically restart them in the
|
||||||
|
unlikely event that a daemon crashes. It also allows you to easily add your own actions when
|
||||||
|
something happens with a daemon. For example, you could send yourself an email notification if
|
||||||
|
a daemon process dies.
|
||||||
|
|
||||||
|
Improvements:
|
||||||
|
* Cumulative time shown on playlists. The Playlist Builder now shows the total time since
|
||||||
|
the beginning of the playlist for each song.
|
||||||
|
|
||||||
|
* "End Time" instead of "Duration". In the Add/Edit Show dialog, we replaced the "Duration"
|
||||||
|
field with "End Time". Users reported that this was a much more intuitive way to schedule the
|
||||||
|
show. Duration is still shown as a read-only field.
|
||||||
|
|
||||||
|
* Feedback & promotion system. Airtime now includes a way to send feedback and promote your
|
||||||
|
site on the Sourcefabric web page. This will greatly enhance our ability to understand who is
|
||||||
|
using the software, which in turn will allow us to make appropriate features and receive grant
|
||||||
|
funding.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
* Fixed bug where you couldnt import a file with a name longer than 255 characters.
|
||||||
|
* Fixed bug where searching an audio archive of 15K+ files was slow.
|
||||||
|
|
||||||
|
|
||||||
|
1.8.2 - June 8, 2011
|
||||||
Highlights:
|
Highlights:
|
||||||
* Improvements:
|
* Improvements:
|
||||||
- You can now download audio files from the search screen and from the "Show Content" screen.
|
- You can now download audio files from the search screen and from the "Show Content" screen.
|
||||||
|
@ -23,7 +75,8 @@ Highlights:
|
||||||
- Fixed problem with Record Check box occasionally being greyed-out when creating new show
|
- Fixed problem with Record Check box occasionally being greyed-out when creating new show
|
||||||
- Fixed a problem with default genre not being applied to recorded shows
|
- Fixed a problem with default genre not being applied to recorded shows
|
||||||
- Fixed a problem where shows repeating bi-weekly or monthly did not update properly when edited.
|
- Fixed a problem where shows repeating bi-weekly or monthly did not update properly when edited.
|
||||||
|
- Fixed problem when a user changed the name of a recorded show right before it started playing would cause the recorded audio not to be linked to the show.
|
||||||
|
- and many more...
|
||||||
|
|
||||||
1.8.1 - May 2, 2011
|
1.8.1 - May 2, 2011
|
||||||
* Fixed issue where an track's progress bar would keep updating, even if the track was no longer playing.
|
* Fixed issue where an track's progress bar would keep updating, even if the track was no longer playing.
|
||||||
|
|
|
@ -95,14 +95,14 @@ class Application_Form_RegisterAirtime extends Zend_Form
|
||||||
$upload = new Zend_Form_Element_File('Logo');
|
$upload = new Zend_Form_Element_File('Logo');
|
||||||
$upload->setLabel('Station Logo:')
|
$upload->setLabel('Station Logo:')
|
||||||
->setRequired(false)
|
->setRequired(false)
|
||||||
->setDecorators(array('File'))
|
->setDecorators(array('File'));
|
||||||
->addValidator('Count', false, 1)
|
/*->addValidator('Count', false, 1)
|
||||||
->addValidator('Extension', false, 'jpg,png,gif')
|
->addValidator('Extension', false, 'jpg,png,gif')
|
||||||
->addValidator('ImageSize', false, array(
|
->addValidator('ImageSize', false, array(
|
||||||
'minwidth' => 200,
|
'minwidth' => 200,
|
||||||
'minheight' => 200,
|
'minheight' => 200,
|
||||||
'maxwidth' => 600,
|
'maxwidth' => 600,
|
||||||
'maxheight' => 600));
|
'maxheight' => 600));*/
|
||||||
$this->addElement($upload);
|
$this->addElement($upload);
|
||||||
|
|
||||||
//enable support feedback
|
//enable support feedback
|
||||||
|
|
|
@ -63,7 +63,7 @@ class MusicDir {
|
||||||
|
|
||||||
public static function getDirByPK($pk)
|
public static function getDirByPK($pk)
|
||||||
{
|
{
|
||||||
$dir = CcMusicDirQuery::create()->findPK($pk);
|
$dir = CcMusicDirsQuery::create()->findPK($pk);
|
||||||
|
|
||||||
$mus_dir = new MusicDir();
|
$mus_dir = new MusicDir();
|
||||||
$mus_dir->_dir = $dir;
|
$mus_dir->_dir = $dir;
|
||||||
|
|
|
@ -149,7 +149,6 @@ class AirtimeInstall
|
||||||
$success = chmod($rp, 02777);
|
$success = chmod($rp, 02777);
|
||||||
$CC_CONFIG['storageDir'] = $rp;
|
$CC_CONFIG['storageDir'] = $rp;
|
||||||
|
|
||||||
AirtimeInstall::DbConnect(true);
|
|
||||||
//add stor directory to MusiDirs
|
//add stor directory to MusiDirs
|
||||||
$sql = "INSERT INTO cc_music_dirs (directory, type) VALUES ('$rp', 'stor')";
|
$sql = "INSERT INTO cc_music_dirs (directory, type) VALUES ('$rp', 'stor')";
|
||||||
$result = $CC_DBC->query($sql);
|
$result = $CC_DBC->query($sql);
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
set_include_path(__DIR__.'/../airtime_mvc/library' . PATH_SEPARATOR . get_include_path());
|
set_include_path(__DIR__.'/../airtime_mvc/library' . PATH_SEPARATOR . get_include_path());
|
||||||
|
|
||||||
require_once(dirname(__FILE__).'/include/AirtimeIni.php');
|
require_once(dirname(__FILE__).'/AirtimeIni.php');
|
||||||
require_once(dirname(__FILE__).'/include/AirtimeInstall.php');
|
require_once(dirname(__FILE__).'/AirtimeInstall.php');
|
||||||
|
|
||||||
require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/constants.php');
|
require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/constants.php');
|
||||||
require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/conf.php');
|
require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/conf.php');
|
||||||
|
@ -20,8 +20,7 @@ AirtimeInstall::InstallPostgresScriptingLanguage();
|
||||||
|
|
||||||
if (isset($argv[1]) && $argv[1] == 'y') {
|
if (isset($argv[1]) && $argv[1] == 'y') {
|
||||||
AirtimeInstall::CreateDatabaseTables();
|
AirtimeInstall::CreateDatabaseTables();
|
||||||
}
|
} else if ($databaseExisted) {
|
||||||
else if ($databaseExisted){
|
|
||||||
//Database already exists. Ask the user how they want to
|
//Database already exists. Ask the user how they want to
|
||||||
//proceed. Warn them that creating the database tables again
|
//proceed. Warn them that creating the database tables again
|
||||||
//will cause them to lose their old ones.
|
//will cause them to lose their old ones.
|
||||||
|
@ -34,8 +33,7 @@ else if ($databaseExisted){
|
||||||
if (in_array($userAnswer, array("y", "Y"))) {
|
if (in_array($userAnswer, array("y", "Y"))) {
|
||||||
AirtimeInstall::CreateDatabaseTables();
|
AirtimeInstall::CreateDatabaseTables();
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
//Database was just created, meaning the tables do not
|
//Database was just created, meaning the tables do not
|
||||||
//exist. Let's create them.
|
//exist. Let's create them.
|
||||||
AirtimeInstall::CreateDatabaseTables();
|
AirtimeInstall::CreateDatabaseTables();
|
|
@ -122,9 +122,9 @@ echo "* Airtime Version: ".AIRTIME_VERSION.PHP_EOL;
|
||||||
|
|
||||||
if ($db_install) {
|
if ($db_install) {
|
||||||
if($newInstall) {
|
if($newInstall) {
|
||||||
system('php airtime-db-install.php y');
|
system('php '.__DIR__.'/airtime-db-install.php y');
|
||||||
}
|
AirtimeInstall::DbConnect(true);
|
||||||
else {
|
} else {
|
||||||
require_once('airtime-db-install.php');
|
require_once('airtime-db-install.php');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,6 @@ AirtimeInstall::UninstallBinaries();
|
||||||
AirtimeInstall::RemoveLogDirectories();
|
AirtimeInstall::RemoveLogDirectories();
|
||||||
AirtimeIni::RemoveMonitFile();
|
AirtimeIni::RemoveMonitFile();
|
||||||
|
|
||||||
unlink('/etc/cron.d/airtime-crons');
|
@unlink('/etc/cron.d/airtime-crons');
|
||||||
|
|
||||||
/* FINISHED AIRTIME PHP UNINSTALLER */
|
/* FINISHED AIRTIME PHP UNINSTALLER */
|
||||||
|
|
|
@ -1,39 +0,0 @@
|
||||||
<?php
|
|
||||||
// Do not allow remote execution
|
|
||||||
$arr = array_diff_assoc($_SERVER, $_ENV);
|
|
||||||
if (isset($arr["DOCUMENT_ROOT"]) && ($arr["DOCUMENT_ROOT"] != "") ) {
|
|
||||||
header("HTTP/1.1 400");
|
|
||||||
header("Content-type: text/plain; charset=UTF-8");
|
|
||||||
echo "400 Not executable\r\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
require_once(dirname(__FILE__).'/../../../storageServer/var/cron/Cron.php');
|
|
||||||
$m = '*';
|
|
||||||
$h ='*';
|
|
||||||
$dom = '*';
|
|
||||||
$mon = '*';
|
|
||||||
$dow = '*';
|
|
||||||
$command = '/usr/bin/php '.realpath(dirname(__FILE__).'/../ui_twitterCron.php').' >/dev/null 2>&1';
|
|
||||||
$old_regex = '/ui_twitterCron\.php/';
|
|
||||||
|
|
||||||
$cron = new Cron();
|
|
||||||
$access = $cron->openCrontab('write');
|
|
||||||
if ($access != 'write') {
|
|
||||||
do {
|
|
||||||
$r = $cron->forceWriteable();
|
|
||||||
} while ($r);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($cron->ct->getByType(CRON_CMD) as $id => $line) {
|
|
||||||
if (preg_match($old_regex, $line['command'])) {
|
|
||||||
echo " removing old entry\n";
|
|
||||||
$cron->ct->delEntry($id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
echo " adding new entry\n";
|
|
||||||
$cron->ct->addCron($m, $h, $dom, $mon, $dow, $command);
|
|
||||||
$cron->closeCrontab();
|
|
||||||
echo "Done.\n";
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
<?php
|
|
||||||
// Do not allow remote execution
|
|
||||||
$arr = array_diff_assoc($_SERVER, $_ENV);
|
|
||||||
if (isset($arr["DOCUMENT_ROOT"]) && ($arr["DOCUMENT_ROOT"] != "") ) {
|
|
||||||
header("HTTP/1.1 400");
|
|
||||||
header("Content-type: text/plain; charset=UTF-8");
|
|
||||||
echo "400 Not executable\r\n";
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
require_once(dirname(__FILE__).'/../../../storageServer/var/cron/Cron.php');
|
|
||||||
$old_regex = '/ui_twitterCron\.php/';
|
|
||||||
|
|
||||||
$cron = new Cron();
|
|
||||||
$access = $cron->openCrontab('write');
|
|
||||||
if ($access != 'write') {
|
|
||||||
do {
|
|
||||||
$r = $cron->forceWriteable();
|
|
||||||
} while ($r);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($cron->ct->getByType(CRON_CMD) as $id => $line) {
|
|
||||||
if (preg_match($old_regex, $line['command'])) {
|
|
||||||
echo " removing cron entry\n";
|
|
||||||
$cron->ct->delEntry($id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$cron->closeCrontab();
|
|
||||||
echo "Done.\n";
|
|
Loading…
Add table
Add a link
Reference in a new issue