rss_timeline 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- checksums.yaml.gz.sig +0 -0
- data/lib/rss_timeline.rb +68 -59
- data.tar.gz.sig +0 -0
- metadata +34 -31
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e7d0917dcf6a4513e264221316f73df4adac9a0837f253e5ed74b04bbbfb8069
|
4
|
+
data.tar.gz: 05ab3115b5903debd742932fe16fd764194224cd2398992e542c0049a5614aad
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcc1eb504d8e6619ab4749230d9094f5e4610ed08e1da76ab2f2db8124c0885e7f36287585a08a6c42123be084cb489db97d82775834ebbd9dae54c3fc452a68
|
7
|
+
data.tar.gz: f36f5f339757d11a464b7632f9da9bb31aeb784c456889c96cb90c815792c26159834eca245410daa9d5dc3ab152664e2db3ee1d06315992636e5ac78ddf29d6
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/rss_timeline.rb
CHANGED
@@ -4,17 +4,18 @@
|
|
4
4
|
|
5
5
|
require 'simple-rss'
|
6
6
|
require 'open-uri'
|
7
|
-
require 'fileutils'
|
8
7
|
require 'rss_creator'
|
8
|
+
require 'rxfreadwrite'
|
9
9
|
|
10
10
|
|
11
11
|
class RSStimeline
|
12
|
-
|
12
|
+
include RXFReadWriteModule
|
13
|
+
|
13
14
|
attr_accessor :rssfile
|
14
15
|
|
15
|
-
def initialize(feeds=[], rssfile: 'timeline.rss', xslt: nil,
|
16
|
+
def initialize(feeds=[], rssfile: 'timeline.rss', xslt: nil,
|
16
17
|
filepath: '.', debug: false, target_filepath: nil)
|
17
|
-
|
18
|
+
|
18
19
|
@source_feeds, @debug, @rssfile, @newupdate = feeds, debug, rssfile, false
|
19
20
|
@target_filepath = target_filepath
|
20
21
|
|
@@ -24,18 +25,18 @@ class RSStimeline
|
|
24
25
|
@cache_filepath = File.join(@filepath, 'cache')
|
25
26
|
|
26
27
|
# create a cache directory if it doesn't already exist
|
27
|
-
|
28
|
+
FileX.mkdir_p @cache_filepath
|
28
29
|
|
29
|
-
if
|
30
|
-
@timeline =RSScreator.new rssfile
|
31
|
-
else
|
30
|
+
if FileX.exists? rssfile then
|
31
|
+
@timeline = RSScreator.new rssfile
|
32
|
+
else
|
32
33
|
|
33
|
-
@timeline =RSScreator.new
|
34
|
+
@timeline = RSScreator.new
|
34
35
|
self.title = 'My RSStimeline feed'
|
35
|
-
self.description = 'Generated using the RSStimeline gem'
|
36
|
-
|
36
|
+
self.description = 'Generated using the RSStimeline gem'
|
37
|
+
|
37
38
|
end
|
38
|
-
|
39
|
+
|
39
40
|
@timeline.xslt = xslt if xslt
|
40
41
|
puts '@timeline.xslt : ' + @timeline.xslt.inspect if @debug
|
41
42
|
|
@@ -44,127 +45,135 @@ class RSStimeline
|
|
44
45
|
def update()
|
45
46
|
|
46
47
|
# fetch the feeds from the web
|
47
|
-
feeds = @source_feeds.map
|
48
|
+
feeds = @source_feeds.map do |feed|
|
49
|
+
#force_encoding('UTF-8')
|
50
|
+
[feed, SimpleRSS.parse(URI.open(feed).read.force_encoding('UTF-8'))]
|
51
|
+
end
|
48
52
|
|
49
53
|
# check for each feed from the cache.
|
50
54
|
# if the feed is in the cache, compare the 2 to find any new items.
|
51
55
|
# New items should be added to the main timeline RSS feed
|
52
|
-
|
56
|
+
|
53
57
|
updated = false
|
54
58
|
|
55
59
|
feeds.each do |feed, rss|
|
56
60
|
|
57
61
|
rssfile = File.join(@cache_filepath, feed[6..-1].gsub(/\W+/,'').\
|
58
62
|
reverse.slice(0,40).reverse)
|
59
|
-
|
63
|
+
|
60
64
|
if File.exists? rssfile then
|
61
65
|
|
62
|
-
rss_cache = SimpleRSS.parse
|
66
|
+
rss_cache = SimpleRSS.parse FileX.read(rssfile).force_encoding('UTF-8')
|
63
67
|
|
64
68
|
fresh, old = [rss.items, rss_cache.items].map do |feed|
|
65
69
|
feed.clone.each {|x| x.delete :guid }
|
66
70
|
end
|
67
|
-
|
71
|
+
|
72
|
+
|
68
73
|
new_items = fresh - old
|
69
|
-
|
74
|
+
|
75
|
+
if @debug then
|
76
|
+
puts 'fresh: ' + fresh.inspect
|
77
|
+
puts 'old: ' + old.inspect
|
78
|
+
puts 'new_items: ' + new_items.inspect
|
79
|
+
end
|
80
|
+
|
70
81
|
new_rss_items = new_items.map do |x|
|
71
82
|
rss.items.find {|y| y[:title] == x[:title]}
|
72
83
|
end
|
73
|
-
|
84
|
+
|
74
85
|
new_rss_items.reverse.each {|item| add_new item}
|
75
|
-
|
86
|
+
|
76
87
|
if new_rss_items.any? then
|
77
88
|
puts 'new_rss_items: ' + new_rss_items.inspect if @debug
|
78
89
|
updated = true
|
79
|
-
|
90
|
+
FileX.write rssfile, rss.source
|
80
91
|
end
|
81
|
-
|
92
|
+
|
82
93
|
else
|
83
94
|
|
84
95
|
updated = true
|
85
96
|
add_new rss.items.first
|
86
|
-
|
87
|
-
|
97
|
+
FileX.write rssfile, rss.source
|
98
|
+
|
88
99
|
end
|
89
100
|
end
|
90
|
-
|
101
|
+
|
91
102
|
save() if updated
|
92
|
-
|
103
|
+
|
93
104
|
end
|
94
|
-
|
105
|
+
|
95
106
|
def description()
|
96
107
|
@timeline.description
|
97
108
|
end
|
98
|
-
|
109
|
+
|
99
110
|
def description=(val)
|
100
111
|
@timeline.description = val
|
101
112
|
end
|
102
|
-
|
113
|
+
|
103
114
|
def link(val)
|
104
115
|
@timeline.link
|
105
116
|
end
|
106
|
-
|
117
|
+
|
107
118
|
def link=(val)
|
108
119
|
@timeline = val
|
109
120
|
end
|
110
|
-
|
121
|
+
|
111
122
|
def title()
|
112
123
|
@timeline.title
|
113
124
|
end
|
114
|
-
|
125
|
+
|
115
126
|
def title=(val)
|
116
127
|
@timeline.title = val
|
117
128
|
end
|
118
|
-
|
129
|
+
|
119
130
|
protected
|
120
|
-
|
131
|
+
|
121
132
|
def on_new_item(item)
|
122
|
-
# you can override this method to create your
|
133
|
+
# you can override this method to create your
|
123
134
|
# own notifier, callback, or webhook
|
124
135
|
end
|
125
|
-
|
136
|
+
|
126
137
|
def on_update()
|
127
|
-
# you can override this method to create your
|
138
|
+
# you can override this method to create your
|
128
139
|
# own notifier, callback, or webhook
|
129
|
-
end
|
130
|
-
|
140
|
+
end
|
141
|
+
|
131
142
|
private
|
132
|
-
|
143
|
+
|
133
144
|
def add_new(item)
|
134
|
-
|
145
|
+
|
135
146
|
puts 'inside add_new: ' + item.inspect if @debug
|
136
|
-
|
147
|
+
|
137
148
|
@timeline.add item: new_item(item), id: nil
|
138
149
|
@newupdate = true
|
139
150
|
on_new_item(item)
|
140
|
-
|
151
|
+
|
141
152
|
end
|
142
|
-
|
153
|
+
|
143
154
|
def new_item(x)
|
144
|
-
|
155
|
+
|
145
156
|
h = {
|
146
|
-
title: x[:title],
|
147
|
-
link: x[:link],
|
148
|
-
description: x[:description],
|
157
|
+
title: x[:title],
|
158
|
+
link: x[:link],
|
159
|
+
description: x[:description],
|
149
160
|
date: x[:date] || Time.now.strftime("%a, %d %b %Y %H:%M:%S %z")
|
150
161
|
}
|
151
|
-
|
162
|
+
|
152
163
|
puts 'inside new_item: ' + h.inspect if @debug
|
153
|
-
|
164
|
+
|
154
165
|
h
|
155
|
-
|
166
|
+
|
156
167
|
end
|
157
|
-
|
168
|
+
|
158
169
|
def save()
|
159
|
-
|
160
|
-
#return unless @newupdate
|
161
|
-
|
162
|
-
on_update()
|
170
|
+
|
163
171
|
@newupdate = false
|
164
|
-
|
172
|
+
|
165
173
|
@timeline.save File.join(@filepath, @rssfile)
|
166
174
|
@timeline.save File.join(@target_filepath, @rssfile) if @target_filepath
|
167
|
-
|
175
|
+
on_update()
|
176
|
+
|
168
177
|
end
|
169
|
-
|
178
|
+
|
170
179
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rss_timeline
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -10,28 +10,32 @@ bindir: bin
|
|
10
10
|
cert_chain:
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
13
|
+
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
14
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjExMTE4MjAxMzM1WhcN
|
15
|
+
MjIxMTE4MjAxMzM1WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDYKlzN
|
17
|
+
KH/j7oHZwXPLafmGaNIE3UnTuZTPLiCbA+X1mObp6e8SovbKJ3WvOylNJlYviuYs
|
18
|
+
NnqPNQkvEod9UO8KgAZQj0wlEgWanwy7KR1DUV+0D/Kun/8Dl0v/UE/rSj9ydq2s
|
19
|
+
/VcWUh8oQb4wG56Z1p9SK+Mc2TCX+FL2K9pT56ucPbM24oTjl94nEtEY5cFdyrOa
|
20
|
+
AEGFy1/Oi2Iu9eXJqLdjgz0FE415GDVjYkXogDLG00bAM52nWci4n6WCz0NaX/FS
|
21
|
+
/0Tub2lRyAdJrWudSTrYOzPnzo6PK0Pjh+I4tDfxLTEiFTPIkell+4JKCvXHvEea
|
22
|
+
Un3WaXbfXSwOWlCj+5zY72eFBQZ2IT62q3qzWWi+PD3dAtZM9dIK0L2kEuglxfbc
|
23
|
+
V6B7qqJ9fQD4gTusK/MVHNxMPaIT6UETylCOVpAKJZ0tEj8sCTWU0D2bIdRSSfEc
|
24
|
+
RWVlFXpJesLEEop6+iury3JvxihI9S076m7E55ojJMpFACe8L8KXXf7Q5kECAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUAKcS66Hl
|
26
|
+
dLaIygyjsXnSn8Gc57swJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
|
+
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEAkWHEHy5EGJHkge8TV3hzuOH/GYQeoakANku7H4v2
|
29
|
+
SuitANiu/DqbFrLcxtRYCnJw0GZOvpE6fB/5ismWaPw0binwkOfHmhQTsJMQmEo8
|
30
|
+
fnwBfuItZ77wNKugBwHdseIV56sN37B/3Xdz1MPBOVk+UdykaSmk13XvPAZIz2aT
|
31
|
+
i13sS30Wa7gj2BxxjzYgDXsn5hniFTrc4Xf5bb99PudQXz51Mc7UxeaQ12NgqsCq
|
32
|
+
dYahrHrep87Kr4mFPl1nfvqM3OArdV720fwePgciO7suRIXPfI8qVnABIlFpWHoo
|
33
|
+
uT7Xa9HSWeV7zMgohnPRGVbF+r2yPsVUXPZmb+coXUV4WHsCLypaDojqCanNouyo
|
34
|
+
uV5AKfB2wO57X83nRdJ8OzrUzCZVxYX3WpTbUIn/n0k4h7CoCRinO/wUM9aCEuyL
|
35
|
+
9TjZeJfzvcT9qoVK2mzNoDK6P7AL4m7kfnLfQUIc2aF5x9/zIcBi5tEMDcnujsKH
|
36
|
+
l5hjs/75OfrhM2lNdizSwpSW
|
33
37
|
-----END CERTIFICATE-----
|
34
|
-
date:
|
38
|
+
date: 2022-03-11 00:00:00.000000000 Z
|
35
39
|
dependencies:
|
36
40
|
- !ruby/object:Gem::Dependency
|
37
41
|
name: simple-rss
|
@@ -42,7 +46,7 @@ dependencies:
|
|
42
46
|
version: '1.3'
|
43
47
|
- - ">="
|
44
48
|
- !ruby/object:Gem::Version
|
45
|
-
version: 1.3.
|
49
|
+
version: 1.3.3
|
46
50
|
type: :runtime
|
47
51
|
prerelease: false
|
48
52
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -52,29 +56,29 @@ dependencies:
|
|
52
56
|
version: '1.3'
|
53
57
|
- - ">="
|
54
58
|
- !ruby/object:Gem::Version
|
55
|
-
version: 1.3.
|
59
|
+
version: 1.3.3
|
56
60
|
- !ruby/object:Gem::Dependency
|
57
61
|
name: rss_creator
|
58
62
|
requirement: !ruby/object:Gem::Requirement
|
59
63
|
requirements:
|
60
64
|
- - "~>"
|
61
65
|
- !ruby/object:Gem::Version
|
62
|
-
version: '0.
|
66
|
+
version: '0.4'
|
63
67
|
- - ">="
|
64
68
|
- !ruby/object:Gem::Version
|
65
|
-
version: 0.
|
69
|
+
version: 0.4.2
|
66
70
|
type: :runtime
|
67
71
|
prerelease: false
|
68
72
|
version_requirements: !ruby/object:Gem::Requirement
|
69
73
|
requirements:
|
70
74
|
- - "~>"
|
71
75
|
- !ruby/object:Gem::Version
|
72
|
-
version: '0.
|
76
|
+
version: '0.4'
|
73
77
|
- - ">="
|
74
78
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.
|
79
|
+
version: 0.4.2
|
76
80
|
description:
|
77
|
-
email:
|
81
|
+
email: digital.robertson@gmail.com
|
78
82
|
executables: []
|
79
83
|
extensions: []
|
80
84
|
extra_rdoc_files: []
|
@@ -99,8 +103,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
99
103
|
- !ruby/object:Gem::Version
|
100
104
|
version: '0'
|
101
105
|
requirements: []
|
102
|
-
|
103
|
-
rubygems_version: 2.6.13
|
106
|
+
rubygems_version: 3.2.22
|
104
107
|
signing_key:
|
105
108
|
specification_version: 4
|
106
109
|
summary: An RSS aggregator which generates an RSS file
|
metadata.gz.sig
CHANGED
Binary file
|