SAAS-596: Store file size and hash in database
Have pypo fetch the file size and md5, if necessary, and make request to Airtime to set these values
This commit is contained in:
parent
47a7b0245e
commit
be7a6854f0
|
@ -160,11 +160,11 @@ class ApiController extends Zend_Controller_Action
|
||||||
|
|
||||||
// If we're passing in a Stored File object, it's faster
|
// If we're passing in a Stored File object, it's faster
|
||||||
// to use getFileSize() and pass in the result
|
// to use getFileSize() and pass in the result
|
||||||
if (!$size || $size <= 0) {
|
if (!isset($size) || $size < 0) {
|
||||||
$size= filesize($location);
|
$size= filesize($location);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($size <= 0) {
|
if ($size < 0) {
|
||||||
throw new Exception("Invalid file size returned for file at $location");
|
throw new Exception("Invalid file size returned for file at $location");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -195,9 +195,11 @@ class ApiController extends Zend_Controller_Action
|
||||||
header('Cache-Control: public, must-revalidate, max-age=0');
|
header('Cache-Control: public, must-revalidate, max-age=0');
|
||||||
header('Pragma: no-cache');
|
header('Pragma: no-cache');
|
||||||
header('Accept-Ranges: bytes');
|
header('Accept-Ranges: bytes');
|
||||||
header('Content-Length:' . (($end - $begin) + 1));
|
if ($size > 0) {
|
||||||
if (isset($_SERVER['HTTP_RANGE'])) {
|
header('Content-Length:' . (($end - $begin) + 1));
|
||||||
header("Content-Range: bytes $begin-$end/$size");
|
if (isset($_SERVER['HTTP_RANGE'])) {
|
||||||
|
header("Content-Range: bytes $begin-$end/$size");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
header("Content-Transfer-Encoding: binary");
|
header("Content-Transfer-Encoding: binary");
|
||||||
|
|
||||||
|
|
|
@ -564,7 +564,10 @@ SQL;
|
||||||
public function getFileSize()
|
public function getFileSize()
|
||||||
{
|
{
|
||||||
$filesize = $this->_file->getFileSize();
|
$filesize = $this->_file->getFileSize();
|
||||||
if ($filesize <= 0) {
|
|
||||||
|
// It's OK for the file size to be zero. Pypo will make a request to Airtime and update
|
||||||
|
// the file size and md5 hash if they are not set.
|
||||||
|
if ($filesize < 0) {
|
||||||
throw new Exception ("Could not determine filesize for file id: ".$this->_file->getDbId().". Filesize: ".$filesize);
|
throw new Exception ("Could not determine filesize for file id: ".$this->_file->getDbId().". Filesize: ".$filesize);
|
||||||
}
|
}
|
||||||
return $filesize;
|
return $filesize;
|
||||||
|
|
|
@ -10,6 +10,9 @@ import sys
|
||||||
import stat
|
import stat
|
||||||
import requests
|
import requests
|
||||||
import ConfigParser
|
import ConfigParser
|
||||||
|
import json
|
||||||
|
import hashlib
|
||||||
|
from requests.exceptions import ConnectionError, HTTPError, Timeout
|
||||||
|
|
||||||
from std_err_override import LogWriter
|
from std_err_override import LogWriter
|
||||||
|
|
||||||
|
@ -68,7 +71,6 @@ class PypoFile(Thread):
|
||||||
|
|
||||||
host = config.get(CONFIG_SECTION, 'base_url')
|
host = config.get(CONFIG_SECTION, 'base_url')
|
||||||
url = "http://%s/rest/media/%s/download" % (host, media_item["id"])
|
url = "http://%s/rest/media/%s/download" % (host, media_item["id"])
|
||||||
|
|
||||||
with open(dst, "wb") as handle:
|
with open(dst, "wb") as handle:
|
||||||
response = requests.get(url, auth=requests.auth.HTTPBasicAuth(username, ''), stream=True, verify=False)
|
response = requests.get(url, auth=requests.auth.HTTPBasicAuth(username, ''), stream=True, verify=False)
|
||||||
|
|
||||||
|
@ -85,11 +87,44 @@ class PypoFile(Thread):
|
||||||
#make file world readable
|
#make file world readable
|
||||||
os.chmod(dst, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
|
os.chmod(dst, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
|
||||||
|
|
||||||
|
if media_item['filesize'] == 0:
|
||||||
|
file_size = self.report_file_size_and_md5_to_airtime(dst, media_item["id"], host, username)
|
||||||
|
media_item["filesize"] = file_size
|
||||||
|
|
||||||
media_item['file_ready'] = True
|
media_item['file_ready'] = True
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.logger.error("Could not copy from %s to %s" % (src, dst))
|
self.logger.error("Could not copy from %s to %s" % (src, dst))
|
||||||
self.logger.error(e)
|
self.logger.error(e)
|
||||||
|
|
||||||
|
def report_file_size_and_md5_to_airtime(self, file_path, file_id, host_name, api_key):
|
||||||
|
try:
|
||||||
|
file_size = os.path.getsize(file_path)
|
||||||
|
|
||||||
|
with open(file_path, 'rb') as fh:
|
||||||
|
m = hashlib.md5()
|
||||||
|
while True:
|
||||||
|
data = fh.read(8192)
|
||||||
|
if not data:
|
||||||
|
break
|
||||||
|
m.update(data)
|
||||||
|
md5_hash = m.hexdigest()
|
||||||
|
except (OSError, IOError) as e:
|
||||||
|
file_size = 0
|
||||||
|
self.logger.error("Error getting file size and md5 hash for file id %s" % file_id)
|
||||||
|
self.logger.error(e)
|
||||||
|
|
||||||
|
# Make PUT request to Airtime to update the file size and hash
|
||||||
|
put_url = "http://%s/rest/media/%s" % (host_name, file_id)
|
||||||
|
payload = json.dumps({'filesize': file_size, 'md5': md5_hash})
|
||||||
|
try:
|
||||||
|
response = requests.put(put_url, data=payload, auth=requests.auth.HTTPBasicAuth(api_key, ''))
|
||||||
|
if not response.ok:
|
||||||
|
self.logger.error("Could not update media file %s with file size and md5 hash" % file_id)
|
||||||
|
except (ConnectionError, Timeout):
|
||||||
|
self.logger.error("Could not update media file %s with file size and md5 hash" % file_id)
|
||||||
|
|
||||||
|
return file_size
|
||||||
|
|
||||||
def get_highest_priority_media_item(self, schedule):
|
def get_highest_priority_media_item(self, schedule):
|
||||||
"""
|
"""
|
||||||
Get highest priority media_item in the queue. Currently the highest
|
Get highest priority media_item in the queue. Currently the highest
|
||||||
|
|
Loading…
Reference in New Issue