@@ -16,6 +16,26 @@ def safe_open(url)
16
16
end
17
17
end
18
18
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
+
19
39
namespace :news do
20
40
desc 'RSS フィードから最新ニュースを取得し、db/news.yml に書き出す'
21
41
task fetch : :environment do
@@ -45,24 +65,7 @@ namespace :news do
45
65
]
46
66
end
47
67
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 ) }
66
69
67
70
# 既存データをハッシュに変換(URL をキーに)
68
71
existing_items_hash = existing_news . index_by { |item | item [ 'url' ] }
@@ -73,12 +76,12 @@ namespace :news do
73
76
74
77
new_items . each do |new_item |
75
78
if existing_items_hash . key? ( new_item [ 'url' ] )
76
- # 既存アイテムの更新
77
79
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
80
84
else
81
- # 完全に新しいアイテム
82
85
truly_new_items << new_item
83
86
end
84
87
end
0 commit comments