You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
soundkonverter/src/amarokscript/soundKonverter.rb

297 lines
10 KiB

#!/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 < Qt::Dialog
slots 'accept()'
def initialize(parent = nil, name = nil)
super
box = Qt::VBoxLayout.new( self, 11, 6 );
lTitle = Qt::Label.new('soundKonverter plugin settings', self)
box.addWidget( lTitle )
lTitle.setAlignment(Qt::AlignCenter)
font = Qt::Font.new()
font.setPixelSize(18)
font.setBold(true)
lTitle.setFont(font)
box.addSpacing( 5 )
mediaDeviceBox = Qt::GroupBox.new( 1, Qt::Vertical, "Options for transfering to media devices", self )
box.addWidget( mediaDeviceBox )
mediaDeviceBox.layout().setSpacing( 6 )
mediaDeviceBox.layout().setMargin( 6 )
Qt::Label.new('Profile for lossy conversion:', mediaDeviceBox)
@cTranscodeProfile = Qt::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 = Qt::GroupBox.new( 2, Qt::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 = Qt::HBoxLayout.new( rippingBox, 6 );
# lRippingProfile = Qt::Label.new('Profile:', rippingBox)
# profileBox.addWidget( lRippingProfile )
# @cRippingProfile = Qt::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 = Qt::Label.new('Format:', rippingBox)
# profileBox.addWidget( lRippingFormat )
# @cRippingFormat = Qt::ComboBox.new(rippingBox)
# profileBox.addWidget( @cRippingFormat )
# @cRippingFormat.insertItem("ogg")
# @cRippingFormat.insertItem("mp3")
# @cRippingFormat.insertItem("flac")
# directoryBox = Qt::HBoxLayout.new( rippingBox, 6 );
# lRippingDirectory = Qt::Label.new('Directory:', rippingBox)
# directoryBox.addWidget( lRippingDirectory )
# @cRippingDirectory = Qt::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 = Qt::HBoxLayout.new(box)
buttonsBox.setSpacing(6)
buttonsBox.addStretch()
okPushButton = Qt::PushButton.new( self, "ok" )
buttonsBox.addWidget( okPushButton )
okPushButton.setText( "OK" )
okPushButton.setDefault( true )
connect( okPushButton, SIGNAL( 'clicked()' ),
self, SLOT( 'accept()' )
)
cancelPushButton = Qt::PushButton.new( self, "cancel" )
buttonsBox.addWidget( cancelPushButton )
cancelPushButton.setText( "Cancel" )
cancelPushButton.setAccel( Qt::KeySequence.new(Key_Escape) )
connect( cancelPushButton, SIGNAL( 'clicked()' ),
self, SLOT( 'reject()' )
)
file = Qt::File.new( File.dirname( File.expand_path( __FILE__ ) ) + "/config" )
if file.open( Qt::IO_ReadOnly )
ts = Qt::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 = Qt::File.new( File.dirname( File.expand_path( __FILE__ ) ) + "/profiles" )
# if file.open( Qt::IO_ReadOnly )
# ts = Qt::TextStream.new( file )
# while !ts.eof()
# content = ''
# ts >> content
# @cProfile.insertItem( content )
# ts >> content
# end
#
# file.close()
# end
end
def accept()
file = Qt::File.new( File.dirname( File.expand_path( __FILE__ ) ) + "/config" )
if file.open( Qt::IO_WriteOnly )
ts = Qt::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 = Qt::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 = Qt::File.new( File.dirname( File.expand_path( __FILE__ ) ) + "/formats" )
if file.open( Qt::IO_ReadOnly )
ts = Qt::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 = Qt::File.new( File.dirname( File.expand_path( __FILE__ ) ) + "/config" )
if file.open( Qt::IO_ReadOnly )
ts = Qt::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.\nThe 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