Newer
Older
index.html / mariks / search.cgi
#!/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>"