aniview 2.1.2 → 3.0.1
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 +4 -4
- data/bin/aniview +4 -4
- data/lib/aniview.rb +1 -1
- data/lib/aniview/interface/animeio/animefile.rb +4 -2
- data/lib/aniview/interface/animeio/animeio.rb +226 -175
- data/lib/aniview/interface/animeio/animeseries.rb +29 -45
- data/lib/aniview/interface/bridge.rb +11 -0
- data/lib/aniview/interface/deluge/delugec.rb +16 -10
- data/lib/aniview/interface/item.rb +3 -0
- data/lib/aniview/interface/mpv/mpvbridge.rb +38 -8
- data/lib/aniview/interface/pref/defaults.json +6 -5
- data/lib/aniview/interface/pref/pref.rb +40 -16
- data/lib/aniview/interface/pref/validate.json +2 -1
- data/lib/aniview/interface/schedule/schedule.rb +17 -18
- data/lib/aniview/interface/subscription/subscription.rb +22 -16
- data/lib/aniview/util/util.rb +1 -1
- data/lib/aniview/view/aiomenu.rb +15 -23
- data/lib/aniview/view/delugemenu.rb +12 -21
- data/lib/aniview/view/menu.rb +123 -91
- data/lib/aniview/view/prefmenu.rb +11 -27
- data/lib/aniview/view/schedulemenu.rb +0 -11
- data/lib/aniview/view/statusline.rb +42 -5
- data/lib/aniview/view/subscriptionmenu.rb +16 -20
- data/lib/application.rb +89 -68
- data/lib/daemon.rb +20 -6
- metadata +3 -2
@@ -2,15 +2,21 @@ require 'simple-rss'
|
|
2
2
|
require 'open-uri'
|
3
3
|
|
4
4
|
require_relative "../schedule/scheduleitem"
|
5
|
+
require_relative '../bridge'
|
5
6
|
|
6
7
|
module Aniview
|
7
8
|
module Interface
|
8
|
-
class Subscription
|
9
|
+
class Subscription < Bridge
|
10
|
+
|
11
|
+
include Observable
|
12
|
+
|
9
13
|
def initialize pref, schedule, delugec, client
|
10
14
|
@c = client
|
11
15
|
@pref = pref
|
12
16
|
@schedule = schedule
|
13
17
|
@delugec = delugec
|
18
|
+
#SimpleRSS.feed_tags << :"torrent:magnetURI"
|
19
|
+
#<![CDATA[
|
14
20
|
end
|
15
21
|
|
16
22
|
def log s
|
@@ -28,6 +34,10 @@ module Aniview
|
|
28
34
|
def getLastChecked
|
29
35
|
@c.lastchecked
|
30
36
|
end
|
37
|
+
|
38
|
+
def getNextCheck
|
39
|
+
@c.sendMsg "nextcheck"
|
40
|
+
end
|
31
41
|
|
32
42
|
def syncMatches
|
33
43
|
@schedule.mergeItems @c.getItems
|
@@ -35,6 +45,7 @@ module Aniview
|
|
35
45
|
|
36
46
|
def updateFeed
|
37
47
|
begin
|
48
|
+
SimpleRSS.item_tags << :"torrent:magnetURI"
|
38
49
|
@rss = SimpleRSS.parse open(@pref.get("rss_feed")["url"])
|
39
50
|
|
40
51
|
rescue SocketError
|
@@ -67,11 +78,11 @@ module Aniview
|
|
67
78
|
log "matching all" if verbose
|
68
79
|
|
69
80
|
total_matches = 0
|
70
|
-
|
81
|
+
@schedule.schedule.each { |subs|
|
71
82
|
log "matching #{subs.attributes["r"]}" if verbose
|
72
83
|
matches = match subs.attributes["r"], verbose
|
73
84
|
log "found #{matches.length} matches" if verbose
|
74
|
-
log "#{matches}" if verbose
|
85
|
+
#log "#{matches}" if verbose
|
75
86
|
|
76
87
|
if matches.length >= 1
|
77
88
|
|
@@ -79,8 +90,10 @@ module Aniview
|
|
79
90
|
newfile = downloaddir + matches[0][:title]
|
80
91
|
|
81
92
|
next if File.exist? newfile
|
93
|
+
log "attempting to downloading file" if verbose
|
82
94
|
log "set download dir to #{newfile}" if verbose
|
83
|
-
|
95
|
+
log "#{matches[0].link}" if verbose
|
96
|
+
s = @delugec.addTorrent matches[0].link, @pref.parseDir(subs.attributes["p"]), verbose: true
|
84
97
|
log "adding torrent, status #{s}" if verbose
|
85
98
|
subs.setSeen if s
|
86
99
|
@schedule.save
|
@@ -98,23 +111,16 @@ module Aniview
|
|
98
111
|
end
|
99
112
|
end
|
100
113
|
|
101
|
-
def
|
102
|
-
@schedule.
|
114
|
+
def items
|
115
|
+
@schedule.items
|
103
116
|
end
|
104
117
|
|
105
118
|
def editItem loc, newval
|
106
|
-
@schedule.
|
119
|
+
@schedule.schedule[loc].setRegexp newval
|
107
120
|
@schedule.save
|
121
|
+
changed
|
122
|
+
notify_observers
|
108
123
|
end
|
109
|
-
|
110
|
-
def makeHash(arr)
|
111
|
-
ret = {}
|
112
|
-
arr.each{ |subs|
|
113
|
-
ret.merge!(subs => subs)
|
114
|
-
}
|
115
|
-
return ret
|
116
|
-
end
|
117
|
-
|
118
124
|
end
|
119
125
|
end
|
120
126
|
end
|
data/lib/aniview/util/util.rb
CHANGED
data/lib/aniview/view/aiomenu.rb
CHANGED
@@ -5,28 +5,18 @@ module Aniview
|
|
5
5
|
module View
|
6
6
|
class AioMenu < Menu
|
7
7
|
include Aniview::Util
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
"t" => @attributes["t"],
|
17
|
-
"D" => Util.format_duration(getDuration),
|
18
|
-
"S" => Util.format_size(getSize)
|
19
|
-
}
|
20
|
-
|
21
|
-
@expanded = -1 if @items.values[@expanded] == nil
|
22
|
-
fixCursor
|
23
|
-
end
|
8
|
+
|
9
|
+
def refresh_attributes
|
10
|
+
@attributes = {
|
11
|
+
"t" => @attributes["t"],
|
12
|
+
"D" => Util.format_duration(getDuration),
|
13
|
+
"S" => Util.format_size(getSize)
|
14
|
+
}
|
15
|
+
end
|
24
16
|
|
25
17
|
def getDuration
|
26
|
-
|
27
|
-
@items.each{ |
|
28
|
-
dur += child[0].attributes["d"]
|
29
|
-
}
|
18
|
+
dur = 0
|
19
|
+
@items.each{ |p, c| dur += p.attr["d"] }
|
30
20
|
return dur
|
31
21
|
end
|
32
22
|
|
@@ -39,6 +29,7 @@ module Aniview
|
|
39
29
|
end
|
40
30
|
|
41
31
|
def customControl(key, sel)
|
32
|
+
return if @items == {}
|
42
33
|
path = @items.values[sel["out"]][sel["in"]].path
|
43
34
|
|
44
35
|
empty = path == "empty"
|
@@ -56,14 +47,15 @@ module Aniview
|
|
56
47
|
refresh
|
57
48
|
elsif key == @pref.get("keybindings")["anime_set_watched"] and not empty
|
58
49
|
@interface.addWatched(path)
|
59
|
-
refresh
|
60
50
|
elsif key == @pref.get("keybindings")["anime_undo_set_watched"]
|
61
51
|
@interface.rmWatched()
|
62
|
-
refresh
|
63
52
|
elsif key == @pref.get("keybindings")["anime_set_unwatched"] and not empty
|
64
53
|
@interface.rmWatched(path)
|
65
|
-
|
54
|
+
moveCursor("down")
|
66
55
|
end
|
56
|
+
|
57
|
+
changed
|
58
|
+
notify_observers
|
67
59
|
end
|
68
60
|
end
|
69
61
|
end
|
@@ -5,43 +5,34 @@ module Aniview
|
|
5
5
|
module View
|
6
6
|
class DelugeMenu < Menu
|
7
7
|
include Aniview::Util
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@attributes = {
|
13
|
-
"t" => @attributes["t"],
|
8
|
+
def refresh_attributes
|
9
|
+
@attributes = {
|
10
|
+
"t" => @attributes["t"],
|
14
11
|
"s" => @interface.getStatus
|
15
|
-
|
16
|
-
|
17
|
-
@expanded = -1 if @items.values[@expanded] == nil
|
18
|
-
fixCursor
|
19
|
-
end
|
12
|
+
}
|
13
|
+
end
|
20
14
|
|
21
|
-
|
15
|
+
def customControl(key, sel)
|
22
16
|
|
23
17
|
if @items != nil and @items.length > 0
|
24
18
|
item = @items.values[sel["out"]]
|
25
19
|
else
|
26
20
|
item = ""
|
27
21
|
end
|
28
|
-
|
29
|
-
|
22
|
+
|
23
|
+
if key == @pref.get("keybindings")["torrents_pause"]
|
30
24
|
@interface.toggleTorrent(item)
|
31
25
|
elsif key == @pref.get("keybindings")["torrents_remove"]
|
32
26
|
@interface.removeTorrent(item, false)
|
33
27
|
elsif key == @pref.get("keybindings")["torrents_remove_data"]
|
34
28
|
@interface.removeTorrent(item, true)
|
35
|
-
elsif key == "enter"
|
36
|
-
|
37
29
|
elsif key == "+"
|
30
|
+
pause
|
38
31
|
newval = Util.readline(@term, "mag:", "")
|
39
32
|
@interface.addTorrent newval, Dir.home + "/downloads/"
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
33
|
+
unpause
|
34
|
+
end
|
35
|
+
end
|
44
36
|
end
|
45
37
|
end
|
46
38
|
end
|
47
|
-
|
data/lib/aniview/view/menu.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
|
1
3
|
require_relative 'color'
|
2
4
|
require_relative '../util/util'
|
3
5
|
|
@@ -5,9 +7,15 @@ module Aniview
|
|
5
7
|
module View
|
6
8
|
class Menu
|
7
9
|
include Aniview::Util
|
8
|
-
|
10
|
+
include Observable
|
11
|
+
|
12
|
+
attr_accessor :visible
|
13
|
+
|
14
|
+
def initialize(refresh_function: :items, interface:, name:, pref:, format:, term:, children: true, visible: false)
|
9
15
|
@attributes = {}
|
10
16
|
|
17
|
+
@visible = visible
|
18
|
+
|
11
19
|
@refresh_function = refresh_function
|
12
20
|
@interface = interface
|
13
21
|
setName name
|
@@ -15,7 +23,7 @@ module Aniview
|
|
15
23
|
@format = format
|
16
24
|
@term = term
|
17
25
|
@children = children
|
18
|
-
|
26
|
+
|
19
27
|
@expanded = -1
|
20
28
|
@selected = 0
|
21
29
|
|
@@ -23,13 +31,44 @@ module Aniview
|
|
23
31
|
@items_hash = {}
|
24
32
|
@hashmap = {}
|
25
33
|
@lu = 0
|
26
|
-
|
34
|
+
|
27
35
|
@oldRows = @term.rows
|
28
|
-
|
36
|
+
|
29
37
|
refresh
|
30
|
-
|
38
|
+
|
31
39
|
@view = [0, @term.rows - 3]
|
32
|
-
|
40
|
+
|
41
|
+
@updated = true
|
42
|
+
|
43
|
+
if @interface.singleton_class.include? Observable
|
44
|
+
@interface.add_observer(self, :refresh)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def unpause
|
49
|
+
unless @interface.singleton_class.include? Observable
|
50
|
+
auto_update s: :start
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def pause
|
55
|
+
auto_update s: :stop
|
56
|
+
end
|
57
|
+
|
58
|
+
def auto_update s: :start
|
59
|
+
case s
|
60
|
+
when :start
|
61
|
+
@update_thread = Thread.new do
|
62
|
+
while true
|
63
|
+
refresh
|
64
|
+
changed
|
65
|
+
notify_observers
|
66
|
+
sleep 0.07
|
67
|
+
end
|
68
|
+
end
|
69
|
+
when :stop
|
70
|
+
@update_thread.exit if @update_thread
|
71
|
+
end
|
33
72
|
end
|
34
73
|
|
35
74
|
def setRfunc(new_method)
|
@@ -41,7 +80,7 @@ module Aniview
|
|
41
80
|
refreshFormats
|
42
81
|
end
|
43
82
|
|
44
|
-
def change_screen_size
|
83
|
+
def change_screen_size redraw: true
|
45
84
|
#@term.rows = lines
|
46
85
|
#@term.cols = cols
|
47
86
|
@items_formatted = {}
|
@@ -50,14 +89,14 @@ module Aniview
|
|
50
89
|
refresh
|
51
90
|
|
52
91
|
#if @term.rows > @oldRows
|
53
|
-
|
92
|
+
|
54
93
|
diff = @term.rows - @oldRows
|
55
94
|
#@view[0] += diff
|
56
95
|
@view[1] += diff
|
57
96
|
|
58
97
|
@oldRows = @term.rows
|
59
98
|
adjustView
|
60
|
-
draw
|
99
|
+
draw if redraw
|
61
100
|
end
|
62
101
|
|
63
102
|
def setName(name)
|
@@ -69,9 +108,13 @@ module Aniview
|
|
69
108
|
end
|
70
109
|
|
71
110
|
def refresh
|
72
|
-
@items = @interface.
|
111
|
+
@items = @interface.send(@refresh_function)
|
112
|
+
refreshFormats
|
113
|
+
refresh_attributes
|
73
114
|
@expanded = -1 if @items.values[@expanded] == nil
|
74
115
|
fixCursor
|
116
|
+
changed
|
117
|
+
notify_observers
|
75
118
|
end
|
76
119
|
|
77
120
|
def expand(i)
|
@@ -85,6 +128,8 @@ module Aniview
|
|
85
128
|
end
|
86
129
|
fixCursor
|
87
130
|
adjustView
|
131
|
+
changed
|
132
|
+
notify_observers
|
88
133
|
end
|
89
134
|
|
90
135
|
def resolveSelected(resolve_me=@selected)
|
@@ -135,123 +180,105 @@ module Aniview
|
|
135
180
|
end
|
136
181
|
end
|
137
182
|
|
138
|
-
def
|
139
|
-
|
140
|
-
|
141
|
-
|
183
|
+
def adjustView
|
184
|
+
buffer = 2
|
185
|
+
bottom = @term.rows-3
|
186
|
+
|
187
|
+
diff = 0
|
188
|
+
if @selected < @view[0] + buffer #and @selected > buffer
|
189
|
+
while @selected < @view[0] + buffer
|
190
|
+
@view[0]-=1
|
191
|
+
@view[1]-=1
|
192
|
+
end
|
193
|
+
elsif @selected > @view[1] - (buffer+1) and @selected < getLen - buffer
|
194
|
+
while @selected > @view[1] - (buffer+1) and @selected < getLen - buffer
|
195
|
+
@view[0]+=1
|
196
|
+
@view[1]+=1
|
197
|
+
end
|
198
|
+
end
|
142
199
|
|
200
|
+
diff = 0 - @view[0] if @view[0] < 0
|
201
|
+
diff = bottom - @view[1] if @view[1] < bottom
|
202
|
+
|
203
|
+
@view[0] += diff
|
204
|
+
@view[1] += diff
|
205
|
+
end
|
206
|
+
|
207
|
+
def updated?
|
208
|
+
@updated and !(@updated = !@updated)
|
209
|
+
end
|
210
|
+
|
211
|
+
def updated!
|
212
|
+
@updated = true
|
213
|
+
end
|
214
|
+
|
215
|
+
def interface
|
216
|
+
@interface
|
217
|
+
end
|
218
|
+
|
219
|
+
def refreshFormats
|
143
220
|
@cl = {
|
144
221
|
"s" => Aniview::View::Color.public_send(@pref.get("clr")["selected"]),
|
145
222
|
"1" => Aniview::View::Color.public_send(@pref.get("clr")["primary"]),
|
146
223
|
"2" => Aniview::View::Color.public_send(@pref.get("clr")["secondary"]),
|
147
224
|
"m" => Aniview::View::Color.public_send(@pref.get("clr")["main"]),
|
148
225
|
}
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
#@l.log @items.keys[i]
|
157
|
-
#
|
158
|
-
babble = item[0].cereal #Digest::SHA256.bubblebabble String(item[0])
|
159
|
-
|
160
|
-
if @items_hash.key? babble
|
161
|
-
val = @items_hash[babble]
|
162
|
-
new_items_hash.merge!(babble => val)
|
163
|
-
new_items_formatted.merge!(@hashmap[babble] => @items_formatted[@hashmap[babble]])
|
164
|
-
new_hashmap.merge!(babble => @hashmap[babble])
|
165
|
-
next
|
166
|
-
end
|
167
|
-
|
168
|
-
parent = Util.parse_format(
|
226
|
+
|
227
|
+
nif = {}
|
228
|
+
|
229
|
+
@items.each { |parent, children|
|
230
|
+
|
231
|
+
parent_formatted = Util.parse_format(
|
169
232
|
@pref.get(@format)["parent"],
|
170
|
-
|
233
|
+
parent.attributes,
|
171
234
|
@term.cols
|
172
235
|
)
|
173
236
|
|
174
|
-
|
175
|
-
children_hash = []
|
176
|
-
|
237
|
+
children_formatted = []
|
177
238
|
if @children
|
178
|
-
|
179
|
-
|
180
|
-
child_babble = subitem.cereal
|
181
|
-
|
182
|
-
if @items_hash.key? child_babble
|
183
|
-
val = @items_hash[babble]
|
184
|
-
new_items_hash.merge!(child_babble => val)
|
185
|
-
children<<@hashmap[babble]
|
186
|
-
new_hashmap.merge!(babble => @hashmap[babble])
|
187
|
-
next
|
188
|
-
end
|
189
|
-
|
190
|
-
children << Util.parse_format(
|
239
|
+
children.each { |child|
|
240
|
+
children_formatted << Util.parse_format(
|
191
241
|
@pref.get(@format)["child"],
|
192
|
-
|
242
|
+
child.attributes,
|
193
243
|
@term.cols
|
194
244
|
)
|
195
|
-
children_hash << subitem.hash
|
196
|
-
|
197
245
|
}
|
198
246
|
end
|
199
247
|
|
200
|
-
|
201
|
-
new_items_formatted.merge!(parent => children)
|
202
|
-
new_hashmap.merge!(babble => parent)
|
248
|
+
nif.merge!(parent_formatted => children_formatted)
|
203
249
|
}
|
204
250
|
|
205
|
-
@items_formatted =
|
206
|
-
@items_hash = new_items_hash
|
207
|
-
@hashmap = new_hashmap
|
251
|
+
@items_formatted = nif
|
208
252
|
|
209
253
|
@title_formatted = Util.parse_format(
|
210
254
|
@pref.get(@format)["title"],
|
211
255
|
@attributes,
|
212
256
|
@term.cols
|
213
257
|
)
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
buffer = 2
|
218
|
-
bottom = @term.rows-3
|
219
|
-
|
220
|
-
diff = 0
|
221
|
-
if @selected < @view[0] + buffer #and @selected > buffer
|
222
|
-
while @selected < @view[0] + buffer
|
223
|
-
@view[0]-=1
|
224
|
-
@view[1]-=1
|
225
|
-
end
|
226
|
-
elsif @selected > @view[1] - (buffer+1) and @selected < getLen - buffer
|
227
|
-
while @selected > @view[1] - (buffer+1) and @selected < getLen - buffer
|
228
|
-
@view[0]+=1
|
229
|
-
@view[1]+=1
|
230
|
-
end
|
231
|
-
end
|
232
|
-
|
233
|
-
diff = 0 - @view[0] if @view[0] < 0
|
234
|
-
diff = bottom - @view[1] if @view[1] < bottom
|
235
|
-
|
236
|
-
@view[0] += diff
|
237
|
-
@view[1] += diff
|
258
|
+
|
259
|
+
changed
|
260
|
+
notify_observers
|
238
261
|
end
|
239
262
|
|
240
263
|
def draw
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
264
|
+
|
265
|
+
#refresh @items_formatted
|
266
|
+
#refreshFormats
|
267
|
+
|
268
|
+
#set the view
|
269
|
+
line_on = @view[0]
|
270
|
+
lines_to_draw = @view[1]
|
271
|
+
|
272
|
+
#print the menu title
|
247
273
|
lo="\e[1;1H"
|
248
274
|
print lo + @cl["m"] + @title_formatted + "\e[K"
|
249
275
|
|
276
|
+
#get the resolved start positions
|
250
277
|
resolved_start_position = resolveSelected line_on
|
251
|
-
|
252
278
|
outer_index = resolved_start_position["out"]
|
253
279
|
inner_index = resolved_start_position["in"]
|
254
280
|
|
281
|
+
# if we are starting in the expanded portion, skip its parent
|
255
282
|
if resolved_start_position["in_expanded"]
|
256
283
|
outer_index+=1
|
257
284
|
end
|
@@ -292,9 +319,14 @@ module Aniview
|
|
292
319
|
else
|
293
320
|
customControl(key, sel)
|
294
321
|
end
|
322
|
+
changed
|
323
|
+
notify_observers
|
295
324
|
end
|
296
325
|
|
297
326
|
def customControl(key, sel); end
|
327
|
+
|
328
|
+
def refresh_attributes; end
|
329
|
+
|
298
330
|
end
|
299
331
|
end
|
300
332
|
end
|