diff --git a/airtime_mvc/application/controllers/ApiController.php b/airtime_mvc/application/controllers/ApiController.php
index c6d7dfc13..f972b23b6 100644
--- a/airtime_mvc/application/controllers/ApiController.php
+++ b/airtime_mvc/application/controllers/ApiController.php
@@ -408,7 +408,8 @@ class ApiController extends Zend_Controller_Action
public function reloadMetadataAction() {
global $CC_CONFIG;
- $api_key = $this->_getParam('api_key');
+ $request = $this->getRequest();
+ $api_key = $request->getParam('api_key');
if (!in_array($api_key, $CC_CONFIG["apiKey"]))
{
header('HTTP/1.0 401 Unauthorized');
@@ -416,8 +417,16 @@ class ApiController extends Zend_Controller_Action
exit;
}
- $md = $this->_getParam('md');
- $mode = $this->_getParam('mode');
+ $mode = $request->getParam('mode');
+ $params = $request->getParams();
+
+ $md = array();
+ //extract all file metadata params from the request.
+ foreach ($params as $key => $value) {
+ if (preg_match('/^MDATA_KEY/', $key)) {
+ $md[$key] = $value;
+ }
+ }
if ($mode == "create") {
$md5 = $md['MDATA_KEY_MD5'];
diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php
index 883598620..04cddcd08 100644
--- a/airtime_mvc/application/controllers/LibraryController.php
+++ b/airtime_mvc/application/controllers/LibraryController.php
@@ -167,7 +167,7 @@ class LibraryController extends Zend_Controller_Action
$data = $file->getMetadata();
- RabbitMq::SendFileMetaData($data);
+ RabbitMq::SendMessageToMediaMonitor("md_update", $data);
$this->_helper->redirector('index');
}
diff --git a/airtime_mvc/application/controllers/PreferenceController.php b/airtime_mvc/application/controllers/PreferenceController.php
index 23727b9f1..0ad9057e6 100644
--- a/airtime_mvc/application/controllers/PreferenceController.php
+++ b/airtime_mvc/application/controllers/PreferenceController.php
@@ -15,32 +15,37 @@ class PreferenceController extends Zend_Controller_Action
$this->view->headScript()->appendFile($baseUrl.'/js/airtime/preferences/preferences.js','text/javascript');
$this->view->statusMsg = "";
-
+
$form = new Application_Form_Preferences();
-
+
if ($request->isPost()) {
-
+
if ($form->isValid($request->getPost())) {
$values = $form->getValues();
-
- Application_Model_Preference::SetHeadTitle($values["preferences_general"]["stationName"], $this->view);
- Application_Model_Preference::SetDefaultFade($values["preferences_general"]["stationDefaultFade"]);
+
+ Application_Model_Preference::SetHeadTitle($values["preferences_general"]["stationName"], $this->view);
+ Application_Model_Preference::SetDefaultFade($values["preferences_general"]["stationDefaultFade"]);
Application_Model_Preference::SetStreamLabelFormat($values["preferences_general"]["streamFormat"]);
Application_Model_Preference::SetAllow3rdPartyApi($values["preferences_general"]["thirdPartyApi"]);
+ Application_Model_Preference::SetWatchedDirectory($values["preferences_general"]["watchedFolder"]);
- Application_Model_Preference::SetDoSoundCloudUpload($values["preferences_soundcloud"]["UseSoundCloud"]);
+ Application_Model_Preference::SetDoSoundCloudUpload($values["preferences_soundcloud"]["UseSoundCloud"]);
Application_Model_Preference::SetSoundCloudUser($values["preferences_soundcloud"]["SoundCloudUser"]);
- Application_Model_Preference::SetSoundCloudPassword($values["preferences_soundcloud"]["SoundCloudPassword"]);
+ Application_Model_Preference::SetSoundCloudPassword($values["preferences_soundcloud"]["SoundCloudPassword"]);
Application_Model_Preference::SetSoundCloudTags($values["preferences_soundcloud"]["SoundCloudTags"]);
Application_Model_Preference::SetSoundCloudGenre($values["preferences_soundcloud"]["SoundCloudGenre"]);
Application_Model_Preference::SetSoundCloudTrackType($values["preferences_soundcloud"]["SoundCloudTrackType"]);
- Application_Model_Preference::SetSoundCloudLicense($values["preferences_soundcloud"]["SoundCloudLicense"]);
-
+ Application_Model_Preference::SetSoundCloudLicense($values["preferences_soundcloud"]["SoundCloudLicense"]);
+
+ $data = array();
+ $data["directory"] = $values["preferences_general"]["watchedFolder"];
+ RabbitMq::SendMessageToMediaMonitor("new_watch", $data);
+
$this->view->statusMsg = "
Preferences updated.
";
}
}
-
+
$this->view->form = $form;
}
}
diff --git a/airtime_mvc/application/forms/GeneralPreferences.php b/airtime_mvc/application/forms/GeneralPreferences.php
index 0e5b55590..ffac3e911 100644
--- a/airtime_mvc/application/forms/GeneralPreferences.php
+++ b/airtime_mvc/application/forms/GeneralPreferences.php
@@ -33,15 +33,15 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm
'label' => 'Default Fade:',
'required' => false,
'filters' => array('StringTrim'),
- 'validators' => array(array('regex', false,
- array('/^[0-2][0-3]:[0-5][0-9]:[0-5][0-9](\.\d{1,6})?$/',
+ 'validators' => array(array('regex', false,
+ array('/^[0-2][0-3]:[0-5][0-9]:[0-5][0-9](\.\d{1,6})?$/',
'messages' => 'enter a time 00:00:00{.000000}'))),
'value' => $defaultFade,
'decorators' => array(
'ViewHelper'
)
));
-
+
$stream_format = new Zend_Form_Element_Radio('streamFormat');
$stream_format->setLabel('Stream Label:');
$stream_format->setMultiOptions(array("Artist - Title",
@@ -58,6 +58,18 @@ class Application_Form_GeneralPreferences extends Zend_Form_SubForm
$third_party_api->setValue(Application_Model_Preference::GetAllow3rdPartyApi());
$third_party_api->setDecorators(array('ViewHelper'));
$this->addElement($third_party_api);
+
+ //Default station fade
+ $this->addElement('text', 'watchedFolder', array(
+ 'class' => 'input_text',
+ 'label' => 'WatchedFolder:',
+ 'required' => false,
+ 'filters' => array('StringTrim'),
+ 'value' => Application_Model_Preference::GetWatchedDirectory(),
+ 'decorators' => array(
+ 'ViewHelper'
+ )
+ ));
}
diff --git a/airtime_mvc/application/models/Preference.php b/airtime_mvc/application/models/Preference.php
index 400e99d8a..463ad99fd 100644
--- a/airtime_mvc/application/models/Preference.php
+++ b/airtime_mvc/application/models/Preference.php
@@ -36,7 +36,7 @@ class Application_Model_Preference
else if(is_null($id)) {
$sql = "INSERT INTO cc_pref (keystr, valstr)"
." VALUES ('$key', '$value')";
- }
+ }
else {
$sql = "INSERT INTO cc_pref (subjid, keystr, valstr)"
." VALUES ($id, '$key', '$value')";
@@ -189,5 +189,13 @@ class Application_Model_Preference
}
}
+ public static function SetWatchedDirectory($directory) {
+ Application_Model_Preference::SetValue("watched_directory", $directory);
+ }
+
+ public static function GetWatchedDirectory() {
+ return Application_Model_Preference::GetValue("watched_directory");
+ }
+
}
diff --git a/airtime_mvc/application/models/RabbitMq.php b/airtime_mvc/application/models/RabbitMq.php
index ee70ae6c5..0cd92bd13 100644
--- a/airtime_mvc/application/models/RabbitMq.php
+++ b/airtime_mvc/application/models/RabbitMq.php
@@ -40,10 +40,12 @@ class RabbitMq
}
}
- public static function SendFileMetaData($md)
+ public static function SendMessageToMediaMonitor($event_type, $md)
{
global $CC_CONFIG;
+ $md["event_type"] = $event_type;
+
$conn = new AMQPConnection($CC_CONFIG["rabbitmq"]["host"],
$CC_CONFIG["rabbitmq"]["port"],
$CC_CONFIG["rabbitmq"]["user"],
diff --git a/airtime_mvc/application/views/scripts/form/preferences_general.phtml b/airtime_mvc/application/views/scripts/form/preferences_general.phtml
index aa4e5d587..0f4ca0743 100644
--- a/airtime_mvc/application/views/scripts/form/preferences_general.phtml
+++ b/airtime_mvc/application/views/scripts/form/preferences_general.phtml
@@ -73,6 +73,19 @@
+
+
+
+
+ element->getElement('watchedFolder') ?>
+ element->getElement('watchedFolder')->hasErrors()) : ?>
+
+ element->getElement('watchedFolder')->getMessages() as $error): ?>
+
+
+
+
+
diff --git a/python_apps/api_clients/api_client.py b/python_apps/api_clients/api_client.py
index 016041255..3394c8fdb 100644
--- a/python_apps/api_clients/api_client.py
+++ b/python_apps/api_clients/api_client.py
@@ -31,24 +31,6 @@ def api_client_factory(config):
logger.info('API Client "'+config["api_client"]+'" not supported. Please check your config file.\n')
sys.exit()
-def recursive_urlencode(d):
- def recursion(d, base=None):
- pairs = []
-
- for key, value in d.items():
- if hasattr(value, 'values'):
- pairs += recursion(value, key)
- else:
- new_pair = None
- if base:
- new_pair = "%s[%s]=%s" % (base, urllib.quote(unicode(key)), urllib.quote(unicode(value)))
- else:
- new_pair = "%s=%s" % (urllib.quote(unicode(key)), urllib.quote(unicode(value)))
- pairs.append(new_pair)
- return pairs
-
- return '&'.join(recursion(d))
-
class ApiClientInterface:
# Implementation: optional
@@ -402,11 +384,12 @@ class AirTimeApiClient(ApiClientInterface):
response = None
try:
url = "http://%s:%s/%s/%s" % (self.config["base_url"], str(self.config["base_port"]), self.config["api_base"], self.config["update_media_url"])
- logger.debug(url)
+
url = url.replace("%%api_key%%", self.config["api_key"])
url = url.replace("%%mode%%", mode)
+ logger.debug(url)
- data = recursive_urlencode(md)
+ data = urllib.urlencode(md)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req).read()
diff --git a/python_apps/media-monitor/MediaMonitor.py b/python_apps/media-monitor/MediaMonitor.py
index f5eede2c8..d30091772 100644
--- a/python_apps/media-monitor/MediaMonitor.py
+++ b/python_apps/media-monitor/MediaMonitor.py
@@ -10,9 +10,12 @@ import hashlib
import json
import shutil
import math
+import socket
+import grp
+import pwd
from collections import deque
-from pwd import getpwnam
+
from subprocess import Popen, PIPE, STDOUT
from configobj import ConfigObj
@@ -26,6 +29,8 @@ from kombu.connection import BrokerConnection
from kombu.messaging import Exchange, Queue, Consumer, Producer
from api_clients import api_client
+from multiprocessing import Process, Lock
+
MODE_CREATE = "create"
MODE_MODIFY = "modify"
MODE_MOVED = "moved"
@@ -130,7 +135,7 @@ class MetadataExtractor:
value = m[key]
if ((value is not None) and (len(str(value)) > 0)):
airtime_file[self.airtime2mutagen[key]] = str(value)
- self.logger.info('setting %s = %s ', key, str(value))
+ #self.logger.info('setting %s = %s ', key, str(value))
airtime_file.save()
@@ -150,7 +155,17 @@ class MetadataExtractor:
if key in attrs :
md[attrs[key]] = file_info[key][0]
- #md['MDATA_KEY_TRACKNUMBER'] = "%02d" % (int(md['MDATA_KEY_TRACKNUMBER']))
+ if 'MDATA_KEY_TITLE' not in md:
+ #get rid of file extention from original name, name might have more than 1 '.' in it.
+ original_name = os.path.basename(filepath)
+ original_name = original_name.split(".")[0:-1]
+ original_name = ''.join(original_name)
+ md['MDATA_KEY_TITLE'] = original_name
+
+ #incase track number is in format u'4/11'
+ if 'MDATA_KEY_TRACKNUMBER' in md:
+ if isinstance(md['MDATA_KEY_TRACKNUMBER'], basestring):
+ md['MDATA_KEY_TRACKNUMBER'] = md['MDATA_KEY_TRACKNUMBER'].split("/")[0]
md['MDATA_KEY_BITRATE'] = file_info.info.bitrate
md['MDATA_KEY_SAMPLERATE'] = file_info.info.sample_rate
@@ -162,6 +177,11 @@ class MetadataExtractor:
elif "vorbis" in md['MDATA_KEY_MIME']:
md['MDATA_KEY_FTYPE'] = "audioclip"
+ #do this so object can be urlencoded properly.
+ for key in md.keys():
+ if(isinstance(md[key], basestring)):
+ md[key] = md[key].encode('utf-8')
+
return md
@@ -179,7 +199,10 @@ class AirtimeNotifier(Notifier):
consumer.consume()
self.logger = logging.getLogger('root')
+ self.api_client = api_client.api_client_factory(config)
self.md_manager = MetadataExtractor()
+ self.import_processes = {}
+ self.watched_folders = []
def handle_message(self, body, message):
# ACK the message to take it off the queue
@@ -187,7 +210,56 @@ class AirtimeNotifier(Notifier):
self.logger.info("Received md from RabbitMQ: " + body)
m = json.loads(message.body)
- self.md_manager.save_md_to_file(m)
+
+ if m['event_type'] == "md_update":
+ self.logger.info("AIRTIME NOTIFIER md update event")
+ self.md_manager.save_md_to_file(m)
+ elif m['event_type'] == "new_watch":
+ self.logger.info("AIRTIME NOTIFIER add watched folder event " + m['directory'])
+ #start a new process to walk through this folder and add the files to Airtime.
+ p = Process(target=self.walk_newly_watched_directory, args=(m['directory'],))
+ p.start()
+ self.import_processes[m['directory']] = p
+ #add this new folder to our list of watched folders
+ self.watched_folders.append(m['directory'])
+
+ def update_airtime(self, d):
+
+ filepath = d['filepath']
+ mode = d['mode']
+
+ data = None
+ md = {}
+ md['MDATA_KEY_FILEPATH'] = filepath
+
+ if (os.path.exists(filepath) and (mode == MODE_CREATE)):
+ mutagen = self.md_manager.get_md_from_file(filepath)
+ md.update(mutagen)
+ data = md
+ elif (os.path.exists(filepath) and (mode == MODE_MODIFY)):
+ mutagen = self.md_manager.get_md_from_file(filepath)
+ md.update(mutagen)
+ data = md
+ elif (mode == MODE_MOVED):
+ mutagen = self.md_manager.get_md_from_file(filepath)
+ md.update(mutagen)
+ data = md
+ elif (mode == MODE_DELETE):
+ data = md
+
+ if data is not None:
+ self.logger.info("Updating Change to Airtime " + filepath)
+ response = None
+ while response is None:
+ response = self.api_client.update_media_metadata(data, mode)
+ time.sleep(5)
+
+ def walk_newly_watched_directory(self, directory):
+
+ for (path, dirs, files) in os.walk(directory):
+ for filename in files:
+ full_filepath = path+"/"+filename
+ self.update_airtime({'filepath': full_filepath, 'mode': MODE_CREATE})
class MediaMonitor(ProcessEvent):
@@ -219,6 +291,27 @@ class MediaMonitor(ProcessEvent):
def is_parent_directory(self, filepath, directory):
return (directory == filepath[0:len(directory)])
+ def set_needed_file_permissions(self, item, is_dir):
+
+ try:
+ omask = os.umask(0)
+
+ uid = pwd.getpwnam('pypo')[2]
+ gid = grp.getgrnam('www-data')[2]
+
+ os.chown(item, uid, gid)
+
+ if is_dir is True:
+ os.chmod(item, 02777)
+ else:
+ os.chmod(item, 0666)
+
+ except Exception, e:
+ self.logger.error("Failed to change file's owner/group/permissions.")
+ self.logger.error(item)
+ finally:
+ os.umask(omask)
+
def ensure_dir(self, filepath):
directory = os.path.dirname(filepath)
@@ -230,21 +323,38 @@ class MediaMonitor(ProcessEvent):
finally:
os.umask(omask)
+ def move_file(self, source, dest):
+
+ try:
+ omask = os.umask(0)
+ os.rename(source, dest)
+ except Exception, e:
+ self.logger.error("failed to move file.")
+ finally:
+ os.umask(omask)
+
def create_unique_filename(self, filepath):
- if(os.path.exists(filepath)):
- file_dir = os.path.dirname(filepath)
- filename = os.path.basename(filepath).split(".")[0]
- #will be in the format .ext
- file_ext = os.path.splitext(filepath)[1]
- i = 1;
- while(True):
- new_filepath = "%s/%s(%s)%s" % (file_dir, filename, i, file_ext)
+ try:
+ if(os.path.exists(filepath)):
+ self.logger.info("Path %s exists", filepath)
+ file_dir = os.path.dirname(filepath)
+ filename = os.path.basename(filepath).split(".")[0]
+ #will be in the format .ext
+ file_ext = os.path.splitext(filepath)[1]
+ i = 1;
+ while(True):
+ new_filepath = '%s/%s(%s)%s' % (file_dir, filename, i, file_ext)
+ self.logger.error("Trying %s", new_filepath)
- if(os.path.exists(new_filepath)):
- i = i+1;
- else:
- filepath = new_filepath
+ if(os.path.exists(new_filepath)):
+ i = i+1;
+ else:
+ filepath = new_filepath
+ break
+
+ except Exception, e:
+ self.logger.error("Exception %s", e)
return filepath
@@ -260,23 +370,39 @@ class MediaMonitor(ProcessEvent):
#will be in the format .ext
file_ext = os.path.splitext(imported_filepath)[1]
+ file_ext = file_ext.encode('utf-8')
md = self.md_manager.get_md_from_file(imported_filepath)
path_md = ['MDATA_KEY_TITLE', 'MDATA_KEY_CREATOR', 'MDATA_KEY_SOURCE', 'MDATA_KEY_TRACKNUMBER', 'MDATA_KEY_BITRATE']
+ self.logger.info('Getting md')
+
for m in path_md:
if m not in md:
- md[m] = 'unknown'
+ md[m] = u'unknown'.encode('utf-8')
+ else:
+ #get rid of any "/" which will interfere with the filepath.
+ if isinstance(md[m], basestring):
+ md[m] = md[m].replace("/", "-")
+
+ self.logger.info(md)
+
+ self.logger.info('Starting filepath creation')
filepath = None
- if (md['MDATA_KEY_TITLE'] == 'unknown'):
- filepath = "%s/%s/%s/%s-%s%s" % (storage_directory, md['MDATA_KEY_CREATOR'], md['MDATA_KEY_SOURCE'], original_name, md['MDATA_KEY_BITRATE'], file_ext)
- elif(md['MDATA_KEY_TRACKNUMBER'] == 'unknown'):
- filepath = "%s/%s/%s/%s-%s%s" % (storage_directory, md['MDATA_KEY_CREATOR'], md['MDATA_KEY_SOURCE'], md['MDATA_KEY_TITLE'], md['MDATA_KEY_BITRATE'], file_ext)
+ if (md['MDATA_KEY_TITLE'] == u'unknown'.encode('utf-8')):
+ self.logger.info('unknown title')
+ filepath = '%s/%s/%s/%s-%s%s' % (storage_directory.encode('utf-8'), md['MDATA_KEY_CREATOR'], md['MDATA_KEY_SOURCE'], original_name, md['MDATA_KEY_BITRATE'], file_ext)
+ elif(md['MDATA_KEY_TRACKNUMBER'] == u'unknown'.encode('utf-8')):
+ self.logger.info('unknown track number')
+ filepath = '%s/%s/%s/%s-%s%s' % (storage_directory.encode('utf-8'), md['MDATA_KEY_CREATOR'], md['MDATA_KEY_SOURCE'], md['MDATA_KEY_TITLE'], md['MDATA_KEY_BITRATE'], file_ext)
else:
- filepath = "%s/%s/%s/%s-%s-%s%s" % (storage_directory, md['MDATA_KEY_CREATOR'], md['MDATA_KEY_SOURCE'], md['MDATA_KEY_TRACKNUMBER'], md['MDATA_KEY_TITLE'], md['MDATA_KEY_BITRATE'], file_ext)
+ self.logger.info('full metadata')
+ filepath = '%s/%s/%s/%s-%s-%s%s' % (storage_directory.encode('utf-8'), md['MDATA_KEY_CREATOR'], md['MDATA_KEY_SOURCE'], md['MDATA_KEY_TRACKNUMBER'], md['MDATA_KEY_TITLE'], md['MDATA_KEY_BITRATE'], file_ext)
+ self.logger.info(u'Created filepath: %s', filepath)
filepath = self.create_unique_filename(filepath)
+ self.logger.info(u'Unique filepath: %s', filepath)
self.ensure_dir(filepath)
except Exception, e:
@@ -284,37 +410,6 @@ class MediaMonitor(ProcessEvent):
return filepath
- def update_airtime(self, d):
-
- filepath = d['filepath']
- mode = d['mode']
-
- data = None
- md = {}
- md['MDATA_KEY_FILEPATH'] = filepath
-
- if (os.path.exists(filepath) and (mode == MODE_CREATE)):
- mutagen = self.md_manager.get_md_from_file(filepath)
- md.update(mutagen)
- data = {'md': md}
- elif (os.path.exists(filepath) and (mode == MODE_MODIFY)):
- mutagen = self.md_manager.get_md_from_file(filepath)
- md.update(mutagen)
- data = {'md': md}
- elif (mode == MODE_MOVED):
- mutagen = self.md_manager.get_md_from_file(filepath)
- md.update(mutagen)
- data = {'md': md}
- elif (mode == MODE_DELETE):
- data = {'md': md}
-
- if data is not None:
- self.logger.info("Updating Change to Airtime")
- response = None
- while response is None:
- response = self.api_client.update_media_metadata(data, mode)
- time.sleep(5)
-
def is_temp_file(self, filename):
info = filename.split(".")
@@ -342,18 +437,20 @@ class MediaMonitor(ProcessEvent):
global plupload_directory
#files that have been added through plupload have a placeholder already put in Airtime's database.
if not self.is_parent_directory(event.pathname, plupload_directory):
- md5 = self.md_manager.get_md5(event.pathname)
- response = self.api_client.check_media_status(md5)
+ if self.is_audio_file(event.pathname):
+ self.set_needed_file_permissions(event.pathname, event.dir)
+ md5 = self.md_manager.get_md5(event.pathname)
+ response = self.api_client.check_media_status(md5)
- #this file is new, md5 does not exist in Airtime.
- if(response['airtime_status'] == 0):
- filepath = self.create_file_path(event.pathname)
- os.rename(event.pathname, filepath)
- self.file_events.append({'mode': MODE_CREATE, 'filepath': filepath})
+ #this file is new, md5 does not exist in Airtime.
+ if(response['airtime_status'] == 0):
+ filepath = self.create_file_path(event.pathname)
+ self.move_file(event.pathname, filepath)
+ self.file_events.append({'mode': MODE_CREATE, 'filepath': filepath})
- #immediately add a watch on the new directory.
else:
- self.watch_directory(event.pathname)
+ self.set_needed_file_permissions(event.pathname, event.dir)
+
def process_IN_MODIFY(self, event):
if not event.dir:
@@ -375,6 +472,8 @@ class MediaMonitor(ProcessEvent):
def process_IN_MOVED_TO(self, event):
self.logger.info("%s: %s", event.maskname, event.pathname)
+ #if stuff dropped in stor via a UI move must change file permissions.
+ self.set_needed_file_permissions(event.pathname, event.dir)
if not event.dir:
if event.cookie in self.temp_files:
del self.temp_files[event.cookie]
@@ -388,7 +487,7 @@ class MediaMonitor(ProcessEvent):
#file renamed from /tmp/plupload does not have a path in our naming scheme yet.
md_filepath = self.create_file_path(event.pathname)
#move the file a second time to its correct Airtime naming schema.
- os.rename(event.pathname, md_filepath)
+ self.move_file(event.pathname, md_filepath)
self.file_events.append({'filepath': md_filepath, 'mode': MODE_MOVED})
else:
self.file_events.append({'filepath': event.pathname, 'mode': MODE_MOVED})
@@ -397,7 +496,7 @@ class MediaMonitor(ProcessEvent):
#TODO need to pass in if md5 exists to this file creation function, identical files will just replace current files not have a (1) etc.
#file has been most likely dropped into stor folder from an unwatched location. (from gui, mv command not cp)
md_filepath = self.create_file_path(event.pathname)
- os.rename(event.pathname, md_filepath)
+ self.move_file(event.pathname, md_filepath)
self.file_events.append({'mode': MODE_CREATE, 'filepath': md_filepath})
def process_IN_DELETE(self, event):
@@ -410,12 +509,22 @@ class MediaMonitor(ProcessEvent):
def notifier_loop_callback(self, notifier):
+ for watched_directory in notifier.import_processes.keys():
+ process = notifier.import_processes[watched_directory]
+ if not process.is_alive():
+ self.watch_directory(watched_directory)
+ del notifier.import_processes[watched_directory]
+
while len(self.file_events) > 0:
+ self.logger.info("Processing a file event update to Airtime.")
file_info = self.file_events.popleft()
- self.update_airtime(file_info)
+ notifier.update_airtime(file_info)
try:
notifier.connection.drain_events(timeout=1)
+ #avoid logging a bunch of timeout messages.
+ except socket.timeout:
+ pass
except Exception, e:
self.logger.info("%s", e)
diff --git a/python_apps/media-monitor/airtime-media-monitor-init-d b/python_apps/media-monitor/airtime-media-monitor-init-d
index afe45e137..1fde178e1 100755
--- a/python_apps/media-monitor/airtime-media-monitor-init-d
+++ b/python_apps/media-monitor/airtime-media-monitor-init-d
@@ -9,14 +9,14 @@
# Short-Description: Manage airtime-media-monitor daemon
### END INIT INFO
-USERID=pypo
-GROUPID=pypo
+USERID=root
+GROUPID=www-data
NAME=Airtime
DAEMON=/usr/bin/airtime-media-monitor
PIDFILE=/var/run/airtime-media-monitor.pid
-start () {
+start () {
start-stop-daemon --start --background --quiet --chuid $USERID:$GROUPID --make-pidfile --pidfile $PIDFILE --startas $DAEMON
}
diff --git a/python_apps/media-monitor/install/media-monitor-install.py b/python_apps/media-monitor/install/media-monitor-install.py
index 36f491c57..730c8e395 100755
--- a/python_apps/media-monitor/install/media-monitor-install.py
+++ b/python_apps/media-monitor/install/media-monitor-install.py
@@ -34,7 +34,7 @@ def copy_dir(src_dir, dest_dir):
if not (os.path.exists(dest_dir)):
print "Copying directory "+os.path.realpath(src_dir)+" to "+os.path.realpath(dest_dir)
shutil.copytree(src_dir, dest_dir)
-
+
def get_current_script_dir():
current_script_dir = os.path.realpath(__file__)
index = current_script_dir.rindex('/')
@@ -60,9 +60,10 @@ try:
os.system("chown -R pypo:pypo "+config["log_dir"])
copy_dir("%s/.."%current_script_dir, config["bin_dir"])
-
+
print "Setting permissions"
os.system("chmod -R 755 "+config["bin_dir"])
+ #os.system("chmod -R 755 "+config["bin_dir"]+"/airtime-media-monitor)
os.system("chown -R pypo:pypo "+config["bin_dir"])
print "Creating symbolic links"
@@ -74,7 +75,7 @@ try:
p = Popen("update-rc.d airtime-media-monitor defaults", shell=True)
sts = os.waitpid(p.pid, 0)[1]
-
+
print "Waiting for processes to start..."
p = Popen("/etc/init.d/airtime-media-monitor start", shell=True)
sts = os.waitpid(p.pid, 0)[1]