ruby-ampache 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,21 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
data/LICENSE ADDED
@@ -0,0 +1,344 @@
1
+ Copyright (c) 2009 tha
2
+ This software is released under the terms of
3
+ GNU GENERAL PUBLIC LICENSE.
4
+
5
+
6
+ GNU GENERAL PUBLIC LICENSE
7
+ Version 2, June 1991
8
+
9
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
10
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
11
+ Everyone is permitted to copy and distribute verbatim copies
12
+ of this license document, but changing it is not allowed.
13
+
14
+ Preamble
15
+
16
+ The licenses for most software are designed to take away your
17
+ freedom to share and change it. By contrast, the GNU General Public
18
+ License is intended to guarantee your freedom to share and change free
19
+ software--to make sure the software is free for all its users. This
20
+ General Public License applies to most of the Free Software
21
+ Foundation's software and to any other program whose authors commit to
22
+ using it. (Some other Free Software Foundation software is covered by
23
+ the GNU Lesser General Public License instead.) You can apply it to
24
+ your programs, too.
25
+
26
+ When we speak of free software, we are referring to freedom, not
27
+ price. Our General Public Licenses are designed to make sure that you
28
+ have the freedom to distribute copies of free software (and charge for
29
+ this service if you wish), that you receive source code or can get it
30
+ if you want it, that you can change the software or use pieces of it
31
+ in new free programs; and that you know you can do these things.
32
+
33
+ To protect your rights, we need to make restrictions that forbid
34
+ anyone to deny you these rights or to ask you to surrender the rights.
35
+ These restrictions translate to certain responsibilities for you if you
36
+ distribute copies of the software, or if you modify it.
37
+
38
+ For example, if you distribute copies of such a program, whether
39
+ gratis or for a fee, you must give the recipients all the rights that
40
+ you have. You must make sure that they, too, receive or can get the
41
+ source code. And you must show them these terms so they know their
42
+ rights.
43
+
44
+ We protect your rights with two steps: (1) copyright the software, and
45
+ (2) offer you this license which gives you legal permission to copy,
46
+ distribute and/or modify the software.
47
+
48
+ Also, for each author's protection and ours, we want to make certain
49
+ that everyone understands that there is no warranty for this free
50
+ software. If the software is modified by someone else and passed on, we
51
+ want its recipients to know that what they have is not the original, so
52
+ that any problems introduced by others will not reflect on the original
53
+ authors' reputations.
54
+
55
+ Finally, any free program is threatened constantly by software
56
+ patents. We wish to avoid the danger that redistributors of a free
57
+ program will individually obtain patent licenses, in effect making the
58
+ program proprietary. To prevent this, we have made it clear that any
59
+ patent must be licensed for everyone's free use or not licensed at all.
60
+
61
+ The precise terms and conditions for copying, distribution and
62
+ modification follow.
63
+
64
+ GNU GENERAL PUBLIC LICENSE
65
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
66
+
67
+ 0. This License applies to any program or other work which contains
68
+ a notice placed by the copyright holder saying it may be distributed
69
+ under the terms of this General Public License. The "Program", below,
70
+ refers to any such program or work, and a "work based on the Program"
71
+ means either the Program or any derivative work under copyright law:
72
+ that is to say, a work containing the Program or a portion of it,
73
+ either verbatim or with modifications and/or translated into another
74
+ language. (Hereinafter, translation is included without limitation in
75
+ the term "modification".) Each licensee is addressed as "you".
76
+
77
+ Activities other than copying, distribution and modification are not
78
+ covered by this License; they are outside its scope. The act of
79
+ running the Program is not restricted, and the output from the Program
80
+ is covered only if its contents constitute a work based on the
81
+ Program (independent of having been made by running the Program).
82
+ Whether that is true depends on what the Program does.
83
+
84
+ 1. You may copy and distribute verbatim copies of the Program's
85
+ source code as you receive it, in any medium, provided that you
86
+ conspicuously and appropriately publish on each copy an appropriate
87
+ copyright notice and disclaimer of warranty; keep intact all the
88
+ notices that refer to this License and to the absence of any warranty;
89
+ and give any other recipients of the Program a copy of this License
90
+ along with the Program.
91
+
92
+ You may charge a fee for the physical act of transferring a copy, and
93
+ you may at your option offer warranty protection in exchange for a fee.
94
+
95
+ 2. You may modify your copy or copies of the Program or any portion
96
+ of it, thus forming a work based on the Program, and copy and
97
+ distribute such modifications or work under the terms of Section 1
98
+ above, provided that you also meet all of these conditions:
99
+
100
+ a) You must cause the modified files to carry prominent notices
101
+ stating that you changed the files and the date of any change.
102
+
103
+ b) You must cause any work that you distribute or publish, that in
104
+ whole or in part contains or is derived from the Program or any
105
+ part thereof, to be licensed as a whole at no charge to all third
106
+ parties under the terms of this License.
107
+
108
+ c) If the modified program normally reads commands interactively
109
+ when run, you must cause it, when started running for such
110
+ interactive use in the most ordinary way, to print or display an
111
+ announcement including an appropriate copyright notice and a
112
+ notice that there is no warranty (or else, saying that you provide
113
+ a warranty) and that users may redistribute the program under
114
+ these conditions, and telling the user how to view a copy of this
115
+ License. (Exception: if the Program itself is interactive but
116
+ does not normally print such an announcement, your work based on
117
+ the Program is not required to print an announcement.)
118
+
119
+ These requirements apply to the modified work as a whole. If
120
+ identifiable sections of that work are not derived from the Program,
121
+ and can be reasonably considered independent and separate works in
122
+ themselves, then this License, and its terms, do not apply to those
123
+ sections when you distribute them as separate works. But when you
124
+ distribute the same sections as part of a whole which is a work based
125
+ on the Program, the distribution of the whole must be on the terms of
126
+ this License, whose permissions for other licensees extend to the
127
+ entire whole, and thus to each and every part regardless of who wrote it.
128
+
129
+ Thus, it is not the intent of this section to claim rights or contest
130
+ your rights to work written entirely by you; rather, the intent is to
131
+ exercise the right to control the distribution of derivative or
132
+ collective works based on the Program.
133
+
134
+ In addition, mere aggregation of another work not based on the Program
135
+ with the Program (or with a work based on the Program) on a volume of
136
+ a storage or distribution medium does not bring the other work under
137
+ the scope of this License.
138
+
139
+ 3. You may copy and distribute the Program (or a work based on it,
140
+ under Section 2) in object code or executable form under the terms of
141
+ Sections 1 and 2 above provided that you also do one of the following:
142
+
143
+ a) Accompany it with the complete corresponding machine-readable
144
+ source code, which must be distributed under the terms of Sections
145
+ 1 and 2 above on a medium customarily used for software interchange; or,
146
+
147
+ b) Accompany it with a written offer, valid for at least three
148
+ years, to give any third party, for a charge no more than your
149
+ cost of physically performing source distribution, a complete
150
+ machine-readable copy of the corresponding source code, to be
151
+ distributed under the terms of Sections 1 and 2 above on a medium
152
+ customarily used for software interchange; or,
153
+
154
+ c) Accompany it with the information you received as to the offer
155
+ to distribute corresponding source code. (This alternative is
156
+ allowed only for noncommercial distribution and only if you
157
+ received the program in object code or executable form with such
158
+ an offer, in accord with Subsection b above.)
159
+
160
+ The source code for a work means the preferred form of the work for
161
+ making modifications to it. For an executable work, complete source
162
+ code means all the source code for all modules it contains, plus any
163
+ associated interface definition files, plus the scripts used to
164
+ control compilation and installation of the executable. However, as a
165
+ special exception, the source code distributed need not include
166
+ anything that is normally distributed (in either source or binary
167
+ form) with the major components (compiler, kernel, and so on) of the
168
+ operating system on which the executable runs, unless that component
169
+ itself accompanies the executable.
170
+
171
+ If distribution of executable or object code is made by offering
172
+ access to copy from a designated place, then offering equivalent
173
+ access to copy the source code from the same place counts as
174
+ distribution of the source code, even though third parties are not
175
+ compelled to copy the source along with the object code.
176
+
177
+ 4. You may not copy, modify, sublicense, or distribute the Program
178
+ except as expressly provided under this License. Any attempt
179
+ otherwise to copy, modify, sublicense or distribute the Program is
180
+ void, and will automatically terminate your rights under this License.
181
+ However, parties who have received copies, or rights, from you under
182
+ this License will not have their licenses terminated so long as such
183
+ parties remain in full compliance.
184
+
185
+ 5. You are not required to accept this License, since you have not
186
+ signed it. However, nothing else grants you permission to modify or
187
+ distribute the Program or its derivative works. These actions are
188
+ prohibited by law if you do not accept this License. Therefore, by
189
+ modifying or distributing the Program (or any work based on the
190
+ Program), you indicate your acceptance of this License to do so, and
191
+ all its terms and conditions for copying, distributing or modifying
192
+ the Program or works based on it.
193
+
194
+ 6. Each time you redistribute the Program (or any work based on the
195
+ Program), the recipient automatically receives a license from the
196
+ original licensor to copy, distribute or modify the Program subject to
197
+ these terms and conditions. You may not impose any further
198
+ restrictions on the recipients' exercise of the rights granted herein.
199
+ You are not responsible for enforcing compliance by third parties to
200
+ this License.
201
+
202
+ 7. If, as a consequence of a court judgment or allegation of patent
203
+ infringement or for any other reason (not limited to patent issues),
204
+ conditions are imposed on you (whether by court order, agreement or
205
+ otherwise) that contradict the conditions of this License, they do not
206
+ excuse you from the conditions of this License. If you cannot
207
+ distribute so as to satisfy simultaneously your obligations under this
208
+ License and any other pertinent obligations, then as a consequence you
209
+ may not distribute the Program at all. For example, if a patent
210
+ license would not permit royalty-free redistribution of the Program by
211
+ all those who receive copies directly or indirectly through you, then
212
+ the only way you could satisfy both it and this License would be to
213
+ refrain entirely from distribution of the Program.
214
+
215
+ If any portion of this section is held invalid or unenforceable under
216
+ any particular circumstance, the balance of the section is intended to
217
+ apply and the section as a whole is intended to apply in other
218
+ circumstances.
219
+
220
+ It is not the purpose of this section to induce you to infringe any
221
+ patents or other property right claims or to contest validity of any
222
+ such claims; this section has the sole purpose of protecting the
223
+ integrity of the free software distribution system, which is
224
+ implemented by public license practices. Many people have made
225
+ generous contributions to the wide range of software distributed
226
+ through that system in reliance on consistent application of that
227
+ system; it is up to the author/donor to decide if he or she is willing
228
+ to distribute software through any other system and a licensee cannot
229
+ impose that choice.
230
+
231
+ This section is intended to make thoroughly clear what is believed to
232
+ be a consequence of the rest of this License.
233
+
234
+ 8. If the distribution and/or use of the Program is restricted in
235
+ certain countries either by patents or by copyrighted interfaces, the
236
+ original copyright holder who places the Program under this License
237
+ may add an explicit geographical distribution limitation excluding
238
+ those countries, so that distribution is permitted only in or among
239
+ countries not thus excluded. In such case, this License incorporates
240
+ the limitation as if written in the body of this License.
241
+
242
+ 9. The Free Software Foundation may publish revised and/or new versions
243
+ of the General Public License from time to time. Such new versions will
244
+ be similar in spirit to the present version, but may differ in detail to
245
+ address new problems or concerns.
246
+
247
+ Each version is given a distinguishing version number. If the Program
248
+ specifies a version number of this License which applies to it and "any
249
+ later version", you have the option of following the terms and conditions
250
+ either of that version or of any later version published by the Free
251
+ Software Foundation. If the Program does not specify a version number of
252
+ this License, you may choose any version ever published by the Free Software
253
+ Foundation.
254
+
255
+ 10. If you wish to incorporate parts of the Program into other free
256
+ programs whose distribution conditions are different, write to the author
257
+ to ask for permission. For software which is copyrighted by the Free
258
+ Software Foundation, write to the Free Software Foundation; we sometimes
259
+ make exceptions for this. Our decision will be guided by the two goals
260
+ of preserving the free status of all derivatives of our free software and
261
+ of promoting the sharing and reuse of software generally.
262
+
263
+ NO WARRANTY
264
+
265
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
266
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
267
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
268
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
269
+ OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
270
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
271
+ TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
272
+ PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
273
+ REPAIR OR CORRECTION.
274
+
275
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
276
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
277
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
278
+ INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
279
+ OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
280
+ TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
281
+ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
282
+ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
283
+ POSSIBILITY OF SUCH DAMAGES.
284
+
285
+ END OF TERMS AND CONDITIONS
286
+
287
+ How to Apply These Terms to Your New Programs
288
+
289
+ If you develop a new program, and you want it to be of the greatest
290
+ possible use to the public, the best way to achieve this is to make it
291
+ free software which everyone can redistribute and change under these terms.
292
+
293
+ To do so, attach the following notices to the program. It is safest
294
+ to attach them to the start of each source file to most effectively
295
+ convey the exclusion of warranty; and each file should have at least
296
+ the "copyright" line and a pointer to where the full notice is found.
297
+
298
+ <one line to give the program's name and a brief idea of what it does.>
299
+ Copyright (C) <year> <name of author>
300
+
301
+ This program is free software; you can redistribute it and/or modify
302
+ it under the terms of the GNU General Public License as published by
303
+ the Free Software Foundation; either version 2 of the License, or
304
+ (at your option) any later version.
305
+
306
+ This program is distributed in the hope that it will be useful,
307
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
308
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
309
+ GNU General Public License for more details.
310
+
311
+ You should have received a copy of the GNU General Public License along
312
+ with this program; if not, write to the Free Software Foundation, Inc.,
313
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
314
+
315
+ Also add information on how to contact you by electronic and paper mail.
316
+
317
+ If the program is interactive, make it output a short notice like this
318
+ when it starts in an interactive mode:
319
+
320
+ Gnomovision version 69, Copyright (C) year name of author
321
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
322
+ This is free software, and you are welcome to redistribute it
323
+ under certain conditions; type `show c' for details.
324
+
325
+ The hypothetical commands `show w' and `show c' should show the appropriate
326
+ parts of the General Public License. Of course, the commands you use may
327
+ be called something other than `show w' and `show c'; they could even be
328
+ mouse-clicks or menu items--whatever suits your program.
329
+
330
+ You should also get your employer (if you work as a programmer) or your
331
+ school, if any, to sign a "copyright disclaimer" for the program, if
332
+ necessary. Here is a sample; alter the names:
333
+
334
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
335
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
336
+
337
+ <signature of Ty Coon>, 1 April 1989
338
+ Ty Coon, President of Vice
339
+
340
+ This General Public License does not permit incorporating your program into
341
+ proprietary programs. If your program is a subroutine library, you may
342
+ consider it more useful to permit linking proprietary applications with the
343
+ library. If this is what you want to do, use the GNU Lesser General
344
+ Public License instead of this License.
data/README.rdoc ADDED
@@ -0,0 +1,47 @@
1
+ = ruby-ampache
2
+
3
+ Ruby-ampache is a really simple command line player for the ampache music server.
4
+
5
+ == Installation
6
+
7
+ You need to have mplayer installed to use ruby-ampache. Mplayer is used for playing music streams.
8
+
9
+ Gem can be installed as usual
10
+
11
+ gem install ruby-ampache
12
+
13
+ == Usage
14
+ First you have to write a .ruby-ampache file and save it in your $HOME
15
+
16
+ example file:
17
+ AMPACHE_HOST="http://path_to_your_ampache_host"
18
+ AMPACHE_USER="username"
19
+ AMPACHE_USER_PSW="userpsw"
20
+
21
+ Simply execute ruby-ampache that should be found in you $PATH after installation
22
+
23
+ == TODO
24
+ This is an alpha version and still has some issues.
25
+ If you kill the application mplayer will continue to run in background.
26
+ Also sometimes if mplayer get stucked playing a song the app does the same.
27
+
28
+ If you found more issues please let me know and I'll try to fix them as soon as possible
29
+
30
+ == Notes
31
+ Special thanks goes to the developer of mplayer-ruby gem.
32
+ I've borrowed a couple of methods from his useful library
33
+
34
+ == Note on Patches/Pull Requests
35
+
36
+ * Fork the project.
37
+ * Make your feature addition or bug fix.
38
+ * Add tests for it. This is important so I don't break it in a
39
+ future version unintentionally.
40
+ * Commit, do not mess with rakefile, version, or history.
41
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
42
+ * Send me a pull request. Bonus points for topic branches.
43
+
44
+ == Copyright
45
+
46
+ Copyright (c) 2010 ghedmat. See LICENSE for details.
47
+ Please drop me a line if you find this useful
data/Rakefile ADDED
@@ -0,0 +1,55 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "ruby-ampache"
8
+ gem.summary = %Q{Ampache ruby client - really simple ampache cli player}
9
+ gem.description = %Q{Ampache ruby based command line player - uses mplayer for streaming audio}
10
+ gem.email = "thamayor@gmail.com"
11
+ gem.homepage = "http://github.com/ghedamat/ruby-ampache"
12
+ gem.authors = ["ghedamat"]
13
+ gem.add_dependency "highline"
14
+ gem.add_dependency "nokogiri"
15
+ gem.add_dependency "parseconfig"
16
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
17
+ end
18
+ Jeweler::GemcutterTasks.new
19
+ rescue LoadError
20
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
21
+ end
22
+
23
+ require 'rake/testtask'
24
+ Rake::TestTask.new(:test) do |test|
25
+ test.libs << 'lib' << 'test'
26
+ test.pattern = 'test/**/test_*.rb'
27
+ test.verbose = true
28
+ end
29
+
30
+ begin
31
+ require 'rcov/rcovtask'
32
+ Rcov::RcovTask.new do |test|
33
+ test.libs << 'test'
34
+ test.pattern = 'test/**/test_*.rb'
35
+ test.verbose = true
36
+ end
37
+ rescue LoadError
38
+ task :rcov do
39
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
40
+ end
41
+ end
42
+
43
+ task :test => :check_dependencies
44
+
45
+ task :default => :test
46
+
47
+ require 'rake/rdoctask'
48
+ Rake::RDocTask.new do |rdoc|
49
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
50
+
51
+ rdoc.rdoc_dir = 'rdoc'
52
+ rdoc.title = "ruby-ampache #{version}"
53
+ rdoc.rdoc_files.include('README*')
54
+ rdoc.rdoc_files.include('lib/**/*.rb')
55
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
data/bin/ruby-ampache ADDED
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ def secure_require(name)
4
+ begin
5
+ require name
6
+ rescue LoadError
7
+ $stderr.print "#{File.basename(__FILE__)} requires #{name} gem to work\n Pleas install it with: gem install #{name}\n"
8
+ exit
9
+ end
10
+ end
11
+
12
+ require 'rubygems'
13
+ secure_require 'highline'
14
+ secure_require 'highline/import'
15
+ secure_require 'parseconfig'
16
+ secure_require 'nokogiri'
17
+ require File.join(File.dirname(__FILE__),'..','lib','lib-ampache')
18
+ require File.join(File.dirname(__FILE__),'..','lib','lib-classes')
19
+
20
+
21
+
22
+ # Ampache ruby parameters
23
+ ar_config = ParseConfig.new(File.expand_path('~/.ruby-ampache'))
24
+
25
+ # ruby-ampache highline version
26
+ $terminal.wrap_at = 80
27
+ $terminal.page_at = 22
28
+
29
+ def print_albums(albums)
30
+ choose do |menu|
31
+ menu.prompt = "Choose an album or abort (1) "
32
+ menu.choice(HighLine.new.color "ABORT", :red)
33
+ albums.each do |a|
34
+ menu.choice(a.name) { a.addToPlaylist(@pl)}
35
+ end
36
+ end
37
+ end
38
+
39
+ def print_artists(artists)
40
+ choose do |menu|
41
+ menu.prompt = "Choose an artists or abort (1)"
42
+ menu.choice(HighLine.new.color "ABORT", :red)
43
+ artists.each do |a|
44
+ menu.choice(a.name) { print_albums(a.albums) }
45
+ end
46
+ end
47
+ end
48
+
49
+ def credits
50
+ s = <<STR
51
+ Ruby-Ampache: Ultra-simple, low-featured command line Ampache player
52
+ Author: Mattia Gheda aka ghedamat
53
+ Homepage: http://github.com/ghedamat/ruby-ampache
54
+ Author-mail: thamayor@gmail.com
55
+
56
+ Usage: pick your choice from the menu.
57
+ You can start playing songs from your ampache server right now!
58
+ Simply choose an artist and than an album
59
+ You can queue up as many albums you like
60
+ Songs are queued up into mplayer playlist
61
+
62
+ STR
63
+ return s
64
+ end
65
+ ar =AmpacheRuby.new(ar_config.get_value('AMPACHE_HOST'),ar_config.get_value('AMPACHE_USER'), ar_config.get_value('AMPACHE_USER_PSW'))
66
+ @pl = AmpachePlaylist.new
67
+
68
+
69
+ while true
70
+ choose do |menu|
71
+ menu.prompt = "pick your choice!"
72
+ menu.choice("now playing") { say(HighLine.new.color(@pl.nowPlaying, :red)) }
73
+ menu.choice("skip this song") { @pl.next; say(HighLine.new.color(@pl.nowPlaying, :red)) }
74
+ menu.choice("add another album") { print_artists(ar.artists); say(HighLine.new.color(@pl.nowPlaying, :red)) }
75
+ menu.choice("stop playing") { @pl.stop }
76
+ menu.choice("about ruby-ampache") { say(HighLine.new.color credits, :red) }
77
+ menu.choice("quit") { @pl.stop; exit}
78
+ end
79
+ end
@@ -0,0 +1,95 @@
1
+ require 'nokogiri'
2
+ require 'net/http'
3
+ require 'open-uri'
4
+ require 'digest/sha2'
5
+
6
+ require File.join(File.dirname(__FILE__),'lib-ampache')
7
+
8
+ class AmpacheRuby
9
+
10
+
11
+ def initialize(host,user,psw)
12
+ uri = URI.parse(host)
13
+ @host = uri.host
14
+ @path = uri.path
15
+ @user = user
16
+ @psw = psw
17
+ @token = nil
18
+ @token = getAuthToken(user,psw)
19
+ end
20
+
21
+ attr_accessor :host, :path, :user, :psw, :token, :playlist
22
+
23
+ def getAuthToken(user,psw)
24
+ action= "handshake"
25
+ # auth string
26
+ key = Digest::SHA2.new << psw
27
+ time = Time.now.to_i.to_s
28
+ psk = Digest::SHA2.new << (time + key.to_s)
29
+
30
+ args = { 'auth' => psk, 'timestamp'=> time, 'version' => '350001', 'user' => user}
31
+ doc = callApiMethod(action,args);
32
+
33
+ return doc.at("auth").content
34
+ end
35
+
36
+ def callApiMethod( method, args={})
37
+ args['auth'] ||= token if token
38
+ url = path + "/server/xml.server.php?action=#{method}&#{args.keys.collect { |k| "#{k}=#{args[k]}"}.join('&')}"
39
+ response = Net::HTTP.get_response(host,url )
40
+ return Nokogiri::XML(response.body)
41
+ end
42
+
43
+
44
+ def artists(name = nil)
45
+ args = {}
46
+ args = { 'filter' => name.to_s } if name # artist search
47
+ artists = []
48
+ doc = callApiMethod("artists",args)
49
+ doc.xpath("//artist").each do |a|
50
+ artists << AmpacheArtist.new(self,a['id'] ,a.at("name").content)
51
+ end
52
+ return artists
53
+ end
54
+
55
+ def albums(artist)
56
+ albums = []
57
+ args = { 'filter' => artist.uid.to_s }
58
+ doc = callApiMethod("artist_albums",args)
59
+ doc.xpath("//album").each do |a|
60
+ albums << AmpacheAlbum.new(self,a['id'], a.at("name").content, artist)
61
+ end
62
+ return albums
63
+ end
64
+
65
+ def songs(album)
66
+ songs = []
67
+ args = { 'filter' => album.uid.to_s }
68
+ doc = callApiMethod("album_songs",args)
69
+ doc.xpath("//song").each do |s|
70
+ songs << AmpacheSong.new(self,s['id'], s.at("title").content, album.artist, album, s.at("url").content)
71
+ end
72
+ return songs
73
+ end
74
+
75
+ end
76
+
77
+ if __FILE__ == $0
78
+ ar =AmpacheRuby.new('ks35824.kimsufi.com', '/graspafm', 'admin', 'potetemorire')
79
+ @artists = ar.getArtists()
80
+ @artists[20].albums[0].songs[0].url
81
+ @artists[20].albums[0].songs[0].addToPlaylist(ar.playlist)
82
+ @artists[21].albums[0].addToPlaylist(ar.playlist)
83
+
84
+
85
+ ar.playlist.play
86
+ sleep 10
87
+ ar.playlist.next
88
+
89
+ gets
90
+
91
+ #TODO add album class.. add album parsing.. add get album songs method ,
92
+ #reneame in getArtistAlbums
93
+
94
+
95
+ end
@@ -0,0 +1,143 @@
1
+ require 'open4'
2
+ class AmpacheArtist
3
+
4
+ # include play module
5
+ def initialize(ar,uid,name)
6
+ @ar = ar
7
+ @uid = uid
8
+ @name = name
9
+ end
10
+
11
+ attr_reader :uid, :name
12
+
13
+ def albums
14
+ @albums ||= @ar.albums(self)
15
+ end
16
+ end
17
+
18
+
19
+ class AmpacheAlbum
20
+
21
+ def initialize(ar,uid,name,artist)
22
+ @ar = ar
23
+ @uid = uid
24
+ @name = name
25
+ @artist = artist
26
+ end
27
+
28
+ attr_reader :uid, :name, :artist
29
+
30
+ def songs
31
+ @songs ||= @ar.songs(self)
32
+ end
33
+
34
+ def addToPlaylist(pl)
35
+ songs.each do |s|
36
+ s.addToPlaylist(pl)
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ class AmpacheSong
43
+
44
+ def initialize(ar,uid,title,artist,album, url)
45
+ @ar = ar
46
+ @uid = uid
47
+ @title = title
48
+ @artist = artist
49
+ @album = album
50
+ @url = url
51
+ end
52
+
53
+ attr_reader :uid, :title, :artist, :album, :url
54
+
55
+ def addToPlaylist(pl)
56
+ pl.add(self)
57
+ end
58
+
59
+ end
60
+
61
+ class AmpachePlaylist
62
+ def add(song)
63
+ if !@pid
64
+ options = {}
65
+ options[:path] ||= '/usr/bin/mplayer'
66
+ mplayer_options = "-slave -quiet"
67
+ mplayer = "#{options[:path]} #{mplayer_options} \"#{song.url}\""
68
+ @pid,@stdin,@stdout,@stderr = Open4.popen4(mplayer)
69
+ until @stdout.gets.inspect =~ /playback/ do
70
+ end
71
+ else
72
+ begin
73
+ @stdin.puts "loadfile \"#{song.url}\" 1"
74
+ rescue Errno::EPIPE
75
+ #puts "playlist is over"
76
+ @pid = nil
77
+ add(song)
78
+ end
79
+ end
80
+ end
81
+
82
+ def play
83
+ @player.play if @pid
84
+ end
85
+
86
+ def stop
87
+ begin
88
+ @stdin.puts "quit" if @pid
89
+ rescue Errno::EPIPE
90
+ puts "playlist is over"
91
+ end
92
+ @pid = nil
93
+ end
94
+
95
+ def next
96
+ begin
97
+ @stdin.puts "pt_step 1 1" if @pid
98
+ sleep 2 #XXX sleep time .. we can't be too fast on remote playing
99
+ rescue Errno::EPIPE
100
+ puts "playlist is over"
101
+ @pid = nil
102
+ end
103
+ end
104
+
105
+ def nowPlaying
106
+ return "Not playing man!" unless @pid
107
+ begin
108
+ s= ''
109
+ #s+= get("file_name")
110
+ s+= get("meta_title")
111
+ s+= get("meta_artist")
112
+ s+= get("meta_album")
113
+ return s.chomp
114
+ rescue Errno::EPIPE
115
+ return "playlist is over"
116
+ @pid = nil
117
+ end
118
+ end
119
+
120
+ # I borrowed these two method from the author of mplayer-ruby!
121
+ # so my thanks to Artuh Chiu and his great gem mplayer-ruby
122
+ def get(value)
123
+ field = value.to_s
124
+ match = case field
125
+ when "time_pos" then "ANS_TIME_POSITION"
126
+ when "time_length" then "ANS_LENGTH"
127
+ when "file_name" then "ANS_FILENAME"
128
+ else "ANS_#{field.upcase}"
129
+ end
130
+ command("get_#{value}",/#{match}/).gsub("#{match}=","").gsub("'","")
131
+ end
132
+
133
+ def command(cmd,match = //)
134
+ @stdin.puts(cmd)
135
+ response = ""
136
+ until response =~ match
137
+ response = @stdout.gets
138
+ end
139
+ response.gsub("\e[A\r\e[K","")
140
+ end
141
+
142
+ end
143
+
data/test/helper.rb ADDED
@@ -0,0 +1,10 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'ruby-ampache'
8
+
9
+ class Test::Unit::TestCase
10
+ end
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestRubyAmpache < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-ampache
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - ghedamat
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-09-24 00:00:00 +02:00
19
+ default_executable: ruby-ampache
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: highline
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: nokogiri
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: parseconfig
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ description: Ampache ruby based command line player - uses mplayer for streaming audio
64
+ email: thamayor@gmail.com
65
+ executables:
66
+ - ruby-ampache
67
+ extensions: []
68
+
69
+ extra_rdoc_files:
70
+ - LICENSE
71
+ - README.rdoc
72
+ files:
73
+ - .document
74
+ - .gitignore
75
+ - LICENSE
76
+ - README.rdoc
77
+ - Rakefile
78
+ - VERSION
79
+ - bin/ruby-ampache
80
+ - lib/lib-ampache.rb
81
+ - lib/lib-classes.rb
82
+ - test/helper.rb
83
+ - test/test_ruby-ampache.rb
84
+ has_rdoc: true
85
+ homepage: http://github.com/ghedamat/ruby-ampache
86
+ licenses: []
87
+
88
+ post_install_message:
89
+ rdoc_options:
90
+ - --charset=UTF-8
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ">="
97
+ - !ruby/object:Gem::Version
98
+ hash: 3
99
+ segments:
100
+ - 0
101
+ version: "0"
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ hash: 3
108
+ segments:
109
+ - 0
110
+ version: "0"
111
+ requirements: []
112
+
113
+ rubyforge_project:
114
+ rubygems_version: 1.3.7
115
+ signing_key:
116
+ specification_version: 3
117
+ summary: Ampache ruby client - really simple ampache cli player
118
+ test_files:
119
+ - test/test_ruby-ampache.rb
120
+ - test/helper.rb