Show movies watched on weekly posts
This commit is contained in:
1
Gemfile
1
Gemfile
@@ -46,6 +46,7 @@ gem "lastfm", "~> 1.27"
|
|||||||
gem "mail"
|
gem "mail"
|
||||||
gem "que"
|
gem "que"
|
||||||
gem "connection_pool"
|
gem "connection_pool"
|
||||||
|
gem "omdb-api", require: false
|
||||||
|
|
||||||
group :cli, :development do
|
group :cli, :development do
|
||||||
gem "hanami-reloader"
|
gem "hanami-reloader"
|
||||||
|
12
Gemfile.lock
12
Gemfile.lock
@@ -48,6 +48,11 @@ GIT
|
|||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
|
activesupport (7.0.4.3)
|
||||||
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
|
i18n (>= 1.6, < 2)
|
||||||
|
minitest (>= 5.1)
|
||||||
|
tzinfo (~> 2.0)
|
||||||
addressable (2.8.4)
|
addressable (2.8.4)
|
||||||
public_suffix (>= 2.0.2, < 6.0)
|
public_suffix (>= 2.0.2, < 6.0)
|
||||||
airbrussh (1.4.1)
|
airbrussh (1.4.1)
|
||||||
@@ -261,6 +266,7 @@ GEM
|
|||||||
mime-types-data (~> 3.2015)
|
mime-types-data (~> 3.2015)
|
||||||
mime-types-data (3.2023.0218.1)
|
mime-types-data (3.2023.0218.1)
|
||||||
mini_mime (1.1.2)
|
mini_mime (1.1.2)
|
||||||
|
minitest (5.18.0)
|
||||||
multi_xml (0.6.0)
|
multi_xml (0.6.0)
|
||||||
mustermann (3.0.0)
|
mustermann (3.0.0)
|
||||||
ruby2_keywords (~> 0.0.1)
|
ruby2_keywords (~> 0.0.1)
|
||||||
@@ -292,6 +298,9 @@ GEM
|
|||||||
ogpr (1.1.0)
|
ogpr (1.1.0)
|
||||||
nokogiri (~> 1.8)
|
nokogiri (~> 1.8)
|
||||||
rest-client (~> 2.1.0)
|
rest-client (~> 2.1.0)
|
||||||
|
omdb-api (1.4.3)
|
||||||
|
activesupport
|
||||||
|
httparty
|
||||||
parallel (1.23.0)
|
parallel (1.23.0)
|
||||||
parser (3.2.2.1)
|
parser (3.2.2.1)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
@@ -419,6 +428,8 @@ GEM
|
|||||||
timecop (0.9.6)
|
timecop (0.9.6)
|
||||||
timeout (0.3.2)
|
timeout (0.3.2)
|
||||||
transproc (1.1.1)
|
transproc (1.1.1)
|
||||||
|
tzinfo (2.0.6)
|
||||||
|
concurrent-ruby (~> 1.0)
|
||||||
unf (0.1.4)
|
unf (0.1.4)
|
||||||
unf_ext
|
unf_ext
|
||||||
unf_ext (0.0.8.2)
|
unf_ext (0.0.8.2)
|
||||||
@@ -466,6 +477,7 @@ DEPENDENCIES
|
|||||||
mail
|
mail
|
||||||
matrix
|
matrix
|
||||||
ogpr
|
ogpr
|
||||||
|
omdb-api
|
||||||
pg
|
pg
|
||||||
pinboard!
|
pinboard!
|
||||||
puma
|
puma
|
||||||
|
23
Rakefile
23
Rakefile
@@ -9,29 +9,6 @@ namespace :blog do
|
|||||||
Dotenv.load("/home/blog/current/.env.production")
|
Dotenv.load("/home/blog/current/.env.production")
|
||||||
end
|
end
|
||||||
|
|
||||||
task :backfill_movie_imdb_ids => ["blog:load_environment"] do
|
|
||||||
require "hanami/prepare"
|
|
||||||
|
|
||||||
movie_repo = Admin::Container["repos.movie_repo"]
|
|
||||||
|
|
||||||
movies = movie_repo.listing
|
|
||||||
|
|
||||||
movies.each do |movie|
|
|
||||||
record = movie_repo.by_url(url: movie.url)
|
|
||||||
|
|
||||||
next unless record.imdb_id.nil?
|
|
||||||
|
|
||||||
page = Down.download(movie.url)
|
|
||||||
match = page.read.match(/href=".+title\/(tt\d+)\/maindetails"/)
|
|
||||||
|
|
||||||
next unless match
|
|
||||||
|
|
||||||
imdb_id = match[1]
|
|
||||||
|
|
||||||
movie_repo.update(movie.id, {imdb_id: imdb_id})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
task :load_from_letterboxd => ["blog:load_environment"] do
|
task :load_from_letterboxd => ["blog:load_environment"] do
|
||||||
require "hanami/prepare"
|
require "hanami/prepare"
|
||||||
require "scraperd"
|
require "scraperd"
|
||||||
|
22
app/decorators/movies/decorator.rb
Normal file
22
app/decorators/movies/decorator.rb
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# frozen_string_literal: false
|
||||||
|
|
||||||
|
# auto_register: false
|
||||||
|
|
||||||
|
module Adamantium
|
||||||
|
module Decorators
|
||||||
|
module Movies
|
||||||
|
class Decorator < SimpleDelegator
|
||||||
|
|
||||||
|
include Deps["clients.omdb"]
|
||||||
|
|
||||||
|
def poster
|
||||||
|
omdb_record.poster
|
||||||
|
end
|
||||||
|
|
||||||
|
def omdb_record
|
||||||
|
@omdb_record ||= omdb.call(imdb_id: imdb_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@@ -10,6 +10,24 @@ module Adamantium
|
|||||||
def by_title_and_year(title:, year:)
|
def by_title_and_year(title:, year:)
|
||||||
movies.where(title: title, year: year).one
|
movies.where(title: title, year: year).one
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def from_the_archives(start_date:, end_date:)
|
||||||
|
# SELECT * FROM posts
|
||||||
|
# WHERE EXTRACT(month FROM "published_at") >= 2
|
||||||
|
# WHERE EXTRACT(month FROM "published_at") <= 2+
|
||||||
|
# AND EXTRACT(day FROM "published_at") > 20
|
||||||
|
# AND EXTRACT(day FROM "published_at") < 27
|
||||||
|
# AND post_type = 'post';
|
||||||
|
|
||||||
|
movies
|
||||||
|
.where { Sequel.extract(:year, :watched_at) >= start_date.year }
|
||||||
|
.where { Sequel.extract(:year, :watched_at) <= start_date.year }
|
||||||
|
.where { Sequel.extract(:month, :watched_at) >= start_date.month }
|
||||||
|
.where { Sequel.extract(:month, :watched_at) <= end_date.month }
|
||||||
|
.where { Sequel.extract(:day, :watched_at) >= start_date.day }
|
||||||
|
.where { Sequel.extract(:day, :watched_at) <= end_date.day }
|
||||||
|
.to_a
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
@@ -40,6 +40,16 @@ article class="h-entry"
|
|||||||
div class="max-w-prose mx-auto text-gray-600 dark:text-gray-200 flex gap-4"
|
div class="max-w-prose mx-auto text-gray-600 dark:text-gray-200 flex gap-4"
|
||||||
div class="grow" hx-get="/post/top_tracks/#{post.slug}" hx-trigger="load"
|
div class="grow" hx-get="/post/top_tracks/#{post.slug}" hx-trigger="load"
|
||||||
|
|
||||||
|
- if past_movies.count > 0
|
||||||
|
div class="max-w-prose mx-auto text-gray-600 dark:text-gray-200 mb-4"
|
||||||
|
h3 class="text-xl" Movies watched
|
||||||
|
div class="flex gap-4 pb-4 mt-4"
|
||||||
|
- past_movies.map do |movie|
|
||||||
|
a href=movie.url
|
||||||
|
figure
|
||||||
|
img class="rounded hover:opacity-80" src=movie.poster
|
||||||
|
figcaption= movie.title
|
||||||
|
hr
|
||||||
- if text_posts.count > 0
|
- if text_posts.count > 0
|
||||||
div class="block grow bg-blue-100 dark:bg-blue-600 rounded px-4 py-2 mb-12"
|
div class="block grow bg-blue-100 dark:bg-blue-600 rounded px-4 py-2 mb-12"
|
||||||
p class="text-sm mb-0" This week, years ago
|
p class="text-sm mb-0" This week, years ago
|
||||||
|
@@ -4,7 +4,7 @@ module Adamantium
|
|||||||
module Views
|
module Views
|
||||||
module Posts
|
module Posts
|
||||||
class Show < Adamantium::View
|
class Show < Adamantium::View
|
||||||
include Deps["repos.post_repo"]
|
include Deps["repos.post_repo", "repos.movie_repo"]
|
||||||
|
|
||||||
expose :post do |slug:|
|
expose :post do |slug:|
|
||||||
Decorators::Posts::Decorator.new(post_repo.fetch!(slug))
|
Decorators::Posts::Decorator.new(post_repo.fetch!(slug))
|
||||||
@@ -17,6 +17,13 @@ module Adamantium
|
|||||||
posts.map { |p| Decorators::Posts::Decorator.new(p) }
|
posts.map { |p| Decorators::Posts::Decorator.new(p) }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
expose :past_movies do |post|
|
||||||
|
start_date = TimeMath.week.floor(post.published_at)
|
||||||
|
end_date = TimeMath.week.ceil(post.published_at)
|
||||||
|
movies = movie_repo.from_the_archives(start_date: start_date, end_date: end_date)
|
||||||
|
movies.map { |p| Decorators::Movies::Decorator.new(p) }
|
||||||
|
end
|
||||||
|
|
||||||
expose :text_posts do |past_posts|
|
expose :text_posts do |past_posts|
|
||||||
past_posts.reject(&:photos?)
|
past_posts.reject(&:photos?)
|
||||||
end
|
end
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
Hanami.app.register_provider :clients, namespace: true do
|
Hanami.app.register_provider :clients, namespace: true do
|
||||||
start do
|
start do
|
||||||
register "mastodon", Adamantium::Client::Mastodon.new
|
register "mastodon", Adamantium::Client::Mastodon.new
|
||||||
|
register "omdb", Adamantium::Client::Omdb.new(api_key: target["settings"].omdb_api_key)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@@ -28,6 +28,8 @@ module Adamantium
|
|||||||
setting :lastfm_api_key, default: nil
|
setting :lastfm_api_key, default: nil
|
||||||
setting :lastfm_secret, default: nil
|
setting :lastfm_secret, default: nil
|
||||||
|
|
||||||
|
setting :omdb_api_key, default: nil
|
||||||
|
|
||||||
setting :from_email, default: nil
|
setting :from_email, default: nil
|
||||||
setting :dayone_email, default: nil
|
setting :dayone_email, default: nil
|
||||||
|
|
||||||
|
15
lib/adamantium/client/omdb.rb
Normal file
15
lib/adamantium/client/omdb.rb
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
require "omdb/api"
|
||||||
|
|
||||||
|
module Adamantium
|
||||||
|
module Client
|
||||||
|
class Omdb
|
||||||
|
def initialize(api_key:)
|
||||||
|
@client = ::Omdb::Api::Client.new(api_key: api_key)
|
||||||
|
end
|
||||||
|
|
||||||
|
def call(imdb_id:)
|
||||||
|
@client.find_by_id(imdb_id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
@@ -1172,6 +1172,10 @@ video {
|
|||||||
width: 1.5rem;
|
width: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.w-3 {
|
||||||
|
width: 0.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
.max-w-prose {
|
.max-w-prose {
|
||||||
max-width: 65ch;
|
max-width: 65ch;
|
||||||
}
|
}
|
||||||
@@ -1442,6 +1446,10 @@ video {
|
|||||||
padding-top: 1rem;
|
padding-top: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pb-4 {
|
||||||
|
padding-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.text-left {
|
.text-left {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
}
|
}
|
||||||
@@ -1478,6 +1486,10 @@ video {
|
|||||||
font-size: 0.75rem;
|
font-size: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.text-2xl {
|
||||||
|
font-size: 1.563rem;
|
||||||
|
}
|
||||||
|
|
||||||
.font-bold {
|
.font-bold {
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
@@ -7,10 +7,6 @@ module Admin
|
|||||||
movies.where(title: title, year: year).one
|
movies.where(title: title, year: year).one
|
||||||
end
|
end
|
||||||
|
|
||||||
def by_url(url:)
|
|
||||||
movies.where(url: url).one
|
|
||||||
end
|
|
||||||
|
|
||||||
def listing
|
def listing
|
||||||
movies.order(Sequel.lit("year desc")).to_a
|
movies.order(Sequel.lit("year desc")).to_a
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user