fix: added og headers, lots of cleanup.

This commit is contained in:
Paul Couture 2023-12-20 01:02:15 +00:00
parent 7772be7dc5
commit f7a27e7f62
17 changed files with 817 additions and 62 deletions

View File

@ -8,10 +8,11 @@ services:
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: ${CONTAINER_NAME:-pcag-laravel} container_name: ${CONTAINER_NAME:-pcag-laravel}
volumes: volumes:
- ${PATH_TO_SITE}:/var/www/html - /var/www/html/vendor/
- ${PATH_TO_STATIC}:/static - ${PATH_TO_SITE}:/var/www/html:cached
- ./nginx/default.conf:/etc/nginx/sites-available/default - ${PATH_TO_STATIC}:/static:cached
- ./nginx/nginx.conf:/etc/nginx/nginx.conf - ./nginx/default.conf:/etc/nginx/sites-available/default:cached
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:cached
environment: environment:
TZ: UTC TZ: UTC
PUID: ${UID:-1000} PUID: ${UID:-1000}
@ -45,7 +46,7 @@ services:
static: static:
image: nginx:alpine image: nginx:alpine
volumes: volumes:
- ${PATH_TO_STATIC}:/usr/share/nginx/html - ${PATH_TO_STATIC}:/usr/share/nginx/html:cached
environment: environment:
TZ: UTC TZ: UTC
PUID: ${UID:-1000} PUID: ${UID:-1000}
@ -73,8 +74,8 @@ services:
MARIADB_DATABASE: ${LIVE_DB_DATABASE} MARIADB_DATABASE: ${LIVE_DB_DATABASE}
MARIADB_PASSWORD: ${LIVE_DB_PASSWORD} MARIADB_PASSWORD: ${LIVE_DB_PASSWORD}
volumes: volumes:
- "./db/data:/var/lib/mysql" - "./db/data:/var/lib/mysql:cached"
- "./db/dump:/docker-entrypoint-initdb.d" - "./db/dump:/docker-entrypoint-initdb.d:cached"
networks: networks:
- proxy - proxy
- default - default
@ -93,8 +94,8 @@ services:
ports: ports:
- "56379:6379" - "56379:6379"
volumes: volumes:
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:cached
- ./redis/redis-data:/var/lib/redis - ./redis/redis-data:/var/lib/redis:cached
environment: environment:
- REDIS_REPLICATION_MODE=master - REDIS_REPLICATION_MODE=master
labels: labels:

View File

@ -0,0 +1,346 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Artwork;
use App\Models\Episode;
use App\Models\Artist;
use App\Models\Podcast;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\Facades\Image;
use Carbon\Carbon;
use ImageOptimizer;
class AddMissingV3ArtworksCommand extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:add-missing-v3-artworks-command';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Command description';
/**
* Execute the console command.
*/
public function handle()
{
$missing_artworks = [
[
'url' => '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));
}
}
}

View File

@ -12,6 +12,7 @@
use Illuminate\Validation\Rule; use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use Intervention\Image\Facades\Image; use Intervention\Image\Facades\Image;
use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Cache;
@ -28,11 +29,13 @@ public function index()
{ {
$user = auth()->user(); $user = auth()->user();
$artworks = Artwork::whereNotNull('approved_by') $artworks = Artwork::whereNotNull('approved_by')
->join('episodes', 'artworks.episode_id', '=', 'episodes.id')
->select('artworks.*', DB::raw('episodes.episode_number episode_number'))
->with('artist') ->with('artist')
->with('podcast') ->with('podcast')
->with('episode') ->with('episode')
->orderBy('episode_id', 'desc') ->orderBy('episode_number', 'desc')
->orderBy('created_at', 'desc') ->orderBy('artworks.created_at', 'desc')
->paginate($perPage = 52, $columns = ['*'], $pageName = 'artworks'); ->paginate($perPage = 52, $columns = ['*'], $pageName = 'artworks');
$podcasts = Cache::remember('publishedPodcasts', 30, function() { $podcasts = Cache::remember('publishedPodcasts', 30, function() {
return Podcast::where('published', true)->get(); return Podcast::where('published', true)->get();
@ -107,6 +110,8 @@ public function store(Request $request): RedirectResponse
'podcast_id' => $podcast->id, 'podcast_id' => $podcast->id,
'episode_id' => $episode->id, 'episode_id' => $episode->id,
'filename' => $filename, 'filename' => $filename,
'created_at' => now(),
'updated_at' => now(),
])->create(); ])->create();
$img = Image::make($rawFile)->resize(3000, null, function($constraint){ $img = Image::make($rawFile)->resize(3000, null, function($constraint){
$constraint->aspectRatio(); $constraint->aspectRatio();
@ -138,6 +143,12 @@ public function show(Request $request, $id)
->with('episode') ->with('episode')
->with('artist') ->with('artist')
->first(); ->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', [ return view('artworks.artwork', [
'artwork' => $artwork, 'artwork' => $artwork,
'user' => $user, 'user' => $user,
@ -194,4 +205,26 @@ public function legacyArtLink(Request $request, $any = null)
dd($request->path()); dd($request->path());
//$artwork = Artwork::where('legacy_filename', '/assets/artwork/') //$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"');
}
} }

View File

@ -18,8 +18,7 @@ public function landing(Request $request)
$headerCounters = $this->getHeaderCounters(); $headerCounters = $this->getHeaderCounters();
$recentEpisodes = $this->mostRecentEpisodes(); $recentEpisodes = $this->mostRecentEpisodes();
$recentSubmissions = $this->mostRecentSubmissions(); $recentSubmissions = $this->mostRecentSubmissions();
$leaderboard = $this->leaderboardTwelveMonths(); $leaderboard = $this->leaderboardTwelveMonthsLanding();
return view('home.page', [ return view('home.page', [
'user' => $user, 'user' => $user,
'pageTitle' => 'Home', '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() { private function mostRecentSubmissions() {
$artworks = Cache::remember('latestSubmissions', 30, function() { $artworks = Cache::remember('latestSubmissions', 30, function() {
return Artwork::whereNotNull('approved_by') return Artwork::whereNotNull('approved_by')
@ -52,7 +76,7 @@ private function mostRecentEpisodes()
->with('podcast') ->with('podcast')
->with('artwork') ->with('artwork')
->with('artwork.artist') ->with('artwork.artist')
->orderBy('episode_date', 'desc') ->orderBy('episode_number', 'desc')
->limit(5) ->limit(5)
->get(); ->get();
}); });
@ -101,6 +125,29 @@ private function numberFormatPrecision($number, $precision = 2, $separator = '.'
private function leaderboardTwelveMonths() { private function leaderboardTwelveMonths() {
$leaderboard = cache()->remember('leaderboardTwelveMonths', 30, function() { $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'); $endDate = now()->endOfDay()->subYear()->format('Y-m-d');
$leaderboard = DB::table('episodes') $leaderboard = DB::table('episodes')
->join('artworks', 'artworks.id', '=', 'episodes.artwork_id') ->join('artworks', 'artworks.id', '=', 'episodes.artwork_id')
@ -122,6 +169,73 @@ private function leaderboardTwelveMonths() {
return $leaderboard; 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) { private function addArtistModelToLeaderboard($leaderboard) {
$artistIds = []; $artistIds = [];
foreach ($leaderboard as $lb) { foreach ($leaderboard as $lb) {

View File

@ -1,5 +1,9 @@
@extends('layouts.master') @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-title', '"' . $artwork->title . '" by ' . $artwork->artist->name)
@section('page-top') @section('page-top')

View File

@ -29,7 +29,7 @@
</div> </div>
{{-- .header --}} {{-- .header --}}
<div class="product-owner py-1 d-flex-between"> <div class="product-owner py-1 d-flex-between">
<span class="bid-owner">Artwork By<br><strong><a <span class="bid-owner">Artwork By <br><strong><a
href="/artist/{{ $thisArtwork->artist->slug }}">{{ $thisArtwork->artist->name ?? 'Unknown' }}</a></strong></span> href="/artist/{{ $thisArtwork->artist->slug }}">{{ $thisArtwork->artist->name ?? 'Unknown' }}</a></strong></span>
<span class="profile-share d-flex-center"><a href="/artist/{{ $thisArtwork->artist->slug }}" <span class="profile-share d-flex-center"><a href="/artist/{{ $thisArtwork->artist->slug }}"
class="avatar" data-bs-toggle="tooltip" class="avatar" data-bs-toggle="tooltip"

View File

@ -2,6 +2,10 @@
@section('page-title', $pageTitle) @section('page-title', $pageTitle)
@section('meta_og_img', config('app.static_asset_url') . '/thumbnails/' . $episode->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') @section('page-top')
<section class="inner-page-banner bg-2 bg-image"> <section class="inner-page-banner bg-2 bg-image">
<div class="container"> <div class="container">

View File

@ -2,6 +2,8 @@
@section('page-title', 'Submitted Artwork') @section('page-title', 'Submitted Artwork')
@section('meta_description', 'Explore the artwork submitted at the No Agenda Art Generator.')
@section('page-top') @section('page-top')
<section class="inner-page-banner bg-2 bg-image"> <section class="inner-page-banner bg-2 bg-image">
<div class="container"> <div class="container">
@ -18,18 +20,6 @@
</section> </section>
@endsection @endsection
@section('page-content') @section('page-content')
<div class="container mt-4">
<div class="row">
<div class="col">
<div class="alert alert-success text-success">
<p style="color:#20202d;">
<strong style="color:#20202d;">NOTE:</strong> Still working out some bugs, episodes 1613-1616 will be added later today
after the show. You can find those submissions here: <a style="color: #000;" href="https://noagenda.dev/old/">https://noagenda.dev/old/</a>
</p>
</div>
</div>
</div>
</div>
<section class="pt-120 pb-90 masonary-wrapper-activation"> <section class="pt-120 pb-90 masonary-wrapper-activation">
<div class="container"> <div class="container">
<div class="row"> <div class="row">

View File

@ -1,39 +1,47 @@
{{-- Start Setup Wallet --}} {{-- Start Setup Wallet --}}
<section class="wallet-setup ptb-120"> <section class="wallet-setup ptb-120">
<div class="container"> <div class="container">
<div class="section-title"> <div class="d-flex-between">
<span class="subtitle">WHAT THIS IS</span> <div class="section-title">
<h2>Artists + Podcasters = <i class="ri-heart-fill"></i></h2> <span class="subtitle">What this is</span>
</div> <h2>Artists + Podcasters = <i class="ri-heart-fill"></i></h2>
{{-- End .section-title --}} </div>
<div class="slider wallet-activation slick-arrow-between slick-gutter-15 grid auto-rows-fr"> <div class="text-large">
<div class="card-block-style-one"> <a href="/support-development">Learn More About This</a>
<h3 class="title mb-3">Setup Your Account & Artist Profile</h3> </div>
<p>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.
</p>
</div>
{{-- End .card-block-style-one --}}
<div class="card-block-style-one">
<h3 class="title mb-3">Submit Your Album Artwork</h3>
<p>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.
</p>
</div>
{{-- End .card-block-style-one --}}
<div class="card-block-style-one">
<h3 class="title mb-3">Podcasters Select Your Art</h3>
<p>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.
</p>
</div> </div>
</div> </div>
<div class="container">
<div class="row">
<div class="slider wallet-activation slick-arrow-between slick-gutter-15 grid auto-rows-fr">
<div class="card-block-style-one">
<h3 class="title mb-3">Setup Your Account & Artist Profile</h3>
<p>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.
</p>
</div>
{{-- End .card-block-style-one --}}
<div class="card-block-style-one">
<h3 class="title mb-3">Submit Your Album Artwork</h3>
<p>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.
</p>
</div>
{{-- End .card-block-style-one --}}
<div class="card-block-style-one">
<h3 class="title mb-3">Podcasters Select Your Art</h3>
<p>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.
</p>
</div>
</div>
</div>
{{-- End .row --}} {{-- End .row --}}
</div> </div>
{{-- End .container --}} {{-- End .container --}}

View File

@ -8,7 +8,7 @@
</div> </div>
{{-- End .section-title --}} {{-- End .section-title --}}
<div class="text-large"> <div class="text-large">
<a href="#">View Leaderboards</a> <a href="/leaderboards">View Leaderboards</a>
</div> </div>
</div> </div>
{{-- End .d-flex-between --}} {{-- End .d-flex-between --}}
@ -16,8 +16,27 @@
@foreach($leaderboard as $leaderboardArtist) @foreach($leaderboard as $leaderboardArtist)
@include('home.leaderboard.card') @include('home.leaderboard.card')
@endforeach @endforeach
<div class="col-xxl-4 col-lg-6 col-md-6 mb-6">
<div class="top-seller-style-two d-flex-between d-flex-stretch">
<div class="d-flex-center">
{{-- End .thumb --}}
<div class="content">
<h4 class="title pb-1"><a href="/leaderboards">See More Leaderboards</a></h4>
<span class="price">Updated Every Episode</span>
</div>
{{-- End .content --}}
</div>
{{-- End .d-flex-center --}}
<a href="/leaderboards" class="items-number d-flex-center flex-column">
<strong class="pb-1"><i class="ri-arrow-right-double-line"></i></strong>
<span> &nbsp; </span>
</a>
</div>
{{-- End .top-seller-style-two --}}
</div>
{{-- End .col --}}
</div> </div>
</div> </div>
{{-- End container --}} {{-- End container --}}
</section> </section>
{{-- End section --}} {{-- End section --}}

View File

@ -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')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Support & History</h1>
<nav class="mt-4">
<ol class="breadcrumb justify-content-center">
<li class="breadcrumb-item"><a href="/">Home</a></li>
<li class="breadcrumb-item active">Explore</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="pt-120 pb-90 blog-details-wrapper">
<div class="container">
<div class="row">
<div class="col-xl-8 mb-6">
<div class="blog-content">
<h2 class="mb-2">History of the No Agenda Art Generator</h2>
<ul class="meta">
<li>19 Dec 2024</li>
<li>Development</li>
<li class="date"><i class="ri-time-line"></i>{{ Carbon\Carbon::create(2023, 12, 19, 22, 1, 9)->diffForHumans() }}</li>
</ul>
<p>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.</p>
<p>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.
</p>
<p>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.</p>
<p>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.
</p>
<p>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.
</p>
<p>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
<a href="/artist/nykko-syme">Nykko Syme</a> 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.
</p>
<p>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.
</p>
<p>
The latest version of the generator launched on Sunday, December 17<sup>th</sup>, 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:
</p>
<ul>
<li>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.</li>
<li>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.</li>
<li>Even with the larger resolutions available for download, the size of the artwork archive was cut nearly in half from 30Gb+ to approx 15Gb.</li>
<li>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.</li>
<li>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.</li>
</ul>
<p>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.
</p>
<p class="text-right">--<br>"Sir" Paul Couture<br>Keeper of the Artwork</p>
</div>
</div>
<div class="col-xl-4 mb-6">
<aside class="sidebar">
<div class="single-widget recent-post mt-0">
<h3 class="title">Support | Value4Value</h3>
<div class="inner">
<ul>
<li><a class="d-block" href="http://dvorak.org/NA">Support the Show</a><span class="cate small">First and Foremost, support our boys.</span></li>
<li><a class="d-block" href="https://paypal.me/caincouture">PayPal Me</a><span class="cate small">@CainCouture and buy me a coffee - or twelve.</span></li>
<li><a class="d-block" href="https://getalby.com/p/pcouture">V4V: ⚡pcouture@getalby.com</a><span class="cate small">Use the lightning network.</span></li>
<li><a class="d-block" href="https://static.noagendaartgenerator.com/assets/img/btc-naart-qr.png">Crypto: <i class="ri-btc-line"></i> Old School BTC</a><span class="cate small">bc1qvkm9fpycc8q99kudqwukd8cf8xgxdrhp6a5zl8</span></li>
</ul>
</div>
</div>
<div class="single-widget recent-post mt-8">
<h3 class="title">Download The Archive</h3>
<div class="inner">
<p>Choose one or both of the text lists below for a wget or curl formatted text list to download your own personal copy of the archive.</p>
<ul>
<li><a class="d-block" href="/download-archive/hd">High-Resolution Archive List</a></li>
<li><a class="d-block" href="/download-archive/sd">Standard Resolution Archive List</a></li>
</ul>
<p class="mb-0 mt-4">I recommend the following:<br>
<span class="cate small">Replace "{filename-of-list.txt}" with the filename you downloaded.</span></p>
<hr>
<pre><code> wget \
--content-disposition \
--trust-server-names \
-i {filename-of-list.txt}</code></pre>
<hr>
</div>
</div>
</aside>
</div>
</div>
</div>
</section>
@endsection

View File

@ -10,6 +10,7 @@
@else @else
<title>.: No Agenda Art Generator :.</title> <title>.: No Agenda Art Generator :.</title>
@endif @endif
@include('partials.metabranding')
@include('partials/favicon') @include('partials/favicon')
@vite(['resources/scss/app.scss']) @vite(['resources/scss/app.scss'])
@livewireStyles @livewireStyles

View File

@ -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')
<section class="inner-page-banner bg-2 bg-image">
<div class="container">
<div class="inner text-center">
<h1 class="title">Leaderboards</h1>
<nav class="mt-4">
<ol class="breadcrumb justify-content-center">
<li class="breadcrumb-item"><a href="/">Home</a></li>
<li class="breadcrumb-item active">Leaderboards</li>
</ol>
</nav>
</div>
</div>
</section>
@endsection
@section('page-content')
<section class="pt-120 pb-90">
<div class="container">
<div class="row">
<ul class="nav custom-tabs mb-4">
<li><a class="active" data-bs-toggle="tab" href="#all-time">All Time</a></li>
<li><a data-bs-toggle="tab" href="#rolling-annual">Rolling Annual</a></li>
<li><a data-bs-toggle="tab" href="#rolling-six-months">Rolling Six Months</a></li>
<li><a data-bs-toggle="tab" href="#rolling-ninety-days">Rolling 90 Days</a></li>
</ul>
</div>
</div>
<div class="container tab-content">
<div class="tab-pane fade show active" id="all-time">
<div class="row">
@foreach($leaderboardAllTime as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
<div class="tab-pane fade" id="rolling-annual">
<div class="row">
@foreach($leaderboardPastTwelveMonths as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
<div class="tab-pane fade" id="rolling-six-months">
<div class="row">
@foreach($leaderboardRollingSixMonths as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
<div class="tab-pane fade" id="rolling-ninety-days">
<div class="row">
@foreach($leaderboardRollingNinetyDays as $leaderboardArtist)
@include('home.leaderboard.card')
@endforeach
</div>
</div>
</div>
</section>
@endsection

View File

@ -0,0 +1,17 @@
{{-- HTML Meta Tags --}}
<meta name="description" content="@yield('meta_description', 'Generating high quality album art for the No Agenda Podcast since 2010.')">
{{-- Facebook Meta Tags --}}
<meta property="og:url" content="{{ url()->current() }}">
<meta property="og:type" content="website">
<meta property="og:title" content="@yield('page-title', 'No Agenda Art Generator')">
<meta property="og:description" content="@yield('meta_description', 'Generating high quality album art for the No Agenda Podcast since 2010.')">
<meta property="og:image" content="@yield('meta_og_img', config('app.static_asset_url') . '/v3/dist/naartgen-fb-og-header.png')">
{{-- Twitter Meta Tags --}}
<meta name="twitter:card" content="summary_large_image">
<meta property="twitter:domain" content="noagendaartgenerator.com">
<meta property="twitter:url" content="{{ url()->current() }}">
<meta name="twitter:title" content="No Agenda Art Generator">
<meta name="twitter:description" content="@yield('meta_description', 'Generating high quality album art for the No Agenda Podcast since 2010.')">
<meta name="twitter:image" content="@yield('meta_og_img', config('app.static_asset_url') . '/v3/dist/naartgen-x-og-header.png')">

View File

@ -2,6 +2,8 @@
@section('page-title', $podcast->name) @section('page-title', $podcast->name)
@section('meta_description', 'Selected artwork for the ' . $podcast->name . ' podcast on the No Agenda Art Generator')
@section('page-top') @section('page-top')
<section class="inner-page-banner bg-2 bg-image"> <section class="inner-page-banner bg-2 bg-image">
<div class="container"> <div class="container">
@ -33,7 +35,10 @@
<div class="grid-item podcast--{{ $episode->podcast->slug }}"> <div class="grid-item podcast--{{ $episode->podcast->slug }}">
<div class="explore-style-one flex-stretch"> <div class="explore-style-one flex-stretch">
<div class="thumb"> <div class="thumb">
<a href="/podcast/{{ $episode->podcast->slug }}/episode/{{ $episode->slug }}"> <a href="/podcast/{{ $episode->podcast->slug }}/episode/{{ $episode->slug }}"
data-bs-toggle="tooltip"
data-bs-placement="top"
title="View This Episode">
<img src="{{ config('app.static_asset_url') <img src="{{ config('app.static_asset_url')
. '/thumbnails/' . '/thumbnails/'
. $episode->artwork->filename ?? '#'}}" . $episode->artwork->filename ?? '#'}}"
@ -42,7 +47,7 @@
</div> </div>
<div class="content"> <div class="content">
<div class="header d-flex-between pt-4 pb-1"> <div class="header d-flex-between pt-4 pb-1">
<h3 class="title">"{{ $episode->title }}"</h3> <h3 class="title"><a href="/podcast/{{ $episode->podcast->slug }}/episode/{{ $episode->slug }}">"{{ $episode->title }}"</a></h3>
</div> </div>
<div class="product-owner py-0 pb-2 d-flex-between"> <div class="product-owner py-0 pb-2 d-flex-between">
<h4>{{ $episode->podcast->name }}</h4> <h4>{{ $episode->podcast->name }}</h4>

View File

@ -2,6 +2,10 @@
@section('page-title', $artist->name) @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') @section('page-top')
<section class="inner-page-banner bg-2 bg-image"> <section class="inner-page-banner bg-2 bg-image">
<div class="container"> <div class="container">

View File

@ -27,6 +27,9 @@
Route::get('/artists', [ArtistController::class, 'index']); Route::get('/artists', [ArtistController::class, 'index']);
Route::get('/podcasts/{slug}', [PodcastController::class, 'show']); Route::get('/podcasts/{slug}', [PodcastController::class, 'show']);
Route::get('/podcast/{any}/episode/{slug}', [EpisodeController::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 () { Route::get('/dashboard', function () {
return view('dashboard'); return view('dashboard');
})->middleware(['auth', 'verified'])->name('dashboard'); })->middleware(['auth', 'verified'])->name('dashboard');