#!/usr/bin/env ruby
#
# amaroK-Script for integrating soundKonverter into amaroK
#
# (c) 2005 Daniel Faust <daniel@kaligames.de>
# License: GNU General Public License V2
# FIXME after adding some files to soundkonverter, it is impossible to repeat that, until soundkonverter gets closed.
# FIXME don't open files on every request. load options on startup and save on exit!
#`dcop amarok playlist addMedia KURL`
#`dcop amarok playlist addMediaList KURL::List`
#`dcop amarok collection scanCollectionChanges`
require " uri "
begin
require " Qt "
rescue LoadError
error = 'Qt Ruby bindings are required for this script.'
` dcop amarok playlist popupMessage "soundKonverter: #{ error } " `
exit
end
class MainWidget < TQt :: Dialog
slots 'accept()'
def initialize ( parent = nil , name = nil )
super
box = TQt :: VBoxLayout . new ( self , 11 , 6 ) ;
lTitle = TQt :: Label . new ( 'soundKonverter plugin settings' , self )
box . addWidget ( lTitle )
lTitle . setAlignment ( TQt :: AlignCenter )
font = TQt :: Font . new ( )
font . setPixelSize ( 18 )
font . setBold ( true )
lTitle . setFont ( font )
box . addSpacing ( 5 )
mediaDeviceBox = TQt :: GroupBox . new ( 1 , TQt :: Vertical , " Options for transfering to media devices " , self )
box . addWidget ( mediaDeviceBox )
mediaDeviceBox . layout ( ) . setSpacing ( 6 )
mediaDeviceBox . layout ( ) . setMargin ( 6 )
TQt :: Label . new ( 'Profile for lossy conversion:' , mediaDeviceBox )
@cTranscodeProfile = TQt :: ComboBox . new ( mediaDeviceBox )
@cTranscodeProfile . insertItem ( " Very low " )
@cTranscodeProfile . insertItem ( " Low " )
@cTranscodeProfile . insertItem ( " Medium " )
@cTranscodeProfile . insertItem ( " High " )
@cTranscodeProfile . insertItem ( " Very high " )
@cTranscodeProfile . setCurrentItem ( 1 )
# box.addSpacing( 5 )
#
# rippingBox = TQt::GroupBox.new( 2, TQt::Horizontal, "Use pre-defined options for CD ripping", self )
# box.addWidget( rippingBox )
# rippingBox.layout().setSpacing( 6 )
# rippingBox.layout().setMargin( 6 )
# rippingBox.setCheckable( true )
# rippingBox.setEnabled( false )
#
# profileBox = TQt::HBoxLayout.new( rippingBox, 6 );
# lRippingProfile = TQt::Label.new('Profile:', rippingBox)
# profileBox.addWidget( lRippingProfile )
# @cRippingProfile = TQt::ComboBox.new(rippingBox)
# profileBox.addWidget( @cRippingProfile )
# @cRippingProfile.insertItem("Very low")
# @cRippingProfile.insertItem("Low")
# @cRippingProfile.insertItem("Medium")
# @cRippingProfile.insertItem("High")
# @cRippingProfile.insertItem("Very high")
# @cRippingProfile.insertItem("Lossless")
# @cRippingProfile.insertItem("Last used")
# @cRippingProfile.setCurrentItem(3)
# lRippingFormat = TQt::Label.new('Format:', rippingBox)
# profileBox.addWidget( lRippingFormat )
# @cRippingFormat = TQt::ComboBox.new(rippingBox)
# profileBox.addWidget( @cRippingFormat )
# @cRippingFormat.insertItem("ogg")
# @cRippingFormat.insertItem("mp3")
# @cRippingFormat.insertItem("flac")
# directoryBox = TQt::HBoxLayout.new( rippingBox, 6 );
# lRippingDirectory = TQt::Label.new('Directory:', rippingBox)
# directoryBox.addWidget( lRippingDirectory )
# @cRippingDirectory = TQt::ComboBox.new(rippingBox)
# directoryBox.addWidget( @cRippingDirectory )
# @cRippingDirectory.setEditable(true)
# @cRippingDirectory.insertItem("/home/daniel/soundKonverter/%b/%d - %n - %t")
# @cRippingDirectory.insertItem("Last used")
box . addSpacing ( 5 )
buttonsBox = TQt :: HBoxLayout . new ( box )
buttonsBox . setSpacing ( 6 )
buttonsBox . addStretch ( )
okPushButton = TQt :: PushButton . new ( self , " ok " )
buttonsBox . addWidget ( okPushButton )
okPushButton . setText ( " OK " )
okPushButton . setDefault ( true )
connect ( okPushButton , SIGNAL ( 'clicked()' ) ,
self , SLOT ( 'accept()' )
)
cancelPushButton = TQt :: PushButton . new ( self , " cancel " )
buttonsBox . addWidget ( cancelPushButton )
cancelPushButton . setText ( " Cancel " )
cancelPushButton . setAccel ( TQt :: KeySequence . new ( Key_Escape ) )
connect ( cancelPushButton , SIGNAL ( 'clicked()' ) ,
self , SLOT ( 'reject()' )
)
file = TQt :: File . new ( File . dirname ( File . expand_path ( __FILE__ ) ) + " /config " )
if file . open ( TQt :: IO_ReadOnly )
ts = TQt :: TextStream . new ( file )
content = ''
ts >> content
if content == 'Very_low'
@cTranscodeProfile . setCurrentItem ( 0 )
elsif content == 'Low'
@cTranscodeProfile . setCurrentItem ( 1 )
elsif content == 'Medium'
@cTranscodeProfile . setCurrentItem ( 2 )
elsif content == 'High'
@cTranscodeProfile . setCurrentItem ( 3 )
elsif content == 'Very_high'
@cTranscodeProfile . setCurrentItem ( 4 )
end
file . close ( )
end
# file = TQt::File.new( File.dirname( File.expand_path( __FILE__ ) ) + "/profiles" )
# if file.open( TQt::IO_ReadOnly )
# ts = TQt::TextStream.new( file )
# while !ts.eof()
# content = ''
# ts >> content
# @cProfile.insertItem( content )
# ts >> content
# end
#
# file.close()
# end
end
def accept ( )
file = TQt :: File . new ( File . dirname ( File . expand_path ( __FILE__ ) ) + " /config " )
if file . open ( TQt :: IO_WriteOnly )
ts = TQt :: TextStream . new ( file )
if @cTranscodeProfile . currentText ( ) == 'Very low'
content = 'Very_low'
elsif @cTranscodeProfile . currentText ( ) == 'Low'
content = 'Low'
elsif @cTranscodeProfile . currentText ( ) == 'Medium'
content = 'Medium'
elsif @cTranscodeProfile . currentText ( ) == 'High'
content = 'High'
elsif @cTranscodeProfile . currentText ( ) == 'Very high'
content = 'Very_high'
end
ts << content + " \n "
file . close ( )
end
super
end
end
MenuItemName1 = " soundKonverter \" Convert selected files \" "
MenuItemName2 = " soundKonverter \" Add Replay Gain to selected files \" "
MenuItemName3 = " soundKonverter \" Rip and play audio CD \" "
def cleanup ( )
` dcop amarok script removeCustomMenuItem #{ MenuItemName1 } `
` dcop amarok script removeCustomMenuItem #{ MenuItemName2 } `
` dcop amarok script removeCustomMenuItem #{ MenuItemName3 } `
end
trap ( " SIGTERM " ) { cleanup ( ) }
` dcop amarok script addCustomMenuItem #{ MenuItemName1 } `
` dcop amarok script addCustomMenuItem #{ MenuItemName2 } `
` dcop amarok script addCustomMenuItem #{ MenuItemName3 } `
loop do
message = gets ( ) . chomp ( )
command = / [A-Za-z]* / . match ( message ) . to_s ( )
case command
when " configure "
app = TQt :: Application . new ( ARGV )
widget = MainWidget . new
app . setMainWidget ( widget )
widget . show ( )
app . exec ( )
when " transcode "
args = message . split ( )
filename = args [ 1 ]
#uri = URI.parse( args[1] )
#filename = URI.unescape( uri.path() )
filetype = args [ 2 ]
profile = ''
file = TQt :: File . new ( File . dirname ( File . expand_path ( __FILE__ ) ) + " /formats " )
if file . open ( TQt :: IO_ReadOnly )
ts = TQt :: TextStream . new ( file )
while ! ts . eof ( )
mode = ''
formats = ''
ts >> mode
ts >> formats
if formats . split ( ',' ) . include? ( filetype )
profile = mode
end
end
file . close ( )
end
if profile == ''
file = TQt :: File . new ( File . dirname ( File . expand_path ( __FILE__ ) ) + " /config " )
if file . open ( TQt :: IO_ReadOnly )
ts = TQt :: TextStream . new ( file )
content = ''
ts >> content
if content == 'Very_low'
profile = 'Very low'
elsif content == 'Low'
profile = 'Low'
elsif content == 'Medium'
profile = 'Medium'
elsif content == 'High'
profile = 'High'
elsif content == 'Very_high'
profile = 'Very high'
end
file . close ( )
else
profile = 'Low'
end
end
` dcop amarok playlist shortStatusMessage "starting soundKonverter in background" `
` soundkonverter --invisible --profile ' #{ profile } ' --format ' #{ filetype } ' --output '/tmp' --command "dcop amarok mediabrowser transcodingFinished %u file://%o" ' #{ filename } ' `
when " customMenuClicked "
if message . include? ( " Convert selected files " )
args = message . split ( )
# Remove the command args
5 . times ( ) { args . delete_at ( 0 ) }
# Iterate over all selected files
files = ''
args . each ( ) do | arg |
uri = URI . parse ( arg )
file = URI . unescape ( uri . path ( ) )
files += ' "' + file + '"'
end
` dcop amarok playlist shortStatusMessage "starting soundKonverter" `
` soundkonverter #{ files } `
end
if message . include? ( " Add Replay Gain to selected files " )
args = message . split ( )
# Remove the command args
8 . times ( ) { args . delete_at ( 0 ) }
files = ''
args . each ( ) do | arg |
uri = URI . parse ( arg )
file = URI . unescape ( uri . path ( ) )
files += ' "' + file + '"'
end
` dcop amarok playlist shortStatusMessage "starting soundKonverter" `
` soundkonverter --replaygain #{ files } `
end
if message . include? ( " Rip and play audio CD " )
` dcop amarok playlist popupMessage "Select all tracks to rip and press 'Start' in order to start ripping. \n The tracks will be added to the playlist, when they are ready." `
#`dcop amarok playlist shortStatusMessage "starting soundKonverter"`
` soundkonverter --invisible --rip auto --command "dcop amarok playlist addMedia %o" `
end
end
end