Merge ; commit '558906cec3
'
This commit is contained in:
commit
0177a8cbea
27 changed files with 375 additions and 177 deletions
|
@ -10790,7 +10790,7 @@
|
|||
"categories": [
|
||||
"Biography & Autobiography"
|
||||
],
|
||||
"thumbnail": "https://books.google.com/books/content?id=f8LrtwEACAAJ&printsec=frontcover&img=1&zoom=1&source=gbs_api&w=512",
|
||||
"thumbnail": "https://coryd.dev/media/books/1573449709-see-a-little-light.jpg",
|
||||
"language": "en",
|
||||
"link": "https://books.google.com/books/about/See_a_Little_Light.html?hl=&id=f8LrtwEACAAJ"
|
||||
}
|
||||
|
|
|
@ -22,7 +22,9 @@ const fetchAllMovies = async () => {
|
|||
collected,
|
||||
plays,
|
||||
favorite,
|
||||
rating
|
||||
rating,
|
||||
description,
|
||||
review
|
||||
`)
|
||||
.order('last_watched', { ascending: false })
|
||||
.range(rangeStart, rangeStart + PAGE_SIZE - 1)
|
||||
|
@ -49,7 +51,7 @@ export default async function () {
|
|||
lastWatched: item['last_watched'],
|
||||
dateAdded: item['last_watched'],
|
||||
year: item['year'],
|
||||
url: `https://www.themoviedb.org/movie/${item['tmdb_id']}`,
|
||||
url: `https://coryd.dev/movies/${item['tmdb_id']}`,
|
||||
description: `${item['title']} (${item['year']})<br/>Watched at: ${DateTime.fromISO(item['last_watched'], { zone: 'utc' }).setZone('America/Los_Angeles').toFormat('MMMM d, yyyy, h:mma')}`,
|
||||
image: `https://coryd.dev/media/movies/poster-${item['tmdb_id']}.jpg`,
|
||||
backdrop: `https://coryd.dev/media/movies/backdrops/backdrop-${item['tmdb_id']}.jpg`,
|
||||
|
@ -57,6 +59,8 @@ export default async function () {
|
|||
collected: item['collected'],
|
||||
favorite: item['favorite'],
|
||||
rating: item['rating'],
|
||||
description: item['description'],
|
||||
id: item['tmdb_id'],
|
||||
type: 'movie'
|
||||
}
|
||||
return movie
|
||||
|
|
|
@ -58,8 +58,9 @@ const fetchAllTimeData = async (fields, table) => {
|
|||
return rows
|
||||
}
|
||||
|
||||
const aggregateData = (data, groupByField, groupByType, sort = true) => {
|
||||
const aggregateData = (data, groupByField, groupByType) => {
|
||||
const aggregation = {}
|
||||
|
||||
data.forEach(item => {
|
||||
const key = item[groupByField]
|
||||
if (!aggregation[key]) {
|
||||
|
@ -92,7 +93,8 @@ const aggregateData = (data, groupByField, groupByType, sort = true) => {
|
|||
}
|
||||
aggregation[key].plays++
|
||||
})
|
||||
const aggregatedData = sort ? Object.values(aggregation).sort((a, b) => b.plays - a.plays) : Object.values(aggregation)
|
||||
|
||||
const aggregatedData = Object.values(aggregation).sort((a, b) => b.plays - a.plays)
|
||||
|
||||
aggregatedData.forEach((item, index) => {
|
||||
item.rank = index + 1
|
||||
|
@ -158,7 +160,7 @@ export default async function() {
|
|||
artists: aggregateData(recentData, 'artist_name', 'artists'),
|
||||
albums: aggregateData(recentData, 'album_name', 'albums'),
|
||||
tracks: aggregateData(recentData, 'track_name', 'track'),
|
||||
tracksChronological: aggregateData(recentData, 'track_name', 'track', false),
|
||||
tracksChronological: aggregateData(recentData, 'track_name', 'track').sort((a, b) => b.timestamp - a.timestamp),
|
||||
genres: aggregateGenres(recentData),
|
||||
totalTracks: recentData?.length?.toLocaleString('en-US')
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@ export default async function () {
|
|||
footer: [
|
||||
{ name: 'Now' },
|
||||
{ name: 'Uses' },
|
||||
{ name: 'Referrals' },
|
||||
{ name: 'Save' },
|
||||
{ name: 'Blogroll' },
|
||||
{ name: 'Speedlify' },
|
||||
],
|
||||
|
|
|
@ -18,6 +18,8 @@ const fetchAllShows = async () => {
|
|||
collected,
|
||||
favorite,
|
||||
year,
|
||||
description,
|
||||
review,
|
||||
episodes (
|
||||
episode_number,
|
||||
season_number,
|
||||
|
@ -88,7 +90,7 @@ export default async function () {
|
|||
|
||||
showEpisodesMap[showTmdbId].episodes.push({
|
||||
name: showTitle,
|
||||
url: `https://www.themoviedb.org/tv/${showTmdbId}/season/${seasonNumber}/episode/${episodeNumber}`,
|
||||
url: `https://coryd.dev/shows/${showTmdbId}`,
|
||||
subtext: `${showTitle} • S${seasonNumber}E${episodeNumber}`,
|
||||
episode: episodeNumber,
|
||||
season: seasonNumber,
|
||||
|
@ -112,7 +114,7 @@ export default async function () {
|
|||
if (show.episodes.length > 1) {
|
||||
episodeData.push({
|
||||
name: show.title,
|
||||
url: `https://www.themoviedb.org/tv/${show['tmdbId']}`,
|
||||
url: `https://coryd.dev/shows/${show['tmdbId']}`,
|
||||
subtext: `S${startingSeason}E${startingEpisode} - S${endingSeason}E${endingEpisode}`,
|
||||
startingEpisode,
|
||||
startingSeason,
|
||||
|
@ -138,7 +140,7 @@ export default async function () {
|
|||
|
||||
const favoriteShows = shows.filter(show => show['favorite'])
|
||||
const collectedShows = shows.filter(show => show['collected'])
|
||||
const toWatch = shows.map(show => ({...show, url: `https://www.themoviedb.org/tv/${show['tmdb_id']}`})).filter(show => !show.episodes.some(episode => episode.last_watched_at)).sort((a, b) => a['title'].localeCompare(b['title']))
|
||||
const toWatch = shows.map(show => ({...show, url: `https://coryd.dev/shows/${show['tmdb_id']}`})).filter(show => !show.episodes.some(episode => episode.last_watched_at)).sort((a, b) => a['title'].localeCompare(b['title']))
|
||||
|
||||
return {
|
||||
shows,
|
||||
|
|
|
@ -6,6 +6,10 @@
|
|||
{{ title }} • {{ meta.siteName }}
|
||||
{% elsif book.title %}
|
||||
Books • {{ book.title }} • {{ meta.siteName }}
|
||||
{% elsif movie.title %}
|
||||
Movies • {{ movie.title }}{% if movie.rating %} ({{ movie.rating }}){% endif %} • {{ meta.siteName }}
|
||||
{% elsif movie.title %}
|
||||
Shows • {{ show.title }} • {{ meta.siteName }}
|
||||
{% else %}
|
||||
{{ meta.siteName }}
|
||||
{%- endif -%}
|
||||
|
@ -15,6 +19,10 @@
|
|||
{{ post_excerpt | markdown | strip_html }}
|
||||
{% elsif book.description %}
|
||||
{{ book.description }}
|
||||
{% elsif movie.description %}
|
||||
{% if movie.review %}{{ movie.review }}{% else %}{{ movie.description }}{% endif %}
|
||||
{% elsif show.description %}
|
||||
{% if show.review %}{{ show.review }}{% else %}{{ show.description }}{% endif %}
|
||||
{% elsif description %}
|
||||
{{ description }}
|
||||
{% else %}
|
||||
|
@ -34,6 +42,10 @@
|
|||
{{ featuredBook.image }}
|
||||
{%- elsif schema == 'book' -%}
|
||||
{{ book.image }}
|
||||
{%- elsif schema == 'movie' -%}
|
||||
{{ movie.backdrop }}
|
||||
{%- elsif schema == 'show' -%}
|
||||
{{ meta.url }}/media/shows/backdrops/backdrop-{{ show.tmdb_id }}.jpg
|
||||
{%- else -%}
|
||||
{{ meta.meta_data.opengraph_default }}
|
||||
{%- endif -%}
|
||||
|
|
BIN
src/assets/img/ogi/boring-is-good-preview.png
Normal file
BIN
src/assets/img/ogi/boring-is-good-preview.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
Binary file not shown.
Before Width: | Height: | Size: 28 KiB |
|
@ -490,6 +490,8 @@ button {
|
|||
|
||||
/* selects */
|
||||
select {
|
||||
color: var(--text-color);
|
||||
background-color: var(--background-color);
|
||||
padding: var(--sizing-xs) var(--sizing-sm);
|
||||
}
|
||||
|
||||
|
|
|
@ -118,6 +118,34 @@
|
|||
}
|
||||
}
|
||||
|
||||
.watching-focus {
|
||||
border-bottom: 0;
|
||||
|
||||
& .watching-meta {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--sizing-xs);
|
||||
margin-top: var(--sizing-base);
|
||||
|
||||
& p {
|
||||
&.title {
|
||||
font-size: var(--font-size-xl);
|
||||
}
|
||||
|
||||
&.sub-meta {
|
||||
font-size: var(--font-size-xs);
|
||||
line-height: var(--line-height-xs);
|
||||
}
|
||||
|
||||
&.title,
|
||||
&.rating,
|
||||
&.sub-meta {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (min-width: 768px) {
|
||||
.watching.grid {
|
||||
grid-template-columns: repeat(3,minmax(0,1fr))
|
||||
|
|
7
src/links/2024/2024-05-22-my-own-little-patch.md
Normal file
7
src/links/2024/2024-05-22-my-own-little-patch.md
Normal file
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: "My own little patch"
|
||||
date: "2024-05-22T08:51-08:00"
|
||||
tags: ["tech", "development"]
|
||||
description: "I don't know if you've tried to use websites lately, but it's largely a mess out there. It feels like things have descended in to a complete shitshow and are only getting worse."
|
||||
link: "https://rachsmith.com/my-own-little-patch/"
|
||||
---
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: "Generative AI is for the idea guys"
|
||||
date: "2024-05-23T08:35-08:00"
|
||||
tags: ["tech", "AI"]
|
||||
description: "https://rachsmith.com/ai-is-for-the-idea-guys/"
|
||||
link: "https://rachsmith.com/ai-is-for-the-idea-guys/"
|
||||
---
|
|
@ -0,0 +1,7 @@
|
|||
---
|
||||
title: "Why AI art will always kind of suck"
|
||||
date: "2024-05-23T08:40-08:00"
|
||||
tags: ["tech", "AI"]
|
||||
description: "Artificial intelligence has long been hailed as a great “equalizer” of creativity, finally putting the ability to create art in all of its myriad forms into the hands of the tech-savvy. Not a creative person? Not an issue."
|
||||
link: "https://www.vox.com/culture/351041/ai-art-chatgpt-dall-e-sora-suno-human-creativity"
|
||||
---
|
|
@ -8,6 +8,9 @@ permalink: /books/{{ book.isbn }}/
|
|||
isbn: {{ book.isbn }}
|
||||
schema: book
|
||||
---
|
||||
{%- capture alt -%}
|
||||
{{ book.title }}{% if book.authors %}By {{ book.authors }}{% endif %}
|
||||
{%- endcapture -%}
|
||||
<a class="back-link-header link-icon flex-centered" href="/books">{% tablericon "arrow-left" "Go back" %} Go back</a>
|
||||
<article class="book-focus">
|
||||
<div class="book-display">
|
||||
|
|
27
src/pages/main/watching/movie.html
Normal file
27
src/pages/main/watching/movie.html
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
layout: default
|
||||
pagination:
|
||||
data: movies.movies
|
||||
size: 1
|
||||
alias: movie
|
||||
permalink: /movies/{{ movie.id }}/
|
||||
schema: movie
|
||||
---
|
||||
{%- capture alt -%}
|
||||
{{ movie.title }} • {{ movie.year }}{% if move.rating %} ({{ movie.rating }}){% endif %}
|
||||
{%- endcapture -%}
|
||||
<a class="back-link-header link-icon flex-centered" href="/watching">{% tablericon "arrow-left" "Go back" %} Go back</a>
|
||||
<article class="watching-focus">
|
||||
<img src="https://coryd.dev/.netlify/images/?url={{ movie.backdrop }}&fm=webp&q=85&w=768&h=432" alt="{{ alt }}" class="image-banner" loading="eager" decoding="async" width="768" height="432" />
|
||||
<div class="watching-meta">
|
||||
<p class="title"><strong>{{ movie.title }}</strong></p>
|
||||
{% if movie.rating %}<p class="rating">{{ movie.rating }}</p>{% endif %}
|
||||
{% if movie.lastWatched %}<p class="sub-meta">Last watched on: {{ movie.lastWatched | date: "%B %e, %Y" }}</p>{% endif %}
|
||||
<p class="sub-meta"><a href="https://themoviedb.org/movie/{{ movie.id }}">View on TMDB</a></p>
|
||||
</div>
|
||||
{% if movie.review %}
|
||||
<p>{{ movie.review | markdown }}</p>
|
||||
<hr class="large-spacing" />
|
||||
{% endif %}
|
||||
{% if movie.description %}<p><em>{{ movie.description }}</em></p>{% endif %}
|
||||
</article>
|
27
src/pages/main/watching/show.html
Normal file
27
src/pages/main/watching/show.html
Normal file
|
@ -0,0 +1,27 @@
|
|||
---
|
||||
layout: default
|
||||
pagination:
|
||||
data: tv.shows
|
||||
size: 1
|
||||
alias: show
|
||||
permalink: /shows/{{ show.tmdb_id }}/
|
||||
schema: show
|
||||
---
|
||||
{%- capture alt -%}
|
||||
{{ show.title }} • {{ show.year }}
|
||||
{%- endcapture -%}
|
||||
{% assign lastWatched = show | getLastWatched %}
|
||||
<a class="back-link-header link-icon flex-centered" href="/watching">{% tablericon "arrow-left" "Go back" %} Go back</a>
|
||||
<article class="watching-focus">
|
||||
<img src="https://coryd.dev/.netlify/images/?url=https://coryd.dev/media/shows/backdrops/backdrop-{{ show.tmdb_id }}.jpg&fm=webp&q=85&w=768&h=432" alt="{{ alt }}" class="image-banner" loading="eager" decoding="async" width="768" height="432" />
|
||||
<div class="watching-meta">
|
||||
<p class="title"><strong>{{ show.title }}</strong></p>
|
||||
{% if lastWatched %}<p class="sub-meta">Last watched on: {{ lastWatched | date: "%B %e, %Y" }}</p>{% endif %}
|
||||
<p class="sub-meta"><a href="https://themoviedb.org/tv/{{ show.tmdb_id }}">View on TMDB</a></p>
|
||||
</div>
|
||||
{% if show.review %}
|
||||
<p>{{ show.review | markdown }}</p>
|
||||
<hr class="large-spacing" />
|
||||
{% endif %}
|
||||
{% if show.description %}<p><em>{{ show.description }}</em></p>{% endif %}
|
||||
</article>
|
|
@ -1,8 +1,8 @@
|
|||
---
|
||||
title: Referrals
|
||||
title: Save
|
||||
layout: default
|
||||
permalink: /referrals.html
|
||||
description: Referral links for services that I use.
|
||||
permalink: /save.html
|
||||
description: Save a little bit on services that I also use.
|
||||
---
|
||||
<h2 class="page-header">{{ title }}</h2>
|
||||
|
||||
|
|
24
src/posts/2024/boring-is-good.md
Normal file
24
src/posts/2024/boring-is-good.md
Normal file
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
date: 2024-05-22T08:47-08:00
|
||||
title: Boring is good
|
||||
description: Boring is good — often great. My favorite applications and tools are typically the most staid. The ones that change little or where there's a clear progression of minor versions leading to major versions.
|
||||
tags:
|
||||
- tech
|
||||
---
|
||||
Boring is good — often great. My favorite applications and tools are typically the most staid. The ones that change little or where there's a clear progression of minor versions leading to major versions.<!-- excerpt -->
|
||||
|
||||
Take, for example, [NetNewsWire](https://netnewswire.com). It's updated infrequently, does exactly what it sets out to do reliably and issues that are carefully considered and never disruptive. [Their app philosophy statement outlines this beautifully](https://netnewswire.com/philosophy.html):
|
||||
|
||||
> We believe that quality is more important than just piling on features; we believe that quality is the most important feature. And we believe that high quality is transformative — it makes for an app you never hesitate to reach for. You can rely on it, and you do, again and again.
|
||||
|
||||
That, to me, is the *best* kind of boring. If I'm investing in a tool, I want it to be developed in a way that best serves what it's intended to do. An RSS reader syncs feeds and displays them in a chronological order while making entries in the feed easy to read. NetNewsWire does that *perfectly*.
|
||||
|
||||
I see some of this attitude in Steph Ango's [file over app](https://stephango.com/file-over-app) philosophy. Files can be limiting, they can be boring but software — more than many other things — comes and goes. Files tend to be the boring, enduring output that software can (and should) enable. Applications and systems that abstract away file access are ones that tend to prevent access to data should they fail or fade away. That's not magic, that's lock-in or engineered precarity.
|
||||
|
||||
Email is boring by almost every possible measure or definition but it continues to work, continues to be open and allows access to data. If I send an email it generally just works (vagaries of ever-evolving spam filters aside).
|
||||
|
||||
Music used to only require audio files and a program to play them. We traded that boring simplicity for a model that — while arguably convenient for users — is utterly unpredictable. The album you had on repeat yesterday may be gone tomorrow.
|
||||
|
||||
New technology can offer exciting features that we think we need and it's easy to get caught up on the hype. When what's promised fails to be delivered or fails after it has been delivered (which is so often the case), it's hard to remain optimistic about new developments.
|
||||
|
||||
<strong class="highlight-text">Taking a steady, slower approach isn't bad — it's often much easier than navigating the peaks and troughs of hype and the disappointment that follows.</strong>
|
Reference in a new issue