#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'cgi'
require 'csv'
# エラーハンドラ
CGI.class_eval { class << self; define_method(:report_exception) { |e| puts "<pre>#{e.message}\n#{e.backtrace.join('\n')}</pre>" }; end }
cgi = CGI.new
puts cgi.header("type" => "text/html", "charset" => "utf-8")
# URLのパラメータから「番組ID(id)」を取得(例: search.cgi?id=1)
work_id = cgi.params['id'].first
# --- [データ処理フェーズ] ---
# 1. すべてのキャストの平均点算出のためのデータを集計
staff_ratings = Hash.new { |h, k| h[k] = [] }
# 2. 作品ごとの情報を整理する
works_repo = Hash.new { |h, k| h[k] = { title: "", genre: "", staffs: [], my_rating: 0 } }
CSV.foreach("works_data.csv") do |row|
next if row.empty?
id = row[0]
title = row[1]
genre = row[2]
staff = row[3]
rating = row[4].to_i
# スタッフごとの評価値をためる
staff_ratings[staff] << rating
# 作品ごとのデータに格納
works_repo[id][:title] = title
works_repo[id][:genre] = genre
works_repo[id][:staffs] << staff
# 今回はその作品の「最高点」を作品自体のスコアとする(簡易的な評価保持)
works_repo[id][:my_rating] = rating if rating > works_repo[id][:my_rating]
end
# スタッフの平均点を計算するハッシュ(追加要素!)
staff_averages = {}
staff_ratings.each do |staff, ratings|
staff_averages[staff] = (ratings.sum.to_f / ratings.size).round(2)
end
# --- [画面出力フェーズ] ---
puts "<html><head><title>Filmarks 改善版</title>"
puts "<style>
body { font-family: sans-serif; margin: 40px; background: #f4f4f4; color: #333; }
.card { background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); max-width: 600px; margin-bottom: 20px; }
.badge { background: #ff9900; color: white; padding: 3px 8px; border-radius: 3px; font-size: 0.8rem; }
.score { font-weight: bold; color: #ff5500; font-size: 1.2rem; }
.staff-tag { display: inline-block; background: #eee; margin: 5px; padding: 5px 10px; border-radius: 20px; font-size: 0.9rem; }
.avg { font-size: 0.8rem; color: #666; font-weight: bold; }
a { color: #0066cc; text-decoration: none; }
</style></head><body>"
if work_id.nil? || work_id.empty?
# =================================================================
# 【トップ画面】作品一覧をFilmarks風に並べる
# =================================================================
puts "<h1>🎬 Filmarks Custom (作品一覧)</h1>"
puts "<p>あなたがこれまでに記録した番組・映画のリストです:</p>"
works_repo.each do |id, data|
puts "<div class='card'>"
puts " <h3><a href='search.cgi?id=#{id}'>#{data[:title]}</a> <span class='badge'>#{data[:genre]}</span></h3>"
puts " <p>あなたの評価: <span class='score'>★ #{data[:my_rating]}.0</span></p>"
puts " <p style='font-size:0.9rem; color:#777;'>キャスト/スタッフ: #{data[:staffs].join(', ')}</p>"
puts "</div>"
end
else
# =================================================================
# 【詳細画面】Filmarksの「作品詳細ページ」を再現
# =================================================================
target_work = works_repo[work_id]
if target_work[:title].empty?
puts "<p>該当する作品が見つかりません。<a href='search.cgi'>トップへ戻る</a></p>"
else
puts "<h1>#{target_work[:title]}</h1>"
puts "<p class='badge'>#{target_work[:genre]}</p>"
puts "<div class='card'>"
puts " <h4>あなたの作品評価</h4>"
puts " <p class='score'>★ #{target_work[:my_rating]}.0</p>"
puts "</div>"
puts "<h3>👥 キャスト・スタッフ(およびあなたの評価の平均点)</h3>"
puts "<div class='card'>"
puts " <p>この人物名が含まれる作品に、あなたがつけた評価の平均値です:</p>"
target_work[:staffs].each do |staff|
avg_score = staff_averages[staff]
puts "<div class='staff-tag'>"
puts " <strong>#{staff}</strong> <span class='avg'>(関与作の平均: ★#{avg_score})</span>"
puts "</div>"
end
puts "</div>"
puts "<br><a href='search.cgi'>← 作品一覧に戻る</a>"
end
end
puts "</body></html>"