zik 0.16.1

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.
Files changed (84) hide show
  1. data.tar.gz.sig +0 -0
  2. data/ChangeLog +222 -0
  3. data/INSTALL +34 -0
  4. data/Makefile.in +199 -0
  5. data/README +53 -0
  6. data/ZiK.desktop +11 -0
  7. data/ZiK.rb +377 -0
  8. data/configure +269 -0
  9. data/dependencies +142 -0
  10. data/doc/COPYING +340 -0
  11. data/doc/ChangeLog +222 -0
  12. data/doc/html/fr/index.html +128 -0
  13. data/doc/html/index.html +126 -0
  14. data/doc/html/pix/ZiK3.png +0 -0
  15. data/doc/html/pix/capture.png +0 -0
  16. data/doc/html/pix/capture_cd.png +0 -0
  17. data/doc/html/pix/capture_compact.png +0 -0
  18. data/doc/html/pix/capture_radio.png +0 -0
  19. data/doc/html/pix/icon.png +0 -0
  20. data/doc/html/pix/logo.png +0 -0
  21. data/doc/html/styles/main.css +47 -0
  22. data/doc/man/manpage.1 +43 -0
  23. data/gui/assistant.rb +133 -0
  24. data/gui/cdgui.rb +54 -0
  25. data/gui/common.rb +56 -0
  26. data/gui/config.rb +120 -0
  27. data/gui/edit.rb +413 -0
  28. data/gui/error.rb +124 -0
  29. data/gui/gui.rb +1383 -0
  30. data/gui/mod.rb +239 -0
  31. data/gui/preference.rb +496 -0
  32. data/gui/progress.rb +50 -0
  33. data/gui/radiogui.rb +404 -0
  34. data/gui/search.rb +249 -0
  35. data/gui/socket.rb +107 -0
  36. data/mod/brainz.rb +76 -0
  37. data/mod/brainz/dialogs.rb +132 -0
  38. data/mod/brainz/functions.rb +55 -0
  39. data/mod/brainz/ofa.rb +76 -0
  40. data/mod/brainz/song.rb +139 -0
  41. data/mod/brainz/widget.rb +34 -0
  42. data/mod/cover.rb +90 -0
  43. data/mod/cover/application-x-cd-image.svg +666 -0
  44. data/mod/cover/config.rb +79 -0
  45. data/mod/cover/configwidget.rb +35 -0
  46. data/mod/cover/widget.rb +147 -0
  47. data/mod/hotkeys.rb +137 -0
  48. data/mod/hotkeys/config.rb +84 -0
  49. data/mod/hotkeys/configwidget.rb +93 -0
  50. data/mod/interact.rb +131 -0
  51. data/mod/interact/configwidget.rb +107 -0
  52. data/mod/interact/interaction.rb +79 -0
  53. data/mod/notify.rb +128 -0
  54. data/mod/notify/config.rb +96 -0
  55. data/mod/notify/configwidget.rb +76 -0
  56. data/mod/notify/window.rb +56 -0
  57. data/mod/trayicon.rb +83 -0
  58. data/mod/trayicon/config.rb +79 -0
  59. data/mod/trayicon/configwidget.rb +35 -0
  60. data/mod/trayicon/icon.rb +99 -0
  61. data/pix/ZiK.svg +78 -0
  62. data/pix/ZiK3.png +0 -0
  63. data/pix/assistant/capture.png +0 -0
  64. data/pix/gtk-directory.svg +287 -0
  65. data/pix/media-cdrom.svg +292 -0
  66. data/pix/network-wireless.svg +429 -0
  67. data/pix/player_play.svg +286 -0
  68. data/pix/sound.svg +244 -0
  69. data/pix/sound_directory.svg +464 -0
  70. data/player/cdplayer.rb +108 -0
  71. data/player/player.rb +132 -0
  72. data/player/radioplayer.rb +124 -0
  73. data/playlist/cdlist.rb +140 -0
  74. data/playlist/common.rb +343 -0
  75. data/playlist/editlist.rb +50 -0
  76. data/playlist/export.rb +108 -0
  77. data/playlist/playlist.rb +143 -0
  78. data/playlist/radiolist.rb +148 -0
  79. data/playlist/song.rb +122 -0
  80. data/po/ZiK.pot +622 -0
  81. data/po/fr/ZiK.po +658 -0
  82. data/zik +2 -0
  83. metadata +265 -0
  84. metadata.gz.sig +0 -0
@@ -0,0 +1,108 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright 2007-2011 Vincent Carmona
4
+ vinc4mai@gmail.com
5
+
6
+ This file is part of ZiK.
7
+
8
+ ZiK is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 2 of the License, or
11
+ (at your option) any later version.
12
+
13
+ ZiK is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with ZiK; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ =end
22
+
23
+ module Cd
24
+ class Player
25
+ attr_writer :gui
26
+
27
+ def initialize(d='/dev/cdrom')
28
+ @playing=false
29
+
30
+ @src=Gst::ElementFactory.make('cdiocddasrc')
31
+ device=d
32
+
33
+ @sink=Gst::ElementFactory.make('autoaudiosink')
34
+
35
+ @vol=Gst::ElementFactory.make('volume')
36
+
37
+ @pipeline=Gst::Pipeline.new
38
+ @pipeline.bus.add_watch {|bus, message| got_bus_message(message)}
39
+ @pipeline.add(@src, @vol, @sink)
40
+ @src >> @vol >> @sink
41
+ end
42
+
43
+ def device=(d)
44
+ @src.device=d
45
+ end
46
+
47
+ def playing?
48
+ @playing
49
+ end
50
+
51
+ def stop
52
+ @playing=false
53
+ @pipeline.stop
54
+ ErrorInfo.new("Player stopped.")
55
+ end
56
+
57
+ def pause
58
+ if playing?
59
+ @playing=false
60
+ @pipeline.pause
61
+ ErrorInfo.new("Pause.")
62
+ end
63
+ end
64
+
65
+ def play(song)
66
+ begin
67
+ @playing=true
68
+ @src.track=song.track
69
+ @pipeline.play
70
+ ErrorInfo.new("Playing #{song.name}.")
71
+ rescue
72
+ ErrorError.new(_("Playing track #{song.track}."), true)
73
+ end
74
+ end
75
+
76
+ def position
77
+ q=Gst::QueryPosition.new(Gst::Format::Type::TIME)
78
+ @pipeline.query(q)
79
+ q.parse[1]/1000000000
80
+ end
81
+
82
+ def position=(pos)
83
+ @pipeline.send_event(Gst::EventSeek.new(1.0,
84
+ Gst::Format::Type::TIME, Gst::Seek::FLAG_FLUSH.to_i | Gst::Seek::FLAG_KEY_UNIT.to_i, Gst::Seek::TYPE_SET,
85
+ pos*1000000000, Gst::Seek::TYPE_NONE, -1))
86
+ #@pipeline.seek(1.0, Gst::Format::Type::TIME, Gst::Seek::FLAG_FLUSH.to_i | Gst::Seek::FLAG_KEY_UNIT.to_i, Gst::Seek::TYPE_SET, pos*1000000000, Gst::Seek::TYPE_NONE, -1)
87
+ #Arguments for Gst::EventSeek taken from the ruby-gstreamer0.10 (and not from ruby-gnome2) binding examples (cf:video-player)
88
+ end
89
+
90
+ def volume=(n)
91
+ @vol.volume=n
92
+ ErrorInfo.new("Set volume to #{n}.")
93
+ end
94
+
95
+ private
96
+
97
+ def got_bus_message(message)
98
+ case message.type
99
+ when Gst::Message::ERROR
100
+ ErrorError.new(_("Gstreamer error."), true)
101
+ stop
102
+ when Gst::Message::EOS
103
+ @gui.next_song#Use Dbus to propagate message instead of :gui ???
104
+ end
105
+ true#Without this line only the first message is processed
106
+ end
107
+ end
108
+ end
data/player/player.rb ADDED
@@ -0,0 +1,132 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright 2007-2011 Vincent Carmona
4
+ vinc4mai@gmail.com
5
+
6
+ This file is part of ZiK.
7
+
8
+ ZiK is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 2 of the License, or
11
+ (at your option) any later version.
12
+
13
+ ZiK is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with ZiK; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ =end
22
+
23
+ class Player
24
+
25
+ attr_writer :gui
26
+
27
+ def initialize
28
+ @playing=false
29
+ @playbin=Gst::ElementFactory.make('playbin')
30
+ @playbin.ready
31
+ @playbin.bus.add_watch {|bus, message| got_bus_message(message)}
32
+ end
33
+
34
+ def stop
35
+ @playing=false
36
+ @playbin.stop
37
+ ErrorInfo.new("Player stopped.")
38
+ end
39
+
40
+ def play(song)
41
+ begin
42
+ @playing=true
43
+ @playbin.uri=GLib.filename_to_uri(song.path)
44
+ @playbin.play
45
+ ErrorInfo.new("Playing #{song.name}.")
46
+ rescue
47
+ ErrorError.new(_("Playing file://#{song.path}"))
48
+ @gui.next_song
49
+ end
50
+ end
51
+
52
+ def pause
53
+ if playing?
54
+ @playing=false
55
+ @playbin.pause
56
+ ErrorInfo.new("Pause.")
57
+ end
58
+ end
59
+
60
+ def playing?
61
+ @playing
62
+ end
63
+
64
+ def position
65
+ q=Gst::QueryPosition.new(Gst::Format::Type::TIME)
66
+ @playbin.query(q)
67
+ q.parse[1]/1000000000
68
+ end
69
+
70
+ def position=(pos)
71
+ @playbin.send_event(Gst::EventSeek.new(1.0,
72
+ Gst::Format::Type::TIME, Gst::Seek::FLAG_FLUSH.to_i | Gst::Seek::FLAG_KEY_UNIT.to_i, Gst::Seek::TYPE_SET,
73
+ pos*1000000000, Gst::Seek::TYPE_NONE, -1))
74
+ #@playbin.seek(1.0, Gst::Format::Type::TIME, Gst::Seek::FLAG_FLUSH.to_i | Gst::Seek::FLAG_KEY_UNIT.to_i, Gst::Seek::TYPE_SET, pos*1000000000, Gst::Seek::TYPE_NONE, -1)
75
+ #Arguments for Gst::EventSeek taken from the ruby-gstreamer0.10 (and not from ruby-gnome2) binding examples (cf:video-player)
76
+ end
77
+
78
+
79
+ def duration
80
+ q=Gst::QueryDuration.new(Gst::Format::Type::TIME)
81
+ @playbin.query(q)
82
+ q.parse[1]/1000000000
83
+ end
84
+
85
+ def volume
86
+ @playbin.volume
87
+ end
88
+
89
+ def volume=(n)
90
+ @playbin.volume=n
91
+ ErrorInfo.new("Set volume to #{n}.")
92
+ end
93
+
94
+ private
95
+
96
+ begin
97
+ Gst::InstallPlugins
98
+ def got_bus_message(message)
99
+ case message
100
+ when Gst::Message::ERROR
101
+ ErrorError.new(_("Gstreamer error."), true)
102
+ @gui.next_song_on_error
103
+ when Gst::Message::EOS
104
+ @gui.next_song#Use Dbus to propagate message instead of :gui or a SIGNAL???
105
+ when Gst::MissingMessage
106
+ ErrorInfo.new("Missing plugins.")
107
+ context=Gst::InstallPluginsContext.new
108
+ Gst::InstallPlugins.async([message.installer_detail], context){|ret|
109
+ case ret
110
+ when Gst::InstallPluginsReturn::SUCCESS, Gst::InstallPluginsReturn::PARTIAL_SUCCESS
111
+ @gui.update_gst_registry
112
+ else
113
+ ErrorInfo.new("Missing plugins return: "+ret.name)
114
+ @gui.next_song
115
+ end
116
+ }
117
+ end
118
+ true#Without this line only the first message is processed
119
+ end
120
+ rescue NameError
121
+ def got_bus_message(message)
122
+ case message.type
123
+ when Gst::Message::ERROR
124
+ ErrorError.new(_("Gstreamer error."), true)
125
+ @gui.next_song_on_error
126
+ when Gst::Message::EOS
127
+ @gui.next_song#Use Dbus to propagate message instead of :gui or a SIGNAL???
128
+ end
129
+ true#Without this line only the first message is processed
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,124 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright 2007-2011 Vincent Carmona
4
+ vinc4mai@gmail.com
5
+
6
+ This file is part of ZiK.
7
+
8
+ ZiK is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 2 of the License, or
11
+ (at your option) any later version.
12
+
13
+ ZiK is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with ZiK; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ =end
22
+ module Radio
23
+ class Player < Player
24
+ def play(radio)
25
+ @streams=[]
26
+ begin
27
+ url=radio.url
28
+ case url
29
+ when /^http:\/\/.*\.m3u$/i
30
+ list=get_list(url)
31
+ @streams=list.to_a
32
+ @streams.reject!{|a| a=~/^\#/}
33
+ @streams.each{|a| a.chomp!}
34
+ when /^http:\/\/.*\.pls$/i, /^http:\/\/.*\.asx$/i
35
+ list=get_list(url)
36
+ @streams=URI::extract(list)
37
+ else
38
+ @streams=url.to_a
39
+ end
40
+ rescue
41
+ ErrorError.new(_("Parsing #{radio.url}."), true)
42
+ end
43
+ @i=-1
44
+ next_stream
45
+ end
46
+
47
+ private
48
+
49
+ def get_list(url)
50
+ reponse=Net::HTTP.get_response(URI.parse(url))
51
+ case reponse
52
+ when Net::HTTPSuccess
53
+ list=reponse.body
54
+ when Net::HTTPRedirection
55
+ ErrorWarning.new("#{url} is moved to #{reponse['location']}")
56
+ list=Net::HTTP.get(URI.parse(reponse['location']))
57
+ else
58
+ ErrorError.new(response.error!)
59
+ raise response.error!
60
+ end
61
+ end
62
+
63
+ begin
64
+ Gst::InstallPlugins
65
+ def got_bus_message(message)
66
+ case message.type
67
+ when Gst::Message::ERROR
68
+ ErrorError.new(_('Gstreamer error'), true)
69
+ stop
70
+ next_stream
71
+ when Gst::Message::EOS
72
+ @gui.next_song#Use Dbus to propagate message instead of :gui ???
73
+ when Gst::MissingMessage
74
+ ErrorInfo.new("Missing plugins.")
75
+ context=Gst::InstallPluginsContext.new
76
+ Gst::InstallPlugins.async([message.installer_detail], context){|ret|
77
+ case ret
78
+ when Gst::InstallPluginsReturn::SUCCESS, Gst::InstallPluginsReturn::PARTIAL_SUCCESS
79
+ @gui.update_gst_registry
80
+ else
81
+ ErrorInfo.new("Missing plugins return: "+ret.name)
82
+ stop
83
+ next_stream
84
+ end
85
+ }
86
+ end
87
+ true#Without this line only the first message is processed
88
+ end
89
+ rescue NameError
90
+ def got_bus_message(message)
91
+ case message.type
92
+ when Gst::Message::ERROR
93
+ ErrorError.new(_('Gstreamer error'), true)
94
+ stop
95
+ next_stream
96
+ when Gst::Message::EOS
97
+ @gui.next_song#Use Dbus to propagate message instead of :gui ???
98
+ end
99
+ true#Without this line only the first message is processed
100
+ end
101
+ end
102
+
103
+ def next_stream
104
+ @i+=1
105
+ if @i<@streams.length
106
+ begin
107
+ @playing=true
108
+ @playbin.uri=@streams[@i]
109
+ ##On some platform total freeze can happened when playing some webradio.
110
+ ##i.e. http://mp3.live.tv-radio.com/centpourcent/all/centpourcent-128k.mp3
111
+ ##gstreamer-good-plugin/souphttpsrc + ruby/gtk may be in cause.
112
+ ##Using a thread as a workaround
113
+ ##Thread.new{@playbin.play}.join also freeze!!
114
+ #@playbin.play
115
+ #puts "Playing #{@streams[@i]}."
116
+ Thread.new{@playbin.play; ErrorInfo.new("Playing #{@streams[@i]}.")}
117
+ rescue
118
+ ErrorError.new(_("Playing #{@streams[@i]}"), true)
119
+ next_stream
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,140 @@
1
+ # encoding: UTF-8
2
+ =begin
3
+ Copyright 2007-2011 Vincent Carmona
4
+ vinc4mai@gmail.com
5
+
6
+ This file is part of ZiK.
7
+
8
+ ZiK is free software; you can redistribute it and/or modify
9
+ it under the terms of the GNU General Public License as published by
10
+ the Free Software Foundation; either version 2 of the License, or
11
+ (at your option) any later version.
12
+
13
+ ZiK is distributed in the hope that it will be useful,
14
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ GNU General Public License for more details.
17
+
18
+ You should have received a copy of the GNU General Public License
19
+ along with ZiK; if not, write to the Free Software
20
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
21
+ =end
22
+ module Cd
23
+
24
+ class Song
25
+ attr_reader :track, :duration, :name, :type
26
+ attr_accessor :artist, :album, :title
27
+
28
+ def initialize(track, duration)
29
+ @track=track; @duration=duration
30
+ @artist=''; @album=''; @title=''
31
+ @type=SONG_CD
32
+ refresh_name
33
+ end
34
+
35
+ def refresh_name
36
+ if @title.empty?
37
+ @name='Track '+@track.to_s
38
+ else
39
+ if @artist.empty?
40
+ @name=@title
41
+ else
42
+ @name=@artist+' - '+@title
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ class List
49
+ include ListPlay
50
+
51
+ attr_reader :songs, :current
52
+ attr_writer :web
53
+
54
+ def initialize(config)
55
+ @songs=[]
56
+ @order=[]
57
+ @config=config
58
+ @shuffle=config['shuffle'];@repeat=config['repeat']
59
+ @web=config['cd_web']
60
+
61
+ @current=0; @n=0
62
+
63
+ @mb=MusicBrainz::Client.new
64
+ #@mb.utf8=true
65
+ refresh
66
+
67
+ @current=@order[0] if @shuffle
68
+ end
69
+
70
+ def device=(device)
71
+ @mb.device=device
72
+ end
73
+
74
+ def clear
75
+ @songs.clear
76
+ @order.clear
77
+ @current=0; @n=0
78
+ end
79
+
80
+ def refresh
81
+ refresh_off
82
+ refresh_on if @web
83
+ end
84
+
85
+ private
86
+
87
+ def refresh_on
88
+ refresh_off
89
+ if @mb.query(MusicBrainz::Query::GetCDInfo)
90
+ nbAlbums=@mb.result(MusicBrainz::Query::GetNumAlbums).to_i
91
+ if nbAlbums < 1
92
+ ErrorWarning.new("No album found.")
93
+ else
94
+ if nbAlbums >1
95
+ ErrorWarning.new("#{nbAlbums} albums are found. Use the first one.")
96
+ end
97
+ @mb.select(MusicBrainz::Query::SelectAlbum, 1)
98
+ album=@mb.result(MusicBrainz::Query::MBE_AlbumGetAlbumName)
99
+ nbTracks=@mb.result(MusicBrainz::Query::AlbumGetNumTracks).to_i
100
+ for i in 1..nbTracks
101
+ artist=@mb.result(MusicBrainz::Query::MBE_AlbumGetArtistName, i)
102
+ title=@mb.result(MusicBrainz::Query::MBE_AlbumGetTrackName, i)
103
+ s=@songs[i-1]
104
+ s.artist=artist;s.album=album;s.title=title;s.refresh_name
105
+ end
106
+ end
107
+ else
108
+ ErrorWarning.new("CD not found on MusicBrainz.")
109
+ end
110
+ end
111
+
112
+ def refresh_off
113
+ self.clear
114
+ self.device=@config['cd_device']
115
+ if @mb.query(MusicBrainz::Query::GetCDTOC)
116
+ nbTracks=@mb.result(MusicBrainz::Query::TOCGetLastTrack).to_i
117
+ offset=[]
118
+ for i in 1..nbTracks+1
119
+ offset.push(@mb.result(MusicBrainz::Query::TOCGetTrackSectorOffset, i).to_i)
120
+ end
121
+ offset.sort!#Apparently the offset are not given in tracks order.
122
+ temp=[];temp[0]=0;temp.concat(offset[0...nbTracks])
123
+ d=[]
124
+ [temp, offset].transpose.each{|a,b|
125
+ dur=((b-a+1).to_f/75.0).round#Calcul track duration from frame offset.
126
+ d.push(dur)
127
+ }
128
+ d.delete_at(0)
129
+ i=1
130
+ d.each{|duration|
131
+ @songs.push(Cd::Song.new(i, duration))
132
+ @order.push(i-1)
133
+ i+=1
134
+ }
135
+ @order.sort_by{rand}
136
+ end
137
+ end
138
+ end
139
+
140
+ end