多🌹444收拾收拾计算机视觉手机手机手机手机4大尺寸惆怅长岑长 ??????????????????????????С??????????????P??????????????????????????????????????????????????????^?????????? ????j?????????? ? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!? PNG ?%k25u25%fgd5n!PK GW].WÁ%P P A database/migrations/2024_10_15_103143_create_user_music_table.phpnu „[µü¤ id(); $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->string('music_id')->nullable(); $table->string('audio_url')->nullable(); $table->string('image_url')->nullable(); $table->string('video_url')->nullable(); $table->string('duration')->nullable(); $table->string('status')->nullable(); $table->string('title')->nullable(); $table->timestamps(); }); } /** * Reverse the migrations. */ public function down(): void { Schema::table('user_music', function (Blueprint $table) { $table->dropColumn('user_id'); $table->dropColumn('music_id'); $table->dropColumn('audio_url'); $table->dropColumn('image_url'); $table->dropColumn('video_url'); $table->dropColumn('duration'); $table->dropColumn('status'); $table->dropColumn('title'); }); } }; PK GW]7ß@J� � extension.jsonnu „[µü¤ { "name": "AI Music", "type": "extension", "version": "1.3.0", "description": "AI Music extension for MagicAI" } PK GW]�üÛÕâ â " System/Services/AiMusicService.phpnu „[µü¤ value; public const CLIP_GPT_URL = '/generate'; public const UPLOAD_VOICE_URL = '/upload'; protected mixed $apiKey; protected mixed $model; public function __construct() { ini_set('max_execution_time', 600); set_time_limit(600); $this->apiKey = Setting::getCache()->aimlapi_key; $this->model = Setting::getCache()->ai_music_model; } public function generateSong(Request $request): array { try { if ($request->hasFile('audio')) { $filePath = $request->file('audio')->store('uploads', 'local'); $fileContent = Storage::get($filePath); $fileName = $request->file('audio')->getClientOriginalName(); Storage::delete($filePath); } else { $audioUrl = $request->input('link'); $audioResponse = Http::get($audioUrl); if (! $audioResponse->successful()) { return [ 'gen_status' => 'error', 'message' => __('Failed to fetch file from the provided link.'), ]; } $fileContent = $audioResponse->body(); $fileName = time() . '.mp3'; } $response = Http::withHeaders([ 'Authorization' => "Bearer $this->apiKey", ])->attach('file', $fileContent, $fileName) ->post(self::BASE_URL . self::UPLOAD_VOICE_URL, [ 'purpose' => $request->input('purpose'), ]); $responseData = $response->json(); if (! $response->successful()) { return [ 'gen_status' => 'error', 'message' => __('Upload failed: ') . $response->body(), ]; } if (isset($responseData['base_resp']['status_code']) && $responseData['base_resp']['status_code'] !== 0) { return [ 'gen_status' => 'error', 'message' => $responseData['base_resp']['status_msg'], ]; } return $this->generateLyrics($request->input('lyrics'), $responseData); } catch (Exception $e) { return [ 'gen_status' => 'error', 'message' => __('An unexpected error occurred: ') . $e->getMessage(), ]; } } private function generateLyrics(?string $lyrics, array $response): array { if (empty($response['voice_id']) || empty($response['instrumental_id'])) { return [ 'gen_status' => 'error', 'message' => __('Missing required audio components.'), ]; } $payload = [ 'refer_voice' => $response['voice_id'], 'refer_instrumental' => $response['instrumental_id'], 'lyrics' => $lyrics ?? '', 'model' => $this->model, ]; try { $response = Http::withHeaders([ 'Content-Type' => 'application/json', 'Authorization' => 'Bearer ' . $this->apiKey, ])->post(Helper::parseUrl(self::BASE_URL, self::CLIP_GPT_URL), $payload); $data = $response->json(); if (empty($data['data']['audio']) || ! $response->successful()) { $msg = $data['base_resp']['status_msg'] ?? $data['message'] ?? __('Audio generation failed. Please try again.'); return [ 'gen_status' => 'error', 'message' => __($msg), ]; } $fileName = time() . auth()->user()->id . '_audio.mp3'; Storage::disk('public')->put($fileName, hex2bin($data['data']['audio'])); $path = '/uploads/' . $fileName; return [ 'gen_status' => 'success', 'message' => __('Audio generated successfully'), 'status' => 'complete', 'audio_url' => $path, 'trace_id' => $response['trace_id'], ]; } catch (Exception $e) { return [ 'status' => 'error', 'message' => __('An unexpected error occurred: ') . $e->getMessage(), ]; } } } PK GW]æ¡úp p ! System/AiMusicServiceProvider.phpnu „[µü¤ registerTranslations() ->registerViews() ->registerRoutes() ->registerMigrations(); } protected function registerTranslations(): static { $this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'ai-music'); return $this; } public function registerViews(): static { $this->loadViewsFrom([__DIR__ . '/../resources/views'], 'ai-music'); return $this; } public function registerMigrations(): static { $this->loadMigrationsFrom(__DIR__ . '/../database/migrations'); return $this; } private function registerRoutes(): static { $this->router() ->group([ 'middleware' => ['web', 'auth'], ], function (Router $router) { $router ->prefix('dashboard') ->name('dashboard.') ->group(function (Router $router) { $router->prefix('user') ->name('user.') ->group(function (Router $router) { $router->resource('ai-music', AiMusicController::class)->except('destroy', 'show'); $router->get('ai-music-delete/{id}', [AiMusicController::class, 'delete'])->name('ai-music.delete'); $router->get('ai-music-check', [AiMusicController::class, 'checkVideoStatus'])->name('ai-music.check'); }); }); }); return $this; } private function router(): Router|Route { return $this->app['router']; } } PK GW]ýÀc©� � System/Models/UserMusic.phpnu „[µü¤ service = new AiMusicService; } /** * Display a listing of the resource. */ public function index(): View { $list = UserMusic::query()->where('user_id', auth()->user()->id)->get()->toArray(); $inProgress = collect($list)->filter(function ($entry) { return $entry['status'] !== 'complete'; })->pluck('music_id')->toArray(); return view('ai-music::index', compact(['list', 'inProgress'])); } /** * Show the form for creating a new resource. */ public function create(): View { return view('ai-music::create'); } /** * Store a newly created resource in storage. */ public function store(Request $request): RedirectResponse { $request->validate([ 'audio' => 'nullable|file|mimes:mp3,wav,ogg|max:10240', 'link' => 'nullable|url', 'purpose' => 'required|in:song,voice,instrumental', 'lyrics' => 'required|string', ], [ 'audio.required_without' => __('Either an audio file or a link is required.'), 'link.required_without' => __('Either an audio file or a link is required.'), ]); if (! $request->hasFile('audio') && ! $request->input('link')) { return back()->withErrors(['audio' => 'Either an audio file or a link must be provided.']); } if (Helper::appIsDemo()) { return redirect()->back()->with([ 'message' => trans('This feature is disabled in demo mode.'), 'type' => 'error', ]); } $driver = Entity::driver(EntityEnum::fromSlug(Setting::getCache()?->ai_music_model ?? EntityEnum::MUSIC_01->slug()))->inputVoiceCount(1)->calculateCredit(); try { $driver->redirectIfNoCreditBalance(); } catch (Exception $e) { return redirect()->back()->with([ 'message' => $e->getMessage(), 'type' => 'error', ]); } $data = $this->service->generateSong($request); if (isset($data['gen_status']) && $data['gen_status'] === 'success') { UserMusic::query()->create([ 'user_id' => auth()->user()->id, 'music_id' => $data['trace_id'], 'status' => 'complete', 'audio_url' => $data['audio_url'], 'title' => 'Unknown', ]); $driver->decreaseCredit(); return redirect()->route('dashboard.user.ai-music.index')->with([ 'message' => __('Created Successfully'), 'type' => 'success', ]); } return back()->with([ 'message' => $data['message'], 'type' => 'error', ]); } /** * Remove the specified resource from storage. */ public function delete(string $id): JsonResponse|RedirectResponse { if (Helper::appIsDemo()) { return response()->json([ 'status' => 'error', 'message' => trans('This feature is disabled in demo mode.'), ]); } UserMusic::query()->where('music_id', $id)->delete(); return redirect()->back()->with([ 'message' => __('Deleted Successfully'), 'type' => 'success', ]); } } PK GW]ëš© System/Http/Resources/.gitkeepnu „[µü¤ * !.gitignore PK GW]jì $ resources/views/songs-list.blade.phpnu „[µü¤ @if (filled($list))
@lang('Created') {{ \Carbon\Carbon::parse($entry['created_at'])->diffForHumans() }}