@@ -16,6 +16,26 @@ def safe_open(url)
1616 end
1717end
1818
19+ def fetch_rss_items ( url , logger )
20+ logger . info ( "Fetching RSS → #{ url } " )
21+ begin
22+ rss = safe_open ( url )
23+ feed = RSS ::Parser . parse ( rss , false )
24+ feed . items . map { |item | item_to_hash ( item ) }
25+ rescue => e
26+ logger . warn ( "⚠️ Failed to fetch #{ url } : #{ e . message } " )
27+ [ ]
28+ end
29+ end
30+
31+ def item_to_hash ( item )
32+ {
33+ 'url' => item . link ,
34+ 'title' => item . title ,
35+ 'published_at' => item . pubDate . to_s
36+ }
37+ end
38+
1939namespace :news do
2040 desc 'RSS フィードから最新ニュースを取得し、db/news.yml に書き出す'
2141 task fetch : :environment do
@@ -45,24 +65,7 @@ namespace :news do
4565 ]
4666 end
4767
48- # RSS 取得&パース
49- new_items = feed_urls . flat_map do |url |
50- logger . info ( "Fetching RSS → #{ url } " )
51- begin
52- rss = safe_open ( url )
53- feed = RSS ::Parser . parse ( rss , false )
54- feed . items . map do |item |
55- {
56- 'url' => item . link ,
57- 'title' => item . title ,
58- 'published_at' => item . pubDate . to_s
59- }
60- end
61- rescue => e
62- logger . warn ( "⚠️ Failed to fetch #{ url } : #{ e . message } " )
63- [ ]
64- end
65- end
68+ new_items = feed_urls . flat_map { |url | fetch_rss_items ( url , logger ) }
6669
6770 # 既存データをハッシュに変換(URL をキーに)
6871 existing_items_hash = existing_news . index_by { |item | item [ 'url' ] }
@@ -73,12 +76,12 @@ namespace :news do
7376
7477 new_items . each do |new_item |
7578 if existing_items_hash . key? ( new_item [ 'url' ] )
76- # 既存アイテムの更新
7779 existing_item = existing_items_hash [ new_item [ 'url' ] ]
78- updated_item = existing_item . merge ( new_item ) # 新しい情報で更新
79- updated_items << updated_item
80+ # タイトルまたは公開日が変わった場合のみ更新
81+ if existing_item [ 'title' ] != new_item [ 'title' ] || existing_item [ 'published_at' ] != new_item [ 'published_at' ]
82+ updated_items << existing_item . merge ( new_item )
83+ end
8084 else
81- # 完全に新しいアイテム
8285 truly_new_items << new_item
8386 end
8487 end
0 commit comments