meuh 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5bb87a1e1f46b99880276dd16c8802b8a54d5a68
4
+ data.tar.gz: 325d0c31b17ebef800058b1d623ca32f216f72bd
5
+ SHA512:
6
+ metadata.gz: 20cf600edfd26a0c495bea4327ccaa665a355be046b0a529dae15338dc9092d11e482f273826aad536fd1b409616725009c94100218863400f5846f21ca48a1c
7
+ data.tar.gz: 8f7b23889ca275904621d28c717e0a7c60c195bafa3aa816277f80bf1f1fd14c17a794514b5a781b798b2319a0c2cd6fec41504be309aa803a7595df1428abf8
data/bin/meuh ADDED
@@ -0,0 +1,27 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+
4
+ require 'trollop'
5
+ require 'meuh'
6
+
7
+ opts = Trollop.options do
8
+ version "meuh #{Meuh.version}"
9
+ banner <<-EOS
10
+ Meuh is a command-line tool to get the current played track at Anticafé.
11
+
12
+ Usage:
13
+ meuh [options]
14
+ where [options] are:
15
+ EOS
16
+
17
+ opt :version, 'Print the version and exit', :default => false
18
+ opt :no_format, 'Disable colored/underlined output', :default => false,
19
+ :short => '-F'
20
+
21
+ end
22
+
23
+ opts[:color] = !opts[:no_format]
24
+
25
+ t = Meuh.tracks(opts)
26
+ puts Meuh.format_results(t, opts[:color])
27
+
@@ -0,0 +1,68 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ module Meuh
4
+ module Formatting
5
+ class << self
6
+
7
+ # Format tracks for text output (e.g. in the terminal)
8
+ def text(tracks, color=true)
9
+ if color
10
+ require 'colored'
11
+ # this line is from github.com/defunkt/colored
12
+ require 'Win32/Console/ANSI' if RUBY_PLATFORM =~ /win32/
13
+ end
14
+ s = []
15
+
16
+ def track_text(t, style, color) # :previous, :next, :curr
17
+ title = t[:title]
18
+ artist = t[:artist]
19
+ album = t[:album]
20
+ time = style == :previous ? "[#{t[:time]}] " : ''
21
+
22
+ title.gsub!(/&amp;/, '&')
23
+ title.strip!
24
+
25
+ if color
26
+ title = title.underline
27
+ if artist and style == :curr
28
+ artist = artist.cyan
29
+ end
30
+ end
31
+
32
+ info = [artist, album].compact
33
+ info = info.empty? ? '' : " (#{info.map(&:to_s).join(' - ')})"
34
+
35
+ if style == :curr and color
36
+ info = info.green
37
+ end
38
+
39
+ ts = "#{time}#{title}#{info}"
40
+
41
+ ts = "* #{ts}" unless style == :curr
42
+
43
+ ts
44
+ end
45
+
46
+ if tracks[:current]
47
+ s << track_text(tracks[:current], :curr, color)
48
+ end
49
+
50
+ if tracks[:previous] and !tracks[:previous].empty?
51
+ s << "\nPreviously:"
52
+ tracks[:previous].each do |t|
53
+ s << track_text(t, :previous, color)
54
+ end
55
+ end
56
+
57
+ if tracks[:next] and !tracks[:next].empty?
58
+ s << "\nNext:"
59
+ tracks[:next].each do |t|
60
+ s << track_text(t, :next, color)
61
+ end
62
+ end
63
+
64
+ s.join("\n")
65
+ end
66
+ end
67
+ end
68
+ end
data/lib/meuh.rb ADDED
@@ -0,0 +1,90 @@
1
+ # -*- coding: UTF-8 -*-
2
+
3
+ require 'uri'
4
+ require 'open-uri'
5
+ require 'nokogiri'
6
+
7
+ require File.dirname(__FILE__) + '/meuh/formatting'
8
+
9
+ # This module provide some methods to scrape current tracks from radiomeuh.com
10
+ module Meuh
11
+ class << self
12
+
13
+ def version
14
+ '0.1.0'
15
+ end
16
+
17
+ def url
18
+ 'http://www.radiomeuh.com/meuh/playlist/index.php'
19
+ end
20
+
21
+ # Get the text of an element. This is an helper for internal usage.
22
+ def text(el)
23
+ el.text.strip.gsub(/\r/, "\n")
24
+ rescue
25
+ ''
26
+ end
27
+
28
+ # Query the website, parse the list of tracks and return a hash:
29
+ # { :previous => [ <track> ],
30
+ # :current => <track>,
31
+ # :next => [ <track>, ... ]
32
+ # }
33
+ #
34
+ # A track is also a hash:
35
+ # { :artist => "...",
36
+ # :album => "...",
37
+ # :title => "...",
38
+ # :remaining => "...", <-- remaining time
39
+ # :time => "..." <-- time for previous tracks
40
+ # }
41
+ def tracks(*opts)
42
+ opts = opts[0] || {}
43
+ tracks = { :previous => [], :current => nil, :next => [] }
44
+
45
+ doc = Nokogiri::HTML(open(url))
46
+
47
+ def parse_track t
48
+ lines = t.inner_html.split(/<br\/?\s*>/)
49
+
50
+ artist, title = lines[1].split(/\s+-\s+/, 2)
51
+
52
+ unless title
53
+ title = artist
54
+ artist = nil
55
+ end
56
+
57
+ {
58
+ :artist => artist,
59
+ :album => lines[2].strip,
60
+ :title => title,
61
+ :remaining => t.css('font').text.gsub(/^:\s+/, ''),
62
+ :time => lines[0].strip
63
+ }
64
+ end
65
+
66
+ got_current = false
67
+ doc.css('tr > td + td').each do |td|
68
+ if !got_current
69
+ b = td.css('b').first
70
+ if b
71
+ got_current = true
72
+ tracks[:current] = parse_track(b)
73
+ else
74
+ tracks[:next] << parse_track(td)
75
+ end
76
+ else
77
+ tracks[:previous] << parse_track(td)
78
+ end
79
+ end
80
+
81
+ tracks
82
+ end
83
+
84
+ # Format tracks for output
85
+ def format_results(tracks, color=true)
86
+ self::Formatting.text(tracks, color)
87
+ end
88
+
89
+ end
90
+ end
data/tests/tests.rb ADDED
@@ -0,0 +1,28 @@
1
+ #! /usr/bin/env ruby
2
+ # -*- coding: UTF-8 -*-
3
+
4
+ require 'test/unit'
5
+ require 'simplecov'
6
+
7
+ test_dir = File.expand_path( File.dirname(__FILE__) )
8
+
9
+ SimpleCov.start { add_filter '/tests/' } if ENV['COVERAGE']
10
+
11
+ require 'meuh'
12
+
13
+ for t in Dir.glob( File.join( test_dir, '*_tests.rb' ) )
14
+ require t
15
+ end
16
+
17
+ class MeuhTests < Test::Unit::TestCase
18
+
19
+ # == Meuh#version == #
20
+
21
+ def test_meuh_version
22
+ assert(Meuh.version =~ /^\d+\.\d+\.\d+/)
23
+ end
24
+
25
+ end
26
+
27
+
28
+ exit Test::Unit::AutoRunner.run
metadata ADDED
@@ -0,0 +1,148 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: meuh
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Baptiste Fontaine
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-01-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: nokogiri
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.9
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.9
27
+ - !ruby/object:Gem::Dependency
28
+ name: trollop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: colored
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '1.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: simplecov
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: test-unit
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: fakeweb
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ description: Get the currently played track on Radiomeuh.com, which is the radio used
112
+ at Anticafé.
113
+ email: batifon@yahoo.fr
114
+ executables:
115
+ - meuh
116
+ extensions: []
117
+ extra_rdoc_files: []
118
+ files:
119
+ - lib/meuh.rb
120
+ - lib/meuh/formatting.rb
121
+ - tests/tests.rb
122
+ - bin/meuh
123
+ homepage: https://github.com/bfontaine/meuh-cli
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - '>='
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - '>='
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.0.3
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: scrapper for radiomeuh.com's current playlist
147
+ test_files:
148
+ - tests/tests.rb