From a65ab11d9fde055b1e94a03916f3ae7b0be14e84 Mon Sep 17 00:00:00 2001 From: Codenift Date: Fri, 25 Oct 2019 10:30:33 -0400 Subject: [PATCH 01/11] Upload artwork using drag and drop or click to browse using track edit. --- .../application/common/FileDataHelper.php | 63 +++++++ .../controllers/LibraryController.php | 6 + airtime_mvc/application/forms/EditAudioMD.php | 10 +- .../views/scripts/library/edit-file-md.phtml | 11 +- airtime_mvc/public/css/styles.css | 91 ++++++++++ .../public/js/airtime/library/library.js | 156 +++++++++++++++++- 6 files changed, 334 insertions(+), 3 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 3c576f685..983885c7e 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -251,6 +251,69 @@ class FileDataHelper { return $get_img; } + /** + * Upload artwork + * + * @param string $trackid + * @param string $data + * + * @return string Path to artwork + */ + public static function uploadArtwork($trackid, $data) + { + $file = Application_Model_StoredFile::RecallById($trackid); + $md = $file->getMetadata(); + + $storDir = Application_Model_MusicDir::getStorDir(); + $fp = $storDir->getDirectory(); + + $dbAudioPath = $md["MDATA_KEY_FILEPATH"]; + $fullpath = $fp . $dbAudioPath; + + $base64 = @$data; + $mime = explode(';', $base64)[0]; + + $audioPath = dirname($fullpath); + $dbPath = dirname($dbAudioPath); + $path_parts = pathinfo($fullpath); + $file = $path_parts['filename']; + + //Save Data URI + if (file_put_contents($audioPath . "/" . $file, $base64)) { + $get_img = $dbPath . "/" . $file; + } else { + Logging::error("Could not save Data URI"); + } + + $rfile = $audioPath . "/" . $file; + + if ($mime == "data:image/png") { + $ext = 'png'; + } elseif ($mime == "data:image/gif") { + $ext = 'gif'; + } elseif ($mime == "data:image/bmp") { + $ext = 'bmp'; + } else { + $ext = 'jpg'; + } + + if (file_exists($rfile)) { + self::resizeImage($rfile, $rfile . '-32.jpg', $ext, 32, 100); + self::resizeImage($rfile, $rfile . '-64.jpg', $ext, 64, 100); + self::resizeImage($rfile, $rfile . '-128.jpg', $ext, 128, 100); + self::resizeImage($rfile, $rfile . '-256.jpg', $ext, 256, 100); + self::resizeImage($rfile, $rfile . '-512.jpg', $ext, 512, 100); + self::imgToDataURI($rfile . '-32.jpg', $rfile . '-32'); + self::imgToDataURI($rfile . '-64.jpg', $rfile . '-64'); + self::imgToDataURI($rfile . '-128.jpg', $rfile . '-128'); + self::imgToDataURI($rfile . '-256.jpg', $rfile . '-256'); + } else { + Logging::error("The file $rfile does not exist"); + } + + return $get_img; + } + /** * Render image * Used in API to render JPEG diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 28c5f02bb..8033555df 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -400,6 +400,12 @@ class LibraryController extends Zend_Controller_Action } else { $serialized[$j["name"]] = $j["value"]; } + + if ($j["name"] == "artwork_uploaded") { + if ($j["value"] != null || $j["value"] != ''){ + $serialized["artwork"] = FileDataHelper::uploadArtwork($file_id, $j["value"] ); + } + } } // Sanitize any wildly incorrect metadata before it goes to be validated. diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php index 62a83f66c..8b7f40754 100644 --- a/airtime_mvc/application/forms/EditAudioMD.php +++ b/airtime_mvc/application/forms/EditAudioMD.php @@ -22,13 +22,21 @@ class Application_Form_EditAudioMD extends Zend_Form $artwork = new Zend_Form_Element_Hidden('artwork'); $artwork->setFilters(array('StringTrim')) ->setValidators(array( - new Zend_Validate_StringLength(array('max' => 512)) + new Zend_Validate_StringLength(array('max' => 2048)) )); $file_id->addDecorator('HtmlTag', array('tag' => 'div', 'style' => 'display:none')); $file_id->removeDecorator('Label'); $file_id->setAttrib('class', 'artwork'); $this->addElement($artwork); + // Add artwork uploaded hidden field + $artwork_uploaded = new Zend_Form_Element_Hidden('artwork_uploaded'); + $artwork_uploaded->class = 'input_text artwork_uploaded_'. $p_id; + $file_id->addDecorator('HtmlTag', array('tag' => 'div', 'style' => 'display:none')); + $file_id->removeDecorator('Label'); + $file_id->setAttrib('class', 'artwork_uploaded'); + $this->addElement($artwork_uploaded); + // Add title field $track_title = new Zend_Form_Element_Text('track_title'); $track_title->class = 'input_text'; diff --git a/airtime_mvc/application/views/scripts/library/edit-file-md.phtml b/airtime_mvc/application/views/scripts/library/edit-file-md.phtml index 4f09f9db4..03e919d66 100644 --- a/airtime_mvc/application/views/scripts/library/edit-file-md.phtml +++ b/airtime_mvc/application/views/scripts/library/edit-file-md.phtml @@ -19,7 +19,16 @@
- '; ?> +
+
+ + +
+
+
+
+
+
diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index 981ac5f92..ae9af550a 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -4284,3 +4284,94 @@ li .ui-state-hover { .track-edit-right { margin-left: 160px; } + +/* Artwork Upload in Tracks Edit */ +.artwork-upload { + position: relative; + max-width: 205px; +} + +.artwork-upload .artwork-edit { + position: absolute; + z-index: 1; + top: 0; +} +.artwork-upload .artwork-edit input { + display: none; +} +.artwork-upload .artwork-edit input + label { + display: inline-block; + width: 140px; + height: 140px; + margin: 1px; + border-radius: 1px; + border: 1px solid transparent; + box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.12); + cursor: pointer; + font-weight: normal; + transition: all 0.2s ease-in-out; +} +.artwork-upload .artwork-edit input + label:hover { + background: rgba(0, 0, 0, 0.40); + border-color: #d6d6d6; +} +.artwork-upload .artwork-edit input + label:after { + color: #757575; + position: absolute; + top: 10px; + left: 0; + right: 0; + text-align: center; + margin: auto; +} +.artwork-upload .artwork-preview { + width: 140px; + height: 140px; + position: relative; + border-radius: 1px; + border: 2px solid #F8F8F8; + box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1); +} +.artwork-upload .artwork-preview > div { + width: 100%; + height: 100%; + background-size: cover; + background-repeat: no-repeat; + background-position: center; +} + +/* Drag and Drop Artwork */ +body.droppable .artwork-upload .artwork-preview { + border: 2px dashed lightblue; + z-index: 9999; +} +.profile { + width: 50%; +} +.profile-avatar-wrap { + width: 33.33%; + float: left; + margin: 0 20px 5px 0; + position: relative; + pointer-events: none; + border: 5px solid transparent; +} +.profile-avatar-wrap:after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.profile-avatar-wrap img { + width: 100%; + display: block; +} +.location { + text-transform: uppercase; + color: #999; + letter-spacing: 1px; + margin: 0 0 10px 0; + font-size: 90%; +} diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 38a675e81..14a1594e7 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -1601,6 +1601,70 @@ var validationTypes = { }; +function readArtworkURL(input, id) { + + if (input.files && input.files[0]) { + var reader = new FileReader(); + reader.onload = function(e) { + $('.artwork-preview-'+id).css('background-image', 'url('+e.target.result +')'); + $('.artwork-preview-'+id).hide(); + $('.artwork-preview-'+id).fadeIn(500); + $('.artwork_uploaded_'+id).val(function() { + return e.target.result; + }); + } + reader.readAsDataURL(input.files[0]); + } +} + +// Resample Artwork +var resampleImg = (function (canvas) { + + function resampleImg(img, width, height, onresample) { + var load = typeof img == "string", + i = load || img; + if (load) { + i = new Image; + i.onload = onload; + i.onerror = onerror; + } + i._onresample = onresample; + i._width = width; + i._height = height; + load ? (i.src = img) : onload.call(img); + } + + function onerror() { + throw ("not found: " + this.src); + } + + function onload() { + var img = this, + width = img._width, + height = img._height, + onresample = img._onresample; + + var minValue = Math.min(img.height, img.width); + width == null && (width = round(img.width * height / img.height)); + height == null && (height = round(img.height * width / img.width)); + + delete img._onresample; + delete img._width; + delete img._height; + canvas.width = width; + canvas.height = height; + context.drawImage(img,0,0,minValue,minValue,0,0,width,height); + onresample(canvas.toDataURL("image/jpeg")); + } + + var context = canvas.getContext("2d"), + round = Math.round; + + return resampleImg; + +}(this.document.createElement("canvas"))); + + $(document).ready(function() { if (window.location.href.indexOf("showbuilder") > -1) { AIRTIME.library.initPodcastDatatable(); @@ -1613,5 +1677,95 @@ $(document).ready(function() { $(window).resize(function() { resizeAdvancedSearch(); }); -}); + // image upload by clicking on the artwork container + $(document).on('change', '.artworkUpload', 'input', function(event) { + event.preventDefault(); + event.stopPropagation(); + var id = $(this).attr('data-id'); + readArtworkURL(this, id); + }); + + // image upload by dragging onto the artwork container + $.event.props.push('dataTransfer'); + (function() { + + var s; + var Artwork = { + settings: { + body: $("body") + }, + init: function() { + s = Artwork.settings; + Artwork.bindUIActions(); + }, + bindUIActions: function() { + + var timer; + s.body.on('dragover', '.artwork-upload', function(event) { + + event.preventDefault(); + event.stopPropagation(); + clearTimeout(timer); + Artwork.showDroppableArea(); + return false; + }); + s.body.on('dragleave', '.artwork-upload', function(event) { + + event.preventDefault(); + event.stopPropagation(); + timer = setTimeout(function() { + Artwork.hideDroppableArea(); + }, 200); + }); + s.body.on('drop', '.artwork-upload', function(event) { + event.preventDefault(); + event.stopPropagation(); + var id = $(this).attr('data-id'); + Artwork.handleDrop(event.dataTransfer.files, id); + }); + + }, + showDroppableArea: function() { + s.body.addClass("droppable"); + }, + hideDroppableArea: function() { + s.body.removeClass("droppable"); + }, + handleDrop: function(files, id) { + Artwork.hideDroppableArea(); + var file = files[0]; + if (typeof file !== 'undefined' && file.type.match('image.*')) { + Artwork.resizeImage(file, 512, function(data) { + Artwork.placeImage(data, id); + }); + } else { + alert("The file is not an image."); + } + }, + resizeImage: function(file, size, callback) { + var fileTracker = new FileReader; + fileTracker.onload = function() { + resampleImg(this.result, size, size, callback); + } + fileTracker.readAsDataURL(file); + fileTracker.onabort = function() { + alert("Upload aborted!"); + } + fileTracker.onerror = function() { + alert("File could not be read."); + } + }, + placeImage: function(data, id) { + $('.artwork-preview-'+id).css('background-image', 'url('+ data +')'); + $('.artwork-preview-'+id).hide(); + $('.artwork-preview-'+id).fadeIn(500); + $('.artwork_uploaded_'+id).val(function() { + return data; + }); + } + } + Artwork.init(); + })(); + +}); From 9f2d941c8745a795ecfa96c4b1161575f0edab88 Mon Sep 17 00:00:00 2001 From: Codenift Date: Fri, 25 Oct 2019 14:46:16 -0400 Subject: [PATCH 02/11] Clean up on artwork upload. --- .../application/common/FileDataHelper.php | 66 ++++++++----------- airtime_mvc/public/css/styles.css | 30 --------- 2 files changed, 26 insertions(+), 70 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 983885c7e..3db19b116 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -155,20 +155,8 @@ class FileDataHelper { } else { $ext = 'jpg'; } + self::resizeGroup($file, $ext); - if (file_exists($file)) { - self::resizeImage($file, $file . '-32.jpg', $ext, 32, 100); - self::resizeImage($file, $file . '-64.jpg', $ext, 64, 100); - self::resizeImage($file, $file . '-128.jpg', $ext, 128, 100); - self::resizeImage($file, $file . '-256.jpg', $ext, 256, 100); - self::resizeImage($file, $file . '-512.jpg', $ext, 512, 100); - self::imgToDataURI($file . '-32.jpg', $file . '-32'); - self::imgToDataURI($file . '-64.jpg', $file . '-64'); - self::imgToDataURI($file . '-128.jpg', $file . '-128'); - self::imgToDataURI($file . '-256.jpg', $file . '-256'); - } else { - Logging::error("The file $file does not exist"); - } } else { $get_img = ''; } @@ -231,20 +219,8 @@ class FileDataHelper { } else { $ext = 'jpg'; } + self::resizeGroup($rfile, $ext); - if (file_exists($rfile)) { - self::resizeImage($rfile, $rfile . '-32.jpg', $ext, 32, 100); - self::resizeImage($rfile, $rfile . '-64.jpg', $ext, 64, 100); - self::resizeImage($rfile, $rfile . '-128.jpg', $ext, 128, 100); - self::resizeImage($rfile, $rfile . '-256.jpg', $ext, 256, 100); - self::resizeImage($rfile, $rfile . '-512.jpg', $ext, 512, 100); - self::imgToDataURI($rfile . '-32.jpg', $rfile . '-32'); - self::imgToDataURI($rfile . '-64.jpg', $rfile . '-64'); - self::imgToDataURI($rfile . '-128.jpg', $rfile . '-128'); - self::imgToDataURI($rfile . '-256.jpg', $rfile . '-256'); - } else { - Logging::error("The file $rfile does not exist"); - } } else { $get_img = ""; } @@ -296,24 +272,34 @@ class FileDataHelper { } else { $ext = 'jpg'; } - - if (file_exists($rfile)) { - self::resizeImage($rfile, $rfile . '-32.jpg', $ext, 32, 100); - self::resizeImage($rfile, $rfile . '-64.jpg', $ext, 64, 100); - self::resizeImage($rfile, $rfile . '-128.jpg', $ext, 128, 100); - self::resizeImage($rfile, $rfile . '-256.jpg', $ext, 256, 100); - self::resizeImage($rfile, $rfile . '-512.jpg', $ext, 512, 100); - self::imgToDataURI($rfile . '-32.jpg', $rfile . '-32'); - self::imgToDataURI($rfile . '-64.jpg', $rfile . '-64'); - self::imgToDataURI($rfile . '-128.jpg', $rfile . '-128'); - self::imgToDataURI($rfile . '-256.jpg', $rfile . '-256'); - } else { - Logging::error("The file $rfile does not exist"); - } + self::resizeGroup($rfile, $ext); return $get_img; } + /** + * Resize artwork group + * + * @param string $file + * @param string $ext + */ + public static function resizeGroup($file, $ext) + { + if (file_exists($file)) { + self::resizeImage($file, $file . '-32.jpg', $ext, 32, 100); + self::resizeImage($file, $file . '-64.jpg', $ext, 64, 100); + self::resizeImage($file, $file . '-128.jpg', $ext, 128, 100); + self::resizeImage($file, $file . '-256.jpg', $ext, 256, 100); + self::resizeImage($file, $file . '-512.jpg', $ext, 512, 100); + self::imgToDataURI($file . '-32.jpg', $file . '-32'); + self::imgToDataURI($file . '-64.jpg', $file . '-64'); + self::imgToDataURI($file . '-128.jpg', $file . '-128'); + self::imgToDataURI($file . '-256.jpg', $file . '-256'); + } else { + Logging::error("The file $file does not exist"); + } + } + /** * Render image * Used in API to render JPEG diff --git a/airtime_mvc/public/css/styles.css b/airtime_mvc/public/css/styles.css index ae9af550a..087bb5ba9 100644 --- a/airtime_mvc/public/css/styles.css +++ b/airtime_mvc/public/css/styles.css @@ -4345,33 +4345,3 @@ body.droppable .artwork-upload .artwork-preview { border: 2px dashed lightblue; z-index: 9999; } -.profile { - width: 50%; -} -.profile-avatar-wrap { - width: 33.33%; - float: left; - margin: 0 20px 5px 0; - position: relative; - pointer-events: none; - border: 5px solid transparent; -} -.profile-avatar-wrap:after { - content: ""; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.profile-avatar-wrap img { - width: 100%; - display: block; -} -.location { - text-transform: uppercase; - color: #999; - letter-spacing: 1px; - margin: 0 0 10px 0; - font-size: 90%; -} From 2bb09763000f2b7818de4a212816e99efaab5bc8 Mon Sep 17 00:00:00 2001 From: Codenift Date: Tue, 29 Oct 2019 23:50:01 -0400 Subject: [PATCH 03/11] Added remove artwork option, and a few changes. --- .../application/common/FileDataHelper.php | 83 ++++++++++++------ .../controllers/LibraryController.php | 17 ++-- airtime_mvc/application/forms/EditAudioMD.php | 19 ++-- .../views/scripts/library/edit-file-md.phtml | 3 + airtime_mvc/public/css/images/no-cover.jpg | Bin 70633 -> 67564 bytes .../public/js/airtime/library/library.js | 23 ++++- 6 files changed, 106 insertions(+), 39 deletions(-) diff --git a/airtime_mvc/application/common/FileDataHelper.php b/airtime_mvc/application/common/FileDataHelper.php index 3db19b116..d9e8b638a 100644 --- a/airtime_mvc/application/common/FileDataHelper.php +++ b/airtime_mvc/application/common/FileDataHelper.php @@ -235,7 +235,7 @@ class FileDataHelper { * * @return string Path to artwork */ - public static function uploadArtwork($trackid, $data) + public static function setArtwork($trackid, $data) { $file = Application_Model_StoredFile::RecallById($trackid); $md = $file->getMetadata(); @@ -246,37 +246,70 @@ class FileDataHelper { $dbAudioPath = $md["MDATA_KEY_FILEPATH"]; $fullpath = $fp . $dbAudioPath; - $base64 = @$data; - $mime = explode(';', $base64)[0]; + if ($data == "0") { - $audioPath = dirname($fullpath); - $dbPath = dirname($dbAudioPath); - $path_parts = pathinfo($fullpath); - $file = $path_parts['filename']; + $get_img = ""; + self::removeArtwork($trackid, $data); - //Save Data URI - if (file_put_contents($audioPath . "/" . $file, $base64)) { - $get_img = $dbPath . "/" . $file; } else { - Logging::error("Could not save Data URI"); + + $base64 = @$data; + $mime = explode(';', $base64)[0]; + + $audioPath = dirname($fullpath); + $dbPath = dirname($dbAudioPath); + $path_parts = pathinfo($fullpath); + $file = $path_parts['filename']; + + //Save Data URI + if (file_put_contents($audioPath . "/" . $file, $base64)) { + $get_img = $dbPath . "/" . $file; + } else { + Logging::error("Could not save Data URI"); + } + + $rfile = $audioPath . "/" . $file; + + if ($mime == "data:image/png") { + $ext = 'png'; + } elseif ($mime == "data:image/gif") { + $ext = 'gif'; + } elseif ($mime == "data:image/bmp") { + $ext = 'bmp'; + } else { + $ext = 'jpg'; + } + self::resizeGroup($rfile, $ext); + } - - $rfile = $audioPath . "/" . $file; - - if ($mime == "data:image/png") { - $ext = 'png'; - } elseif ($mime == "data:image/gif") { - $ext = 'gif'; - } elseif ($mime == "data:image/bmp") { - $ext = 'bmp'; - } else { - $ext = 'jpg'; - } - self::resizeGroup($rfile, $ext); - return $get_img; } + /** + * + * Deletes just the artwork + */ + public static function removeArtwork($trackid) + { + $file = Application_Model_StoredFile::RecallById($trackid); + $md = $file->getMetadata(); + + $storDir = Application_Model_MusicDir::getStorDir(); + $fp = $storDir->getDirectory(); + + $dbAudioPath = $md["MDATA_KEY_ARTWORK"]; + $fullpath = $fp . $dbAudioPath; + + if (file_exists($fullpath)) { + foreach (glob("$fullpath*", GLOB_NOSORT) as $filename) { + unlink($filename); + } + } else { + throw new Exception("Could not locate file ".$filepath); + } + return ""; + } + /** * Resize artwork group * diff --git a/airtime_mvc/application/controllers/LibraryController.php b/airtime_mvc/application/controllers/LibraryController.php index 8033555df..7b41603f7 100644 --- a/airtime_mvc/application/controllers/LibraryController.php +++ b/airtime_mvc/application/controllers/LibraryController.php @@ -395,17 +395,20 @@ class LibraryController extends Zend_Controller_Action //on edit, if no artwork is set and audiofile has image, automatically add it if ($j["name"] == "artwork") { if ($j["value"] == null || $j["value"] == ''){ - $serialized["artwork"] = FileDataHelper::resetArtwork($file_id); + $serialized["artwork"] = FileDataHelper::resetArtwork($file_id); + } + } elseif ($j["name"] == "set_artwork") { + if ($j["value"] != null || $j["value"] != ''){ + $serialized["artwork"] = FileDataHelper::setArtwork($file_id, $j["value"] ); + } + } elseif ($j["name"] == "remove_artwork") { + if ($j["value"] == 1){ + $remove_artwork = true; + $serialized["artwork"] = FileDataHelper::removeArtwork($file_id); } } else { $serialized[$j["name"]] = $j["value"]; } - - if ($j["name"] == "artwork_uploaded") { - if ($j["value"] != null || $j["value"] != ''){ - $serialized["artwork"] = FileDataHelper::uploadArtwork($file_id, $j["value"] ); - } - } } // Sanitize any wildly incorrect metadata before it goes to be validated. diff --git a/airtime_mvc/application/forms/EditAudioMD.php b/airtime_mvc/application/forms/EditAudioMD.php index 8b7f40754..dda96aa5c 100644 --- a/airtime_mvc/application/forms/EditAudioMD.php +++ b/airtime_mvc/application/forms/EditAudioMD.php @@ -20,6 +20,7 @@ class Application_Form_EditAudioMD extends Zend_Form // Add artwork hidden field $artwork = new Zend_Form_Element_Hidden('artwork'); + $artwork->class = 'input_text artwork_'. $p_id; $artwork->setFilters(array('StringTrim')) ->setValidators(array( new Zend_Validate_StringLength(array('max' => 2048)) @@ -29,13 +30,21 @@ class Application_Form_EditAudioMD extends Zend_Form $file_id->setAttrib('class', 'artwork'); $this->addElement($artwork); - // Add artwork uploaded hidden field - $artwork_uploaded = new Zend_Form_Element_Hidden('artwork_uploaded'); - $artwork_uploaded->class = 'input_text artwork_uploaded_'. $p_id; + // Set artwork hidden field + $set_artwork = new Zend_Form_Element_Hidden('set_artwork'); + $set_artwork->class = 'input_text set_artwork_'. $p_id; $file_id->addDecorator('HtmlTag', array('tag' => 'div', 'style' => 'display:none')); $file_id->removeDecorator('Label'); - $file_id->setAttrib('class', 'artwork_uploaded'); - $this->addElement($artwork_uploaded); + $file_id->setAttrib('class', 'set_artwork'); + $this->addElement($set_artwork); + + // Remove artwork hidden field + $remove_artwork = new Zend_Form_Element_Hidden('remove_artwork'); + $remove_artwork->class = 'input_text remove_artwork_'. $p_id; + $file_id->addDecorator('HtmlTag', array('tag' => 'div', 'style' => 'display:none')); + $file_id->removeDecorator('Label'); + $file_id->setAttrib('class', 'remove_artwork'); + $this->addElement($remove_artwork); // Add title field $track_title = new Zend_Form_Element_Text('track_title'); diff --git a/airtime_mvc/application/views/scripts/library/edit-file-md.phtml b/airtime_mvc/application/views/scripts/library/edit-file-md.phtml index 03e919d66..c216987ae 100644 --- a/airtime_mvc/application/views/scripts/library/edit-file-md.phtml +++ b/airtime_mvc/application/views/scripts/library/edit-file-md.phtml @@ -29,6 +29,9 @@ +
+ Remove +
diff --git a/airtime_mvc/public/css/images/no-cover.jpg b/airtime_mvc/public/css/images/no-cover.jpg index cd38cfc0d3b73cdbeee4cb1c0fdfc338a7254098..bd4f12cf8be95ad9a7fb9769be82a65ad7826ca9 100644 GIT binary patch literal 67564 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 literal 70633 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 diff --git a/airtime_mvc/public/js/airtime/library/library.js b/airtime_mvc/public/js/airtime/library/library.js index 14a1594e7..d4a28373d 100644 --- a/airtime_mvc/public/js/airtime/library/library.js +++ b/airtime_mvc/public/js/airtime/library/library.js @@ -1609,7 +1609,7 @@ function readArtworkURL(input, id) { $('.artwork-preview-'+id).css('background-image', 'url('+e.target.result +')'); $('.artwork-preview-'+id).hide(); $('.artwork-preview-'+id).fadeIn(500); - $('.artwork_uploaded_'+id).val(function() { + $('.set_artwork_'+id).val(function() { return e.target.result; }); } @@ -1678,6 +1678,25 @@ $(document).ready(function() { resizeAdvancedSearch(); }); + // delete artwork + $(document).on('click', '.delete-artwork', function(event) { + event.preventDefault(); + event.stopPropagation(); + var id = $(this).attr('data-id'); + $('.artwork-preview-'+id).css('background-image', 'url('+ baseUrl +'css/images/no-cover.jpg)'); + $('.artwork-preview-'+id).hide(); + $('.artwork-preview-'+id).fadeIn(500); + $('.artwork_'+id).val(function() { + return ""; + }); + $('.set_artwork_'+id).val(function() { + return ""; + }); + $('.remove_artwork_'+id).val(function() { + return 1; + }); + }); + // image upload by clicking on the artwork container $(document).on('change', '.artworkUpload', 'input', function(event) { event.preventDefault(); @@ -1760,7 +1779,7 @@ $(document).ready(function() { $('.artwork-preview-'+id).css('background-image', 'url('+ data +')'); $('.artwork-preview-'+id).hide(); $('.artwork-preview-'+id).fadeIn(500); - $('.artwork_uploaded_'+id).val(function() { + $('.set_artwork_'+id).val(function() { return data; }); } From 03c3cb02d8488ad424b748d472a065dee6149376 Mon Sep 17 00:00:00 2001 From: Roberto Soto Date: Fri, 1 Nov 2019 20:18:11 -0700 Subject: [PATCH 04/11] raising the exception might kill pypopush thread this is apparently the reason why schedules don't get pushed after a silence producing desynchronization between the mvc and liquidsoap and cannot catch up until pypofetch times out. (ON AIR turns off and there's a mess until the schedule is fetched. sometimes it even continues playing the wrong tune) ((logging inside the while True loop produces no output, probably it is locked on the queue?)) --- python_apps/pypo/pypo/pypopush.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python_apps/pypo/pypo/pypopush.py b/python_apps/pypo/pypo/pypopush.py index e9b809473..5427c6112 100644 --- a/python_apps/pypo/pypo/pypopush.py +++ b/python_apps/pypo/pypo/pypopush.py @@ -69,7 +69,6 @@ class PypoPush(Thread): media_schedule = self.queue.get(block=True) except Exception, e: self.logger.error(str(e)) - raise else: self.logger.debug(media_schedule) #separate media_schedule list into currently_playing and From cdf9f6f98e058dc6c62b089f0541d8de29101a69 Mon Sep 17 00:00:00 2001 From: Roberto Soto Date: Sat, 2 Nov 2019 17:48:32 -0700 Subject: [PATCH 05/11] PypoMessageHandlers using a kombu Consumer solves MVC/Liquidsoap synchronization issues: The real error was PypoMessageHandler wasn't consuming messages from RabbitMQ, thus schedules were only updated on PypoFetch time out. Proably queue is in a stale state because it didn't recover from a broken connection. The issue is a SimpleQueue was being used, which's 'python-like' *get* method apparently doesn't handle recovery. Consumers are the way to go instead. --- python_apps/pypo/pypo/pypomessagehandler.py | 42 ++++++++++++--------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/python_apps/pypo/pypo/pypomessagehandler.py b/python_apps/pypo/pypo/pypomessagehandler.py index 61caab976..04b1a6a75 100644 --- a/python_apps/pypo/pypo/pypomessagehandler.py +++ b/python_apps/pypo/pypo/pypomessagehandler.py @@ -7,15 +7,32 @@ import sys from threading import Thread import time # For RabbitMQ -from kombu.connection import BrokerConnection +from kombu.connection import Connection from kombu.messaging import Exchange, Queue from kombu.simple import SimpleQueue from amqp.exceptions import AMQPError import json +from kombu.mixins import ConsumerMixin + logging.captureWarnings(True) +class RabbitConsumer(ConsumerMixin): + def __init__(self, connection, queues, handler): + self.connection = connection + self.queues = queues + self.handler = handler + + def get_consumers(self, Consumer, channel): + return [ + Consumer(self.queues, callbacks=[self.on_message], accept=['text/plain']), + ] + + def on_message(self, body, message): + self.handler.handle_message(message.payload) + message.ack() + class PypoMessageHandler(Thread): def __init__(self, pq, rq, config): Thread.__init__(self) @@ -26,22 +43,18 @@ class PypoMessageHandler(Thread): def init_rabbit_mq(self): self.logger.info("Initializing RabbitMQ stuff") - simple_queue = None try: schedule_exchange = Exchange("airtime-pypo", "direct", durable=True, auto_delete=True) schedule_queue = Queue("pypo-fetch", exchange=schedule_exchange, key="foo") - connection = BrokerConnection(self.config["host"], - self.config["user"], - self.config["password"], - self.config["vhost"]) - - channel = connection.channel() - simple_queue = SimpleQueue(channel, schedule_queue) + with Connection(self.config["host"], \ + self.config["user"], \ + self.config["password"],\ + self.config["vhost"]) as connection: + rabbit = RabbitConsumer(connection, [schedule_queue], self) + rabbit.run() except Exception, e: self.logger.error(e) - return simple_queue - """ Handle a message from RabbitMQ, put it into our yucky global var. Hopefully there is a better way to do this. @@ -89,12 +102,7 @@ class PypoMessageHandler(Thread): def main(self): try: - with self.init_rabbit_mq() as queue: - while True: - message = queue.get(block=True) - self.handle_message(message.payload) - # ACK the message to take it off the queue - message.ack() + self.init_rabbit_mq() except Exception, e: self.logger.error('Exception: %s', e) self.logger.error("traceback: %s", traceback.format_exc()) From 5b3c0cb1c8ad7a9f41ecfc46df9e2bb9dd66fb28 Mon Sep 17 00:00:00 2001 From: Roberto Soto Date: Sat, 2 Nov 2019 17:56:54 -0700 Subject: [PATCH 06/11] Revert "raising the exception might kill pypopush thread" This reverts commit 2afe01b3ddc94194101a4a2149116e27e0e115e5. --- python_apps/pypo/pypo/pypopush.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python_apps/pypo/pypo/pypopush.py b/python_apps/pypo/pypo/pypopush.py index 5427c6112..e9b809473 100644 --- a/python_apps/pypo/pypo/pypopush.py +++ b/python_apps/pypo/pypo/pypopush.py @@ -69,6 +69,7 @@ class PypoPush(Thread): media_schedule = self.queue.get(block=True) except Exception, e: self.logger.error(str(e)) + raise else: self.logger.debug(media_schedule) #separate media_schedule list into currently_playing and From 8a0f4740753e1e3efd6e7150e627d537531acd79 Mon Sep 17 00:00:00 2001 From: Roberto Soto Date: Sat, 2 Nov 2019 20:00:43 -0700 Subject: [PATCH 07/11] use AMQP heartbeat feature --- python_apps/pypo/pypo/pypomessagehandler.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/python_apps/pypo/pypo/pypomessagehandler.py b/python_apps/pypo/pypo/pypomessagehandler.py index 04b1a6a75..5582be086 100644 --- a/python_apps/pypo/pypo/pypomessagehandler.py +++ b/python_apps/pypo/pypo/pypomessagehandler.py @@ -48,8 +48,9 @@ class PypoMessageHandler(Thread): schedule_queue = Queue("pypo-fetch", exchange=schedule_exchange, key="foo") with Connection(self.config["host"], \ self.config["user"], \ - self.config["password"],\ - self.config["vhost"]) as connection: + self.config["password"], \ + self.config["vhost"], \ + hearbeat = 4) as connection: rabbit = RabbitConsumer(connection, [schedule_queue], self) rabbit.run() except Exception, e: From bf7659dfa0be5da9bc2f7b3768034f3a7f30b6f2 Mon Sep 17 00:00:00 2001 From: Roberto Soto Date: Mon, 4 Nov 2019 13:05:07 -0800 Subject: [PATCH 08/11] fix heartbeat spelling --- python_apps/pypo/pypo/pypomessagehandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python_apps/pypo/pypo/pypomessagehandler.py b/python_apps/pypo/pypo/pypomessagehandler.py index 5582be086..6e31d2f70 100644 --- a/python_apps/pypo/pypo/pypomessagehandler.py +++ b/python_apps/pypo/pypo/pypomessagehandler.py @@ -50,7 +50,7 @@ class PypoMessageHandler(Thread): self.config["user"], \ self.config["password"], \ self.config["vhost"], \ - hearbeat = 4) as connection: + heartbeat = 5) as connection: rabbit = RabbitConsumer(connection, [schedule_queue], self) rabbit.run() except Exception, e: From 7e19a28caf65ddba908dcdd1c5232e45aa139878 Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Wed, 6 Nov 2019 13:27:13 +0200 Subject: [PATCH 09/11] Expand out currentShowID conditional Fixes: #875 --- airtime_mvc/application/models/Schedule.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airtime_mvc/application/models/Schedule.php b/airtime_mvc/application/models/Schedule.php index 333dbfb4b..3a1be171c 100644 --- a/airtime_mvc/application/models/Schedule.php +++ b/airtime_mvc/application/models/Schedule.php @@ -104,7 +104,10 @@ SQL; $utcNow = new DateTime("now", new DateTimeZone("UTC")); $shows = Application_Model_Show::getPrevCurrentNext($utcNow, $utcTimeEnd, $showsToRetrieve); - $currentShowID = (is_array($shows['currentShow'] && count($shows['currentShow'])>0))?$shows['currentShow']['instance_id']:null; + $currentShowID = null; + if (is_array($shows['currentShow']) && count($shows['currentShow'])>0) { + $currentShowID = $shows['currentShow']['instance_id']; + } $source = self::_getSource(); $results = Application_Model_Schedule::getPreviousCurrentNextMedia($utcNow, $currentShowID, self::_getSource()); From b447d6016f41aa92078176536c8fe4b39723710d Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Wed, 6 Nov 2019 13:55:38 +0200 Subject: [PATCH 10/11] Document .deb install option Fixes: #132 --- docs/install.md | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/docs/install.md b/docs/install.md index 494bebe56..201334b6d 100644 --- a/docs/install.md +++ b/docs/install.md @@ -1,15 +1,18 @@ # Installing LibreTime +There two methods of installing LibreTime - [Source](#source) or +[Ubuntu package](#ubuntu-package). +## Source LibreTime releases can be downloaded [here](https://github.com/LibreTime/libretime/releases). Recommendations: -- LibreTime should generally be installed on a dedicated host running Ubuntu 16.04 LTS (Xenial Xerus). -- LibreTime is undergoing active development, and is currently in ALPHA. -- It is not recommended that you install LibreTime on the same computer you are using as a desktop. +- LibreTime should generally be installed on a dedicated host running Ubuntu 16.04 LTS (Xenial Xerus). +- LibreTime is undergoing active development, and is currently in ALPHA. +- It is not recommended that you install LibreTime on the same computer you are using as a desktop. - Please review the release notes of the version you are planning on installing. -Once you have downloaded and extracted LibreTime, run the installation script by navigating into the +Once you have downloaded and extracted LibreTime, run the installation script by navigating into the folder containing the LibreTime codebase, and run it's install script from the command line: ``` @@ -18,12 +21,27 @@ sudo ./install By default, the installer will install and configure all dependencies. +## Ubuntu Package +LibreTime maintains amd64 .deb packages for Ubuntu 16.04 (Xenial) and 18.04 +(Bionic). These can be downloaded [here](https://github.com/LibreTime/libretime-debian-packaging/releases). +Issues with installation of these packages should be reported to the +[LibretTime/libretime-debian-packaging](https://github.com/LibreTime/libretime-debian-packaging) +repository. + +These are installed by running the following from the command line (the `./` in +front of the libretime package is important): + +``` +sudo apt install icecast2 ./libretime__amd64.deb +``` +`` is replaced by the version of the package downloaded. + ## Alternative OS installations -Installation in Debian 9 and other Linux distributions is possible, but multiple outstanding issues have yet -to be resolved. Installation on Ubuntu 14.04.5 LTS (Trusty Tahr) is also working, but deprecated due to the +Installation in Debian 9 and other Linux distributions is possible, but these +are less tested. Installation on Ubuntu 14.04.5 LTS (Trusty Tahr) is also working, but deprecated due to the fact that this version will reach its official end of life in April 2019. -Plans are in the works for `.deb` and `.rpm` packages, as well as Docker and AWS images. +Plans are in the works for `.rpm` packages, as well as Docker and AWS images. Please note that the install script does not take care to ensure that any packages installed are set up in a secure manner. Please see the chapter on From a572f275fc8a5132cd6d6dcbe72c46d7cbb6381c Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Wed, 6 Nov 2019 14:08:13 +0200 Subject: [PATCH 11/11] Update stream URLs to use LibreTime --- airtime_mvc/build/sql/defaultdata.sql | 4 ++-- python_apps/pypo/liquidsoap/liquidsoap.cfg | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/airtime_mvc/build/sql/defaultdata.sql b/airtime_mvc/build/sql/defaultdata.sql index 7712e23f2..cd976b11f 100644 --- a/airtime_mvc/build/sql/defaultdata.sql +++ b/airtime_mvc/build/sql/defaultdata.sql @@ -35,7 +35,7 @@ INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_pass', 'h INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_admin_user', '', 'string'); INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_admin_pass', '', 'string'); INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_mount', 'airtime_128', 'string'); -INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_url', 'http://airtime.sourcefabric.org', 'string'); +INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_url', 'https://libretime.org', 'string'); INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_description', 'LibreTime Radio! Stream #1', 'string'); INSERT INTO cc_stream_setting ("keyname", "value", "type") VALUES ('s1_genre', 'genre', 'string'); @@ -392,4 +392,4 @@ INSERT INTO cc_pref("keystr", "valstr") VALUES('whats_new_dialog_viewed', 1); --added for LibreTime to turn on podcast album override by default 3.0.0.alpha6 INSERT INTO cc_pref("keystr", "valstr") VALUES('podcast_album_override', 1); INSERT INTO cc_pref("keystr", "valstr") VALUES('podcast_auto_smartblock', 0); --- end \ No newline at end of file +-- end diff --git a/python_apps/pypo/liquidsoap/liquidsoap.cfg b/python_apps/pypo/liquidsoap/liquidsoap.cfg index bb6c6d88f..ae4bbd203 100644 --- a/python_apps/pypo/liquidsoap/liquidsoap.cfg +++ b/python_apps/pypo/liquidsoap/liquidsoap.cfg @@ -60,14 +60,14 @@ s3_mount = "airtime_160.mp3" s4_mount = "airtime_160.mp3" # Webstream metadata settings -s1_url = "http://airtime.sourcefabric.org" -s2_url = "http://airtime.sourcefabric.org" -s3_url = "http://airtime.sourcefabric.org" -s4_url = "http://airtime.sourcefabric.org" -s1_description = "Airtime Radio! Stream 1" -s2_description = "Airtime Radio! Stream 2" -s3_description = "Airtime Radio! Stream 3" -s4_description = "Airtime Radio! Stream 4" +s1_url = "https://libretime.org" +s2_url = "https://libretime.org" +s3_url = "https://libretime.org" +s4_url = "https://libretime.org" +s1_description = "LibreTime Radio! Stream 1" +s2_description = "LibreTime Radio! Stream 2" +s3_description = "LibreTime Radio! Stream 3" +s4_description = "LibreTime Radio! Stream 4" s1_genre = "genre" s2_genre = "genre" s3_genre = "genre"