diff --git a/docker-compose.yml b/docker-compose.yml index 373d72e..af02b5a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,10 +8,11 @@ services: dockerfile: Dockerfile container_name: ${CONTAINER_NAME:-pcag-laravel} volumes: - - ${PATH_TO_SITE}:/var/www/html - - ${PATH_TO_STATIC}:/static - - ./nginx/default.conf:/etc/nginx/sites-available/default - - ./nginx/nginx.conf:/etc/nginx/nginx.conf + - /var/www/html/vendor/ + - ${PATH_TO_SITE}:/var/www/html:cached + - ${PATH_TO_STATIC}:/static:cached + - ./nginx/default.conf:/etc/nginx/sites-available/default:cached + - ./nginx/nginx.conf:/etc/nginx/nginx.conf:cached environment: TZ: UTC PUID: ${UID:-1000} @@ -45,7 +46,7 @@ services: static: image: nginx:alpine volumes: - - ${PATH_TO_STATIC}:/usr/share/nginx/html + - ${PATH_TO_STATIC}:/usr/share/nginx/html:cached environment: TZ: UTC PUID: ${UID:-1000} @@ -73,8 +74,8 @@ services: MARIADB_DATABASE: ${LIVE_DB_DATABASE} MARIADB_PASSWORD: ${LIVE_DB_PASSWORD} volumes: - - "./db/data:/var/lib/mysql" - - "./db/dump:/docker-entrypoint-initdb.d" + - "./db/data:/var/lib/mysql:cached" + - "./db/dump:/docker-entrypoint-initdb.d:cached" networks: - proxy - default @@ -93,8 +94,8 @@ services: ports: - "56379:6379" volumes: - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - - ./redis/redis-data:/var/lib/redis + - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:cached + - ./redis/redis-data:/var/lib/redis:cached environment: - REDIS_REPLICATION_MODE=master labels: diff --git a/site/app/Console/Commands/AddMissingV3ArtworksCommand.php b/site/app/Console/Commands/AddMissingV3ArtworksCommand.php new file mode 100644 index 0000000..8567e81 --- /dev/null +++ b/site/app/Console/Commands/AddMissingV3ArtworksCommand.php @@ -0,0 +1,346 @@ + 'https://noagenda.dev/old/img/7e5e1ca05eb622e2.png', + 'title' => 'Show Art 1613', + 'artist' => 'dirty-jersey-whore', + 'artist_id' => 1318, + 'episode' => 1613, + ], + [ + 'url' => 'https://noagenda.dev/old/img/6ac5a1220e954d10.jpg', + 'title' => 'No Stinkin\' Title Provided', + 'artist' => 'dirty-jersey-whore', + 'artist_id' => 1318, + 'episode' => 1613, + ], + [ + 'url' => 'https://noagenda.dev/old/img/eb9c5a07a25db93b.jpg', + 'title' => 'McMystery', + 'artist' => 'Nessworks', + 'artist_id' => 1159, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/16dce3f9249b42e8.png', + 'title' => 'Blinking Red Lights!', + 'artist' => 'mountainjay', + 'artist_id' => 891, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/8a6153d61715434b.jpg', + 'title' => 'Day One Dictator!', + 'artist' => 'matthewdropco1972', + 'artist_id' => 1173, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/bf6322f359b0727f.png', + 'title' => 'Vivek\'s Notebook', + 'artist' => 'sir-paul-couture', + 'artist_id' => 4, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/81e71a8e2b24874b.jpg', + 'title' => 'Plastic Shoes', + 'artist' => 'Nessworks', + 'artist_id' => 1159, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/51f16e95c0e86cc9.jpg', + 'title' => 'My Transhausen Blewupen', + 'artist' => 'francisco-scaramanga', + 'artist_id' => 1377, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/b3b6c7988b5fd7f0.jpeg', + 'title' => 'McPartner', + 'artist' => 'dame-kenny-ben', + 'artist_id' => 1121, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/c9c52179e5eedc6f.png', + 'title' => 'Red Flashing Lights', + 'artist' => 'jack-evans', + 'artist_id' => 1224, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/2a29bb2974959b8a.jpg', + 'title' => 'Threat Level Swift', + 'artist' => 'darren-oneill', + 'artist_id' => 756, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/0ed3c698ba336ea9.jpg', + 'title' => 'Blinking Lights', + 'artist' => 'matthewdropco1972', + 'artist_id' => 1173, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/04658d1ccb786d26.png', + 'title' => 'Deep State University, In The Morning', + 'artist' => 'mountainjay', + 'artist_id' => 891, + 'episode' => 1614, + ], + [ + 'url' => 'https://noagenda.dev/old/img/61273125525b7861.jpg', + 'title' => 'Chad GPT', + 'artist' => 'Nessworks', + 'artist_id' => 1159, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/479090be93d46fad.jpg', + 'title' => 'Chet GPT', + 'artist' => 'Nessworks', + 'artist_id' => 1159, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/a533697498ad7f75.png', + 'title' => 'Word Salad, Roundy Variant', + 'artist' => 'comic-strip-blogger', + 'artist_id' => 680, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/bcd81059b0440049.png', + 'title' => 'word salad (that AI allegedly produces)', + 'artist' => 'comic-strip-blogger', + 'artist_id' => 680, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/ddfbcc471e4f265f.png', + 'title' => 'microphone hand (without show number)', + 'artist' => 'comic-strip-blogger', + 'artist_id' => 680, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/c11e2b8a88774fca.png', + 'title' => 'microphone hand', + 'artist' => 'comic-strip-blogger', + 'artist_id' => 680, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/f0c08370c93980b8.jpg', + 'title' => 'Bye Joe', + 'artist' => 'darren-oneill', + 'artist_id' => 756, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/9fc5c17fc0ec547e.jpg', + 'title' => 'Coof Train', + 'artist' => 'darren-oneill', + 'artist_id' => 756, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/99e317f0dd6dd10c.jpg', + 'title' => 'Comb Your Hair!', + 'artist' => 'Nessworks', + 'artist_id' => 1159, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/c579a7ef6ab53869.jpg', + 'title' => 'Milgram', + 'artist' => 'clip-custodian', + 'artist_id' => 1431, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/ba791114371437bc.jpeg', + 'title' => '67% are Killers', + 'artist' => 'dame-kenny-ben', + 'artist_id' => 1121, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/05b40baf17249ea5.jpg', + 'title' => 'Garage Sale Find', + 'artist' => 'francisco-scaramanga', + 'artist_id' => 1377, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/fc626cd5542c71d8.jpg', + 'title' => 'NA Show Art', + 'artist' => 'monsieur-pierrey', + 'artist_id' => 58, + 'episode' => 1615, + ], + [ + 'url' => 'https://noagenda.dev/old/img/2dc17c67400465ad.jpg', + 'title' => 'Merry Christmas Ukraine', + 'artist' => 'clip-custodian', + 'artist_id' => 1431, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/18724b09fd552fc0.jpg', + 'title' => 'THE END IS HERE', + 'artist' => 'francisco-scaramanga', + 'artist_id' => 1377, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/cefbe40e1afdf45c.jpg', + 'title' => 'AI Winter is Coming', + 'artist' => 'Nessworks', + 'artist_id' => 1159, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/045db414cd60cf2a.jpg', + 'title' => 'Space Race Force', + 'artist' => 'Nessworks', + 'artist_id' => 1159, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/f817a154c260076f.png', + 'title' => 'No Agenda Verse', + 'artist' => 'comic-strip-blogger', + 'artist_id' => 680, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/618ddba291dbe349.png', + 'title' => 'NA Show Art', + 'artist' => 'comic-strip-blogger', + 'artist_id' => 680, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/322eda9c9e44933c.jpg', + 'title' => 'Chinese Satellite', + 'artist' => 'darren-oneill', + 'artist_id' => 756, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/2c9ecc0646cc49dc.jpeg', + 'title' => 'Naked No Agenda', + 'artist' => 'KorrectDaRekard', + 'artist_id' => 1021, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/96ba274872584092.jpg', + 'title' => 'NA Show Art', + 'artist' => 'matthewdropco1972', + 'artist_id' => 1173, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/af8ab3953ba21524.jpg', + 'title' => 'False Idols', + 'artist' => 'matt-boisvert', + 'artist_id' => 1368, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/ec5e76093063d663.jpg', + 'title' => 'Collect Them All!', + 'artist' => 'matt-boisvert', + 'artist_id' => 1368, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/c28ec70cfd544c9b.jpg', + 'title' => 'Santa\'s New List', + 'artist' => 'matt-boisvert', + 'artist_id' => 1368, + 'episode' => 1616, + ], + [ + 'url' => 'https://noagenda.dev/old/img/6d228246fb744cb7.jpg', + 'title' => 'Christmas is Coming', + 'artist' => 'matt-boisvert', + 'artist_id' => 1368, + 'episode' => 1616, + ], + ]; + foreach ($missing_artworks as $art) { + $artist = Artist::find($art['artist_id']); + $episode = Episode::where('episode_number', $art['episode'])->first(); + $this->line('Artist: ' . $artist->slug); + $this->line('Episode: ' . $episode->episode_date->format('Y-m-d')); + $artwork = new Artwork; + $artwork->title = $art['title']; + $artwork->artist_id = $artist->id; + $artwork->created_at = $episode->episode_date->format('Y-m-d ' . now()->format('H:i:s')); + $artwork->updated_at = $episode->episode_date->format('Y-m-d ' . now()->format('H:i:s')); + $artwork->episode_id = $episode->id; + $artwork->podcast_id = 1; + $artwork->approved_by = 4; + $basename = $episode->episode_date->format('Y/m/') + . Str::slug($artist->name) + . '_' + . Str::slug($art['title']) + . '_' + . Str::random(8) + . '.jpg'; + $artwork->filename = $basename; + $artwork->save(); + $filename = 'artworks/' . $basename; + $thumbnailName = 'thumbnails/' . $basename; + $this->line($basename); + $img = Image::make(file_get_contents($art['url']))->resize(3000, 3000)->encode('jpg', 100); + $thumbImg = Image::make(file_get_contents($art['url']))->resize(512, 512)->encode('jpg', 100); + $imgLocation = Storage::disk('static')->put($filename, $img); + $thumbLocation = Storage::disk('static')->put($thumbnailName, $thumbImg); + ImageOptimizer::optimize(Storage::disk('static')->path($filename)); + ImageOptimizer::optimize(Storage::disk('static')->path($thumbnailName)); + } + } +} diff --git a/site/app/Http/Controllers/ArtworkController.php b/site/app/Http/Controllers/ArtworkController.php index d153d2d..762df22 100644 --- a/site/app/Http/Controllers/ArtworkController.php +++ b/site/app/Http/Controllers/ArtworkController.php @@ -12,6 +12,7 @@ use Illuminate\Validation\Rule; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use Intervention\Image\Facades\Image; use Illuminate\Support\Facades\Cache; @@ -28,11 +29,13 @@ public function index() { $user = auth()->user(); $artworks = Artwork::whereNotNull('approved_by') + ->join('episodes', 'artworks.episode_id', '=', 'episodes.id') + ->select('artworks.*', DB::raw('episodes.episode_number episode_number')) ->with('artist') ->with('podcast') ->with('episode') - ->orderBy('episode_id', 'desc') - ->orderBy('created_at', 'desc') + ->orderBy('episode_number', 'desc') + ->orderBy('artworks.created_at', 'desc') ->paginate($perPage = 52, $columns = ['*'], $pageName = 'artworks'); $podcasts = Cache::remember('publishedPodcasts', 30, function() { return Podcast::where('published', true)->get(); @@ -107,6 +110,8 @@ public function store(Request $request): RedirectResponse 'podcast_id' => $podcast->id, 'episode_id' => $episode->id, 'filename' => $filename, + 'created_at' => now(), + 'updated_at' => now(), ])->create(); $img = Image::make($rawFile)->resize(3000, null, function($constraint){ $constraint->aspectRatio(); @@ -138,6 +143,12 @@ public function show(Request $request, $id) ->with('episode') ->with('artist') ->first(); + if (is_null($artwork->approved_by) && $user && $user->id != $artwork->id) { + return redirect('artworks'); + } + if (is_null($artwork->approved_by) && !$user) { + return redirect('artworks'); + } return view('artworks.artwork', [ 'artwork' => $artwork, 'user' => $user, @@ -194,4 +205,26 @@ public function legacyArtLink(Request $request, $any = null) dd($request->path()); //$artwork = Artwork::where('legacy_filename', '/assets/artwork/') } + + public function downloadArchiveList(Request $request, $type = 'sd') + { + $artworks = Artwork::whereNotNull('approved_by') + ->orderBy('created_at', 'desc') + ->pluck('filename'); + $output = ''; + if ($type == 'sd') { + foreach($artworks as $artwork) { + $output .= '"https://static.noagendaartgenerator.com/thumbnails/' . $artwork . '"' . "\r\n"; + } + } else { + foreach($artworks as $artwork) { + $output .= '"https://static.noagendaartgenerator.com/artworks/' . $artwork . '"' . "\r\n"; + } + } + return response($output, 200) + ->header('Content-type', 'text/plain') + ->header('Content-Length', strlen($output)) + ->header('Content-Disposition', 'attachment; filename="naartgen-archivelist-' . $type . '.txt"'); + } + } diff --git a/site/app/Http/Controllers/PageController.php b/site/app/Http/Controllers/PageController.php index c29624d..635e82b 100644 --- a/site/app/Http/Controllers/PageController.php +++ b/site/app/Http/Controllers/PageController.php @@ -18,8 +18,7 @@ public function landing(Request $request) $headerCounters = $this->getHeaderCounters(); $recentEpisodes = $this->mostRecentEpisodes(); $recentSubmissions = $this->mostRecentSubmissions(); - $leaderboard = $this->leaderboardTwelveMonths(); - + $leaderboard = $this->leaderboardTwelveMonthsLanding(); return view('home.page', [ 'user' => $user, 'pageTitle' => 'Home', @@ -31,6 +30,31 @@ public function landing(Request $request) ]); } + public function leaderboards(Request $request) + { + $user = auth()->user(); + return view('leaderboards.leaderboards', [ + 'user' => $user, + 'leaderboardAllTime' => $this->leaderboardAllTime(), + 'leaderboardPastTwelveMonths' => $this->leaderboardTwelveMonths(), + 'leaderboardRollingSixMonths' => $this->leaderboardRollingSixMonths(), + 'leaderboardRollingNinetyDays' => $this->leaderboardRollingNinetyDays(), + ]); + } + + public function support(Request $request) + { + return view('home.support.page', [ + 'user' => auth()->user(), + 'pageTitle' => 'History and Support', + 'headerCounters' => $this->getHeaderCounters(), + 'recentEpisodes' => $this->mostRecentEpisodes(), + 'recentSubmissions' => $this->mostRecentSubmissions(), + 'leaderboard' => $this->leaderboardTwelveMonthsLanding(), + 'preferredTheme' => $request->session()->get('preferred_theme') ?? 'dark', + ]); + } + private function mostRecentSubmissions() { $artworks = Cache::remember('latestSubmissions', 30, function() { return Artwork::whereNotNull('approved_by') @@ -52,7 +76,7 @@ private function mostRecentEpisodes() ->with('podcast') ->with('artwork') ->with('artwork.artist') - ->orderBy('episode_date', 'desc') + ->orderBy('episode_number', 'desc') ->limit(5) ->get(); }); @@ -101,6 +125,29 @@ private function numberFormatPrecision($number, $precision = 2, $separator = '.' private function leaderboardTwelveMonths() { $leaderboard = cache()->remember('leaderboardTwelveMonths', 30, function() { + $endDate = now()->endOfDay()->subYear()->format('Y-m-d'); + $leaderboard = DB::table('episodes') + ->join('artworks', 'artworks.id', '=', 'episodes.artwork_id') + ->join('artists', 'artists.id', '=', 'artworks.artist_id') + ->select([ + DB::raw('artists.id as artistId'), + DB::raw('artists.name as artistName'), + DB::raw('count(artworks.id) as artworkCount') + ]) + ->where('episodes.published', 1) + ->where('episodes.episode_date', '>=', $endDate) + ->groupBy('artistId') + ->orderByDesc('artworkCount') + ->limit(50) + ->get(); + $leaderboard = $this->addArtistModelToLeaderboard($leaderboard); + return $leaderboard; + }); + return $leaderboard; + } + + private function leaderboardTwelveMonthsLanding() { + $leaderboard = cache()->remember('leaderboardTwelveMonthsLanding', 30, function() { $endDate = now()->endOfDay()->subYear()->format('Y-m-d'); $leaderboard = DB::table('episodes') ->join('artworks', 'artworks.id', '=', 'episodes.artwork_id') @@ -122,6 +169,73 @@ private function leaderboardTwelveMonths() { return $leaderboard; } + private function leaderboardAllTime() { + $leaderboard = cache()->remember('leaderboardAllTime', 30, function() { + $leaderboard = DB::table('episodes') + ->join('artworks', 'artworks.id', '=', 'episodes.artwork_id') + ->join('artists', 'artists.id', '=', 'artworks.artist_id') + ->select([ + DB::raw('artists.id as artistId'), + DB::raw('artists.name as artistName'), + DB::raw('count(artworks.id) as artworkCount') + ]) + ->where('episodes.published', 1) + ->groupBy('artistId') + ->orderByDesc('artworkCount') + ->limit(100) + ->get(); + $leaderboard = $this->addArtistModelToLeaderboard($leaderboard); + return $leaderboard; + }); + return $leaderboard; + } + + private function leaderboardRollingSixMonths() { + $leaderboard = cache()->remember('leaderboardRollingSixMonth', 30, function() { + $endDate = now()->endOfDay()->subMonths(6)->format('Y-m-d'); + $leaderboard = DB::table('episodes') + ->join('artworks', 'artworks.id', '=', 'episodes.artwork_id') + ->join('artists', 'artists.id', '=', 'artworks.artist_id') + ->select([ + DB::raw('artists.id as artistId'), + DB::raw('artists.name as artistName'), + DB::raw('count(artworks.id) as artworkCount') + ]) + ->where('episodes.published', 1) + ->where('episodes.episode_date', '>=', $endDate) + ->groupBy('artistId') + ->orderByDesc('artworkCount') + ->limit(50) + ->get(); + $leaderboard = $this->addArtistModelToLeaderboard($leaderboard); + return $leaderboard; + }); + return $leaderboard; + } + + private function leaderboardRollingNinetyDays() { + $leaderboard = cache()->remember('leaderboardNinetyDays', 30, function() { + $endDate = now()->endOfDay()->subDays(90)->format('Y-m-d'); + $leaderboard = DB::table('episodes') + ->join('artworks', 'artworks.id', '=', 'episodes.artwork_id') + ->join('artists', 'artists.id', '=', 'artworks.artist_id') + ->select([ + DB::raw('artists.id as artistId'), + DB::raw('artists.name as artistName'), + DB::raw('count(artworks.id) as artworkCount') + ]) + ->where('episodes.published', 1) + ->where('episodes.episode_date', '>=', $endDate) + ->groupBy('artistId') + ->orderByDesc('artworkCount') + ->limit(50) + ->get(); + $leaderboard = $this->addArtistModelToLeaderboard($leaderboard); + return $leaderboard; + }); + return $leaderboard; + } + private function addArtistModelToLeaderboard($leaderboard) { $artistIds = []; foreach ($leaderboard as $lb) { diff --git a/site/resources/views/artworks/artwork.blade.php b/site/resources/views/artworks/artwork.blade.php index 4314288..29dfe24 100644 --- a/site/resources/views/artworks/artwork.blade.php +++ b/site/resources/views/artworks/artwork.blade.php @@ -1,5 +1,9 @@ @extends('layouts.master') +@section('meta_description', $artwork->description ?? 'Artwork by ' . $artwork->artist->name . ', "' . $artwork->title . '" for the podcast ' . $artwork->podcast->name . '.') + +@section('meta_og_img', config('app.static_asset_url') . '/thumbnails/' . $artwork->filename) + @section('page-title', '"' . $artwork->title . '" by ' . $artwork->artist->name) @section('page-top') diff --git a/site/resources/views/artworks/card.blade.php b/site/resources/views/artworks/card.blade.php index b5f55df..636e5ca 100644 --- a/site/resources/views/artworks/card.blade.php +++ b/site/resources/views/artworks/card.blade.php @@ -29,7 +29,7 @@ {{-- .header --}}
- Artwork By
Artwork By
{{ $thisArtwork->artist->name ?? 'Unknown' }}
artwork->filename) + +@section('meta_description', 'Artwork for the ' . $episode->podcast->name . ' podcast, episode ' . $episode->episode_number + 0 . ' by ' . $episode->artwork->artist->name) + @section('page-top')
diff --git a/site/resources/views/explore/artworks.blade.php b/site/resources/views/explore/artworks.blade.php index 958cfcd..90c92f5 100644 --- a/site/resources/views/explore/artworks.blade.php +++ b/site/resources/views/explore/artworks.blade.php @@ -2,6 +2,8 @@ @section('page-title', 'Submitted Artwork') +@section('meta_description', 'Explore the artwork submitted at the No Agenda Art Generator.') + @section('page-top')
@@ -18,18 +20,6 @@
@endsection @section('page-content') -
diff --git a/site/resources/views/home/explainer/explainer.blade.php b/site/resources/views/home/explainer/explainer.blade.php index 0c89ea2..ca7ef97 100644 --- a/site/resources/views/home/explainer/explainer.blade.php +++ b/site/resources/views/home/explainer/explainer.blade.php @@ -1,39 +1,47 @@ {{-- Start Setup Wallet --}}
-
- WHAT THIS IS -

Artists + Podcasters =

-
- {{-- End .section-title --}} -
-
-

Setup Your Account & Artist Profile

-

First things first, you need to have an account to control your artist profiles and submit artwork. - Setting up your account is easy, you just need an email address and some creativity. Once you have - your account, you can create one more artist profiles which are controlled by you. -

-
- {{-- End .card-block-style-one --}} - - -
-

Submit Your Album Artwork

-

Your artwork should be unique, high-quality, and on-topic. Our artists stive to provide the podcast - hosts with unqiue artwork each and every episode to use as the album artwork. artwork should be - a minimum of 512px square. -

-
- {{-- End .card-block-style-one --}} - -
-

Podcasters Select Your Art

-

When publishing their podcast, podcasters select the album art they like best, and if you are selected, - you'll get your credit here and usually in the show-notes of the podcast that used your art. If you aren't - selected for Album Art, your artwork could be used for Podcasting 2.0 chapter art as well. -

+
+
+ What this is +

Artists + Podcasters =

+
+
+
+
+
+
+

Setup Your Account & Artist Profile

+

First things first, you need to have an account to control your artist profiles and submit artwork. + Setting up your account is easy, you just need an email address and some creativity. Once you have + your account, you can create one more artist profiles which are controlled by you. +

+
+ {{-- End .card-block-style-one --}} + + +
+

Submit Your Album Artwork

+

Your artwork should be unique, high-quality, and on-topic. Our artists stive to provide the podcast + hosts with unqiue artwork each and every episode to use as the album artwork. artwork should be + a minimum of 512px square. +

+
+ {{-- End .card-block-style-one --}} + +
+

Podcasters Select Your Art

+

When publishing their podcast, podcasters select the album art they like best, and if you are selected, + you'll get your credit here and usually in the show-notes of the podcast that used your art. If you aren't + selected for Album Art, your artwork could be used for Podcasting 2.0 chapter art as well. +

+
+
+
{{-- End .row --}}
{{-- End .container --}} diff --git a/site/resources/views/home/leaderboard/section.blade.php b/site/resources/views/home/leaderboard/section.blade.php index c348dc4..e358327 100644 --- a/site/resources/views/home/leaderboard/section.blade.php +++ b/site/resources/views/home/leaderboard/section.blade.php @@ -8,7 +8,7 @@
{{-- End .section-title --}}
{{-- End .d-flex-between --}} @@ -16,8 +16,27 @@ @foreach($leaderboard as $leaderboardArtist) @include('home.leaderboard.card') @endforeach +
+
+
+ {{-- End .thumb --}} +
+

See More Leaderboards

+ Updated Every Episode +
+ {{-- End .content --}} +
+ {{-- End .d-flex-center --}} + + +   + +
+ {{-- End .top-seller-style-two --}} +
+ {{-- End .col --}}
{{-- End container --}}
-{{-- End section --}} \ No newline at end of file +{{-- End section --}} diff --git a/site/resources/views/home/support/page.blade.php b/site/resources/views/home/support/page.blade.php new file mode 100644 index 0000000..41fe8b6 --- /dev/null +++ b/site/resources/views/home/support/page.blade.php @@ -0,0 +1,138 @@ +@extends('layouts.master') + +@section('page-title', 'Support and The History of the Art Generator') + +@section('meta_description', 'Learn the history of the No Agenda Art Generator and how to support the generator.') + +@section('page-top') +
+
+
+

Support & History

+ +
+
+
+@endsection + +@section('page-content') +
+
+
+
+
+

History of the No Agenda Art Generator

+
    +
  • 19 Dec 2024
  • +
  • Development
  • +
  • {{ Carbon\Carbon::create(2023, 12, 19, 22, 1, 9)->diffForHumans() }}
  • +
+

In June of 2010, there was no formal process to submit artwork to + the No Agenda Podcast for use as album artwork for each episode. At the same time, + I was in the process of learning the then "new to me" Drupal 6 Content Management + System. I realized that I could kill two birds with one stone by improving the process + of uploading artwork, add some community and competition to the process and learn more + about Drupal module development by building a simple tool that would allow anyone to + submit artwork live as we trolled-along in the IRC "trollroom" as the show was recorded + by our venerable hosts, Adam and John C.

+

The first variation of the Art Generator was built over the course of a weekend, and + as part of that development, I did my best to re-create the work of Sir Randy Asher and Sir Paul T. + who had, up until that point, submitted the bulk of the user submitted artwork in the archive. +

+

For the next almost four years and roughly 4,500 art submissions, the generator continued + in it's first interation with an abandonded upgrade to Drupal 7 somewhere in the duration as the Drupal + community was more focused on writing "codes-of-conduct" than writing actual code.

+

Around that time, many in the PHP community and myself + became aware of an upcoming framework that seemed to offer a ton of promise - Laravel, and I chose to + use the generator to become familiar with that new framework. In October 2014, the Art Generator was + re-written from the ground up using the Laravel 4 platform which greatly simplified the maintenance and + customization of the platform. +

+

In 2022, I started to run into minor issues due to the age of the codebase, support for older versions + of the database and PHP were becoming deprecated, and tackling them would require a basic rewrite of + the entire platform (seriously, the upgrade path from Laravel 4 to 5 suggests re-writing the application.) + Laravel had matured, and became the most popular PHP framework on the Internet, upgrades between versions + had become relatively painless and took a few minutes to a few hours. However, I procrastinated doing the re-write + as I was already spending my days writing Laravel code and I put a lot of focus learning other technologies + that would make the upgrade worthwhile. +

+

I began the re-write for the current interation of the Art Generator, in early 2023, working on small pieces + on weekends as free-time allowed, the core functionality of the system is now powered by Laravel 10 and I used + much of the development time to learn some of the new third-party add-ons that would improve developer's experience + moving forward such as Laravel Live-Wire, Docker, Docker Compose, Traefik, Caddy and other technology. Development + in earnest began in early summer of 2023 - a new design was developed using a new logo graciously provided by + Nykko Syme and addressing some community requests for both dark and light mode support, + easier to access download links for the artwork, and a much more streamlined codebase allowing for future development + with less pain points. A bonus is the ability for me to run the entire stack in Docker making migrating to other hosting + and development environments smoother. +

+

Toward the end of September, the host that had powered the Art Generator since 2010 emailed its customers and + notified us they would be shutting down without warning. I took the time to migrate the database away from that host, + and moved as much of the site off of them as possible while working as quickly as possible to finish the upgrade. Communicating + with them, I was told to expect to continue to have hosting until my paid-in-advance hosting ran out, which would have + been through May of 2024 - but on the morning of November 30, 2023, they disappeared without a trace, stopped answering + the phone, and emails bounced. This lit a fire under my rear to complete the newest build as I was very close to complete. +

+

+ The latest version of the generator launched on Sunday, December 17th, 2024 to a rocky launch with "good-enough" + functionality, it took a few days to stabilize the cacheing and hardware, but you are now viewing the "new hotness" or whatever + the kids these days call it, powered by Laravel 10 in a docker powered container that can be migrated in minutes to other locations. + It facilitates point-in-time backups, and as you will see below, makes it fairly simple for anyone to grab and entire archive of the + artwork submitted to the site in an sane, organized manner. Here's some of the new features that really made the upgrade worth it: +

+
    +
  • All artwork is optimized, sized, and scaled to the absolute smallest filesize while having the resolutions required by Apple (3,000px x 3,000px) and by the sane people in the world (512px x 512px) with none of the extraneous temporary files and unnecessary thumbnails of the old system.
  • +
  • The artwork is organized by year, month, and date, with the artist's name and artwork title in the filename so offline use is easier.
  • +
  • Even with the larger resolutions available for download, the size of the artwork archive was cut nearly in half from 30Gb+ to approx 15Gb.
  • +
  • Artists get a lot more credit on the new version, it's easier to find their additional work, and get high quality downloads of that work.
  • +
  • While not yet implemented in the production site, the new version was built from the ground up with support for more than one podcast. In the coming weeks, I hope to expand and turn that feature on for additional podcasts in the No Agenda Community.
  • +
+

Want to download your own copy of the archive? Know wget and/or curl? There are lists in the sidebar you can download that are updated each time a piece + of artwork is approved. I plan to make this easier for non-dudes/dudettes named Ben soon. In the meantime, enjoy your stay, note the v4v section, and be + decent to one another. +

+

--
"Sir" Paul Couture
Keeper of the Artwork

+
+
+
+ +
+
+
+
+@endsection diff --git a/site/resources/views/layouts/master.blade.php b/site/resources/views/layouts/master.blade.php index 1b78688..c8bbb26 100644 --- a/site/resources/views/layouts/master.blade.php +++ b/site/resources/views/layouts/master.blade.php @@ -10,6 +10,7 @@ @else .: No Agenda Art Generator :. @endif + @include('partials.metabranding') @include('partials/favicon') @vite(['resources/scss/app.scss']) @livewireStyles diff --git a/site/resources/views/leaderboards/leaderboards.blade.php b/site/resources/views/leaderboards/leaderboards.blade.php new file mode 100644 index 0000000..5a20f4a --- /dev/null +++ b/site/resources/views/leaderboards/leaderboards.blade.php @@ -0,0 +1,68 @@ +@extends('layouts.master') + +@section('page-title', 'Leaderboards') + +@section('meta_description', 'Check the standings of the competition at the No Agenda Art Generator.') + +@section('page-top') +
+
+
+

Leaderboards

+ +
+
+
+@endsection +@section('page-content') +
+ +
+
+
+ @foreach($leaderboardAllTime as $leaderboardArtist) + @include('home.leaderboard.card') + @endforeach +
+
+
+
+ @foreach($leaderboardPastTwelveMonths as $leaderboardArtist) + @include('home.leaderboard.card') + @endforeach +
+
+
+
+ @foreach($leaderboardRollingSixMonths as $leaderboardArtist) + @include('home.leaderboard.card') + @endforeach +
+
+
+
+ @foreach($leaderboardRollingNinetyDays as $leaderboardArtist) + @include('home.leaderboard.card') + @endforeach +
+
+
+
+@endsection + + + diff --git a/site/resources/views/partials/metabranding.blade.php b/site/resources/views/partials/metabranding.blade.php new file mode 100644 index 0000000..49b2e6d --- /dev/null +++ b/site/resources/views/partials/metabranding.blade.php @@ -0,0 +1,17 @@ + {{-- HTML Meta Tags --}} + + + {{-- Facebook Meta Tags --}} + + + + + + + {{-- Twitter Meta Tags --}} + + + + + + diff --git a/site/resources/views/podcasts/podcast.blade.php b/site/resources/views/podcasts/podcast.blade.php index 502376b..b07b30d 100644 --- a/site/resources/views/podcasts/podcast.blade.php +++ b/site/resources/views/podcasts/podcast.blade.php @@ -2,6 +2,8 @@ @section('page-title', $podcast->name) +@section('meta_description', 'Selected artwork for the ' . $podcast->name . ' podcast on the No Agenda Art Generator') + @section('page-top')
@@ -33,7 +35,10 @@
- +

{{ $episode->podcast->name }}

diff --git a/site/resources/views/profile/artist.blade.php b/site/resources/views/profile/artist.blade.php index e5d8317..92afe97 100644 --- a/site/resources/views/profile/artist.blade.php +++ b/site/resources/views/profile/artist.blade.php @@ -2,6 +2,10 @@ @section('page-title', $artist->name) +@section('meta_description', 'Artist profile page on the No Agenda Art Generator for ' . $artist->name) + +@section('meta_og_img', $artworks->first() ? config('app.static_asset_url') . '/thumbnails/' . $artworks->first()->filename : config('app.static_asset_url') . '/v3/dist/naartgen-x-og-header.png') + @section('page-top')
diff --git a/site/routes/web.php b/site/routes/web.php index 652ab79..1d989a7 100644 --- a/site/routes/web.php +++ b/site/routes/web.php @@ -27,6 +27,9 @@ Route::get('/artists', [ArtistController::class, 'index']); Route::get('/podcasts/{slug}', [PodcastController::class, 'show']); Route::get('/podcast/{any}/episode/{slug}', [EpisodeController::class, 'show']); +Route::get('/leaderboards', [PageController::class, 'leaderboards'])->name('leaderboards'); +Route::get('/support-development', [PageController::class, 'support'])->name('support'); +Route::get('/download-archive/{type}', [ArtworkController::class, 'downloadArchiveList']); Route::get('/dashboard', function () { return view('dashboard'); })->middleware(['auth', 'verified'])->name('dashboard');