aniview 1.1.0 → 1.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 +4 -4
- data/bin/aniviewd +20 -0
- data/lib/aniview.rb +99 -47
- data/lib/aniview/client/aniclient.rb +11 -1
- data/lib/aniview/interface/animeio/animeio.rb +3 -2
- data/lib/aniview/interface/deluge/delugec.rb +13 -7
- data/lib/aniview/interface/mpv/mpvbridge.rb +80 -0
- data/lib/aniview/interface/pref/defaults.json +5 -3
- data/lib/aniview/interface/pref/pref.rb +2 -2
- data/lib/aniview/interface/pref/validate.json +3 -1
- data/lib/aniview/interface/schedule/schedule.rb +23 -3
- data/lib/aniview/interface/schedule/scheduleitem.rb +11 -1
- data/lib/aniview/interface/subscription/subscription.rb +32 -16
- data/lib/aniview/util/alogger.rb +1 -1
- data/lib/aniview/util/command.rb +2 -1
- data/lib/aniview/util/format.rb +7 -5
- data/lib/aniview/util/serializer.rb +19 -0
- data/lib/aniview/view/aiomenu.rb +2 -2
- data/lib/aniview/view/color.rb +67 -0
- data/lib/aniview/view/delugemenu.rb +4 -0
- data/lib/aniview/view/emote.rb +343 -95
- data/lib/aniview/view/menu.rb +300 -281
- data/lib/aniview/view/statusline.rb +18 -0
- data/lib/aniview/view/subscriptionmenu.rb +8 -5
- data/lib/aniviewd.rb +31 -19
- metadata +13 -8
- data/lib/aniview/interface/subscription/subscriptiondaemon.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2886da682b5b5671858688ae216011d2af04ed3a
|
4
|
+
data.tar.gz: b59ed72a1289d7a21eda2b4922674061702a267f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c6943259e6c267341c73262ad702fb04bb489c46a88308127a7318b44aed913452a69c212a816cd9b5ac4761b5b1d436aa015708df78c91fe7879ec509c73eca
|
7
|
+
data.tar.gz: b5ff1b8ec8ca41dd1a85ca8771ff8ffeb2853a99fbf0469f55cf6f14a4252d4dbe2f097d352b308621a08621fd2929906046e754d0f8fa715f0946f67186ab79
|
data/bin/aniviewd
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'aniviewd'
|
5
|
+
rescue LoadError
|
6
|
+
require_relative '../lib/aniviewd' if File.exist?(File.join(File.dirname(__FILE__), '../lib/aniviewd.rb'))
|
7
|
+
end
|
8
|
+
|
9
|
+
unless defined? AniViewd
|
10
|
+
puts "cant find aniviewd library"
|
11
|
+
exit
|
12
|
+
end
|
13
|
+
|
14
|
+
av = AniViewd.new(ARGV)
|
15
|
+
|
16
|
+
process = fork do
|
17
|
+
av.run
|
18
|
+
end
|
19
|
+
|
20
|
+
Process.detach(process)
|
data/lib/aniview.rb
CHANGED
@@ -11,12 +11,13 @@ require_relative 'aniview/view/delugemenu'
|
|
11
11
|
require_relative 'aniview/view/prefmenu'
|
12
12
|
require_relative 'aniview/view/schedulemenu'
|
13
13
|
require_relative 'aniview/view/subscriptionmenu'
|
14
|
+
require_relative 'aniview/view/statusline'
|
14
15
|
|
15
16
|
require_relative 'aniview/interface/animeio/animeio'
|
17
|
+
require_relative 'aniview/interface/mpv/mpvbridge'
|
16
18
|
require_relative 'aniview/interface/deluge/delugec'
|
17
19
|
require_relative 'aniview/interface/pref/pref'
|
18
20
|
require_relative 'aniview/interface/subscription/subscription'
|
19
|
-
require_relative 'aniview/interface/subscription/subscriptiondaemon'
|
20
21
|
require_relative 'aniview/interface/schedule/schedule'
|
21
22
|
|
22
23
|
require_relative 'aniview/util/alogger'
|
@@ -30,19 +31,31 @@ $stdout.sync = true
|
|
30
31
|
class AniView
|
31
32
|
def initialize
|
32
33
|
|
33
|
-
@term
|
34
|
+
@term = Term.new
|
34
35
|
|
35
|
-
@pref
|
36
|
+
@pref = Pref.new
|
36
37
|
|
37
|
-
$l
|
38
|
+
$l = ALogger.new(@pref.parseDir(@pref.get "log_file"), false)
|
38
39
|
|
39
|
-
|
40
|
+
@mpvbridge = MPVBridge.new @pref
|
41
|
+
|
42
|
+
@aio = AnimeIO.new @pref, @mpvbridge
|
40
43
|
|
41
|
-
@schedule
|
44
|
+
@schedule = Schedule.new @pref
|
45
|
+
|
46
|
+
@delugec = DelugeC.new @pref
|
47
|
+
|
48
|
+
@c = AniClient.new @pref
|
49
|
+
|
50
|
+
@statusline = StatusLine.new @pref, @term, @mpvbridge
|
42
51
|
|
43
|
-
|
52
|
+
#file = "/Users/lattis/anime/Tekkonkinkreet/Tekkonkinkreet.mkv"
|
53
|
+
#@mpvbridge.play file
|
44
54
|
|
45
|
-
|
55
|
+
#while true
|
56
|
+
# @statusline.draw
|
57
|
+
# sleep 1/45.0
|
58
|
+
#end
|
46
59
|
|
47
60
|
@subscription = Subscription.new(@pref, @schedule, @delugec, @c)
|
48
61
|
|
@@ -57,11 +70,11 @@ class AniView
|
|
57
70
|
end
|
58
71
|
|
59
72
|
@aiomenu = AioMenu.new(
|
60
|
-
refresh_function: :
|
73
|
+
refresh_function: :getUnwatched,
|
61
74
|
interface: @aio,
|
62
|
-
name: @pref.get("menu_titles")["
|
75
|
+
name: @pref.get("menu_titles")["unwatched"],
|
63
76
|
pref: @pref,
|
64
|
-
format: "
|
77
|
+
format: "format_library_unwatched",
|
65
78
|
term: @term
|
66
79
|
)
|
67
80
|
@prefmenu = PrefMenu.new(
|
@@ -109,7 +122,9 @@ class AniView
|
|
109
122
|
|
110
123
|
def cleanup
|
111
124
|
@mthread.exit if @mthread != nil
|
125
|
+
@statusthread.exit if @statusthread != nil
|
112
126
|
@term.reset
|
127
|
+
@mpvbridge.quit!
|
113
128
|
exit
|
114
129
|
end
|
115
130
|
|
@@ -126,9 +141,21 @@ class AniView
|
|
126
141
|
elsif cmd == "index"
|
127
142
|
@aio.index_anime :force => true, :verbose => true
|
128
143
|
@aiomenu.refresh
|
144
|
+
elsif cmd == "help"
|
145
|
+
print "\e[1;1H" + Color.white
|
146
|
+
puts "Help"
|
147
|
+
puts ""
|
148
|
+
else
|
149
|
+
print "\033[" + String(@term.rows) + ";1H" + Color.red + "error, unknown command"
|
150
|
+
@term.getKey
|
129
151
|
end
|
130
152
|
end
|
131
153
|
|
154
|
+
def changeView newView
|
155
|
+
@view = newView
|
156
|
+
@view.change_screen_size
|
157
|
+
end
|
158
|
+
|
132
159
|
def run
|
133
160
|
|
134
161
|
@view = @aiomenu
|
@@ -153,46 +180,71 @@ class AniView
|
|
153
180
|
end
|
154
181
|
end
|
155
182
|
|
183
|
+
@statusthread = Thread.new do
|
184
|
+
while true
|
185
|
+
if @shoulddraw
|
186
|
+
@statusline.draw
|
187
|
+
end
|
188
|
+
sleep 1/25.0
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
156
192
|
while true
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
193
|
+
@shoulddraw = true
|
194
|
+
key = @term.getKey
|
195
|
+
@shoulddraw = false
|
196
|
+
|
197
|
+
kb = @pref.get("keybindings")
|
198
|
+
nm = @pref.get("menu_titles")
|
199
|
+
|
200
|
+
case key
|
201
|
+
when kb["goto_unwatched"]
|
202
|
+
changeView @aiomenu
|
203
|
+
@view.setName nm["unwatched"]
|
204
|
+
@view.setFormat("format_library_unwatched")
|
205
|
+
@view.setRfunc(:getUnwatched)
|
206
|
+
|
207
|
+
when kb["goto_library"]
|
208
|
+
changeView @aiomenu
|
209
|
+
@view.setName nm["library"]
|
210
|
+
@view.setFormat("format_library")
|
211
|
+
@view.setRfunc(:getAll)
|
212
|
+
|
213
|
+
when kb["goto_torrents"]
|
214
|
+
changeView @delugemenu
|
215
|
+
@view.setName nm["torrents"]
|
216
|
+
when kb["goto_preferences"]
|
217
|
+
changeView @prefmenu
|
218
|
+
@view.setName nm["preferences"]
|
219
|
+
when kb["goto_schedule"]
|
220
|
+
changeView @schedulemenu
|
221
|
+
@view.setName nm["schedule"]
|
222
|
+
when kb["goto_subscriptions"]
|
223
|
+
changeView @subscriptionmenu
|
224
|
+
@view.setName nm["subscriptions"]
|
225
|
+
when ":"
|
226
|
+
runCommand Command.read(@term, ":")
|
227
|
+
when "q"
|
228
|
+
cleanup
|
229
|
+
end
|
180
230
|
|
181
|
-
elsif key == @pref.get("keybindings")["goto_schedule"]
|
182
|
-
@view = @schedulemenu
|
183
|
-
@view.setName(@pref.get("menu_titles")["schedule"])
|
184
231
|
|
185
|
-
elsif key == @pref.get("keybindings")["goto_subscriptions"]
|
186
|
-
@view = @subscriptionmenu
|
187
|
-
@view.setName(@pref.get("menu_titles")["subscriptions"])
|
188
|
-
|
189
|
-
elsif key == ":"
|
190
|
-
cmd = Command.read(@term, ":")
|
191
|
-
self.runCommand cmd
|
192
232
|
|
193
|
-
|
194
|
-
|
195
|
-
|
233
|
+
#if key == @pref.get("keybindings")["goto_unwatched"]
|
234
|
+
# @view.setFormat("format_library_unwatched")
|
235
|
+
# @view.setRfunc(:getUnwatched)
|
236
|
+
#
|
237
|
+
#elsif key == @pref.get("keybindings")["goto_library"]
|
238
|
+
# @view.setFormat("format_library")
|
239
|
+
# @view.setRfunc(:getAll)
|
240
|
+
#
|
241
|
+
#elsif key == ":"
|
242
|
+
# cmd = Command.read(@term, ":")
|
243
|
+
# self.runCommand cmd
|
244
|
+
#
|
245
|
+
#elsif key == "q"
|
246
|
+
# self.cleanup
|
247
|
+
#end
|
196
248
|
|
197
249
|
@view.control(key)
|
198
250
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'socket'
|
2
|
+
require_relative '../util/serializer'
|
3
|
+
|
2
4
|
|
3
5
|
#require_relative '../interface/pref/pref'
|
4
6
|
|
@@ -20,7 +22,7 @@ class AniClient
|
|
20
22
|
def sendMsg msg
|
21
23
|
begin
|
22
24
|
s = connect
|
23
|
-
return "" if s == false
|
25
|
+
return "offline" if s == false
|
24
26
|
s.puts msg
|
25
27
|
r = s.gets.chomp
|
26
28
|
s.close
|
@@ -42,6 +44,14 @@ class AniClient
|
|
42
44
|
sendMsg "lastchecked"
|
43
45
|
end
|
44
46
|
|
47
|
+
def getItems
|
48
|
+
Serializer.d(sendMsg "items")
|
49
|
+
end
|
50
|
+
|
51
|
+
def getAllCereal
|
52
|
+
sendMsg "itemshash"
|
53
|
+
end
|
54
|
+
|
45
55
|
def server?
|
46
56
|
return false unless sendMsg("up?") == "true"
|
47
57
|
return true
|
@@ -5,8 +5,9 @@ require_relative 'animeseries'
|
|
5
5
|
|
6
6
|
class AnimeIO
|
7
7
|
|
8
|
-
def initialize(pref)
|
8
|
+
def initialize(pref, mpvbridge)
|
9
9
|
@pref = pref
|
10
|
+
@mpvbridge = mpvbridge
|
10
11
|
@empty_hash = {
|
11
12
|
"empty" => AnimeFile.new(
|
12
13
|
"empty",
|
@@ -179,6 +180,6 @@ class AnimeIO
|
|
179
180
|
|
180
181
|
#run mpv
|
181
182
|
def watch(file)
|
182
|
-
|
183
|
+
@mpvbridge.play file
|
183
184
|
end
|
184
185
|
end
|
@@ -36,17 +36,17 @@ class DelugeC
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def connect
|
39
|
+
@connected = false
|
40
|
+
@status = "error connecting"
|
39
41
|
begin
|
40
|
-
@status = "connected"
|
41
42
|
@client.connect
|
42
|
-
@connected = true
|
43
43
|
rescue Deluge::Rpc::Connection::RPCError
|
44
|
-
@
|
45
|
-
@connected = false
|
44
|
+
@client.close
|
46
45
|
rescue RuntimeError
|
47
|
-
@status = "error connecting"
|
48
46
|
@client.close
|
49
|
-
|
47
|
+
else
|
48
|
+
@status = "connected"
|
49
|
+
@connected = true
|
50
50
|
end
|
51
51
|
|
52
52
|
@client.close unless @connected
|
@@ -121,14 +121,20 @@ class DelugeC
|
|
121
121
|
@client.core.remove_torrent(id, withData)
|
122
122
|
end
|
123
123
|
|
124
|
-
def addTorrent mag, loc
|
124
|
+
def addTorrent mag, loc, verbose: false
|
125
125
|
connect unless @connected
|
126
126
|
return false unless @connected
|
127
|
+
puts "[delugec] connected!" if verbose
|
127
128
|
begin
|
128
129
|
tid = @client.core.add_torrent_magnet(mag, {"download_location": loc})
|
129
130
|
rescue Deluge::Rpc::Connection::InvokeTimeoutError
|
131
|
+
puts "[delugec] Error: timeout error" if verbose
|
132
|
+
tid = nil
|
133
|
+
rescue Errno::EPIPE
|
134
|
+
puts "[delugec] Error: Errno::EPIPE" if verbose
|
130
135
|
tid = nil
|
131
136
|
end
|
137
|
+
p tid
|
132
138
|
return true if tid.class == String and tid.length > 1
|
133
139
|
return false
|
134
140
|
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'mpv'
|
2
|
+
require_relative '../../util/format'
|
3
|
+
|
4
|
+
class MPVBridge
|
5
|
+
def initialize pref
|
6
|
+
@pref = pref
|
7
|
+
connect
|
8
|
+
end
|
9
|
+
|
10
|
+
def quit!
|
11
|
+
@mpv.quit!
|
12
|
+
end
|
13
|
+
|
14
|
+
def connect
|
15
|
+
return unless @mpv == nil or @mpv.client.get_property("idle-active") == nil
|
16
|
+
@mpv = MPV::Session.new(user_args: @pref.get("mpv_args").split(" "))
|
17
|
+
end
|
18
|
+
|
19
|
+
def play file
|
20
|
+
connect
|
21
|
+
@playing_file = file
|
22
|
+
@mpv.client.command "loadfile", file.path
|
23
|
+
end
|
24
|
+
|
25
|
+
def playing?
|
26
|
+
@mpv.client.get_property("time-pos") != nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def checkSetWatched percentage
|
30
|
+
if @playing_file != nil
|
31
|
+
swp = Integer(@pref.get "set_watched_percentage")
|
32
|
+
pct = Float(percentage)
|
33
|
+
if pct >= swp and not @playing_file.seen?
|
34
|
+
@playing_file.watch
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def attributes
|
40
|
+
if playing?
|
41
|
+
|
42
|
+
r = {}
|
43
|
+
props = [
|
44
|
+
"time-pos",
|
45
|
+
"percent-pos",
|
46
|
+
"duration"
|
47
|
+
]
|
48
|
+
props.each { |prop|
|
49
|
+
prop_val = @mpv.client.get_property(prop)
|
50
|
+
prop_val = 0 if prop_val == nil
|
51
|
+
r.merge!(
|
52
|
+
prop[0] => prop_val
|
53
|
+
)
|
54
|
+
}
|
55
|
+
|
56
|
+
if @playing_file != nil
|
57
|
+
r.merge!("n" => @playing_file.attributes["t"])
|
58
|
+
else
|
59
|
+
r.merge!("n" => "loading")
|
60
|
+
end
|
61
|
+
|
62
|
+
checkSetWatched r["p"]
|
63
|
+
|
64
|
+
{
|
65
|
+
"t" => Format.format_duration(r["t"]),
|
66
|
+
"p" => Format.format_progress(r["p"]),
|
67
|
+
"d" => Format.format_duration(r["d"]),
|
68
|
+
"n" => r["n"]
|
69
|
+
}
|
70
|
+
else
|
71
|
+
{
|
72
|
+
"t" => "0:00",
|
73
|
+
"p" => "0",
|
74
|
+
"d" => "0:00",
|
75
|
+
"n" => "."
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
@@ -47,14 +47,14 @@
|
|
47
47
|
},
|
48
48
|
"format_library_unwatched" :
|
49
49
|
{
|
50
|
-
"title" : " %t
|
50
|
+
"title" : " %t@ %D %S ",
|
51
51
|
"parent" : " %t - %c@ %D %S ",
|
52
52
|
"child" : " %t@ %D %S %r "
|
53
53
|
},
|
54
54
|
"format_torrents" :
|
55
55
|
{
|
56
56
|
"title" : " %t - %s",
|
57
|
-
"parent" : " %n@ %p "
|
57
|
+
"parent" : " %n - %s@ %e %p\\% "
|
58
58
|
},
|
59
59
|
"format_schedule" :
|
60
60
|
{
|
@@ -71,6 +71,7 @@
|
|
71
71
|
"title" : " %t",
|
72
72
|
"parent" : " %t@ %v "
|
73
73
|
},
|
74
|
+
"format_status" : " %n - %t/%d@ %p ",
|
74
75
|
"deluge_config" :
|
75
76
|
{
|
76
77
|
"host" : "localhost",
|
@@ -87,11 +88,12 @@
|
|
87
88
|
{
|
88
89
|
"port" : "21312"
|
89
90
|
},
|
91
|
+
"set_watched_percentage" : "80",
|
90
92
|
"log_file" : "$conf_dir/aw.log",
|
91
93
|
"daemon_log_file" : "$conf_dir/server.log",
|
92
94
|
"watch_log" : "$conf_dir/watchlog",
|
93
95
|
"conf_dir" : "~/.config/aniview",
|
94
|
-
"
|
96
|
+
"mpv_args" : "--alang=jpn --slang=eng",
|
95
97
|
"local_anime" : null,
|
96
98
|
"schedule" : []
|
97
99
|
}
|