From 5a81908ed48ed09e2fc243b6621c5ca7b7298f6e Mon Sep 17 00:00:00 2001
From: Kelvin Zhang <me@iamkelv.in>
Date: Thu, 29 Oct 2015 16:00:16 +0000
Subject: [PATCH] Add file size rebuilding command

---
 app/Console/Commands/RebuildFilesize.php   | 77 ++++++++++++++++++++++
 app/Console/Commands/RebuildTrackCache.php |  5 +-
 app/Console/Kernel.php                     |  1 +
 3 files changed, 82 insertions(+), 1 deletion(-)
 create mode 100644 app/Console/Commands/RebuildFilesize.php

diff --git a/app/Console/Commands/RebuildFilesize.php b/app/Console/Commands/RebuildFilesize.php
new file mode 100644
index 00000000..a5d66cc9
--- /dev/null
+++ b/app/Console/Commands/RebuildFilesize.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Poniverse\Ponyfm\Console\Commands;
+
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\File;
+use Poniverse\Ponyfm\TrackFile;
+
+class RebuildFilesize extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'filesize:rebuild
+                            {--force : Skip all prompts.}';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Rebuilds the filesize cache for each track file which currently exists on disk.';
+
+    /**
+     * Create a new command instance.
+     *
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return mixed
+     */
+    public function handle()
+    {
+        $this->info('This will only rebuild the cache for track files which exist on disk; non-existent files will be skipped.');
+
+        if ($this->option('force') || $this->confirm('Are you sure you want to rebuild the filesize cache? [y|N]',
+                false)
+        ) {
+
+            TrackFile::chunk(200, function ($trackFiles) {
+
+                $this->info('========== Start Chunk ==========');
+
+                foreach ($trackFiles as $trackFile) {
+                    $file = $trackFile->getFile();
+
+                    if (File::exists($file)) {
+                        $size = File::size($file);
+                        $this->info('ID ' . $trackFile->id . ' processed - ' . $size . ' bytes');
+                    } else {
+                        $size = null;
+                        $this->info('ID ' . $trackFile->id . ' skipped');
+                    }
+
+                    $trackFile->filesize = $size;
+                    $trackFile->update();
+                }
+
+                $this->info('=========== End Chunk ===========');
+
+            });
+
+            $this->info('Rebuild complete. Exiting.');
+
+        } else {
+            $this->info('Rebuild cancelled. Exiting.');
+        }
+    }
+}
diff --git a/app/Console/Commands/RebuildTrackCache.php b/app/Console/Commands/RebuildTrackCache.php
index ef5d5582..1dae63ce 100644
--- a/app/Console/Commands/RebuildTrackCache.php
+++ b/app/Console/Commands/RebuildTrackCache.php
@@ -64,6 +64,9 @@ class RebuildTrackCache extends Command
     public function handle()
     {
         $this->info('This will run \'php artisan down\' if you proceed and \'php artisan up\' when complete.');
+        $this->info('***');
+        $this->info('If this is your first time running this command, it is *highly* recommended that you run `php artisan filesize:rebuild` to cache file sizes for all files before they are deleted.');
+        $this->info('***');
 
         if ($this->option('force') || $this->confirm('Are you sure you want to delete all to-be-cached files and encode missing non-cached files? [y|N]',
                 false)
@@ -201,7 +204,7 @@ class RebuildTrackCache extends Command
             }
 
             // Encode recorded files
-            foreach($emptyTrackFiles as $emptyTrackFile) {
+            foreach ($emptyTrackFiles as $emptyTrackFile) {
                 $this->dispatch(new EncodeTrackFile($emptyTrackFile, false));
             }
 
diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php
index 6f76ff2b..9a7c58e2 100644
--- a/app/Console/Kernel.php
+++ b/app/Console/Kernel.php
@@ -41,6 +41,7 @@ class Kernel extends ConsoleKernel
         \Poniverse\Ponyfm\Console\Commands\PoniverseApiSetup::class,
         \Poniverse\Ponyfm\Console\Commands\ClearTrackCache::class,
         \Poniverse\Ponyfm\Console\Commands\RebuildTrackCache::class,
+        \Poniverse\Ponyfm\Console\Commands\RebuildFilesize::class,
     ];
 
     /**