Add IMDB ID to movies
This commit is contained in:
23
Rakefile
23
Rakefile
@@ -2,12 +2,29 @@
|
||||
|
||||
require "dotenv"
|
||||
require "hanami/rake_tasks"
|
||||
require "down"
|
||||
|
||||
namespace :blog do
|
||||
task :load_environment do
|
||||
Dotenv.load("/home/blog/current/.env.production")
|
||||
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|
|
||||
page = Down.download(movie.url)
|
||||
match = page.read.match(/href=".+title\/(tt\d+)\/maindetails"/)
|
||||
imdb_id = match[1]
|
||||
|
||||
movie_repo.update(movie.id, {imdb_id: imdb_id})
|
||||
end
|
||||
end
|
||||
|
||||
task :load_from_letterboxd => ["blog:load_environment"] do
|
||||
require "hanami/prepare"
|
||||
require "scraperd"
|
||||
@@ -15,15 +32,13 @@ namespace :blog do
|
||||
client = Scraperd::Base.new
|
||||
activities = client.fetch('dnitza')
|
||||
|
||||
repo = Adamantium::Container["repos.movie_repo"]
|
||||
create_command = Admin::Container["commands.movies.create"]
|
||||
|
||||
activities.each do |activity|
|
||||
|
||||
title = CGI.unescapeHTML(activity.title)
|
||||
|
||||
next if repo.by_title_and_year(title: title, year: activity.year)
|
||||
|
||||
repo.create({
|
||||
create_command.({
|
||||
title: title,
|
||||
year: activity.year,
|
||||
url: activity.film_link,
|
||||
|
9
db/migrate/20230513012518_add_imdb_id_to_movies.rb
Normal file
9
db/migrate/20230513012518_add_imdb_id_to_movies.rb
Normal file
@@ -0,0 +1,9 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
ROM::SQL.migration do
|
||||
change do
|
||||
alter_table :movies do
|
||||
add_column :imdb_id, :text
|
||||
end
|
||||
end
|
||||
end
|
27
slices/admin/commands/movies/create.rb
Normal file
27
slices/admin/commands/movies/create.rb
Normal file
@@ -0,0 +1,27 @@
|
||||
require "down"
|
||||
|
||||
module Admin
|
||||
module Commands
|
||||
module Movies
|
||||
class Create
|
||||
|
||||
include Deps["repos.movie_repo"]
|
||||
|
||||
def call(movie)
|
||||
repo = Adamantium::Container["repos.movie_repo"]
|
||||
|
||||
next if repo.by_title_and_year(title: title, year: activity.year)
|
||||
|
||||
page = Down.download(activity.film_link)
|
||||
match = page.read.match(/href=".+title\/(tt\d+)\/maindetails"/)
|
||||
imdb_id = match[1]
|
||||
|
||||
movie = movie.merge(imdb_id: imdb_id) if imdb_id
|
||||
|
||||
repo.create(movie)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
19
slices/admin/repos/movie_repo.rb
Normal file
19
slices/admin/repos/movie_repo.rb
Normal file
@@ -0,0 +1,19 @@
|
||||
module Admin
|
||||
module Repos
|
||||
class MovieRepo < Adamantium::Repo[:movies]
|
||||
commands :create
|
||||
|
||||
def by_title_and_year(title:, year:)
|
||||
movies.where(title: title, year: year).one
|
||||
end
|
||||
|
||||
def listing
|
||||
movies.order(Sequel.lit("year desc")).to_a
|
||||
end
|
||||
|
||||
def update(id, attrs)
|
||||
movies.where(id: id).update(attrs)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
Reference in New Issue
Block a user