keenser 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +0 -1
- data/bin/keenser +32 -77
- data/keenser.gemspec +0 -1
- data/lib/keenser.rb +62 -2
- data/lib/keenser/music.rb +18 -27
- data/lib/keenser/server.rb +25 -0
- data/lib/keenser/version.rb +1 -1
- metadata +3 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a82b0c422a1dc920fe649ef09c2fc057d4673da
|
4
|
+
data.tar.gz: ca07f7ac0c8def3bda386609c3ae2ef74c7b6605
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b92a2b36d02f38f21fe08edfcd4ae0d0384935a8f53ff13595d4c2a046bf94f1a390122d3324479613e67393eefa25945c567b84c8e9decf38bf2bfb848d5f2a
|
7
|
+
data.tar.gz: d0a1b396f1ffdd39575d3cbc06cd37a81218b666c02dc128d5f0255aed4a1225cc1346ee7549625b91a6228f84059aa64fab8d122dbb6cf9f1795345ee223898
|
data/Gemfile
CHANGED
data/bin/keenser
CHANGED
@@ -1,85 +1,40 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
Keenser::DB.setup!
|
20
|
-
|
21
|
-
# FIXME: need to do something to reload the connection / model after the
|
22
|
-
# db is setup for the first time
|
23
|
-
unless Keenser::Computer.local
|
24
|
-
puts arr "Configuring local machine"
|
25
|
-
|
26
|
-
role = askd "Role", :client
|
27
|
-
music = askd "Music directory", "#{ENV['SYNC']}/Music"
|
28
|
-
playlists = askd "Playlist directory", "#{ENV['HOME']}/Playlists"
|
29
|
-
|
30
|
-
Keenser::Computer.create({
|
31
|
-
name: `hostname`,
|
32
|
-
role: role,
|
33
|
-
music: music,
|
34
|
-
playlists: playlists
|
35
|
-
})
|
36
|
-
|
37
|
-
puts "Saved local config"
|
38
|
-
puts
|
39
|
-
end
|
40
|
-
|
41
|
-
puts "You're all set!"
|
42
|
-
end
|
43
|
-
|
44
|
-
desc "console", "Attach to a database console"
|
45
|
-
def console
|
46
|
-
Keenser.pry
|
47
|
-
end
|
48
|
-
|
49
|
-
# TODO: look into subcommands
|
50
|
-
desc "play", "Play music"
|
51
|
-
def play *args
|
52
|
-
cmd = args.shift || "pause"
|
53
|
-
Keenser::Music.send cmd, *args
|
54
|
-
rescue => e
|
55
|
-
puts "✗ #{e.message}"
|
56
|
-
end
|
57
|
-
|
58
|
-
desc "status", "Show current dependency status"
|
59
|
-
def status
|
60
|
-
[Keenser::DB, Keenser::Music].each do |m|
|
61
|
-
name = m.name.sub /^Keenser::/, ''
|
62
|
-
status, msg = begin
|
63
|
-
['✓'.green, m.status]
|
64
|
-
rescue => e
|
65
|
-
['✗'.red, e.to_s]
|
66
|
-
end
|
67
|
-
puts "#{status} #{name.underline}\t #{msg}"
|
3
|
+
cmd = ARGV.shift
|
4
|
+
session = "keenser"
|
5
|
+
|
6
|
+
|
7
|
+
if cmd == "boot"
|
8
|
+
unless system "tmux list-windows -t '#{session}' >/dev/null 2>&1"
|
9
|
+
`TMUX= tmux new-session -s '#{session}' -d`
|
10
|
+
`tmux send-keys -t '#{session}' '#{__FILE__} server' C-m`
|
11
|
+
`tmux split-window -h -t '#{session}'`
|
12
|
+
`tmux send-keys -t '#{session}' "cmus" C-m`
|
13
|
+
if ENV["TMUX"]
|
14
|
+
puts "Started new session '#{session}'"
|
15
|
+
exit
|
16
|
+
else
|
17
|
+
exec "tmux attach -t '#{session}'"
|
68
18
|
end
|
69
19
|
end
|
20
|
+
end
|
70
21
|
|
71
|
-
no_commands do
|
72
|
-
|
73
|
-
def arr str
|
74
|
-
"#{'==>'.light_blue} #{str}"
|
75
|
-
end
|
76
22
|
|
77
|
-
|
78
|
-
val = ask("#{field} (#{default}) >").strip
|
79
|
-
val.empty? ? default : val
|
80
|
-
end
|
23
|
+
require_relative "../lib/keenser"
|
81
24
|
|
82
|
-
|
25
|
+
case cmd
|
26
|
+
when "boot"
|
27
|
+
# No-op, just run the above startup logic
|
28
|
+
when nil, "console"
|
29
|
+
require "pry"
|
30
|
+
Pry.commands.delete "play"
|
31
|
+
Keenser.pry
|
32
|
+
when "server"
|
33
|
+
Keenser.start_server!
|
34
|
+
when "remote"
|
35
|
+
require "drb/drb"
|
36
|
+
DRb.start_service
|
37
|
+
puts DRbObject.new_with_uri(Keenser::Server.uri).send *ARGV
|
38
|
+
else
|
39
|
+
raise Keenser::Error.new "Not implemented: #{cmd}"
|
83
40
|
end
|
84
|
-
|
85
|
-
Default.start
|
data/keenser.gemspec
CHANGED
@@ -21,7 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_dependency "colorize", "~> 0.6"
|
22
22
|
spec.add_dependency "pry", "~> 0.9"
|
23
23
|
spec.add_dependency "sequel", "~> 4.6"
|
24
|
-
spec.add_dependency "thor", "~> 0.18"
|
25
24
|
|
26
25
|
spec.add_development_dependency "bundler", "~> 1.5"
|
27
26
|
spec.add_development_dependency "rake", "~> 10.1"
|
data/lib/keenser.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
-
|
1
|
+
# encoding: utf-8
|
2
|
+
# FIXME: lazy-load everything
|
3
|
+
%w{ colorize sequel }.each { |m| require m }
|
2
4
|
|
3
5
|
%w{
|
4
|
-
version error db music
|
6
|
+
version error db music server
|
5
7
|
}.each { |m| require_relative "../lib/keenser/#{m}" }
|
6
8
|
|
7
9
|
module Keenser
|
@@ -19,4 +21,62 @@ module Keenser
|
|
19
21
|
:Tag => "tag",
|
20
22
|
:SongTag => "song_tag"
|
21
23
|
}.each { |name,m| autoload name, src("model/#{m}") }
|
24
|
+
|
25
|
+
def self.setup
|
26
|
+
unless ENV["SYNC"]
|
27
|
+
ENV["SYNC"] = ask "Path to sync directory >"
|
28
|
+
puts %!You should probably add `export SYNC="#{ENV['SYNC']}"` to your .*rc file!.yellow
|
29
|
+
puts
|
30
|
+
end
|
31
|
+
|
32
|
+
DB.setup!
|
33
|
+
|
34
|
+
# FIXME: need to do something to reload the connection / model after the
|
35
|
+
# db is setup for the first time
|
36
|
+
unless Computer.local
|
37
|
+
puts arr "Configuring local machine"
|
38
|
+
|
39
|
+
role = ask "Role", :client
|
40
|
+
music = ask "Music directory", "#{ENV['SYNC']}/Music"
|
41
|
+
playlists = ask "Playlist directory", "#{ENV['HOME']}/Playlists"
|
42
|
+
|
43
|
+
Computer.create({
|
44
|
+
name: `hostname`,
|
45
|
+
role: role,
|
46
|
+
music: music,
|
47
|
+
playlists: playlists
|
48
|
+
})
|
49
|
+
|
50
|
+
puts "Saved local config"
|
51
|
+
puts
|
52
|
+
end
|
53
|
+
|
54
|
+
puts "You're all set!"
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.status
|
58
|
+
[Keenser::DB, Keenser::Music].each do |m|
|
59
|
+
name = m.name.sub /^Keenser::/, ''
|
60
|
+
status, msg = begin
|
61
|
+
['✓'.green, m.status]
|
62
|
+
rescue => e
|
63
|
+
['✗'.red, e.to_s]
|
64
|
+
end
|
65
|
+
puts "#{status} #{name.underline}\t #{msg}"
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def self.arr str
|
72
|
+
"#{'==>'.light_blue} #{str}"
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.ask field, default=nil
|
76
|
+
print field
|
77
|
+
print " (#{default})" if default
|
78
|
+
print " > "
|
79
|
+
val = STDIN.gets.strip
|
80
|
+
val.empty? ? default : val
|
81
|
+
end
|
22
82
|
end
|
data/lib/keenser/music.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
module Keenser
|
2
3
|
module Music
|
3
4
|
extend self
|
4
5
|
|
5
|
-
SESSION_NAME = "music"
|
6
|
-
|
7
6
|
def status
|
8
7
|
expect "tmux"
|
9
8
|
expect "cmus-remote"
|
@@ -15,29 +14,30 @@ module Keenser
|
|
15
14
|
end
|
16
15
|
end
|
17
16
|
|
17
|
+
def show
|
18
|
+
playing.to_s
|
19
|
+
end
|
20
|
+
|
18
21
|
%w{ prev pause next }.each do |cmd|
|
19
|
-
define_method
|
22
|
+
define_method cmd do
|
23
|
+
puts "Pressed #{cmd}"
|
24
|
+
`cmus-remote --#{cmd}`
|
25
|
+
show
|
26
|
+
end
|
20
27
|
end
|
21
28
|
|
22
29
|
def tag name
|
23
30
|
playing.tag name
|
24
|
-
puts "#{
|
25
|
-
|
26
|
-
|
27
|
-
def method_missing *args
|
28
|
-
name = args.first.to_s
|
29
|
-
if Tag.where(name: name).any?
|
30
|
-
list name
|
31
|
-
else
|
32
|
-
raise Error.new "Don't know how to play '#{args}'"
|
33
|
-
end
|
31
|
+
puts "Tagging #{playing} as #{name}"
|
32
|
+
"#{name} ← #{playing}"
|
34
33
|
end
|
35
34
|
|
36
35
|
def list name
|
37
|
-
t = Tag.where(name: name).first
|
36
|
+
t = Tag.where(name: name.to_s).first
|
37
|
+
t.export!
|
38
38
|
raise Error.new "Cannot find tag '#{t}'" unless t
|
39
39
|
`echo "load -p #{t.playlist}\nset play_library=false\nplayer-next" | cmus-remote`
|
40
|
-
|
40
|
+
"'#{name}' now playing"
|
41
41
|
end
|
42
42
|
|
43
43
|
def import name, path
|
@@ -51,12 +51,13 @@ module Keenser
|
|
51
51
|
n += 1
|
52
52
|
end
|
53
53
|
t.export!
|
54
|
-
|
54
|
+
"Imported #{n} songs"
|
55
55
|
end
|
56
56
|
|
57
57
|
def all
|
58
|
+
puts "Playing all songs"
|
58
59
|
`echo "set play_library=true\nplayer-next" | cmus-remote`
|
59
|
-
|
60
|
+
show
|
60
61
|
end
|
61
62
|
|
62
63
|
private
|
@@ -77,7 +78,6 @@ module Keenser
|
|
77
78
|
s
|
78
79
|
end
|
79
80
|
|
80
|
-
|
81
81
|
def test cmd
|
82
82
|
system "#{cmd} >/dev/null 2>&1"
|
83
83
|
end
|
@@ -85,14 +85,5 @@ module Keenser
|
|
85
85
|
def expect bin
|
86
86
|
raise Error.new "'#{bin}' is not present" unless test "which #{bin}"
|
87
87
|
end
|
88
|
-
|
89
|
-
def remote cmd
|
90
|
-
unless test "tmux list-windows -t '#{SESSION_NAME}'"
|
91
|
-
# tmux might complain about starting nested sessions without the TMUX=
|
92
|
-
`TMUX= tmux new-session -s '#{SESSION_NAME}' -d 'cmus'`
|
93
|
-
end
|
94
|
-
|
95
|
-
`cmus-remote --#{cmd}`
|
96
|
-
end
|
97
88
|
end
|
98
89
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require "drb/drb"
|
2
|
+
require "pry"
|
3
|
+
|
4
|
+
module Keenser
|
5
|
+
def self.start_server!
|
6
|
+
# FIXME: $SAFE = 1
|
7
|
+
|
8
|
+
puts "Starting DRb server at '#{Server.uri}'"
|
9
|
+
DRb.start_service Server.uri, Server.new
|
10
|
+
DRb.thread.join
|
11
|
+
end
|
12
|
+
|
13
|
+
class Server
|
14
|
+
def self.uri
|
15
|
+
"druby://localhost:8787"
|
16
|
+
end
|
17
|
+
|
18
|
+
def play *args
|
19
|
+
cmd = args.shift || "pause"
|
20
|
+
Music.send cmd, *args
|
21
|
+
rescue => e
|
22
|
+
puts "#{'✗'.red} #{e.message}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/keenser/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: keenser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Dabbs
|
@@ -52,20 +52,6 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '4.6'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: thor
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0.18'
|
62
|
-
type: :runtime
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0.18'
|
69
55
|
- !ruby/object:Gem::Dependency
|
70
56
|
name: bundler
|
71
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -120,6 +106,7 @@ files:
|
|
120
106
|
- lib/keenser/model/song_tag.rb
|
121
107
|
- lib/keenser/model/tag.rb
|
122
108
|
- lib/keenser/music.rb
|
109
|
+
- lib/keenser/server.rb
|
123
110
|
- lib/keenser/version.rb
|
124
111
|
homepage: ''
|
125
112
|
licenses:
|
@@ -146,3 +133,4 @@ signing_key:
|
|
146
133
|
specification_version: 4
|
147
134
|
summary: A wee sidekick
|
148
135
|
test_files: []
|
136
|
+
has_rdoc:
|