fazlamesai.net'ten FZ ruby ile emacs icinden xmms'e parca sectiren bir
program yazmis. Hazir ruby tutorial'ini biraz karistirmisken ruby ile birseyler yapayim dedim. Programi biraz daha gelistirdim.
Ekledigim seyler:
- Birden fazla kelime aranabiliyor, hepsinin parca ismine/dosya ismine uymasi lazim
- Sadece sayi girilirse xmms o siradaki parcaya atliyor
- Girdi ':' ile baslarsa xmms'e direkt ruby kodu ile hukmedebiliyoruz (:stop, :play :next gibi). eval fonksiyonu sagolsun.
- Eger ilk arguman --dialog ise girdi bir dialog yardimiyla aliniyor.
Ben gconf-editor yardimiyla C-M-j tus kombinasyonunu --dialog opsiyonuna atadim. Biraz yavas da olsa idare ediyor. Aslina bakarsaniz bunu zaten birinin yapmis olabilecegini dusunup kisa bir aramadan sonra
xmmsfind'i buldum, fakat ne yazik ki cani istemedigi zaman acilmama gibi bir sorunu var.
#!/usr/bin/env ruby
require 'xmms'
def nextSong(args, xr)
matching = []
i = 0
xr.playlist.each do |entry|
if match(entry, args)
matching << i
$stderr.puts 'Matched: ' + entry[0]
end
i += 1
end
if matching.length == 0
return false
else
xr.position = matching[rand(matching.length)]
return true
end
end
def match(entry, args)
title, file, time = entry
args.each do |arg|
regex = /#{arg}/i
return false unless (title =~ regex or file =~ regex)
end
return true
end
def is_int(str)
return str =~ /^[0-9]+$/
end
$stderr.puts 'Xmms-Ruby version ' << Xmms::Remote::VERSION
# allocate a new Xmms::Remote object
xr = Xmms::Remote::new
if ARGV.length == 1 and ARGV[0] == '--dialog'
cmd = open('| zenity --entry --text "xmms: give some keywords"')
argStr = cmd.gets.strip
args = argStr.split
cmd.close
puts args.to_s
exit if args.length == 0
else
argStr = ARGV.map{|s| s.strip}.join(' ')
args = argStr.split
end
if args.length == 0
xr.next
$stderr.puts 'next song'
elsif is_int(argStr) and argStr.to_i <= xr.playlist.length and argStr.to_i > 0
xr.position = argStr.to_i - 1
$stderr.puts 'jump to position: ' + argStr
elsif argStr[0] == ":"[0]
$stderr.puts 'Evaluate: ' + argStr[1..-1]
eval ('xr.' + argStr[1..-1])
elsif not nextSong(args, xr)
$stderr.puts 'No match: ' + argStr
end