diff --git a/Changelog b/Changelog index 5e2a2e38c..93bd0a634 100644 --- a/Changelog +++ b/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: * Improvements: - 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 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 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 * Fixed issue where an track's progress bar would keep updating, even if the track was no longer playing. diff --git a/airtime_mvc/application/forms/RegisterAirtime.php b/airtime_mvc/application/forms/RegisterAirtime.php index ee861cab4..a3fedd4c0 100644 --- a/airtime_mvc/application/forms/RegisterAirtime.php +++ b/airtime_mvc/application/forms/RegisterAirtime.php @@ -95,14 +95,14 @@ class Application_Form_RegisterAirtime extends Zend_Form $upload = new Zend_Form_Element_File('Logo'); $upload->setLabel('Station Logo:') ->setRequired(false) - ->setDecorators(array('File')) - ->addValidator('Count', false, 1) + ->setDecorators(array('File')); + /*->addValidator('Count', false, 1) ->addValidator('Extension', false, 'jpg,png,gif') ->addValidator('ImageSize', false, array( 'minwidth' => 200, 'minheight' => 200, 'maxwidth' => 600, - 'maxheight' => 600)); + 'maxheight' => 600));*/ $this->addElement($upload); //enable support feedback diff --git a/airtime_mvc/application/models/MusicDir.php b/airtime_mvc/application/models/MusicDir.php index 4021f2829..6580ab99c 100644 --- a/airtime_mvc/application/models/MusicDir.php +++ b/airtime_mvc/application/models/MusicDir.php @@ -63,7 +63,7 @@ class MusicDir { public static function getDirByPK($pk) { - $dir = CcMusicDirQuery::create()->findPK($pk); + $dir = CcMusicDirsQuery::create()->findPK($pk); $mus_dir = new MusicDir(); $mus_dir->_dir = $dir; diff --git a/install/include/AirtimeInstall.php b/install/include/AirtimeInstall.php index e88aab027..ff7ec7737 100644 --- a/install/include/AirtimeInstall.php +++ b/install/include/AirtimeInstall.php @@ -149,7 +149,6 @@ class AirtimeInstall $success = chmod($rp, 02777); $CC_CONFIG['storageDir'] = $rp; - AirtimeInstall::DbConnect(true); //add stor directory to MusiDirs $sql = "INSERT INTO cc_music_dirs (directory, type) VALUES ('$rp', 'stor')"; $result = $CC_DBC->query($sql); diff --git a/install/airtime-db-install.php b/install/include/airtime-db-install.php similarity index 86% rename from install/airtime-db-install.php rename to install/include/airtime-db-install.php index 7fd0a253d..c339b4e6d 100644 --- a/install/airtime-db-install.php +++ b/install/include/airtime-db-install.php @@ -2,8 +2,8 @@ set_include_path(__DIR__.'/../airtime_mvc/library' . PATH_SEPARATOR . get_include_path()); -require_once(dirname(__FILE__).'/include/AirtimeIni.php'); -require_once(dirname(__FILE__).'/include/AirtimeInstall.php'); +require_once(dirname(__FILE__).'/AirtimeIni.php'); +require_once(dirname(__FILE__).'/AirtimeInstall.php'); require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/constants.php'); require_once(AirtimeInstall::GetAirtimeSrcDir().'/application/configs/conf.php'); @@ -18,10 +18,9 @@ AirtimeInstall::DbConnect(true); AirtimeInstall::InstallPostgresScriptingLanguage(); -if(isset($argv[1]) && $argv[1] == 'y') { +if (isset($argv[1]) && $argv[1] == 'y') { AirtimeInstall::CreateDatabaseTables(); -} -else if ($databaseExisted){ +} else if ($databaseExisted) { //Database already exists. Ask the user how they want to //proceed. Warn them that creating the database tables again //will cause them to lose their old ones. @@ -34,8 +33,7 @@ else if ($databaseExisted){ if (in_array($userAnswer, array("y", "Y"))) { AirtimeInstall::CreateDatabaseTables(); } -} -else { +} else { //Database was just created, meaning the tables do not //exist. Let's create them. AirtimeInstall::CreateDatabaseTables(); diff --git a/install/include/airtime-install.php b/install/include/airtime-install.php index 121077c0c..223a433b9 100644 --- a/install/include/airtime-install.php +++ b/install/include/airtime-install.php @@ -122,9 +122,9 @@ echo "* Airtime Version: ".AIRTIME_VERSION.PHP_EOL; if ($db_install) { if($newInstall) { - system('php airtime-db-install.php y'); - } - else { + system('php '.__DIR__.'/airtime-db-install.php y'); + AirtimeInstall::DbConnect(true); + } else { require_once('airtime-db-install.php'); } } diff --git a/install/include/airtime-uninstall.php b/install/include/airtime-uninstall.php index da2a58ed3..361109c5b 100644 --- a/install/include/airtime-uninstall.php +++ b/install/include/airtime-uninstall.php @@ -90,6 +90,6 @@ AirtimeInstall::UninstallBinaries(); AirtimeInstall::RemoveLogDirectories(); AirtimeIni::RemoveMonitFile(); -unlink('/etc/cron.d/airtime-crons'); +@unlink('/etc/cron.d/airtime-crons'); /* FINISHED AIRTIME PHP UNINSTALLER */ diff --git a/install/install_twitter_plugin.php b/install/install_twitter_plugin.php deleted file mode 100644 index 1c473fb2b..000000000 --- a/install/install_twitter_plugin.php +++ /dev/null @@ -1,39 +0,0 @@ -/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"; - diff --git a/install/uninstall_twitter_plugin.php b/install/uninstall_twitter_plugin.php deleted file mode 100644 index 6fd9c6731..000000000 --- a/install/uninstall_twitter_plugin.php +++ /dev/null @@ -1,31 +0,0 @@ -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";