Browse Source

file-based catalog builder. more localization.

SCAD 5 years ago
parent
commit
d5298f0358

+ 10 - 0
.idea/composerJson.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ComposerJsonPluginSettings">
+    <unboundedVersionInspectionSettings>
+      <excludedPackages />
+    </unboundedVersionInspectionSettings>
+    <customRepositories />
+    <composerUpdateOptions />
+  </component>
+</project>

+ 65 - 10
app/Http/Controllers/MusicController.php

@@ -4,6 +4,8 @@ namespace App\Http\Controllers;
 
 use App\Music;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
 
 class MusicController extends Controller
 {
@@ -16,22 +18,75 @@ class MusicController extends Controller
     {
         // list all songs
         $songs = Music::all();
-        return view('home', ['song_list'=>$songs]);
+        return view('home', ['song_list' => $songs]);
     }
 
-    public function playlog(Music $music){
+    public function playLog(Music $music)
+    {
         // add one to played log
         $music->played += 1;
         $music->save();
         return $music->played;
     }
-    public function dwlog(Music $music){
+
+    public function dwLog(Music $music)
+    {
         // add one to download log
         $music->downloads += 1;
         $music->save();
         return $music->downloads;
     }
-    public function null(Music $music){
+
+    public function fileRefresh()
+    {
+
+        // Scan for files
+        $fIndex = array();
+        $files = Storage::disk('local')->listContents('public/audio', true);
+        //return $files;
+
+        // Update storage index
+        $songs = Music::all();
+        foreach ($files as $f) {
+            $fix_path = Str::replaceFirst('public/', 'storage/', $f['path']);
+            // add NEW files to DB
+            if (!Music::where('file_name', $fix_path)->first()) {
+                $melody = new Music();
+                $melody->title = $f['filename'];
+                $melody->description = $f['filename'];
+                $melody->played = 0;
+                $melody->downloads = 0;
+                $melody->hidden = 0; // visible
+                $melody->file_name = $fix_path;
+
+                if ($f['type'] == 'dir') {
+                    $melody->type = 'dir';
+                } elseif ($f['type'] == 'file') {
+                    if ($f['extension'] == 'txt') {
+                        $melody->type = 'txt';
+                        $melody->description = Storage::disk('local')->read($f['path']);
+                    } else {
+                        $melody->type = $f['extension'];
+                    }
+                }
+
+                $melody->save();
+            }
+            $fIndex[] = $fix_path;
+        }
+        // Clean DB of OLD files
+        $musicdB = Music::all();
+        foreach ($musicdB as $song) {
+            if (!in_array($song->file_name, $fIndex)) {
+                $song->delete();
+            }
+        }
+
+        return $files;
+    }
+
+    public function null(Music $music)
+    {
         return null;
     }
 
@@ -48,7 +103,7 @@ class MusicController extends Controller
     /**
      * Store a newly created resource in storage.
      *
-     * @param  \Illuminate\Http\Request  $request
+     * @param \Illuminate\Http\Request $request
      * @return \Illuminate\Http\Response
      */
     public function store(Request $request)
@@ -59,7 +114,7 @@ class MusicController extends Controller
     /**
      * Display the specified resource.
      *
-     * @param  \App\Music  $music
+     * @param \App\Music $music
      * @return \Illuminate\Http\Response
      */
     public function show(Music $music)
@@ -70,7 +125,7 @@ class MusicController extends Controller
     /**
      * Show the form for editing the specified resource.
      *
-     * @param  \App\Music  $music
+     * @param \App\Music $music
      * @return \Illuminate\Http\Response
      */
     public function edit(Music $music)
@@ -81,8 +136,8 @@ class MusicController extends Controller
     /**
      * Update the specified resource in storage.
      *
-     * @param  \Illuminate\Http\Request  $request
-     * @param  \App\Music  $music
+     * @param \Illuminate\Http\Request $request
+     * @param \App\Music $music
      * @return \Illuminate\Http\Response
      */
     public function update(Request $request, Music $music)
@@ -93,7 +148,7 @@ class MusicController extends Controller
     /**
      * Remove the specified resource from storage.
      *
-     * @param  \App\Music  $music
+     * @param \App\Music $music
      * @return \Illuminate\Http\Response
      */
     public function destroy(Music $music)

+ 14 - 0
config/filesystems.php

@@ -65,6 +65,20 @@ return [
             'endpoint' => env('AWS_ENDPOINT'),
         ],
 
+        'ftp' => [
+            'driver' => 'ftp',
+            'host' => 'ftp.example.com',
+            'username' => 'your-username',
+            'password' => 'your-password',
+
+            // Optional FTP Settings...
+            // 'port' => 21,
+            // 'root' => '',
+            // 'passive' => true,
+            // 'ssl' => true,
+            // 'timeout' => 30,
+        ],
+
     ],
 
     /*

+ 2 - 1
database/factories/MusicFactory.php

@@ -12,6 +12,7 @@ $factory->define(Music::class, function (Faker $faker) {
         'played' => $faker->randomDigit(),
         'downloads' => $faker->randomDigit(),
         'hidden' => false,
-        'file_name' => $faker->imageUrl()
+        'file_name' => $faker->randomElement(['public/audio/album/audio.mp3','public/audio/songs/sample.mp3']),
+        'type' => $faker->randomElement(['dir','txt','mp3']),
     ];
 });

+ 6 - 2
database/migrations/2014_10_12_000000_create_users_table.php

@@ -16,8 +16,6 @@ class CreateUsersTable extends Migration
         Schema::create('users', function (Blueprint $table) {
             $table->id();
             $table->string('name');
-            $table->string('surname')->default('');
-            $table->string('by_father')->default('');
             $table->bigInteger('role')->default(0);
             $table->string('email')->unique();
             $table->timestamp('email_verified_at')->nullable();
@@ -25,6 +23,12 @@ class CreateUsersTable extends Migration
             $table->rememberToken();
             $table->timestamps();
         });
+
+        DB::table('users')->insert([
+            'name' => 'admin',
+            'email' => 'admin@example.com',
+            'password' => '12345678'
+        ]);
     }
 
     /**

+ 1 - 0
database/migrations/2020_04_10_175800_create_musics_table.php

@@ -21,6 +21,7 @@ class CreateMusicsTable extends Migration
             $table->integer('downloads');
             $table->boolean('hidden');
             $table->string('file_name');
+            $table->string('type');
             $table->timestamps();
         });
     }

BIN
public/audio/audio.mp3


+ 17 - 4
public/js/myScript.js

@@ -3,7 +3,7 @@ $(document).ready(function () {
 
     // --------------------------------------
     // Async data loading
-     function asyncSend(tUri, sObj){
+     function asyncSend(tUri, sObj, isTextRes){
          var res = -1;
          $.ajax({
              method: "GET",
@@ -11,7 +11,13 @@ $(document).ready(function () {
              data: {},
              dataType: "html",
          }).done(function (data) {
-             sObj.innerText = data;
+             if(isTextRes) {
+                 sObj.innerText = data;
+             } else {
+                 console.log(data);
+                 $('#fScan').removeClass('disabled');
+                 window.location = panelRoute;
+             }
              //console.log(data);
          }).fail(function (jqXHR, textStatus) {
             console.error(textStatus);
@@ -19,6 +25,12 @@ $(document).ready(function () {
          return res;
      }
 
+     // other buttons
+    $('#fScan').click(function () {
+        $(this).addClass('disabled');
+        asyncSend(scanRoute, null, false);
+    });
+
      // --------------------------------------
      // My Player logic
     function btnIconSwitch(obj, dir) {
@@ -46,7 +58,7 @@ $(document).ready(function () {
                 btnIconSwitch(btn, true);
                 // Play event
                 var myRoute = this.getAttribute('route');
-                var asRes = asyncSend(myRoute, playBadge);
+                var asRes = asyncSend(myRoute, playBadge, true);
             } else {
                 audio.pause();
                 btnIconSwitch(btn, false);
@@ -60,7 +72,8 @@ $(document).ready(function () {
             var audioID = this.getAttribute('audio_id');
             var dwBadge = document.getElementById('dw_num_' + audioID)
             var myRoute = this.getAttribute('route');
-            asyncSend(myRoute, dwBadge); // download event
+            asyncSend(myRoute, dwBadge, true); // download event
         }
     }
+
 });

+ 9 - 4
resources/lang/en/ui.php

@@ -2,14 +2,19 @@
 
 return[
     'h1_title' => 'Znamen Archive',
-  'login' => 'Login',
-  'register' => 'Register',
+    'login' => 'Login',
+    'register' => 'Register',
+    'name' => 'Full Name',
+    'pwd_lb' => 'Password',
+    'pwd_lb2' => 'Confirm Password',
+    'remember' => 'Remember Me',
+    'forgot_pwd' => 'Forgot Your Password?',
     'panel' => 'Listen',
     'logout' => 'Logout',
     'tb_col1' => 'Title',
     'tb_col2' => 'Controls',
-    'tb_col3' => 'Played',
-    'tb_col4' => 'Downloaded',
+    'tb_col3' => 'Play',
+    'tb_col4' => 'Downl.',
     'rescan' => 'Rescan for audio',
     'login_req' => 'Please login, to listen audio',
     'err_play' => 'Your browser does not support the audio element.',

+ 10 - 5
resources/lang/ru/ui.php

@@ -2,14 +2,19 @@
 
 return[
     'h1_title' => 'Знаменное пение',
-  'login' => 'Войти',
-  'register' => 'Регистрация',
-    'panel' => 'Слушать',
+    'login' => 'Войти',
+    'register' => 'Регистрация',
+    'name' => 'ФИО',
+    'pwd_lb' => 'Пароль',
+    'pwd_lb2' => 'Подтвредите пароль',
+    'remember' => 'Запомнить меня',
+    'forgot_pwd' => 'Забали пароль?',
+    'panel' => 'Наш архив',
     'logout' => 'Выйти',
     'tb_col1' => 'Название',
     'tb_col2' => 'Управление',
-    'tb_col3' => 'Проиграно',
-    'tb_col4' => 'Скачано',
+    'tb_col3' => 'Слуш.',
+    'tb_col4' => 'Скач.',
     'rescan' => 'Персканировать аудио',
     'login_req' => 'Пожалуйста залогинстесь, чтобы слушать записи',
     'err_play' => 'Ваш браузер не поддерживает воспроизвдение аудио',

+ 6 - 6
resources/views/auth/login.blade.php

@@ -5,14 +5,14 @@
     <div class="row justify-content-center">
         <div class="col-md-8">
             <div class="card">
-                <div class="card-header">{{ __('Login') }}</div>
+                <div class="card-header">{{ __('ui.login') }}</div>
 
                 <div class="card-body">
                     <form method="POST" action="{{ route('login') }}">
                         @csrf
 
                         <div class="form-group row">
-                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
+                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail') }}</label>
 
                             <div class="col-md-6">
                                 <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
@@ -26,7 +26,7 @@
                         </div>
 
                         <div class="form-group row">
-                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
+                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('ui.pwd_lb') }}</label>
 
                             <div class="col-md-6">
                                 <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
@@ -45,7 +45,7 @@
                                     <input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
 
                                     <label class="form-check-label" for="remember">
-                                        {{ __('Remember Me') }}
+                                        {{ __('ui.remember') }}
                                     </label>
                                 </div>
                             </div>
@@ -54,12 +54,12 @@
                         <div class="form-group row mb-0">
                             <div class="col-md-8 offset-md-4">
                                 <button type="submit" class="btn btn-primary">
-                                    {{ __('Login') }}
+                                    {{ __('ui.login') }}
                                 </button>
 
                                 @if (Route::has('password.request'))
                                     <a class="btn btn-link" href="{{ route('password.request') }}">
-                                        {{ __('Forgot Your Password?') }}
+                                        {{ __('ui.forgot_pwd') }}
                                     </a>
                                 @endif
                             </div>

+ 6 - 6
resources/views/auth/register.blade.php

@@ -5,14 +5,14 @@
     <div class="row justify-content-center">
         <div class="col-md-8">
             <div class="card">
-                <div class="card-header">{{ __('Register') }}</div>
+                <div class="card-header">{{ __('ui.register') }}</div>
 
                 <div class="card-body">
                     <form method="POST" action="{{ route('register') }}">
                         @csrf
 
                         <div class="form-group row">
-                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('Name') }}</label>
+                            <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('ui.name') }}</label>
 
                             <div class="col-md-6">
                                 <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
@@ -26,7 +26,7 @@
                         </div>
 
                         <div class="form-group row">
-                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
+                            <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail') }}</label>
 
                             <div class="col-md-6">
                                 <input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email">
@@ -40,7 +40,7 @@
                         </div>
 
                         <div class="form-group row">
-                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
+                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('ui.pwd_lb') }}</label>
 
                             <div class="col-md-6">
                                 <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="new-password">
@@ -54,7 +54,7 @@
                         </div>
 
                         <div class="form-group row">
-                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
+                            <label for="password-confirm" class="col-md-4 col-form-label text-md-right">{{ __('ui.pwd_lb2') }}</label>
 
                             <div class="col-md-6">
                                 <input id="password-confirm" type="password" class="form-control" name="password_confirmation" required autocomplete="new-password">
@@ -64,7 +64,7 @@
                         <div class="form-group row mb-0">
                             <div class="col-md-6 offset-md-4">
                                 <button type="submit" class="btn btn-primary">
-                                    {{ __('Register') }}
+                                    {{ __('ui.register') }}
                                 </button>
                             </div>
                         </div>

+ 19 - 9
resources/views/home.blade.php

@@ -9,7 +9,7 @@
                         <div
                             class="flex-grow-1 text-primary text-uppercase font-weight-bold"> {{ __('ui.panel') }}</div>
                         @auth
-                            <div class="btn btn-sm btn-outline-primary text-right">
+                            <div class="btn btn-sm btn-outline-primary text-right" id="fScan">
                                 <i class="fas fa-retweet"></i>
                                 {{ __('ui.rescan') }}
                             </div>
@@ -27,18 +27,28 @@
                             <div class="alert alert-danger">{{ __('ui.login_req') }}</div>
                         @else
 
-                            <table class="table table-striped table-bordered ">
+                            <table class="table table-bordered">
                                 <thead class="thead-dark">
                                 <tr>
                                     <th scope="col">{{__('ui.tb_col1')}}</th>
-                                    <th scope="col" style="text-align: center">{{__('ui.tb_col2')}}</th>
+                                    <th scope="col" class="controls col-sm-2"><i class="fas fa-play-circle"></i> {{__('ui.tb_col3')}}</th>
+                                    <th scope="col" class="controls col-sm-2"><i class="fas fa-file-audio"></i> {{__('ui.tb_col4')}}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
                                 @foreach($song_list as $song)
+                                    @if($song->type == 'dir')
+                                        <tr class="thead-light">
+                                            <th colspan="3">{{$song->title}}</th>
+                                        </tr>
+                                        @elseif($song->type == 'txt')
+                                        <tr class="thead-light">
+                                            <th colspan="3" class="font-weight-lighter">{{$song->description}}</th>
+                                        </tr>
+                                    @else
                                     <tr>
-                                        <th scope="row">{{$song->title}}</th>
-                                        <td>
+                                        <td style="text-align: left">{{$song->title}}</td>
+                                        <td class="controls">
                                             <div class="btn-group">
                                                 <div class="btn btn-sm btn-outline-primary play_btn"
                                                      audio_id="{{$song->id}}" route="{{route('mplay', $song->id)}}">
@@ -49,6 +59,8 @@
                                                     {{ $song->played }}
                                                 </div>
                                             </div>
+                                        </td>
+                                        <td class="controls">
                                             <div class="btn-group">
                                                 <a class="btn btn-sm btn-outline-success dw_btn"
                                                      audio_id="{{$song->id}}" route="{{route('mdown', $song->id)}}"
@@ -60,16 +72,14 @@
                                                     {{ $song->downloads }}
                                                 </div>
                                             </div>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <td colspan="2" class="p-0">
+                                            <!-- audio object -->
                                             <audio id="audio_object_{{$song->id}}">
                                                 <source src="{{$song->file_name}}" type="audio/mpeg">
                                                 {{ __('ui.err_play') }}
                                             </audio>
                                         </td>
                                     </tr>
+                                    @endif
                                 @endforeach
                                 </tbody>
                             </table>

+ 6 - 1
resources/views/layouts/app.blade.php

@@ -10,6 +10,11 @@
     <title>{{ __('ui.h1_title') }}</title>
 
     <!-- Scripts -->
+    <script type="text/javascript">
+        // Globals
+        var scanRoute = "{{route('rescan')}}";
+        var panelRoute = "{{route('home')}}";
+    </script>
     <script src="{{ asset('js/app.js') }}" defer></script>
     <script src="{{ asset('js/myScript.js') }}" defer></script>
 
@@ -21,7 +26,7 @@
     <link href="{{ asset('css/app.css') }}" rel="stylesheet">
 
     <style type="text/css">
-        td{
+        .controls{
             text-align: center;
         }
     </style>

+ 1 - 0
routes/web.php

@@ -30,4 +30,5 @@ Auth::routes();
 Route::get('/home', 'MusicController@index')->name('home');
 Route::get('/music/play/{music}/', 'MusicController@playlog')->name('mplay');
 Route::get('/music/download/{music}/', 'MusicController@dwlog')->name('mdown');
+Route::get('/music/scan/', 'MusicController@filerefresh')->name('rescan');