diff --git a/app/Http/Controllers/FileController.php b/app/Http/Controllers/FileController.php index d3a22c3..71b242d 100644 --- a/app/Http/Controllers/FileController.php +++ b/app/Http/Controllers/FileController.php @@ -3,14 +3,29 @@ namespace App\Http\Controllers; use App\Helpers\LengthFormatter; -use App\Jobs\FileJob; +use App\Lib\RabbitMQSender; use App\Models\File; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Queue; use Illuminate\Support\Facades\Storage; class FileController extends Controller { + protected static $propertyDefinitions = array( + 'content_type' => 'shortstr', + 'content_encoding' => 'shortstr', + 'application_headers' => 'table_object', + 'delivery_mode' => 'octet', + 'priority' => 'octet', + 'correlation_id' => 'shortstr', + 'reply_to' => 'shortstr', + 'expiration' => 'shortstr', + 'message_id' => 'shortstr', + 'timestamp' => 'timestamp', + 'type' => 'shortstr', + 'user_id' => 'shortstr', + 'app_id' => 'shortstr', + 'cluster_id' => 'shortstr', + ); public function index() { //ToDo } @@ -47,22 +62,19 @@ class FileController extends Controller 'hidden' => true, 'is_scheduled' => false, 'is_playlist' => false, - 'filesize' => 0 + 'filesize' => 0, + 'track_type_id' => $request->track_type_id ? $request->track_type_id : null, ]); $tmpFile = $file->move(Storage::disk('libretime-tmp')->path(''), $dbFile->id.'-'.$originalName); - //Create array to dispatch to Analyzer - $payload = [ - 'id' => $dbFile->id, - 'tmp_file_path' => $tmpFile->getPathname(), - 'import_directory' => Storage::disk('libretime-upload')->path('').'/'.'1', //$user->id, - 'original_filename' => $originalName, - 'options' => new \stdClass() - ]; - - //Queue::connection('rabbitmq')->pushRaw(json_encode($payload), 'airtime-upload'); - //Queue::dispatch(new FileJob($payload)); + RabbitMQSender::SendMessageToAnalyzer( + $tmpFile->getPathname(), + Storage::disk('libretime-upload')->path('').'/'.'1', //$user->id, + $originalName, + $dbFile->id, + $dbFile->track_type_id + ); } public function show($id) { diff --git a/app/Jobs/FileJob.php b/app/Jobs/FileJob.php deleted file mode 100644 index a926e5d..0000000 --- a/app/Jobs/FileJob.php +++ /dev/null @@ -1,39 +0,0 @@ -file = $fileInfo; - $this->file = [ - 'id' => 1, - 'tmp_file_path' => '\/srv\/libretime\/organize\/14-Zela Margossian Quintet - On Ya.mp3', - 'import_directory' => '\/srv\/libretime\/\/imported\/1', //$user->id, - 'original_filename' => 'Zela Margossian Quintet - On Ya.mp3', - 'options' => new \stdClass() - ]; - } - - /** - * Execute the job. - */ - public function handle(): void - { - dd($this->file); - } -} diff --git a/app/Lib/RabbitMQSender.php b/app/Lib/RabbitMQSender.php new file mode 100644 index 0000000..73670e6 --- /dev/null +++ b/app/Lib/RabbitMQSender.php @@ -0,0 +1,160 @@ +channel(); + $channel->access_request( + config('rabbitmq.vhost'), + false, + false, + true, + true + ); + + // I'm pretty sure we DON'T want to autodelete ANY exchanges but I'm keeping the code + // the way it is just so I don't accidentally break anything when I add the Analyzer code in. -- Albert, March 13, 2014 + $channel->exchange_declare($exchange, $exchangeType, false, true, $autoDeleteExchange); + + $msg = new AMQPMessage($data, ['content_type' => 'text/plain']); + + $channel->basic_publish($msg, $exchange); + $channel->close(); + $conn->close(); + } + + public static function SendMessageToPypo($event_type, $md) + { + $md['event_type'] = $event_type; + + $exchange = 'airtime-pypo'; + $data = json_encode($md, JSON_FORCE_OBJECT); + self::sendMessage($exchange, 'direct', true, $data); + } + + public static function SendMessageToMediaMonitor($event_type, $md) + { + $md['event_type'] = $event_type; + + $exchange = 'airtime-analyzer'; + $data = json_encode($md); + self::sendMessage($exchange, 'direct', true, $data); + } + + public static function SendMessageToShowRecorder($event_type) + { +// $exchange = 'airtime-pypo'; +// +// $now = new DateTime('@' . time()); // in UTC timezone +// $end_timestamp = new DateTime('@' . (time() + 3600 * 2)); // in UTC timezone +// +// $temp = []; +// $temp['event_type'] = $event_type; +// $temp['server_timezone'] = Preferences::getTimezone(); +// if ($event_type == 'update_recorder_schedule') { +// $temp['shows'] = Application_Model_Show::getShows( +// $now, +// $end_timestamp, +// $onlyRecord = true +// ); +// } +// $data = json_encode($temp); +// +// self::sendMessage($exchange, 'direct', true, $data); + } + + public static function SendMessageToAnalyzer( + $tmpFilePath, + $importedStorageDirectory, + $originalFilename, + $fileId, + $fileTrackTypeId + ) { + //$config = Config::getConfig(); + + $conn = new AMQPStreamConnection( + config('rabbitmq.host'), + config('rabbitmq.port'), + config('rabbitmq.user'), + config('rabbitmq.password'), + config('rabbitmq.vhost') + ); + + $exchange = 'airtime-uploads'; + $exchangeType = 'topic'; + $queue = 'airtime-uploads'; + $autoDeleteExchange = false; + + $data['file_id'] = $fileId; + $data['tmp_file_path'] = $tmpFilePath; + $data['import_directory'] = $importedStorageDirectory; + $data['original_filename'] = $originalFilename; + + $options = new stdClass(); + + if ($fileTrackTypeId) { + $fileTrackType = TrackType::whereId($fileTrackTypeId); + $options->analyze_cue_points = $fileTrackType->analyze_cue_points; + } + + $data['options'] = $options; + + $jsonData = json_encode($data); + // self::sendMessage($exchange, 'topic', false, $jsonData, 'airtime-uploads'); + + if (!isset($conn)) { + throw new Exception('Cannot connect to RabbitMQ server'); + } + + $channel = $conn->channel(); + $channel->access_request( + config('rabbitmq.vhost'), + false, + false, + true, + true + ); + + // I'm pretty sure we DON'T want to autodelete ANY exchanges but I'm keeping the code + // the way it is just so I don't accidentally break anything when I add the Analyzer code in. -- Albert, March 13, 2014 + $channel->exchange_declare($exchange, $exchangeType, false, true, $autoDeleteExchange); + + $msg = new AMQPMessage($jsonData, ['content_type' => 'text/plain']); + + $channel->basic_publish($msg, $exchange); + $channel->close(); + $conn->close(); + } +} diff --git a/composer.json b/composer.json index 1503d15..7abb394 100644 --- a/composer.json +++ b/composer.json @@ -16,8 +16,8 @@ "livewire/livewire": "^3.4", "livewire/volt": "^1.0", "mxl/laravel-job": "^1.6", + "php-amqplib/php-amqplib": "^3.7", "spatie/laravel-permission": "^6.13", - "vladimir-yuldashev/laravel-queue-rabbitmq": "^14.1", "xenos/musicbrainz": "^1.0" }, "require-dev": { diff --git a/composer.lock b/composer.lock index fe47295..efe6f3c 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f49892f6eb7bb8fb733e5b8d018d1792", + "content-hash": "9757bb812dad4bb4fe33068d0b32f5f1", "packages": [ { "name": "bacon/bacon-qr-code", @@ -6307,70 +6307,6 @@ }, "time": "2024-12-21T16:25:41+00:00" }, - { - "name": "vladimir-yuldashev/laravel-queue-rabbitmq", - "version": "v14.1.0", - "source": { - "type": "git", - "url": "https://github.com/vyuldashev/laravel-queue-rabbitmq.git", - "reference": "3d58891479582ebe988df7c3303efa4784dabccd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/vyuldashev/laravel-queue-rabbitmq/zipball/3d58891479582ebe988df7c3303efa4784dabccd", - "reference": "3d58891479582ebe988df7c3303efa4784dabccd", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/queue": "^10.0|^11.0", - "php": "^8.0", - "php-amqplib/php-amqplib": "^v3.6" - }, - "require-dev": { - "laravel/framework": "^9.0|^10.0|^11.0", - "laravel/horizon": "^5.0", - "laravel/pint": "^1.2", - "mockery/mockery": "^1.0", - "orchestra/testbench": "^7.0|^8.0|^9.0", - "phpunit/phpunit": "^10.0|^11.0" - }, - "suggest": { - "ext-pcntl": "Required to use all features of the queue consumer." - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "VladimirYuldashev\\LaravelQueueRabbitMQ\\LaravelQueueRabbitMQServiceProvider" - ] - }, - "branch-alias": { - "dev-master": "13.0-dev" - } - }, - "autoload": { - "psr-4": { - "VladimirYuldashev\\LaravelQueueRabbitMQ\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Vladimir Yuldashev", - "email": "misterio92@gmail.com" - } - ], - "description": "RabbitMQ driver for Laravel Queue. Supports Laravel Horizon.", - "support": { - "issues": "https://github.com/vyuldashev/laravel-queue-rabbitmq/issues", - "source": "https://github.com/vyuldashev/laravel-queue-rabbitmq/tree/v14.1.0" - }, - "time": "2024-04-26T22:36:00+00:00" - }, { "name": "vlucas/phpdotenv", "version": "v5.6.1", diff --git a/config/queue.php b/config/queue.php index 04dd476..01c6b05 100644 --- a/config/queue.php +++ b/config/queue.php @@ -71,24 +71,6 @@ return [ 'after_commit' => false, ], - 'rabbitmq' => [ - 'driver' => 'rabbitmq', - 'hosts' => [ - 'host' => env('RABBITMQ_HOST', 'rabbitmq'), - 'port' => env('RABBITMQ_PORT', 5672), - 'user' => env('RABBITMQ_USER', 'libretime'), - 'password' => env('RABBITMQ_PASSWORD', 'libretime'), - 'vhost' => env('RABBITMQ_VHOST', '/libretime'), - ], - 'options' => [ - 'airtime-upload' => [ - 'exchange' => 'airtime-upload', - 'exchange_type' => 'topic', - 'exchange_routing_key' => '', - ] - ] - ] - ], /* diff --git a/config/rabbitmq.php b/config/rabbitmq.php new file mode 100644 index 0000000..5054183 --- /dev/null +++ b/config/rabbitmq.php @@ -0,0 +1,9 @@ + env('RABBITMQ_HOST', 'localhost'), + 'port' => env('RABBITMQ_PORT', 5672), + 'user' => env('RABBITMQ_USER', 'libretime'), + 'password' => env('RABBITMQ_PASSWORD', 'libretime'), + 'vhost' => env('RABBITMQ_VHOST', '/libretime'), +]; \ No newline at end of file