rwdshell 0.95 → 0.96
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.
- data/Readme.txt +5 -1
- data/code/superant.com.rwdtinkerbackwindow/controlclient.rb +25 -26
- data/code/superant.com.rwdtinkerbackwindow/helptexthashtinkerwin2.rb +25 -4
- data/code/superant.com.rwdtinkerbackwindow/installapplet.rb +1 -0
- data/code/superant.com.rwdtinkerbackwindow/installgemapplet.rb +6 -7
- data/code/superant.com.rwdtinkerbackwindow/installremotegem.rb +19 -0
- data/code/superant.com.rwdtinkerbackwindow/listgemdirs.rb +12 -0
- data/code/superant.com.rwdtinkerbackwindow/listgemzips.rb +2 -2
- data/code/superant.com.rwdtinkerbackwindow/listzips.rb +22 -7
- data/code/superant.com.rwdtinkerbackwindow/openhelpwindowtinkerwin2.rb +3 -0
- data/code/superant.com.rwdtinkerbackwindow/remotegemlist.rb +24 -0
- data/code/superant.com.rwdtinkerbackwindow/saveconfigurationrecord.rb +1 -1
- data/configuration/rwdshellversion.cnf +1 -1
- data/configuration/rwdtinker.cnf +0 -3
- data/configuration/rwdtinkerversion.cnf +1 -1
- data/configuration/tinkerwin2variables.cnf +5 -1
- data/extras/cmdline_parse +47 -0
- data/extras/config_file +69 -0
- data/extras/errorMsg +19 -0
- data/extras/makePlaylist +34 -0
- data/extras/mp3controld +289 -0
- data/extras/playlist +186 -0
- data/extras/showHelp +18 -0
- data/gui/00coreguibegin/applicationguitop.rwd +1 -1
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/40rwdlistzips.rwd +9 -10
- data/gui/tinkerbackwindows/superant.com.tinkerbackwindow/45installremotezip.rwd +44 -0
- data/init.rb +22 -35
- data/installed/rwdtinkerwin2-0.5.inf +8 -0
- data/installed/rwdviewlogo-0.4.inf +4 -0
- data/rwd_files/HowTo_Shell.txt +5 -1
- data/rwd_files/HowTo_Tinker.txt +17 -1
- data/tests/rwdtinkertestEN.rb +163 -0
- data/tests/test.result +32 -0
- metadata +20 -14
- data/gui/frontwindowtdocuments/superant.com.shelldocument/vvdocshellxp.rwd +0 -5
- data/lang/alanguagehashbegin.rb +0 -4
- data/lang/languagehash.rb +0 -4
- data/lang/templangfile.rb +0 -16
- data/lang/vlanguagehashend.rb +0 -6
- data/lang/wlocallangstart.rb +0 -5
- data/lang/xlocallangfile.rb +0 -16
- data/lang/zlocallangend.rb +0 -2
- data/zips/rwdwcalc-0.50.zip +0 -0
data/extras/mp3controld
ADDED
@@ -0,0 +1,289 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# --- MP3 Control ---
|
4
|
+
#
|
5
|
+
# Author: Magnus Engstr�m
|
6
|
+
# Email: magnus@gisab.se
|
7
|
+
# File: mp3controld
|
8
|
+
#
|
9
|
+
# Description
|
10
|
+
# -----------
|
11
|
+
# An application which manages
|
12
|
+
# mp3 songs on the poor users
|
13
|
+
# computer.
|
14
|
+
# -------------------------
|
15
|
+
|
16
|
+
# --- External files ---
|
17
|
+
# Change directory to find all functions
|
18
|
+
#Dir::chdir("/usr/lib/mp3control")
|
19
|
+
|
20
|
+
load "extras/config_file" # Handles the mp3controld.conf configuration file
|
21
|
+
load "extras/cmdline_parse" # Provides the Commandline::parse which returns an hash of the commandline
|
22
|
+
load "extras/showHelp" # Hmmm... guess what? This function shows the help message =)
|
23
|
+
load "extras/errorMsg" # Outputs error messages to the admin
|
24
|
+
load "extras/playlist" # Core playlist functionality
|
25
|
+
|
26
|
+
# --- MP3Control - the main class ---
|
27
|
+
class MP3Control
|
28
|
+
# --- Core functions ---
|
29
|
+
# initialize() reads the config files and daemonizes!
|
30
|
+
def initialize()
|
31
|
+
# Parse the commandline
|
32
|
+
$commandline = Commandline::parse()
|
33
|
+
|
34
|
+
# Display help if the commandline sucks
|
35
|
+
if($commandline == -1)
|
36
|
+
showHelp()
|
37
|
+
Kernel::exit(-1)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Make this class instance a background daemon
|
41
|
+
daemonize() if($commandline["--daemon"] != 'no' && $commandline["-D"] != 'no')
|
42
|
+
|
43
|
+
# Read the configuration file
|
44
|
+
configfile = ( $commandline["--configfile"] ? $commandline["--configfile"] : 'configuration/mp3controld.conf' ) # Use the --configfile if supplied, else use the default /etc/mp3controld/mp3controld.conf
|
45
|
+
$configFile = ConfigFile::parse(configfile) # Create an new config file object
|
46
|
+
errorMsg("Configuration file #{configfile} isn't readable or doesn't exist!", 137) if($configFile == -1)
|
47
|
+
|
48
|
+
# Find the default playlist (or use the user supplied one from the commandline)
|
49
|
+
defaultPlaylist = $configFile.getParam("programConfig", "defaultPlaylist")
|
50
|
+
defaultPlaylist = $commandline["--playlist"] if($commandline["--playlist"])
|
51
|
+
if( $configFile.getParam(defaultPlaylist, 'listFile').type == String) # Make sure the listFile contains a value
|
52
|
+
if(FileTest.readable_real?( $configFile.getParam(defaultPlaylist, 'listFile') )) # Make sure this file is readable
|
53
|
+
# Cool. Everything looks alright. Lets create a playlist!
|
54
|
+
errorMsg("Loading playlist '#{defaultPlaylist}' from #{$configFile.getParam(defaultPlaylist, 'listFile')}...") if($commandline['--verbose'] == 'on')
|
55
|
+
$current_playlist = Playlist::create_from_file($configFile.getParam(defaultPlaylist, 'listFile'))
|
56
|
+
$current_playlist_name = defaultPlaylist
|
57
|
+
|
58
|
+
# Errorhandling
|
59
|
+
errorMsg("Playlist creation from #{$current_playlist.filename} failed.", 1) if($current_playlist == -1) # Quit and complain if it didn't work
|
60
|
+
errorMsg("Playlist #{defaultPlaylist} (#{$current_playlist.filename}) doesn't contain any entries.", 1) if($current_playlist.length() < 1)
|
61
|
+
errorMsg("Playlist '#{defaultPlaylist}' loaded successfully.") if($commandline["--verbose"] == 'on')
|
62
|
+
|
63
|
+
# Fix wrap/repeat and shuffle the playlist if the configfile says so
|
64
|
+
$current_playlist.wrap = true if($configFile.getParam(defaultPlaylist, 'repeat') == 'true')
|
65
|
+
$current_playlist.shuffle() if($configFile.getParam(defaultPlaylist, 'random') == 'true')
|
66
|
+
$current_playlist.goto(0) # Rewind the playlist
|
67
|
+
else
|
68
|
+
errorMsg("The default playlist doesn't appear to exist, or has the wrong permissions. That's not good.", 1)
|
69
|
+
end
|
70
|
+
else # listFile returns other than string, that's baaaaad
|
71
|
+
errorMsg("the listFile value for '#{defaultPlaylist}' doesn't appear to exist in your #{$configFile.filename}. That's not good.", 1)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Check for the existence of our mpg123 instance
|
75
|
+
errorMsg("Trying to find the mp3 player...") if($commandline["--verbose"] == 'on')
|
76
|
+
@mpg123 = $configFile.getParam('programConfig', 'application') # Get the application name, path, and possible arguments
|
77
|
+
mpg123_application = @mpg123.scan(/^\S+/)
|
78
|
+
if(mpg123_application.type == Array)
|
79
|
+
mpg123_application = mpg123_application[0]
|
80
|
+
else
|
81
|
+
errorMsg("Please check your ProgramConfig/application setting in the configuration file. It seems weird.", 1)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Do some nice errorhandling
|
85
|
+
if( !FileTest::executable_real?(mpg123_application) )
|
86
|
+
errorMsg("#{mpg123_application} doesn't appear to exist. Please do something about it (no, not \"touch #{mpg123_application}\"! Stupid!).", 1)
|
87
|
+
else
|
88
|
+
errorMsg("Found #{mpg123_application}!") if($commandline["--verbose"] == 'on')
|
89
|
+
end
|
90
|
+
|
91
|
+
# Open an instance of mpg123, our high-performance mp3 player
|
92
|
+
@@mpg123 = IO::popen("#{@mpg123} -R -", 'r+')
|
93
|
+
|
94
|
+
# Start all plugins
|
95
|
+
load_plugins()
|
96
|
+
|
97
|
+
# Start the mp3 player
|
98
|
+
mpg123_control()
|
99
|
+
|
100
|
+
end
|
101
|
+
|
102
|
+
# mpg123_control() gets the input from the mpg123 process and handles it hopefully correctly :)
|
103
|
+
def mpg123_control()
|
104
|
+
|
105
|
+
# Initialize class variables
|
106
|
+
@@stopped = false
|
107
|
+
|
108
|
+
# Start playing if the configfile says so
|
109
|
+
if( $configFile.getParam('programConfig', 'playOnStartup') == 'true' )
|
110
|
+
MP3Control::play()
|
111
|
+
else
|
112
|
+
puts("Dont want to play!")
|
113
|
+
end
|
114
|
+
|
115
|
+
# The infinite 5 second loop =)
|
116
|
+
while(true)
|
117
|
+
begin
|
118
|
+
input = @@mpg123.readline.chop()
|
119
|
+
rescue EOFError
|
120
|
+
errorMsg("mpg123 error! Probably just a file that didn't exist (#{$current_playlist.song_info["filename"]}).")
|
121
|
+
@@mpg123 = IO::popen("#{@mpg123} -R -", 'r+') # Just start it again...
|
122
|
+
MP3Control::next_song() # Next song, so it doesn't die again...
|
123
|
+
end
|
124
|
+
|
125
|
+
# Song stopped
|
126
|
+
MP3Control::next_song() if(input == '@P 0' && @@stopped != true) # Change to the next song if current song stops and the user didn't told it to
|
127
|
+
@@stopped = false if(input == '@P 0' && @@stopped == true) # Reset the stop-flag if the user ordered the stop
|
128
|
+
|
129
|
+
# Time left
|
130
|
+
if(input[0,2] == '@F')
|
131
|
+
input =~ /^@F\s+\S+\s+\S+\s+(\S+)\s+(\S+)$/
|
132
|
+
@@time = $1
|
133
|
+
@@timeleft = $2
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# start() creates a new instance. Just like .new, but a nicer name.
|
140
|
+
def MP3Control::start()
|
141
|
+
MP3Control::new()
|
142
|
+
end
|
143
|
+
|
144
|
+
# daemonize() daemonizes this process. Cool =)
|
145
|
+
def daemonize()
|
146
|
+
if(child_pid = fork) # Parent code
|
147
|
+
puts("PID #{child_pid}")
|
148
|
+
Kernel::exit(0) # We dont want this parent process any more. Too bad.
|
149
|
+
end
|
150
|
+
|
151
|
+
# Child code. And child wants to be free from parent
|
152
|
+
Process.setsid()
|
153
|
+
end
|
154
|
+
|
155
|
+
# load_plugins() loads all plugins that can be found in the plugins directory
|
156
|
+
def load_plugins()
|
157
|
+
Dir::entries('extras/plugins/').each { |plugin|
|
158
|
+
# Try to load every plugin except all files that begins with a dot
|
159
|
+
if(plugin[0].chr() != '.')
|
160
|
+
retval = 0
|
161
|
+
# Do some errorhandling
|
162
|
+
begin
|
163
|
+
load("extras/plugins/#{plugin}") # Load the files
|
164
|
+
errorMsg("Loaded plugin '#{plugin}'") if($commandline['--verbose'] == 'no')
|
165
|
+
rescue SyntaxError
|
166
|
+
errorMsg("Plugin '#{plugin}' has syntax errors.")
|
167
|
+
end
|
168
|
+
|
169
|
+
# Run the plugin in a separate thread
|
170
|
+
# Try to start the class with the same name as the plugin
|
171
|
+
eval("
|
172
|
+
Thread::new() {
|
173
|
+
start_again = true
|
174
|
+
while(start_again)
|
175
|
+
puts(\"Plugin starting...\")
|
176
|
+
begin
|
177
|
+
retval = #{plugin}::start()
|
178
|
+
rescue
|
179
|
+
error = $!
|
180
|
+
puts(error)
|
181
|
+
puts(error.backtrace)
|
182
|
+
puts(\"Error in plugin #{plugin}! Waiting for 5 seconds before attempting to start again...\")
|
183
|
+
sleep(5)
|
184
|
+
end
|
185
|
+
if(retval == -1)
|
186
|
+
errorMsg(\"Plugin 'plugins/#{plugin}' failed to load...\")
|
187
|
+
start_again = false
|
188
|
+
end
|
189
|
+
end
|
190
|
+
}
|
191
|
+
")
|
192
|
+
|
193
|
+
end
|
194
|
+
}
|
195
|
+
end
|
196
|
+
|
197
|
+
# exit_mpg123() terminates the current mpg123 session
|
198
|
+
def MP3Control::exit_mpg123()
|
199
|
+
#system("kill `pidof mpg123`") # Yes, I know this isn't a nice way to do it in, please fix this and send me a patch :)
|
200
|
+
end
|
201
|
+
|
202
|
+
# mpg123_command() sends a command to mpg123
|
203
|
+
def MP3Control::mpg123_command(command)
|
204
|
+
errorMsg("mpg123 command: '#{command}'") if($commandline['--verbose'] == 'on')
|
205
|
+
@@mpg123.write("#{command}\n")
|
206
|
+
@@mpg123.flush()
|
207
|
+
end
|
208
|
+
|
209
|
+
|
210
|
+
# --- play functions ---
|
211
|
+
# play() plays the current index of the current playlist
|
212
|
+
def MP3Control::play()
|
213
|
+
@@stopped = false
|
214
|
+
mpg123_command("LOAD #{$current_playlist.song_info["filename"]}")
|
215
|
+
end
|
216
|
+
|
217
|
+
# stop() stops playing
|
218
|
+
def MP3Control::stop()
|
219
|
+
mpg123_command("PAUSE")
|
220
|
+
@@stopped = true # Set the stop-status to true
|
221
|
+
end
|
222
|
+
|
223
|
+
# pause() pauses playing
|
224
|
+
def MP3Control::pause()
|
225
|
+
@@stopped = false
|
226
|
+
mpg123_command("PAUSE")
|
227
|
+
end
|
228
|
+
|
229
|
+
# next_song() loads the next song. Yay...
|
230
|
+
def MP3Control::next_song()
|
231
|
+
retval = $current_playlist.next()
|
232
|
+
if(retval == -1)
|
233
|
+
errorMsg("Error while changing to the next song.") # Tell him/her
|
234
|
+
else
|
235
|
+
MP3Control::play() if(@@stopped == false)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
# prev_song() loads the previous song. Yay...
|
240
|
+
def MP3Control::prev_song()
|
241
|
+
retval = $current_playlist.prev()
|
242
|
+
if(retval == -1)
|
243
|
+
errorMsg("Error while changing to the previous song.") # Tell him/her
|
244
|
+
else
|
245
|
+
MP3Control::play() if(@@stopped == false)
|
246
|
+
end
|
247
|
+
end
|
248
|
+
|
249
|
+
# forward(sec) jumps sec seconds forward
|
250
|
+
def MP3Control::forward(sec)
|
251
|
+
mpg123_command("JUMP +#{sec*38}")
|
252
|
+
end
|
253
|
+
|
254
|
+
# backward(sec) jumps sec seconds backward
|
255
|
+
def MP3Control::backward(sec)
|
256
|
+
mpg123_command("JUMP -#{sec*38}")
|
257
|
+
end
|
258
|
+
|
259
|
+
|
260
|
+
# --- Misc functions ---
|
261
|
+
# getTime() - Get the current song time information. getTime(true) for time left
|
262
|
+
def MP3Control::getTime(whichTime = 'elapsed')
|
263
|
+
case whichTime
|
264
|
+
when 'elapsed'
|
265
|
+
parsed = Time::at(@@time.to_i)
|
266
|
+
when 'left'
|
267
|
+
parsed = Time::at(@@timeleft.to_i)
|
268
|
+
when 'total'
|
269
|
+
parsed = Time::at( (@@time.to_f + @@timeleft.to_f).to_i )
|
270
|
+
end
|
271
|
+
|
272
|
+
hour = (parsed.hour - 1).to_s
|
273
|
+
min = parsed.min.to_s
|
274
|
+
sec = parsed.sec.to_s
|
275
|
+
|
276
|
+
hour = "0#{hour}" if(hour.length == 1)
|
277
|
+
min = "0#{min}" if(min.length == 1)
|
278
|
+
sec = "0#{sec}" if(sec.length == 1)
|
279
|
+
|
280
|
+
hour = (hour == '00' ? '' : "#{hour}:")
|
281
|
+
|
282
|
+
# Return the now formatted time
|
283
|
+
"#{hour}#{min}:#{sec}"
|
284
|
+
end
|
285
|
+
|
286
|
+
end
|
287
|
+
|
288
|
+
# Create an instance of the MP3Control class and start the application
|
289
|
+
MP3Control::start()
|
data/extras/playlist
ADDED
@@ -0,0 +1,186 @@
|
|
1
|
+
#!ruby
|
2
|
+
|
3
|
+
# --- Playlist class ---
|
4
|
+
#
|
5
|
+
# Author: Magnus Engstr�m
|
6
|
+
# Email: magnus@gisab.se
|
7
|
+
# File: playlist
|
8
|
+
#
|
9
|
+
# Description
|
10
|
+
# -----------
|
11
|
+
# The Playlist class handles everything a playlist should be able to manage.
|
12
|
+
# Shuffle it, unshuffle it, wrap it if desired, add new songs, find songs and
|
13
|
+
# so on. Cool huh? :)
|
14
|
+
# ----------------------
|
15
|
+
|
16
|
+
class Playlist
|
17
|
+
# create_from_file() creates a playlist from a file and returns either a Playlist instance or -1 in case of error
|
18
|
+
# This function should be used instead of the ::new, because this one
|
19
|
+
# returns -1 on file read errors, which the ::new doesn't.
|
20
|
+
def Playlist::create_from_file(filename)
|
21
|
+
# Check that the file is readable
|
22
|
+
if(FileTest::readable_real?(filename))
|
23
|
+
new(filename) # Return the Playlist class instance
|
24
|
+
else
|
25
|
+
-1 # Return -1 on error
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# initialize reads the playlist from a file and returns the Playlist instance
|
30
|
+
def initialize(filename)
|
31
|
+
|
32
|
+
@filename = filename # Store the filename for later use
|
33
|
+
@playlist = Array::new() # This hash contains the whole playlist
|
34
|
+
@index = 0 # Playlist's current position
|
35
|
+
@wrap = false # Don't repeat the list as default
|
36
|
+
|
37
|
+
# Parse these fields, separated with double pipes (||) (songname, artist, album, year, comment, tracknum, genre_id, genre)
|
38
|
+
File::foreach(filename) { |line| # Iterate through every line in the file
|
39
|
+
foo = line.split(/\|\|/)
|
40
|
+
@playlist << { "filename" => foo[0], "songname" => foo[1], "artist" => foo[2], "album" => foo[3], "year" => foo[4], "comment" => foo[5], "tracknum" => foo[6], "genre_id" => foo[7], "genre" => foo[8] } # Add a hash to the @playlist array with all values found in the playlist file
|
41
|
+
}
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def insert(song, placement = 0)
|
46
|
+
# Check song information
|
47
|
+
return -1 if(song.type != Hash)
|
48
|
+
song = { "filename" => song["filename"], "songname" => song["songname"], "artist" => song["artist"], "album" => song["album"], "year" => song["year"], "comment" => song["comment"], "tracknum" => song["tracknum"], "genre_id" => song["genre_id"], "genre" => song["genre"] }
|
49
|
+
|
50
|
+
# Check minimum and maximum values
|
51
|
+
placement = 0 if(placement < 0)
|
52
|
+
placement = @playlist.length() if(placement > @playlist.length() )
|
53
|
+
|
54
|
+
# Retrieve the two parts of the split playlist
|
55
|
+
first = @playlist[0...placement]
|
56
|
+
second = @playlist[placement...@playlist.length()]
|
57
|
+
|
58
|
+
# Put it together again
|
59
|
+
@playlist = Array::new()
|
60
|
+
@playlist = first
|
61
|
+
@playlist << song
|
62
|
+
@playlist.concat(second)
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
def remove(placement = 0)
|
67
|
+
# Check boundaries
|
68
|
+
placement = 0 if(placement < 0)
|
69
|
+
placement = @playlist.length()-1 if( placement >= @playlist.length() )
|
70
|
+
|
71
|
+
# Delete the item
|
72
|
+
@playlist.delete_at(placement)
|
73
|
+
end
|
74
|
+
|
75
|
+
def find(search_string, case_insensitive = false, fields = ["songname", "filename"])
|
76
|
+
case_insensitive = nil if(case_insensitive == false)
|
77
|
+
|
78
|
+
results = Array::new()
|
79
|
+
regex = Regexp::new(search_string, case_insensitive) # The regex that will be matched
|
80
|
+
|
81
|
+
# Iterate through the playlist to find one or more matching songs
|
82
|
+
@playlist.length().times { |index|
|
83
|
+
# Iterate through the user supplied list of fields to be searched
|
84
|
+
fields.each { |field|
|
85
|
+
# Make sure this is a hash, so we don't go and crash, or make someone's dog sick :)
|
86
|
+
if(@playlist[index].type == Hash)
|
87
|
+
results << index if( regex.match(@playlist[index][field]) && !(results.include?(index)) ) # If it matches, and if it doesn't already is in the results. We don't want duplicates :)
|
88
|
+
end
|
89
|
+
}
|
90
|
+
}
|
91
|
+
|
92
|
+
results # Return the results
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
def shuffle()
|
97
|
+
# Iterate through the playlist
|
98
|
+
( 0...@playlist.length() ).each { |i|
|
99
|
+
j = rand @playlist.length() # Grab a random value between 0 and @playlist.length()
|
100
|
+
|
101
|
+
# Maintain index
|
102
|
+
if(@index == j)
|
103
|
+
@index = i
|
104
|
+
elsif(@index == i)
|
105
|
+
@index = j
|
106
|
+
end
|
107
|
+
|
108
|
+
@playlist[i], @playlist[j] = @playlist[j], @playlist[i]
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
112
|
+
def re_read()
|
113
|
+
# Maintain index
|
114
|
+
current_filename = @playlist[@index]["filename"]
|
115
|
+
|
116
|
+
# Create a new playlist array
|
117
|
+
@playlist = Array::new()
|
118
|
+
@index = 0
|
119
|
+
foo_index = 0 # Just to keep the count while adding all songs to the @playlist
|
120
|
+
|
121
|
+
# Parse these fields, separated with double pipes (||) (songname, artist, album, year, comment, tracknum, genre_id, genre)
|
122
|
+
# Iterate through every line in the file
|
123
|
+
File::foreach(@filename) { |line|
|
124
|
+
foo = line.split(/\|\|/) # Separate the fields with double pipes (||)
|
125
|
+
@playlist << { "filename" => foo[0], "songname" => foo[1], "artist" => foo[2], "album" => foo[3], "year" => foo[4], "comment" => foo[5], "tracknum" => foo[6], "genre_id" => foo[7], "genre" => foo[8] } # Add a hash to the @playlist array with all values found in the playlist file
|
126
|
+
|
127
|
+
# Maintain index
|
128
|
+
@index = foo_index if(foo[0] == current_filename)
|
129
|
+
foo_index += 1
|
130
|
+
}
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
def next()
|
135
|
+
# Increase the counter and return -1 if the playlist went to far, and wrap isn't true
|
136
|
+
@index += 1
|
137
|
+
if( @index >= @playlist.length() )
|
138
|
+
if(@wrap)
|
139
|
+
@index = 0
|
140
|
+
else
|
141
|
+
@index -= 1
|
142
|
+
-1 # Return an error
|
143
|
+
end
|
144
|
+
else
|
145
|
+
@index
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def prev()
|
150
|
+
# Decrease the counter and return -1 if the playlist went to far, and wrap isn't true
|
151
|
+
@index -= 1
|
152
|
+
if( @index < 0 )
|
153
|
+
if(@wrap)
|
154
|
+
@index = @playlist.length() -1
|
155
|
+
else
|
156
|
+
@index += 1
|
157
|
+
-1 # Return an error
|
158
|
+
end
|
159
|
+
else
|
160
|
+
@index
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def song_info(index = @index)
|
165
|
+
@playlist[index]
|
166
|
+
end
|
167
|
+
|
168
|
+
def goto(index = 0)
|
169
|
+
if( index >= 0 && index < @playlist.length() )
|
170
|
+
@index = index
|
171
|
+
else
|
172
|
+
return -1
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
def length()
|
177
|
+
@playlist.length()
|
178
|
+
end
|
179
|
+
|
180
|
+
def each()
|
181
|
+
@playlist.each { |song| yield(song) }
|
182
|
+
end
|
183
|
+
|
184
|
+
attr_reader :wrap, :index, :filename
|
185
|
+
attr_writer :wrap
|
186
|
+
end
|
data/extras/showHelp
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
|
3
|
+
# --- showHelp ----
|
4
|
+
#
|
5
|
+
# Author: Magnus Engstr�m
|
6
|
+
# Email: magnus@gisab.se
|
7
|
+
# File: showHelp
|
8
|
+
#
|
9
|
+
# Description
|
10
|
+
# -----------
|
11
|
+
# This function
|
12
|
+
# print the help
|
13
|
+
# message on STDOUT
|
14
|
+
# -----------------
|
15
|
+
|
16
|
+
def showHelp()
|
17
|
+
STDOUT.puts("MaGnuX Mp3 Management server - Ruby Edition v0.2a\n-------------------------------------------------\n\n--help\t\t\tShow this message\n--debug on\t\tShow some debug data\n--configfile file\tSelect configuration file\n--daemon, -D (yes*|no)\tGo to background on startup\n\n")
|
18
|
+
end
|
@@ -6,30 +6,29 @@ $rwdguivar=
|
|
6
6
|
<row> <p align=\"right\">File Name:</p> <text size=70 name=\"a_installapplet\"/> </row>
|
7
7
|
|
8
8
|
</table>
|
9
|
-
|
10
|
-
<button caption=\"view applet contents\" action=\"viewappletcontents\"/>
|
11
|
-
<button caption=\"view (GEM Directory) applet contents\" action=\"viewgemappletcontents\"/>
|
12
|
-
</horizontal>
|
13
|
-
<p>%appletcontentstext%</p>
|
9
|
+
|
14
10
|
|
15
11
|
<horizontal>
|
16
12
|
|
17
|
-
|
18
|
-
<button caption=\"install applet\" action=\"
|
19
|
-
<button caption=\"install (Gem Directory) applet\" action=\"installgemapplet\"/>
|
13
|
+
|
14
|
+
<button caption=\"install (rwdtinker) applet\" action=\"installgemapplet\"/>
|
20
15
|
<button caption=\"Help\" action=\"runhelpwindowtinkerwin2\"/>
|
21
16
|
|
22
17
|
</horizontal>
|
23
18
|
<p>%installapplettext%</p>
|
24
19
|
|
25
|
-
|
20
|
+
<horizontal>
|
21
|
+
|
22
|
+
<button caption=\"view (rwdtinker) applet contents\" action=\"viewgemappletcontents\"/>
|
23
|
+
</horizontal>
|
24
|
+
<p>%appletcontentstext%</p>
|
26
25
|
<table>
|
27
26
|
<row> <p align=\"right\">Click below to view the list of zip files </row>
|
28
27
|
|
29
28
|
</table>
|
30
29
|
|
31
30
|
<horizontal>
|
32
|
-
<button caption=\"List applets available for installing\" action=\"listzipfilestoinstall\"/>
|
31
|
+
<button caption=\"List (zip directory) applets available for installing\" action=\"listzipfilestoinstall\"/>
|
33
32
|
|
34
33
|
<button caption=\"List applets (in the GEM Directory) available for installing\" action=\"listgemzips\"/>
|
35
34
|
|
@@ -0,0 +1,44 @@
|
|
1
|
+
$rwdguivar=
|
2
|
+
"
|
3
|
+
<tab name=\"superantcomremotezipsinstall\" caption=\"Install Remote Applets\">
|
4
|
+
|
5
|
+
<table>
|
6
|
+
<row> <p align=\"right\">File Name:</p> <text size=70 name=\"superantcominstallremoteappletinput\"/> </row>
|
7
|
+
|
8
|
+
</table>
|
9
|
+
<horizontal>
|
10
|
+
<button caption=\"install remote Gem applet package\" action=\"superantcominstallremotegemapplet\"/>
|
11
|
+
<button caption=\"Help\" action=\"runhelpwindowtinkerwin2\"/>
|
12
|
+
|
13
|
+
</horizontal>
|
14
|
+
<p>%superantcominstallremotegemappletresult%</p>
|
15
|
+
|
16
|
+
<horizontal>
|
17
|
+
|
18
|
+
|
19
|
+
|
20
|
+
<button caption=\"view already installed GEM applets\" action=\"superantcomshowgemfiledirs\"/>
|
21
|
+
</horizontal>
|
22
|
+
<p>%%superantcomshowgemappletdirsresult%%</p>
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
|
28
|
+
<table>
|
29
|
+
<row> <p align=\"right\">Click below to view the list of zip files </row>
|
30
|
+
|
31
|
+
</table>
|
32
|
+
|
33
|
+
<horizontal>
|
34
|
+
|
35
|
+
<button caption=\"List applets in the Remote GEM Repository available for downloading\" action=\"superantcomremotegemlist\"/>
|
36
|
+
|
37
|
+
</horizontal>
|
38
|
+
<p>%superantcomremotegemappletsfullresult%</p>
|
39
|
+
<p>%%superantcomremotegemappletsresult%%</p>
|
40
|
+
|
41
|
+
</tab>"
|
42
|
+
|
43
|
+
|
44
|
+
|
data/init.rb
CHANGED
@@ -51,8 +51,9 @@ $progdir = File::expand_path( File.dirname(__FILE__))
|
|
51
51
|
if(!test(?d,x))
|
52
52
|
# only rwd files
|
53
53
|
if x =~ /rb|rwd|txt/
|
54
|
-
|
55
|
-
|
54
|
+
|
55
|
+
load x #opens the file thats in fileName and reads it
|
56
|
+
$tempdoc += $rwdguivar # adds the file into the doc string
|
56
57
|
end
|
57
58
|
end
|
58
59
|
end
|
@@ -73,6 +74,8 @@ $progdir = File::expand_path( File.dirname(__FILE__))
|
|
73
74
|
Dir.chdir($progdir) # change back to top program directory
|
74
75
|
|
75
76
|
# build the English Language hash file from the parts
|
77
|
+
languagehashvariable = 'Message = Hash.new { |hh, kk| hh[kk] = "ERROR: Message not found: #{kk.inspect}."; hh[kk] }
|
78
|
+
langmessage = {' + "\n"
|
76
79
|
startlangdir = File.join(LangDir,"en")
|
77
80
|
#get a list of the files and subdirectories on the starting directory only
|
78
81
|
alanghash = Array.new(Dir[startlangdir].entries.sort)
|
@@ -100,10 +103,11 @@ $progdir = File::expand_path( File.dirname(__FILE__))
|
|
100
103
|
end
|
101
104
|
end
|
102
105
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
106
|
+
|
107
|
+
#writes the contents of doc into the languagehashvariable
|
108
|
+
languagehashvariable = languagehashvariable + $tempdoc + "} ; langmessage.each { |kk, vv| Message[kk] = vv }"
|
109
|
+
|
110
|
+
# END of en Lang building
|
107
111
|
$tempdoc = " "
|
108
112
|
Dir.chdir($progdir) # change back to top program directory
|
109
113
|
|
@@ -135,31 +139,16 @@ $progdir = File::expand_path( File.dirname(__FILE__))
|
|
135
139
|
end
|
136
140
|
end
|
137
141
|
|
138
|
-
|
139
|
-
|
140
|
-
|
142
|
+
|
143
|
+
#writes the contents of doc into the variable
|
144
|
+
languagehashvariable = languagehashvariable + " ; Message.update(" + $tempdoc + ' :rwdtinker => "Rwdtinker" ) '
|
145
|
+
|
141
146
|
|
142
147
|
$tempdoc = " "
|
143
148
|
|
144
149
|
Dir.chdir($progdir) # change back to top program directory
|
145
|
-
|
146
|
-
|
147
|
-
#get a list of the files in lang directory only
|
148
|
-
alangfile = Dir.new(LangDir).entries.sort.reverse.delete_if { |x| ! (x =~ /rb$/) }
|
149
|
-
alangfile.length.times{
|
150
|
-
fileName = alangfile.pop
|
151
|
-
Dir.chdir($progdir)
|
152
|
-
Dir.chdir(LangDir)
|
153
|
-
fileLangA=File.open("#{fileName}","r") #opens the file thats in fileName as read only
|
154
|
-
$tempdoc += fileLangA.read #reads the file into the doc string
|
155
|
-
fileLangA.close
|
156
|
-
}
|
157
|
-
|
158
|
-
Dir.chdir($progdir)
|
159
|
-
fileLangB=File.open(LangNameFile,"w") #deletes and opens a the file in fileName
|
160
|
-
fileLangB.write($tempdoc) #writes the contents of doc into the file
|
161
|
-
fileLangB.close
|
162
|
-
load LangNameFile # load the file
|
150
|
+
|
151
|
+
temp = eval( languagehashvariable )
|
163
152
|
|
164
153
|
$tempdoc = " "
|
165
154
|
|
@@ -190,10 +179,9 @@ Dir.chdir($progdir)
|
|
190
179
|
end
|
191
180
|
end
|
192
181
|
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
require CodeName # load the program file
|
182
|
+
|
183
|
+
# load the program file
|
184
|
+
tempcoderesult = eval( $tempdoc )
|
197
185
|
|
198
186
|
# build the actual GUI from the gui parts
|
199
187
|
$tempdoc = " "
|
@@ -224,9 +212,8 @@ Dir.chdir($progdir)
|
|
224
212
|
end
|
225
213
|
end
|
226
214
|
|
227
|
-
|
228
|
-
|
229
|
-
fileB.close
|
215
|
+
# gui variable is done
|
216
|
+
guiRWD = $tempdoc
|
230
217
|
|
231
218
|
require 'socket' # Network stuff
|
232
219
|
host = "127.0.0.1"
|
@@ -266,4 +253,4 @@ $port = port
|
|
266
253
|
end
|
267
254
|
|
268
255
|
|
269
|
-
RwdTinker.
|
256
|
+
RwdTinker.new( guiRWD).serve(port) # start the main class and program
|