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
@@ -5,34 +5,18 @@ module Aniview
|
|
5
5
|
module View
|
6
6
|
class PrefMenu < Menu
|
7
7
|
include Aniview::Util
|
8
|
-
def refresh
|
9
|
-
@items = @interface.send(@refresh_function)
|
10
8
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
value = @items.keys[sel["out"]].attributes["v"]
|
23
|
-
|
24
|
-
if key == "space"
|
25
|
-
#expand(sel["out"])
|
26
|
-
elsif key == "r"
|
27
|
-
refresh
|
28
|
-
elsif key == "enter"
|
29
|
-
|
30
|
-
newval = Util.readline(@term, title + ":", value)
|
31
|
-
|
32
|
-
@interface.set(path, newval)
|
33
|
-
refresh
|
34
|
-
end
|
35
|
-
end
|
9
|
+
def customControl(key, sel)
|
10
|
+
return if @items.keys[sel["out"]].attributes["t"] == ""
|
11
|
+
path = @items.values[sel["out"]][0].path
|
12
|
+
title = @items.keys[sel["out"]].attributes["t"]
|
13
|
+
value = @items.keys[sel["out"]].attributes["v"]
|
14
|
+
if key == "enter"
|
15
|
+
newval = Util.readline(@term, title + ":", value)
|
16
|
+
@interface.set(path, newval)
|
17
|
+
refresh
|
18
|
+
end
|
19
|
+
end
|
36
20
|
end
|
37
21
|
end
|
38
22
|
end
|
@@ -5,16 +5,6 @@ module Aniview
|
|
5
5
|
module View
|
6
6
|
class ScheduleMenu < Menu
|
7
7
|
include Aniview::Util
|
8
|
-
def refresh
|
9
|
-
@items = @interface.makeHash @interface.send(@refresh_function)
|
10
|
-
|
11
|
-
@attributes = {
|
12
|
-
"t" => @attributes["t"],
|
13
|
-
}
|
14
|
-
|
15
|
-
@expanded = -1 if @items.values[@expanded] == nil
|
16
|
-
fixCursor
|
17
|
-
end
|
18
8
|
|
19
9
|
def customControl(key, sel)
|
20
10
|
|
@@ -33,7 +23,6 @@ module Aniview
|
|
33
23
|
|
34
24
|
end
|
35
25
|
end
|
36
|
-
|
37
26
|
end
|
38
27
|
end
|
39
28
|
end
|
@@ -4,20 +4,57 @@ require_relative 'color'
|
|
4
4
|
module Aniview
|
5
5
|
module View
|
6
6
|
class StatusLine
|
7
|
+
|
7
8
|
include Aniview::Util
|
9
|
+
include Observable
|
10
|
+
|
8
11
|
def initialize pref, term, mpvbridge
|
9
12
|
@term = term
|
10
13
|
@pref = pref
|
11
14
|
@mpvbridge = mpvbridge
|
15
|
+
|
16
|
+
@mpvbridge.add_observer(self, :draw)
|
17
|
+
|
12
18
|
@clr = Aniview::View::Color.public_send(@pref.get("clr")["main"])
|
19
|
+
reset_message
|
13
20
|
end
|
14
|
-
|
21
|
+
|
22
|
+
def message msg, display_for: 1, color: "red"
|
23
|
+
@message = {
|
24
|
+
"text" => msg,
|
25
|
+
"linger" => display_for,
|
26
|
+
"color" => color
|
27
|
+
}
|
28
|
+
changed
|
29
|
+
notify_observers
|
30
|
+
end
|
31
|
+
|
32
|
+
def reset_message
|
33
|
+
@message = {
|
34
|
+
"text" => nil,
|
35
|
+
"linger" => 0,
|
36
|
+
"color" => "red"
|
37
|
+
}
|
38
|
+
changed
|
39
|
+
notify_observers
|
40
|
+
end
|
41
|
+
|
42
|
+
def print_row line
|
43
|
+
print "\e[#{@term.rows - 1};1H" + @clr + line + "\e[K\nq\e[2K"
|
44
|
+
end
|
45
|
+
|
15
46
|
def draw
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
47
|
+
if @message["text"] == nil
|
48
|
+
line = Util.parse_format @pref.get("format_status"), @mpvbridge.attributes, @term.cols
|
49
|
+
print_row line
|
50
|
+
else
|
51
|
+
line = Color.public_send(@message["color"]) + @message["text"]
|
52
|
+
print_row line
|
53
|
+
sleep Integer(@message["linger"])
|
54
|
+
reset_message
|
55
|
+
end
|
20
56
|
end
|
57
|
+
|
21
58
|
end
|
22
59
|
end
|
23
60
|
end
|
@@ -4,38 +4,34 @@ require_relative '../util/util'
|
|
4
4
|
module Aniview
|
5
5
|
module View
|
6
6
|
class SubscriptionMenu < Menu
|
7
|
-
|
7
|
+
|
8
8
|
include Aniview::Util
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
@last_checked = Time.now.to_i
|
20
|
-
end
|
21
|
-
|
22
|
-
@expanded = -1 if @items.values[@expanded] == nil
|
23
|
-
fixCursor
|
10
|
+
#if Time.now.to_i < @last_checked + 10
|
11
|
+
# @last_checked = Time.now.to_i
|
12
|
+
#end
|
13
|
+
|
14
|
+
def refresh_attributes
|
15
|
+
@attributes["l"] = @interface.getLastChecked
|
16
|
+
@attributes["d"] = @interface.checkDaemon
|
17
|
+
@attributes["n"] = @interface.getNextCheck
|
18
|
+
@interface.syncMatches
|
24
19
|
end
|
25
|
-
|
20
|
+
|
26
21
|
def customControl(key, sel)
|
27
|
-
|
22
|
+
|
28
23
|
item = @items.values[sel["out"]].attributes["r"]
|
29
|
-
|
24
|
+
|
30
25
|
if key == @pref.get("keybindings")["subscriptions_edit"]
|
31
26
|
newval = Util.readline(@term, "regexp:", item)
|
32
27
|
@interface.editItem(sel["out"], newval)
|
33
|
-
|
28
|
+
|
34
29
|
elsif key == "m"
|
35
30
|
@interface.forceMatch
|
36
31
|
|
37
32
|
end
|
38
|
-
end
|
33
|
+
end
|
34
|
+
|
39
35
|
end
|
40
36
|
end
|
41
37
|
end
|
data/lib/application.rb
CHANGED
@@ -3,6 +3,10 @@ require 'highline/import'
|
|
3
3
|
require 'thread'
|
4
4
|
require 'io/console'
|
5
5
|
require 'warning'
|
6
|
+
require 'observer'
|
7
|
+
require 'benchmark'
|
8
|
+
|
9
|
+
require 'logger'
|
6
10
|
|
7
11
|
Warning.ignore([:fixnum, :bignum])
|
8
12
|
|
@@ -37,35 +41,29 @@ module Aniview
|
|
37
41
|
# @return nil
|
38
42
|
#
|
39
43
|
def initialize
|
40
|
-
|
44
|
+
|
45
|
+
#@logger = Logger.new('aniview.log')
|
46
|
+
#@logger.level = Logger::DEBUG
|
47
|
+
|
41
48
|
@term = Util::Term.new
|
42
49
|
|
43
50
|
@pref = Interface::Pref.new
|
44
51
|
|
45
|
-
@mpvbridge = Interface::MPVBridge.new
|
46
|
-
|
47
|
-
@aio = Interface::AnimeIO.new
|
48
|
-
|
49
|
-
@schedule = Interface::Schedule.new
|
50
|
-
|
51
|
-
@delugec = Interface::DelugeC.new
|
52
|
-
|
53
|
-
@c = Client::AniClient.new
|
54
|
-
|
55
|
-
@statusline = View::StatusLine.new
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
#while true
|
61
|
-
# @statusline.draw
|
62
|
-
# sleep 1/45.0
|
63
|
-
#end
|
64
|
-
|
65
|
-
@subscription = Interface::Subscription.new(@pref, @schedule, @delugec, @c)
|
66
|
-
|
52
|
+
@mpvbridge = Interface::MPVBridge.new @pref
|
53
|
+
|
54
|
+
@aio = Interface::AnimeIO.new @pref, @mpvbridge
|
55
|
+
|
56
|
+
@schedule = Interface::Schedule.new @pref
|
57
|
+
|
58
|
+
@delugec = Interface::DelugeC.new @pref
|
59
|
+
|
60
|
+
@c = Client::AniClient.new @pref
|
61
|
+
|
62
|
+
@statusline = View::StatusLine.new @pref, @term, @mpvbridge
|
63
|
+
|
64
|
+
@subscription = Interface::Subscription.new @pref, @schedule, @delugec, @c
|
65
|
+
|
67
66
|
if not @c.server?
|
68
|
-
#puts "starting server"
|
69
67
|
process = fork do
|
70
68
|
require_relative 'daemon'
|
71
69
|
avd = Daemon.new([])
|
@@ -73,17 +71,16 @@ module Aniview
|
|
73
71
|
end
|
74
72
|
Process.detach(process)
|
75
73
|
end
|
76
|
-
|
74
|
+
|
77
75
|
@aiomenu = View::AioMenu.new(
|
78
|
-
refresh_function: :getUnwatched,
|
79
76
|
interface: @aio,
|
80
77
|
name: @pref.get("menu_titles")["unwatched"],
|
81
78
|
pref: @pref,
|
82
79
|
format: "format_library_unwatched",
|
83
|
-
term: @term
|
80
|
+
term: @term,
|
81
|
+
refresh_function: :unwatched
|
84
82
|
)
|
85
83
|
@prefmenu = View::PrefMenu.new(
|
86
|
-
refresh_function: :getAll,
|
87
84
|
interface: @pref,
|
88
85
|
name: @pref.get("menu_titles")["preferences"],
|
89
86
|
pref: @pref,
|
@@ -92,7 +89,6 @@ module Aniview
|
|
92
89
|
children: false
|
93
90
|
)
|
94
91
|
@delugemenu = View::DelugeMenu.new(
|
95
|
-
refresh_function: :getTorrents,
|
96
92
|
interface: @delugec,
|
97
93
|
name: @pref.get("menu_titles")["torrents"],
|
98
94
|
pref: @pref,
|
@@ -100,19 +96,15 @@ module Aniview
|
|
100
96
|
term: @term,
|
101
97
|
children: false
|
102
98
|
)
|
103
|
-
|
104
99
|
@schedulemenu = View::ScheduleMenu.new(
|
105
|
-
refresh_function: :getAll,
|
106
100
|
interface: @schedule,
|
107
|
-
name: @pref.get("menu_titles")["
|
101
|
+
name: @pref.get("menu_titles")["schedule"],
|
108
102
|
pref: @pref,
|
109
103
|
format: "format_schedule",
|
110
104
|
term: @term,
|
111
105
|
children: false
|
112
106
|
)
|
113
|
-
|
114
107
|
@subscriptionmenu = View::SubscriptionMenu.new(
|
115
|
-
refresh_function: :getAll,
|
116
108
|
interface: @subscription,
|
117
109
|
name: @pref.get("menu_titles")["subscriptions"],
|
118
110
|
pref: @pref,
|
@@ -120,8 +112,8 @@ module Aniview
|
|
120
112
|
term: @term,
|
121
113
|
children: false
|
122
114
|
)
|
123
|
-
|
124
115
|
@term.save.hide_cursor.echo_off
|
116
|
+
|
125
117
|
end
|
126
118
|
|
127
119
|
# Cleans up Aniview, restoring terminal settings and safely exiting all
|
@@ -130,10 +122,13 @@ module Aniview
|
|
130
122
|
# @return nil
|
131
123
|
#
|
132
124
|
def cleanup
|
125
|
+
@view.pause
|
126
|
+
@statusthread.exit if @statusthread
|
133
127
|
@mthread.exit if @mthread != nil
|
134
128
|
@statusthread.exit if @statusthread != nil
|
135
129
|
@term.reset
|
136
130
|
@mpvbridge.quit!
|
131
|
+
@aio.cleanup
|
137
132
|
exit
|
138
133
|
end
|
139
134
|
|
@@ -161,8 +156,7 @@ module Aniview
|
|
161
156
|
puts "Help"
|
162
157
|
puts ""
|
163
158
|
else
|
164
|
-
|
165
|
-
@term.getKey
|
159
|
+
@statusline.message "unknown command"
|
166
160
|
end
|
167
161
|
end
|
168
162
|
|
@@ -173,48 +167,70 @@ module Aniview
|
|
173
167
|
# @return nil
|
174
168
|
#
|
175
169
|
def changeView newView
|
170
|
+
@view.delete_observers
|
171
|
+
@view.pause
|
172
|
+
newView.unpause
|
173
|
+
newView.add_observer(self, :drawview)
|
174
|
+
newView.change_screen_size redraw: false
|
175
|
+
newView.expand -1
|
176
176
|
@view = newView
|
177
|
-
@view.change_screen_size
|
178
177
|
end
|
179
178
|
|
179
|
+
def drawview
|
180
|
+
@view.draw
|
181
|
+
@rcount ||= 0
|
182
|
+
#puts "refreshed view #{@rcount+=1}"
|
183
|
+
end
|
184
|
+
|
185
|
+
def togglestatusline
|
186
|
+
return unless @mpvbridge.what_changed == "playing_status"
|
187
|
+
unless @statusthread
|
188
|
+
@statusthread = Thread.new do
|
189
|
+
while true
|
190
|
+
@statusline.draw
|
191
|
+
sleep 0.07
|
192
|
+
end
|
193
|
+
end
|
194
|
+
else
|
195
|
+
@statusthread.exit
|
196
|
+
@statusthread = nil
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
def drawmessage
|
201
|
+
unless @statusthread
|
202
|
+
@view.draw
|
203
|
+
Thread.new do
|
204
|
+
@statusline.draw
|
205
|
+
@statusline.draw
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
180
209
|
|
181
210
|
# Runs the aniview application, this method starts all of the threads
|
182
211
|
#
|
183
212
|
# @return nil
|
184
213
|
#
|
185
214
|
def run
|
186
|
-
|
215
|
+
|
187
216
|
@view = @aiomenu
|
188
|
-
|
217
|
+
@view.add_observer(self, :drawview)
|
218
|
+
@statusline.draw
|
219
|
+
|
220
|
+
@mpvbridge.add_observer(self, :togglestatusline)
|
221
|
+
@statusline.add_observer(self, :drawmessage)
|
222
|
+
|
189
223
|
mutex = Mutex.new
|
190
224
|
Signal.trap('SIGWINCH', proc {
|
191
|
-
Thread.new { mutex.synchronize {
|
225
|
+
Thread.new { mutex.synchronize {
|
226
|
+
@view.change_screen_size
|
227
|
+
@statusline.draw
|
228
|
+
} }
|
192
229
|
} )
|
193
|
-
|
230
|
+
|
194
231
|
key = ""
|
195
232
|
@view.refresh
|
196
|
-
|
197
|
-
|
198
|
-
Thread.abort_on_exception = true
|
199
|
-
@mthread = Thread.new do
|
200
|
-
while true
|
201
|
-
if @shoulddraw
|
202
|
-
@view.draw
|
203
|
-
@view.refresh
|
204
|
-
end
|
205
|
-
sleep 1/45.0
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
@statusthread = Thread.new do
|
210
|
-
while true
|
211
|
-
if @shoulddraw
|
212
|
-
@statusline.draw
|
213
|
-
end
|
214
|
-
sleep 1/25.0
|
215
|
-
end
|
216
|
-
end
|
217
|
-
|
233
|
+
|
218
234
|
while true
|
219
235
|
@shoulddraw = true
|
220
236
|
key = @term.getKey
|
@@ -228,14 +244,12 @@ module Aniview
|
|
228
244
|
changeView @aiomenu
|
229
245
|
@view.setName nm["unwatched"]
|
230
246
|
@view.setFormat("format_library_unwatched")
|
231
|
-
@view.setRfunc(:
|
232
|
-
|
247
|
+
@view.setRfunc(:unwatched)
|
233
248
|
when kb["goto_library"]
|
234
249
|
changeView @aiomenu
|
235
250
|
@view.setName nm["library"]
|
236
251
|
@view.setFormat("format_library")
|
237
|
-
@view.setRfunc(:
|
238
|
-
|
252
|
+
@view.setRfunc(:items)
|
239
253
|
when kb["goto_torrents"]
|
240
254
|
changeView @delugemenu
|
241
255
|
@view.setName nm["torrents"]
|
@@ -249,7 +263,14 @@ module Aniview
|
|
249
263
|
changeView @subscriptionmenu
|
250
264
|
@view.setName nm["subscriptions"]
|
251
265
|
when ":"
|
266
|
+
@view.pause
|
267
|
+
if @statusthread
|
268
|
+
togglestatusline
|
269
|
+
toggled = true
|
270
|
+
end
|
252
271
|
runCommand Util.readline(@term, ":")
|
272
|
+
togglestatusline if toggled
|
273
|
+
@view.unpause
|
253
274
|
when "q"
|
254
275
|
cleanup
|
255
276
|
end
|