CC-1799 Put Airtime Storage into a Human Readable File Naming ConventionPut Airtime Storage into a Human Readable File Naming Convention
put initial stub file in when a user uploads via plupload so they aren't wondering why they don't see anything in their playlist builder. Metadata will be updated when the file event completes.
This commit is contained in:
parent
51b1f00ac9
commit
17d895861d
|
@ -440,6 +440,19 @@ class ApiController extends Zend_Controller_Action
|
||||||
$file->setMetadata($md);
|
$file->setMetadata($md);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if ($mode == "moved") {
|
||||||
|
$filepath = $md['MDATA_KEY_FILEPATH'];
|
||||||
|
$filepath = str_replace("\\", "", $filepath);
|
||||||
|
$file = StoredFile::RecallByFilepath($filepath);
|
||||||
|
|
||||||
|
if (is_null($file)) {
|
||||||
|
$this->view->error = "File doesn't exist in Airtime.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$file->setMetadataValue('MDATA_KEY_FILEPATH', $md['new_filepath']);
|
||||||
|
}
|
||||||
|
}
|
||||||
else if ($mode == "delete") {
|
else if ($mode == "delete") {
|
||||||
$filepath = $md['MDATA_KEY_FILEPATH'];
|
$filepath = $md['MDATA_KEY_FILEPATH'];
|
||||||
$filepath = str_replace("\\", "", $filepath);
|
$filepath = str_replace("\\", "", $filepath);
|
||||||
|
|
|
@ -390,12 +390,14 @@ class StoredFile {
|
||||||
$storedFile->_file = $file;
|
$storedFile->_file = $file;
|
||||||
|
|
||||||
if(isset($md)) {
|
if(isset($md)) {
|
||||||
|
if(isset($md['MDATA_KEY_MIME'])) {
|
||||||
if (preg_match("/mp3/i", $md['MDATA_KEY_MIME'])) {
|
if (preg_match("/mp3/i", $md['MDATA_KEY_MIME'])) {
|
||||||
$file->setDbFtype("audioclip");
|
$file->setDbFtype("audioclip");
|
||||||
}
|
}
|
||||||
else if (preg_match("/vorbis/i", $md['MDATA_KEY_MIME'])) {
|
else if (preg_match("/vorbis/i", $md['MDATA_KEY_MIME'])) {
|
||||||
$file->setDbFtype("audioclip");
|
$file->setDbFtype("audioclip");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$storedFile->setMetadata($md);
|
$storedFile->setMetadata($md);
|
||||||
}
|
}
|
||||||
|
@ -731,10 +733,18 @@ class StoredFile {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
||||||
global $CC_CONFIG;
|
global $CC_CONFIG;
|
||||||
$stor = $CC_CONFIG["storageDir"];
|
$stor = $CC_CONFIG["storageDir"];
|
||||||
$audio_stor = $stor . DIRECTORY_SEPARATOR . $fileName;
|
$audio_stor = $stor . DIRECTORY_SEPARATOR . $fileName;
|
||||||
$r = @copy($audio_file, $audio_stor);
|
$r = @rename($audio_file, $audio_stor);
|
||||||
|
|
||||||
|
$md = array();
|
||||||
|
$md['MDATA_KEY_MD5'] = $md5;
|
||||||
|
$md['MDATA_KEY_FILEPATH'] = $audio_stor;
|
||||||
|
$md['MDATA_KEY_TITLE'] = $fileName;
|
||||||
|
|
||||||
|
StoredFile::Insert($md);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,9 +28,11 @@ from api_clients import api_client
|
||||||
|
|
||||||
MODE_CREATE = "create"
|
MODE_CREATE = "create"
|
||||||
MODE_MODIFY = "modify"
|
MODE_MODIFY = "modify"
|
||||||
|
MODE_MOVED = "moved"
|
||||||
MODE_DELETE = "delete"
|
MODE_DELETE = "delete"
|
||||||
|
|
||||||
global storage_directory
|
global storage_directory
|
||||||
|
global plupload_directory
|
||||||
|
|
||||||
# configure logging
|
# configure logging
|
||||||
try:
|
try:
|
||||||
|
@ -150,6 +152,9 @@ class MediaMonitor(ProcessEvent):
|
||||||
def watch_directory(self, directory):
|
def watch_directory(self, directory):
|
||||||
return self.wm.add_watch(directory, self.mask, rec=True, auto_add=True)
|
return self.wm.add_watch(directory, self.mask, rec=True, auto_add=True)
|
||||||
|
|
||||||
|
def is_parent_directory(self, filepath, directory):
|
||||||
|
return (directory == filepath[0:len(directory)])
|
||||||
|
|
||||||
def get_md5(self, filepath):
|
def get_md5(self, filepath):
|
||||||
f = open(filepath, 'rb')
|
f = open(filepath, 'rb')
|
||||||
m = hashlib.md5()
|
m = hashlib.md5()
|
||||||
|
@ -242,15 +247,8 @@ class MediaMonitor(ProcessEvent):
|
||||||
|
|
||||||
return filepath
|
return filepath
|
||||||
|
|
||||||
|
def get_mutagen_info(self, filepath):
|
||||||
def update_airtime(self, filepath, mode):
|
|
||||||
|
|
||||||
if ((os.path.exists(filepath) and (mode == MODE_CREATE or mode == MODE_MODIFY)) or mode == MODE_DELETE):
|
|
||||||
self.logger.info("Updating Change to Airtime")
|
|
||||||
md = {}
|
md = {}
|
||||||
md['MDATA_KEY_FILEPATH'] = filepath
|
|
||||||
|
|
||||||
if(mode == MODE_CREATE or mode == MODE_MODIFY):
|
|
||||||
md5 = self.get_md5(filepath)
|
md5 = self.get_md5(filepath)
|
||||||
md['MDATA_KEY_MD5'] = md5
|
md['MDATA_KEY_MD5'] = md5
|
||||||
|
|
||||||
|
@ -265,8 +263,34 @@ class MediaMonitor(ProcessEvent):
|
||||||
md['MDATA_KEY_SAMPLERATE'] = file_info.info.sample_rate
|
md['MDATA_KEY_SAMPLERATE'] = file_info.info.sample_rate
|
||||||
md['MDATA_KEY_DURATION'] = self.format_length(file_info.info.length)
|
md['MDATA_KEY_DURATION'] = self.format_length(file_info.info.length)
|
||||||
|
|
||||||
|
return md
|
||||||
|
|
||||||
|
|
||||||
|
def update_airtime(self, **kwargs):
|
||||||
|
|
||||||
|
filepath = kwargs['filepath']
|
||||||
|
mode = kwargs['mode']
|
||||||
|
|
||||||
|
data = None
|
||||||
|
md = {}
|
||||||
|
md['MDATA_KEY_FILEPATH'] = filepath
|
||||||
|
|
||||||
|
if (os.path.exists(filepath) and (mode == MODE_CREATE)):
|
||||||
|
mutagen = self.get_mutagen_info(filepath)
|
||||||
|
md.update(mutagen)
|
||||||
|
data = {'md': md}
|
||||||
|
elif (os.path.exists(filepath) and (mode == MODE_MODIFY)):
|
||||||
|
mutagen = self.get_mutagen_info(filepath)
|
||||||
|
md.update(mutagen)
|
||||||
|
data = {'md': md}
|
||||||
|
elif (mode == MODE_MOVED):
|
||||||
|
md['new_filepath'] = kwargs['new_filepath']
|
||||||
|
data = {'md': md}
|
||||||
|
elif (mode == MODE_DELETE):
|
||||||
data = {'md': md}
|
data = {'md': md}
|
||||||
|
|
||||||
|
if data is not None:
|
||||||
|
self.logger.info("Updating Change to Airtime")
|
||||||
response = None
|
response = None
|
||||||
while response is None:
|
while response is None:
|
||||||
response = self.api_client.update_media_metadata(data, mode)
|
response = self.api_client.update_media_metadata(data, mode)
|
||||||
|
@ -296,6 +320,9 @@ class MediaMonitor(ProcessEvent):
|
||||||
self.temp_files[event.pathname] = None
|
self.temp_files[event.pathname] = None
|
||||||
#This is a newly imported file.
|
#This is a newly imported file.
|
||||||
else :
|
else :
|
||||||
|
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.get_md5(event.pathname)
|
md5 = self.get_md5(event.pathname)
|
||||||
response = self.api_client.check_media_status(md5)
|
response = self.api_client.check_media_status(md5)
|
||||||
|
|
||||||
|
@ -315,12 +342,18 @@ class MediaMonitor(ProcessEvent):
|
||||||
if event.pathname in self.temp_files:
|
if event.pathname in self.temp_files:
|
||||||
del self.temp_files[event.pathname]
|
del self.temp_files[event.pathname]
|
||||||
self.temp_files[event.cookie] = event.pathname
|
self.temp_files[event.cookie] = event.pathname
|
||||||
|
else:
|
||||||
|
self.moved_files[event.cookie] = event.pathname
|
||||||
|
|
||||||
def process_IN_MOVED_TO(self, event):
|
def process_IN_MOVED_TO(self, event):
|
||||||
self.logger.info("%s: %s", event.maskname, event.pathname)
|
self.logger.info("%s: %s", event.maskname, event.pathname)
|
||||||
if event.cookie in self.temp_files:
|
if event.cookie in self.temp_files:
|
||||||
del self.temp_files[event.cookie]
|
del self.temp_files[event.cookie]
|
||||||
self.file_events.append({'filepath': event.pathname, 'mode': MODE_MODIFY})
|
self.file_events.append({'filepath': event.pathname, 'mode': MODE_MODIFY})
|
||||||
|
elif event.cookie in self.moved_files:
|
||||||
|
old_filepath = self.moved_files[event.cookie]
|
||||||
|
del self.moved_files[event.cookie]
|
||||||
|
self.file_events.append({'filepath': old_filepath,'new_filepath': event.pathname, 'mode': MODE_MOVED})
|
||||||
|
|
||||||
def process_IN_DELETE(self, event):
|
def process_IN_DELETE(self, event):
|
||||||
self.logger.info("%s: %s", event.maskname, event.pathname)
|
self.logger.info("%s: %s", event.maskname, event.pathname)
|
||||||
|
@ -337,13 +370,12 @@ class MediaMonitor(ProcessEvent):
|
||||||
if(file_info['mode'] == MODE_CREATE):
|
if(file_info['mode'] == MODE_CREATE):
|
||||||
os.rename(file_info['old_filepath'], file_info['filepath'])
|
os.rename(file_info['old_filepath'], file_info['filepath'])
|
||||||
|
|
||||||
self.update_airtime(file_info['filepath'], file_info['mode'])
|
self.update_airtime(file_info)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
notifier.connection.drain_events(timeout=1)
|
notifier.connection.drain_events(timeout=1)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
logger = logging.getLogger('root')
|
self.logger.info("%s", e)
|
||||||
logger.info("%s", e)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue