diff --git a/mariks/search.cgi b/mariks/search.cgi new file mode 100644 index 0000000..5c5a662 --- /dev/null +++ b/mariks/search.cgi @@ -0,0 +1,106 @@ +#!/usr/bin/env ruby +# -*- coding: utf-8 -*- + +require 'cgi' +require 'csv' + +# エラーハンドラ +CGI.class_eval { class << self; define_method(:report_exception) { |e| puts "
#{e.message}\n#{e.backtrace.join('\n')}
" }; 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 "Filmarks 改善版" +puts "" + +if work_id.nil? || work_id.empty? + # ================================================================= + # 【トップ画面】作品一覧をFilmarks風に並べる + # ================================================================= + puts "

🎬 Filmarks Custom (作品一覧)

" + puts "

あなたがこれまでに記録した番組・映画のリストです:

" + + works_repo.each do |id, data| + puts "
" + puts "

#{data[:title]} #{data[:genre]}

" + puts "

あなたの評価: ★ #{data[:my_rating]}.0

" + puts "

キャスト/スタッフ: #{data[:staffs].join(', ')}

" + puts "
" + end + +else + # ================================================================= + # 【詳細画面】Filmarksの「作品詳細ページ」を再現 + # ================================================================= + target_work = works_repo[work_id] + + if target_work[:title].empty? + puts "

該当する作品が見つかりません。トップへ戻る

" + else + puts "

#{target_work[:title]}

" + puts "

#{target_work[:genre]}

" + puts "
" + puts "

あなたの作品評価

" + puts "

★ #{target_work[:my_rating]}.0

" + puts "
" + + puts "

👥 キャスト・スタッフ(およびあなたの評価の平均点)

" + puts "
" + puts "

この人物名が含まれる作品に、あなたがつけた評価の平均値です:

" + + target_work[:staffs].each do |staff| + avg_score = staff_averages[staff] + puts "
" + puts " #{staff} (関与作の平均: ★#{avg_score})" + puts "
" + end + puts "
" + + puts "
← 作品一覧に戻る" + end +end + +puts ""