1 
2 #include "flakecodecglobal.h"
3 
4 #include "soundkonverter_codec_flake.h"
5 #include "../../core/conversionoptions.h"
6 #include "flakecodecwidget.h"
7 
8 
soundkonverter_codec_flake(QObject * parent,const QVariantList & args)9 soundkonverter_codec_flake::soundkonverter_codec_flake( QObject *parent, const QVariantList& args  )
10     : CodecPlugin( parent )
11 {
12     Q_UNUSED(args)
13 
14     binaries["flake"] = "";
15 
16     allCodecs += "flac";
17     allCodecs += "wav";
18 }
19 
~soundkonverter_codec_flake()20 soundkonverter_codec_flake::~soundkonverter_codec_flake()
21 {}
22 
name() const23 QString soundkonverter_codec_flake::name() const
24 {
25     return global_plugin_name;
26 }
27 
codecTable()28 QList<ConversionPipeTrunk> soundkonverter_codec_flake::codecTable()
29 {
30     QList<ConversionPipeTrunk> table;
31     ConversionPipeTrunk newTrunk;
32 
33     newTrunk.codecFrom = "wav";
34     newTrunk.codecTo = "flac";
35     newTrunk.rating = 100;
36     newTrunk.enabled = ( binaries["flake"] != "" );
37     newTrunk.problemInfo = standardMessage( "encode_codec,backend", "flac", "flake" ) + "\n" + standardMessage( "install_website_backend,url", "flake", "http://flake-enc.sourceforge.net" );
38     newTrunk.data.hasInternalReplayGain = false;
39     table.append( newTrunk );
40 
41     return table;
42 }
43 
isConfigSupported(ActionType action,const QString & codecName)44 bool soundkonverter_codec_flake::isConfigSupported( ActionType action, const QString& codecName )
45 {
46     Q_UNUSED(action)
47     Q_UNUSED(codecName)
48 
49     return false;
50 }
51 
showConfigDialog(ActionType action,const QString & codecName,QWidget * parent)52 void soundkonverter_codec_flake::showConfigDialog( ActionType action, const QString& codecName, QWidget *parent )
53 {
54     Q_UNUSED(action)
55     Q_UNUSED(codecName)
56     Q_UNUSED(parent)
57 }
58 
hasInfo()59 bool soundkonverter_codec_flake::hasInfo()
60 {
61     return false;
62 }
63 
showInfo(QWidget * parent)64 void soundkonverter_codec_flake::showInfo( QWidget *parent )
65 {
66     Q_UNUSED(parent)
67 //         info.description = i18n("Flake is an alternative flac encoder.\nFor more information see: http://flake-enc.sourceforge.net");
68 }
69 
newCodecWidget()70 CodecWidget *soundkonverter_codec_flake::newCodecWidget()
71 {
72     FlakeCodecWidget *widget = new FlakeCodecWidget();
73     return qobject_cast<CodecWidget*>(widget);
74 }
75 
convert(const KUrl & inputFile,const KUrl & outputFile,const QString & inputCodec,const QString & outputCodec,const ConversionOptions * _conversionOptions,TagData * tags,bool replayGain)76 int soundkonverter_codec_flake::convert( const KUrl& inputFile, const KUrl& outputFile, const QString& inputCodec, const QString& outputCodec, const ConversionOptions *_conversionOptions, TagData *tags, bool replayGain )
77 {
78     QStringList command = convertCommand( inputFile, outputFile, inputCodec, outputCodec, _conversionOptions, tags, replayGain );
79     if( command.isEmpty() )
80         return BackendPlugin::UnknownError;
81 
82     CodecPluginItem *newItem = new CodecPluginItem( this );
83     newItem->id = lastId++;
84     newItem->process = new KProcess( newItem );
85     newItem->process->setOutputChannelMode( KProcess::MergedChannels );
86     connect( newItem->process, SIGNAL(readyRead()), this, SLOT(processOutput()) );
87     connect( newItem->process, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(processExit(int,QProcess::ExitStatus)) );
88 
89     newItem->process->clearProgram();
90     newItem->process->setShellCommand( command.join(" ") );
91     newItem->process->start();
92 
93     logCommand( newItem->id, command.join(" ") );
94 
95     backendItems.append( newItem );
96     return newItem->id;
97 }
98 
convertCommand(const KUrl & inputFile,const KUrl & outputFile,const QString & inputCodec,const QString & outputCodec,const ConversionOptions * _conversionOptions,TagData * tags,bool replayGain)99 QStringList soundkonverter_codec_flake::convertCommand( const KUrl& inputFile, const KUrl& outputFile, const QString& inputCodec, const QString& outputCodec, const ConversionOptions *_conversionOptions, TagData *tags, bool replayGain )
100 {
101     Q_UNUSED(inputCodec)
102     Q_UNUSED(tags)
103     Q_UNUSED(replayGain)
104 
105     if( !_conversionOptions )
106         return QStringList();
107 
108     QStringList command;
109     const ConversionOptions *conversionOptions = _conversionOptions;
110 
111     if( outputCodec == "flac" )
112     {
113         command += binaries["flake"];
114         if( conversionOptions->pluginName == global_plugin_name )
115         {
116             command += "-"+QString::number((int)conversionOptions->compressionLevel);
117             command += conversionOptions->cmdArguments;
118         }
119         command += "\"" + escapeUrl(inputFile) + "\"";
120         command += "-o";
121         command += "\"" + escapeUrl(outputFile) + "\"";
122     }
123 
124     return command;
125 }
126 
parseOutput(const QString & output)127 float soundkonverter_codec_flake::parseOutput( const QString& output )
128 {
129     // progress:   6% | ratio: 0.556 | bitrate: 784.4 kbps
130 
131     QRegExp regEnc("progress:\\s+(\\d+)%");
132     if( output.contains(regEnc) )
133     {
134         return (float)regEnc.cap(1).toInt();
135     }
136 
137     return -1;
138 }
139 
140 K_PLUGIN_FACTORY(codec_flake, registerPlugin<soundkonverter_codec_flake>();)
141 
142 #include "soundkonverter_codec_flake.moc"
143