somadic 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +6 -4
- data/bin/curses/somadic +22 -10
- data/bin/somadic +22 -10
- data/lib/somadic/base_channel.rb +8 -1
- data/lib/somadic/channel/slay_radio.rb +66 -0
- data/lib/somadic/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de245545ac8fcf5c46871ccc33da669bf8e110de
|
4
|
+
data.tar.gz: 3f22648c7c61efd72a150d68126c5fd49eb1de0b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcd9c0b0a9951feb56d54dad3baa2ed9fa5959ce1f262f2e66b6bc0621a143217b225634d44d6f574b289639956ac6c3147eee06ef3d207b46f15f407265752b
|
7
|
+
data.tar.gz: f562e66865f8f06bad224712ada70d7ec6d414a4d7f380a9f7d48d4c7a7a6793aa4273e395b7b622c23552b974c59697b1c7218bb3d014325b4c80966e98849e
|
data/README.md
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
# Somadic
|
2
2
|
|
3
|
-
Somadic is a bare-bones terminal-based player for [somafm.com](http://somafm.com)
|
4
|
-
It uses `mplayer` to do the heavy lifting. It's a hot
|
3
|
+
Somadic is a bare-bones terminal-based player for [somafm.com](http://somafm.com), [di.fm](http://di.fm),
|
4
|
+
and [SLAY Radio](http://www.slayradio.org). It uses `mplayer` to do the heavy lifting. It's also a hot
|
5
|
+
Curses mess, but it works on my machine.
|
5
6
|
|
6
7
|
```
|
7
8
|
$ somadic di:breaks
|
@@ -28,8 +29,8 @@ Usage: somadic [options] [preset_name | [site1:channel1 ...]]
|
|
28
29
|
|
29
30
|
You can specify either a `preset_name` or an arbitrary list of `site:channel` identifiers.
|
30
31
|
|
31
|
-
site:
|
32
|
-
channel: a valid channel on `site`
|
32
|
+
site: `di`, `soma`, or `slayradio`
|
33
|
+
channel: a valid channel on `site`, or `slayradio` if site is slayradio
|
33
34
|
|
34
35
|
DI premium channels require an environment variable: DI_FM_PREMIUM_ID.
|
35
36
|
|
@@ -62,6 +63,7 @@ a YAML file in `~/.somadic/presets`, say `chill.yaml`, with the following conten
|
|
62
63
|
- soma:secretagent
|
63
64
|
- di:psychill
|
64
65
|
- soma:lush
|
66
|
+
- slayradio:slayradio
|
65
67
|
```
|
66
68
|
|
67
69
|
You can then start somadic with the preset's name:
|
data/bin/curses/somadic
CHANGED
@@ -11,10 +11,7 @@ require 'yaml'
|
|
11
11
|
SOMADIC_PATH = ENV['HOME'] + '/.somadic'
|
12
12
|
|
13
13
|
base_path = File.expand_path(File.dirname(__FILE__))
|
14
|
-
Dir["#{base_path}/curses/lib/*.rb"].each
|
15
|
-
Somadic::Logger.debug("require #{file}")
|
16
|
-
require file
|
17
|
-
end
|
14
|
+
Dir["#{base_path}/curses/lib/*.rb"].each { |file| require file }
|
18
15
|
|
19
16
|
Signal.trap("INT") do |sig|
|
20
17
|
@channel.stop
|
@@ -29,8 +26,9 @@ end
|
|
29
26
|
@optparser = OptionParser.new do |o|
|
30
27
|
o.banner = 'Usage: somadic [options] site:channel [site:channel]'
|
31
28
|
o.separator ''
|
32
|
-
o.separator 'The `site` parameter can be di or
|
33
|
-
o.separator
|
29
|
+
o.separator 'The `site` parameter can be di, soma, or slayradio. `channel`'
|
30
|
+
o.separator "should be a valid channel on that site except when it's slayradio,"
|
31
|
+
o.separator 'when `channel` should also be slayradio (slayradio:slayradio).'
|
34
32
|
o.separator ''
|
35
33
|
o.separator 'DI premium channels require an environment variable: ' \
|
36
34
|
'DI_FM_PREMIUM_ID.'
|
@@ -69,8 +67,10 @@ def start_playing
|
|
69
67
|
@options[:premium_id] = ENV['DI_FM_PREMIUM_ID']
|
70
68
|
if who == 'di'
|
71
69
|
@channel = Somadic::Channel::DI.new(@options)
|
72
|
-
|
70
|
+
elsif who == 'soma'
|
73
71
|
@channel = Somadic::Channel::Soma.new(@options)
|
72
|
+
else
|
73
|
+
@channel = Somadic::Channel::SlayRadio.new(@options)
|
74
74
|
end
|
75
75
|
@channel.start
|
76
76
|
end
|
@@ -151,8 +151,10 @@ def goto_channel(channel)
|
|
151
151
|
@options[:channel] = what
|
152
152
|
if who == 'di'
|
153
153
|
@channel = Somadic::Channel::DI.new(@options)
|
154
|
-
|
154
|
+
elsif who == 'soma'
|
155
155
|
@channel = Somadic::Channel::Soma.new(@options)
|
156
|
+
else
|
157
|
+
@channel = Somadic::Channel::SlayRadio.new(@options)
|
156
158
|
end
|
157
159
|
@channel.start
|
158
160
|
end
|
@@ -162,8 +164,18 @@ def goto_next_channel
|
|
162
164
|
end
|
163
165
|
|
164
166
|
def goto_next_channel_random
|
165
|
-
who = @channel.is_a?(Somadic::Channel::DI)
|
166
|
-
|
167
|
+
who = if @channel.is_a?(Somadic::Channel::DI)
|
168
|
+
'di'
|
169
|
+
elsif @channel.is_a?(Somadic::Channel::Soma)
|
170
|
+
'soma'
|
171
|
+
else
|
172
|
+
'slayradio'
|
173
|
+
end
|
174
|
+
what = if who == 'slayradio'
|
175
|
+
'slayradio'
|
176
|
+
else
|
177
|
+
@channel.channels.reject { |c| c[:name] == @display.channel[:name] }.sample[:name]
|
178
|
+
end
|
167
179
|
goto_channel("#{who}:#{what}")
|
168
180
|
end
|
169
181
|
|
data/bin/somadic
CHANGED
@@ -11,10 +11,7 @@ require 'yaml'
|
|
11
11
|
SOMADIC_PATH = ENV['HOME'] + '/.somadic'
|
12
12
|
|
13
13
|
base_path = File.expand_path(File.dirname(__FILE__))
|
14
|
-
Dir["#{base_path}/curses/lib/*.rb"].each
|
15
|
-
Somadic::Logger.debug("require #{file}")
|
16
|
-
require file
|
17
|
-
end
|
14
|
+
Dir["#{base_path}/curses/lib/*.rb"].each { |file| require file }
|
18
15
|
|
19
16
|
Signal.trap("INT") do |sig|
|
20
17
|
@channel.stop
|
@@ -29,8 +26,9 @@ end
|
|
29
26
|
@optparser = OptionParser.new do |o|
|
30
27
|
o.banner = 'Usage: somadic [options] site:channel [site:channel]'
|
31
28
|
o.separator ''
|
32
|
-
o.separator 'The `site` parameter can be di or
|
33
|
-
o.separator
|
29
|
+
o.separator 'The `site` parameter can be di, soma, or slayradio. `channel`'
|
30
|
+
o.separator "should be a valid channel on that site except when it's slayradio,"
|
31
|
+
o.separator 'when `channel` should also be slayradio (slayradio:slayradio).'
|
34
32
|
o.separator ''
|
35
33
|
o.separator 'DI premium channels require an environment variable: ' \
|
36
34
|
'DI_FM_PREMIUM_ID.'
|
@@ -69,8 +67,10 @@ def start_playing
|
|
69
67
|
@options[:premium_id] = ENV['DI_FM_PREMIUM_ID']
|
70
68
|
if who == 'di'
|
71
69
|
@channel = Somadic::Channel::DI.new(@options)
|
72
|
-
|
70
|
+
elsif who == 'soma'
|
73
71
|
@channel = Somadic::Channel::Soma.new(@options)
|
72
|
+
else
|
73
|
+
@channel = Somadic::Channel::SlayRadio.new(@options)
|
74
74
|
end
|
75
75
|
@channel.start
|
76
76
|
end
|
@@ -151,8 +151,10 @@ def goto_channel(channel)
|
|
151
151
|
@options[:channel] = what
|
152
152
|
if who == 'di'
|
153
153
|
@channel = Somadic::Channel::DI.new(@options)
|
154
|
-
|
154
|
+
elsif who == 'soma'
|
155
155
|
@channel = Somadic::Channel::Soma.new(@options)
|
156
|
+
else
|
157
|
+
@channel = Somadic::Channel::SlayRadio.new(@options)
|
156
158
|
end
|
157
159
|
@channel.start
|
158
160
|
end
|
@@ -162,8 +164,18 @@ def goto_next_channel
|
|
162
164
|
end
|
163
165
|
|
164
166
|
def goto_next_channel_random
|
165
|
-
who = @channel.is_a?(Somadic::Channel::DI)
|
166
|
-
|
167
|
+
who = if @channel.is_a?(Somadic::Channel::DI)
|
168
|
+
'di'
|
169
|
+
elsif @channel.is_a?(Somadic::Channel::Soma)
|
170
|
+
'soma'
|
171
|
+
else
|
172
|
+
'slayradio'
|
173
|
+
end
|
174
|
+
what = if who == 'slayradio'
|
175
|
+
'slayradio'
|
176
|
+
else
|
177
|
+
@channel.channels.reject { |c| c[:name] == @display.channel[:name] }.sample[:name]
|
178
|
+
end
|
167
179
|
goto_channel("#{who}:#{what}")
|
168
180
|
end
|
169
181
|
|
data/lib/somadic/base_channel.rb
CHANGED
@@ -8,7 +8,14 @@ module Somadic
|
|
8
8
|
def initialize(options)
|
9
9
|
@url = options[:url]
|
10
10
|
playlist = @url.split('/').last
|
11
|
-
|
11
|
+
if playlist.end_with?('.pls')
|
12
|
+
name = playlist[0..playlist.index('.pls') - 1]
|
13
|
+
elsif playlist.end_with?('.m3u')
|
14
|
+
name = playlist[0..playlist.index('.m3u') - 1]
|
15
|
+
else
|
16
|
+
Somadic::Logger.error("BaseChannel#initialize: bad playlist #{playlist}")
|
17
|
+
return
|
18
|
+
end
|
12
19
|
@channel = find_channel(name)
|
13
20
|
|
14
21
|
@mp = Mplayer.new(options)
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# A wrapper around a SLAYradio channel.
|
2
|
+
module Somadic
|
3
|
+
module Channel
|
4
|
+
class SlayRadio < Somadic::BaseChannel
|
5
|
+
CHANNEL_NAME = 'slayradio'
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
@options = options
|
9
|
+
@options[:channel] = CHANNEL_NAME
|
10
|
+
@channels = load_channels
|
11
|
+
super(options.merge({ url: 'http://www.slayradio.org/tune_in.php/128kbps/slayradio.128.m3u' }))
|
12
|
+
end
|
13
|
+
|
14
|
+
# Overrides BaseChannel
|
15
|
+
def find_channel(name)
|
16
|
+
Somadic::Logger.debug("SlayRadio#find_channel(#{name})")
|
17
|
+
{ id: 0, name: name, display_name: name }
|
18
|
+
end
|
19
|
+
|
20
|
+
# Observer callback.
|
21
|
+
def update(time, song)
|
22
|
+
@song = song if song
|
23
|
+
songs = refresh_playlist
|
24
|
+
channel = { id: 0, name: @options[:channel], display_name: @options[:channel] }
|
25
|
+
@listeners.each do |l|
|
26
|
+
l.update(channel, songs) if l.respond_to?(:update)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def load_channels
|
33
|
+
[{id: 0, name: @options[:channel], display_name: @options[:channel]}]
|
34
|
+
end
|
35
|
+
|
36
|
+
def refresh_playlist
|
37
|
+
url = 'https://www.slayradio.org/api.php?query=rotationalhistory'
|
38
|
+
page = open(url).read
|
39
|
+
json = JSON.parse(page)
|
40
|
+
songs = []
|
41
|
+
json['data'].each do |song|
|
42
|
+
artist = song['artist']
|
43
|
+
title = song['title']
|
44
|
+
if artist == title
|
45
|
+
track = artist
|
46
|
+
else
|
47
|
+
track = "#{artist} - #{title}"
|
48
|
+
end
|
49
|
+
songs << { started: Time.at(song['nowplaying'].to_i),
|
50
|
+
votes: {up: 0, down: 0},
|
51
|
+
duration: duration(song['duration'].to_i),
|
52
|
+
artist: artist,
|
53
|
+
title: title,
|
54
|
+
track: track }
|
55
|
+
end
|
56
|
+
songs
|
57
|
+
rescue => e
|
58
|
+
Somadic::Logger.error("SlayRadio#refresh_playlist: error #{e}")
|
59
|
+
end
|
60
|
+
|
61
|
+
def duration(val)
|
62
|
+
Time.at(val/1000).to_i
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/somadic/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: somadic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Thomas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-03-
|
11
|
+
date: 2015-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mono_logger
|
@@ -174,6 +174,7 @@ files:
|
|
174
174
|
- lib/somadic/audio_addict.rb
|
175
175
|
- lib/somadic/base_channel.rb
|
176
176
|
- lib/somadic/channel/di.rb
|
177
|
+
- lib/somadic/channel/slay_radio.rb
|
177
178
|
- lib/somadic/channel/soma.rb
|
178
179
|
- lib/somadic/logger.rb
|
179
180
|
- lib/somadic/mplayer.rb
|