From 093f7ffb9d89a661c199f28e3a8449fb6c7fb0de Mon Sep 17 00:00:00 2001
From: Peter Deltchev <peter@deltchev.com>
Date: Mon, 15 Feb 2016 12:16:04 -0800
Subject: [PATCH] Added ALAC upload support and improved the upload page.

---
 app/Commands/GenerateTrackFilesCommand.php |  1 +
 app/Commands/UploadTrackCommand.php        | 18 ++++++------------
 app/Library/PfmValidator.php               |  4 ++++
 public/templates/uploader/index.html       |  6 ++++--
 4 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/app/Commands/GenerateTrackFilesCommand.php b/app/Commands/GenerateTrackFilesCommand.php
index d345f002..8663cfe2 100644
--- a/app/Commands/GenerateTrackFilesCommand.php
+++ b/app/Commands/GenerateTrackFilesCommand.php
@@ -51,6 +51,7 @@ class GenerateTrackFilesCommand extends CommandBase
         'flac',
         'pcm',
         'adpcm',
+        'alac'
     ];
 
     public function __construct(Track $track, SplFileInfo $sourceFile, bool $autoPublish = false)
diff --git a/app/Commands/UploadTrackCommand.php b/app/Commands/UploadTrackCommand.php
index b50f0302..4e42c86a 100644
--- a/app/Commands/UploadTrackCommand.php
+++ b/app/Commands/UploadTrackCommand.php
@@ -112,8 +112,8 @@ class UploadTrackCommand extends CommandBase
             'track' =>
                 'required|'
                 . ($this->_allowLossy
-                    ? 'audio_format:flac,pcm,adpcm,aac,mp3,vorbis|'
-                    : 'audio_format:flac,pcm,adpcm|')
+                    ? 'audio_format:flac,alac,pcm,adpcm,aac,mp3,vorbis|'
+                    : 'audio_format:flac,alac,pcm,adpcm|')
                 . ($this->_allowShortTrack ? '' : 'min_duration:30|')
                 . 'audio_channels:1,2',
 
@@ -250,22 +250,16 @@ class UploadTrackCommand extends CommandBase
         // all tags read by getID3, including the cover art
         $allTags = $getId3->analyze($file->getPathname());
 
-        // tags specific to a file format (ID3 or Atom), pre-normalization but with cover art removed
-        $rawTags = [];
-
-        // normalized tags used by Pony.fm
-        $parsedTags = [];
+        // $rawTags => tags specific to a file format (ID3 or Atom), pre-normalization but with cover art removed
+        // $parsedTags => normalized tags used by Pony.fm
 
         if ($audioCodec === 'mp3') {
             list($parsedTags, $rawTags) = $this->getId3Tags($allTags);
 
-        } elseif (Str::startsWith($audioCodec, 'aac')) {
+        } elseif (Str::startsWith($audioCodec, ['aac', 'alac'])) {
             list($parsedTags, $rawTags) = $this->getAtomTags($allTags);
 
-        } elseif ($audioCodec === 'vorbis') {
-            list($parsedTags, $rawTags) = $this->getVorbisTags($allTags);
-
-        } elseif ($audioCodec === 'flac') {
+        } elseif (in_array($audioCodec, ['vorbis', 'flac'])) {
             list($parsedTags, $rawTags) = $this->getVorbisTags($allTags);
 
         } elseif (Str::startsWith($audioCodec, ['pcm', 'adpcm'])) {
diff --git a/app/Library/PfmValidator.php b/app/Library/PfmValidator.php
index ecbc5fdc..9b4ce6db 100644
--- a/app/Library/PfmValidator.php
+++ b/app/Library/PfmValidator.php
@@ -64,6 +64,10 @@ class PfmValidator extends Illuminate\Validation\Validator
             return true;
         }
 
+        if (in_array('alac', $parameters) && Str::startsWith($codecString, 'alac')) {
+            return true;
+        }
+
         return in_array($file->getAudioCodec(), $parameters);
     }
 
diff --git a/public/templates/uploader/index.html b/public/templates/uploader/index.html
index b965c87b..65fc7159 100644
--- a/public/templates/uploader/index.html
+++ b/public/templates/uploader/index.html
@@ -3,11 +3,13 @@
         <p>Drop files here to begin your upload!</p>
     </div>
 
-    <p>FLAC, WAV, and AIFF files will be accepted. Each file can be up to 200 MB in size.</p>
+    <p>Our preferred formats are FLAC, WAV, AIFF, and ALAC (because lossless audio is awesome) but we accept a few others, too. Each file can be up to 200 MB in size.</p>
 
     <p>Tracks must be a <strong>minimum</strong> of 30 seconds long.</p>
 
-    <p>Please note that you need to publish your tracks after uploading them before they will become available to the public.</p>
+    <p>Note that you&#39;ll need to publish your tracks after uploading them before they&#39;ll become available to the public.</p>
+
+    <p>Contact <a href="mailto:feld0@pony.fm">feld0@pony.fm</a> if you run into any issues!</p>
 
     <ul class="uploads">
         <li ng-repeat="upload in data.queue track by $index" ng-class="{'uploading': upload.isUploading, 'has-error': upload.error != null, 'is-processing': upload.isProcessing || upload.progress >= 100}" ng-animate="'upload-queue'">