From 84c2a3bceb52cca41e4ef18e48f2b0b819f844aa Mon Sep 17 00:00:00 2001 From: "paul.baranowski" Date: Thu, 9 Dec 2010 18:44:47 -0500 Subject: [PATCH] Converted API functions to Zend Framework. Converted pypo to use the new Zendified URLs. Fixed bugs in the daemontool scripts. The installed scheduler is still not working at this point, but getting close. --- .zfproject.xml | 7 ++++++ application/configs/ACL.php | 4 ++- application/configs/conf.php | 11 ++++++++ application/models/Playlist.php | 19 +++++++++----- application/models/Schedule.php | 20 +++++++++++++++ application/models/StoredFile.php | 2 +- pypo/api_clients/api_client.py | 4 +-- pypo/config.cfg | 12 ++++----- pypo/install/pypo-daemontools-fetch.sh | 4 +-- pypo/install/pypo-daemontools-push.sh | 4 +-- pypo/install/pypo-install.py | 23 +++++++++++++++-- .../models => pypo}/tests/pypoTester.php | 25 +++++++++++++------ .../controllers/ApiControllerTest.php | 20 +++++++++++++++ 13 files changed, 126 insertions(+), 29 deletions(-) rename {application/models => pypo}/tests/pypoTester.php (81%) create mode 100644 tests/application/controllers/ApiControllerTest.php diff --git a/.zfproject.xml b/.zfproject.xml index 986d3777a..05cfc7b75 100644 --- a/.zfproject.xml +++ b/.zfproject.xml @@ -54,6 +54,9 @@ + + + @@ -167,6 +170,9 @@ + + + @@ -207,6 +213,7 @@ + diff --git a/application/configs/ACL.php b/application/configs/ACL.php index 61f657bae..7803aa471 100644 --- a/application/configs/ACL.php +++ b/application/configs/ACL.php @@ -15,6 +15,7 @@ $ccAcl->add(new Zend_Acl_Resource('library')) ->add(new Zend_Acl_Resource('playlist')) ->add(new Zend_Acl_Resource('plupload')) ->add(new Zend_Acl_Resource('schedule')) + ->add(new Zend_Acl_Resource('api')) ->add(new Zend_Acl_Resource('search')); /** Creating permissions */ @@ -23,11 +24,12 @@ $ccAcl->allow('guest', 'index') ->allow('guest', 'error') ->allow('guest', 'library') ->allow('guest', 'search') + ->allow('guest', 'api') ->allow('host', 'plupload') ->allow('host', 'playlist') ->allow('host', 'schedule'); $aclPlugin = new Zend_Controller_Plugin_Acl($ccAcl); -$front = Zend_Controller_Front::getInstance(); +$front = Zend_Controller_Front::getInstance(); $front->registerPlugin($aclPlugin); diff --git a/application/configs/conf.php b/application/configs/conf.php index 0a97c14c4..7779721b5 100644 --- a/application/configs/conf.php +++ b/application/configs/conf.php @@ -25,6 +25,8 @@ $CC_CONFIG = array( 'apiKey' => array('AAA'), + 'apiPath' => "/api/", + 'baseFilesDir' => __DIR__."/../../files", // main directory for storing binary media files 'storageDir' => __DIR__.'/../../files/stor', @@ -162,4 +164,13 @@ set_include_path('.'.PATH_SEPARATOR.$CC_CONFIG['pearPath'] .PATH_SEPARATOR.$CC_CONFIG['zendPath'] .PATH_SEPARATOR.$old_include_path); +//$dsn = $CC_CONFIG['dsn']; +//$CC_DBC = DB::connect($dsn, TRUE); +//if (PEAR::isError($CC_DBC)) { +// echo "ERROR: ".$CC_DBC->getMessage()." ".$CC_DBC->getUserInfo()."\n"; +// exit(1); +//} +//$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); + + ?> \ No newline at end of file diff --git a/application/models/Playlist.php b/application/models/Playlist.php index a0ec8385d..78333a88b 100644 --- a/application/models/Playlist.php +++ b/application/models/Playlist.php @@ -102,7 +102,14 @@ class Playlist { } - /** + public static function findPlaylistByName($p_name) + { + $res = CcPlaylistQuery::create()->findByDbName($p_name); + return $res; + } + + + /** * Fetch instance of Playlist object.
* * @param string $id @@ -414,7 +421,7 @@ class Playlist { if (is_null($media) || PEAR::isError($media)) { return $media; } - + $metadata = $media->getMetadata(); $length = $metadata["length"]; @@ -425,7 +432,7 @@ class Playlist { // insert at end of playlist. if (is_null($p_position)) $p_position = $this->getNextPos(); - + // insert default values if parameter was empty $p_cuein = !is_null($p_cuein) ? $p_cuein : '00:00:00.000000'; $p_cueout = !is_null($p_cueout) ? $p_cueout : $length; @@ -434,9 +441,9 @@ class Playlist { $sql = "SELECT INTERVAL '{$p_cueout}' - INTERVAL '{$p_cuein}'"; $r = $con->query($sql); $p_cliplength = $r->fetchColumn(0); - + $res = $this->insertPlaylistElement($this->id, $p_mediaId, $p_position, $p_cliplength, $p_cuein, $p_cueout, $p_fadeIn, $p_fadeOut); - + return TRUE; } @@ -629,7 +636,7 @@ class Playlist { $sql = "SELECT INTERVAL '{$oldCueOut}' - INTERVAL '{$cueIn}'"; $r = $con->query($sql); $cliplength = $r->fetchColumn(0); - + $row->setDbCuein($cueIn); $row->setDBCliplength($cliplength); } diff --git a/application/models/Schedule.php b/application/models/Schedule.php index fa80671f3..76a028061 100644 --- a/application/models/Schedule.php +++ b/application/models/Schedule.php @@ -401,6 +401,26 @@ class Schedule { return $t[0]."-".$t[1]."-".$t[2]." ".$t[3].":".$t[4].":00"; } + /** + * Return true if the input string is in the format YYYY-MM-DD-HH-mm + * + * @param string $p_time + * @return boolean + */ + public static function ValidPypoTimeFormat($p_time) + { + $t = explode("-", $p_time); + if (count($t) != 5) { + return false; + } + foreach ($t as $part) { + if (!is_numeric($part)) { + return false; + } + } + return true; + } + /** * Converts a time value as a string (with format HH:MM:SS.mmmmmm) to * millisecs. diff --git a/application/models/StoredFile.php b/application/models/StoredFile.php index 052885be6..9925fcc63 100644 --- a/application/models/StoredFile.php +++ b/application/models/StoredFile.php @@ -1697,7 +1697,7 @@ class StoredFile { { global $CC_CONFIG; return "http://".$CC_CONFIG["storageUrlHost"] - .$CC_CONFIG["apiPath"]."get_media.php?file=" + .$CC_CONFIG["apiPath"]."getMedia/file/" .$this->gunid.".".$this->getFileExtension(); } diff --git a/pypo/api_clients/api_client.py b/pypo/api_clients/api_client.py index 59fd22e48..4f6357a74 100644 --- a/pypo/api_clients/api_client.py +++ b/pypo/api_clients/api_client.py @@ -251,7 +251,7 @@ class CampcasterApiClient(ApiClientInterface): logger = logging.getLogger() try: - src = src + "&api_key=" + self.config["api_key"] + src = src + "/api_key/" + self.config["api_key"] # check if file exists already before downloading again filename, headers = urllib.urlretrieve(src, dst) @@ -269,7 +269,7 @@ class CampcasterApiClient(ApiClientInterface): schedule_id = playlist["schedule_id"] url = self.config["base_url"] + self.config["api_base"] + self.config["update_item_url"] url = url.replace("%%schedule_id%%", str(schedule_id)) - url += "&api_key=" + self.config["api_key"] + url = url.replace("%%api_key%%", self.config["api_key"]) logger.debug(url) try: diff --git a/pypo/config.cfg b/pypo/config.cfg index 26ec732cd..7655854f0 100644 --- a/pypo/config.cfg +++ b/pypo/config.cfg @@ -72,24 +72,24 @@ cue_style = 'pre' api_key = 'AAA' # Path to the base of the API -api_base = 'campcaster/' +api_base = 'api/' # URL to get the version number of the server API -version_url = 'api/api_version.php?api_key=%%api_key%%' +version_url = 'version/api_key/%%api_key%%' # Schedule export path. # %%from%% - starting date/time in the form YYYY-MM-DD-hh-mm # %%to%% - starting date/time in the form YYYY-MM-DD-hh-mm -export_url = 'api/schedule.php?from=%%from%%&to=%%to%%&api_key=%%api_key%%' +export_url = 'schedule/api_key/%%api_key%%/from/%%from%%/to/%%to%%' # Update whether a schedule group has begun playing. -update_item_url = 'api/notify_schedule_group_play.php?schedule_id=%%schedule_id%%' +update_item_url = 'notifyScheduleGroupPlay/api_key/%%api_key%%/schedule_id/%%schedule_id%%' # Update whether an audio clip is currently playing. -update_start_playing_url = 'api/notify_media_item_start_play.php?media_id=%%media_id%%&schedule_id=%%schedule_id%%' +update_start_playing_url = 'notifyMediaItemStartPlay/api_key/%%api_key%%/media_id/%%media_id%%/schedule_id/%%schedule_id%%' # ??? -generate_range_url = 'api/generate_range_dp.php' +generate_range_url = 'generate_range_dp.php' ############## diff --git a/pypo/install/pypo-daemontools-fetch.sh b/pypo/install/pypo-daemontools-fetch.sh index bf762ae89..6e7bed55d 100644 --- a/pypo/install/pypo-daemontools-fetch.sh +++ b/pypo/install/pypo-daemontools-fetch.sh @@ -2,8 +2,8 @@ pypo_user="pypo" export HOME="/home/pypo/" # Location of pypo_cli.py Python script -pypo_path="/opt/pypo/bin" -pypo_script="pypo_cli.py" +pypo_path="/opt/pypo/bin/" +pypo_script="pypo-cli.py" echo "*** Daemontools: starting daemon" cd ${pypo_path} exec 2>&1 diff --git a/pypo/install/pypo-daemontools-push.sh b/pypo/install/pypo-daemontools-push.sh index b933ea838..4c5cc9f7c 100644 --- a/pypo/install/pypo-daemontools-push.sh +++ b/pypo/install/pypo-daemontools-push.sh @@ -2,8 +2,8 @@ pypo_user="pypo" export HOME="/home/pypo/" # Location of pypo_cli.py Python script -pypo_path="/opt/pypo/bin" -pypo_script="pypo_cli.py" +pypo_path="/opt/pypo/bin/" +pypo_script="pypo-cli.py" echo "*** Daemontools: starting daemon" cd ${pypo_path} exec 2>&1 diff --git a/pypo/install/pypo-install.py b/pypo/install/pypo-install.py index adeb85619..a5a38dfbc 100644 --- a/pypo/install/pypo-install.py +++ b/pypo/install/pypo-install.py @@ -61,8 +61,17 @@ try: shutil.copy("../scripts/silence-playlist.lsp", BASE_PATH+"files/basic") shutil.copy("../scripts/silence.mp3", BASE_PATH+"files/basic") shutil.copy("../pypo-cli.py", BASE_PATH+"bin") + shutil.copy("../pypo-notify.py", BASE_PATH+"bin") + shutil.copy("../logging.cfg", BASE_PATH+"bin") + shutil.copy("../config.cfg", BASE_PATH+"bin") shutil.copy("../pypo-log.sh", BASE_PATH+"bin") - + print "Copying directory util" + shutil.copytree("../util", BASE_PATH+"bin/util") + print "Copying directory api_clients" + shutil.copytree("../api_clients", BASE_PATH+"bin/api_clients") + print "Copying directory scripts" + shutil.copytree("../scripts", BASE_PATH+"bin/scripts") + print "Setting permissions" os.system("chmod -R 755 "+BASE_PATH) os.system("chown -R pypo:pypo "+BASE_PATH) @@ -95,8 +104,18 @@ try: output = p.stdout.read() if (output.find("unable to open supervise/ok: file does not exist") >= 0): print "Install has completed, but daemontools is not running, please make sure you have it installed and then reboot." + sys.exit() + print output + + p = Popen('svstat /etc/service/pypo-push', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) + output = p.stdout.read() + print output + + p = Popen('svstat /etc/service/pypo-liquidsoap', shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) + output = p.stdout.read() + print output - #os.symlink(BASE_PATH+"bin/pypo-log.sh", "/usr/local/bin/") +#os.symlink(BASE_PATH+"bin/pypo-log.sh", "/usr/local/bin/") except Exception, e: diff --git a/application/models/tests/pypoTester.php b/pypo/tests/pypoTester.php similarity index 81% rename from application/models/tests/pypoTester.php rename to pypo/tests/pypoTester.php index 4443b14c1..0fa1853e9 100644 --- a/application/models/tests/pypoTester.php +++ b/pypo/tests/pypoTester.php @@ -1,12 +1,23 @@ getMessage()." ".$CC_DBC->getUserInfo()."\n"; + exit(1); +} +$CC_DBC->setFetchMode(DB_FETCHMODE_ASSOC); + $playlistName = "pypo_playlist_test"; $minutesFromNow = 1; @@ -82,4 +93,4 @@ $scheduleGroup = new ScheduleGroup(); $scheduleGroup->add($playTime, null, $pl->getId()); echo " SUCCESS: Playlist scheduled at $playTime\n\n"; -?> \ No newline at end of file +?> diff --git a/tests/application/controllers/ApiControllerTest.php b/tests/application/controllers/ApiControllerTest.php new file mode 100644 index 000000000..aaf96967e --- /dev/null +++ b/tests/application/controllers/ApiControllerTest.php @@ -0,0 +1,20 @@ +