acxi - audio conversion flac to ogg / mp3 script - sync data
acxi (click to open file, or right click and use the Save As option, in most browsers) is an expanded, cleaned up, and feature enhanced fork of the original logic of the classic flac2ogg.pl script.
Github: github.com/smxi/acxi Version History:
In addition to converting flac (or wav, raw, with ogg output) to ogg or mp3, acxi also copies over all txt, bmp, jpg, and pdf files from the source/flac directories to the new destination/ogg (or mp3) directories, which is convenient if you are ripping flac torrents with their data stuff to ogg/mp3. I'll probably add more features over time, once I figure out how perl actually works, but for now it's all working nicely, it's been cleaned up and put into structured functions to make it more powerful and useful. To get it, do this: :: Code :: cd /usr/local/bin && wget -Nc smxi.org/acxi && chmod +x acxiSee acxi -h for list of supported options. then edit the top variables to fit your system as defaults, most can be overridden with options however. See online options html page for current options: smxi.org/docs/acxi-options.htm Script features error handling for all user input, so it's a bit safer than the old flac2ogg.pl, which didn't do any checking of anything. Currently supported: output: ogg input: wav, raw, flac quality: 1-10 output: mp3 input: flac quality: 0-9 ( uses -V n - variable bit rate, highest is lowest quality, lowest number, 0, is highest quality and largest) Updated: as of version 2.7.x, acxi Flac to MP3 does now copy ID3 tags over to the MP# files from the Flac files, if present. Copy types (sync from source to destination): defauts: bmp jpg jpeg tif doc docx odt pdf txt user set: any you want Back to top |
The script fails if you have dollars in your filenames
Great work on the script, saved me a lot of time! I did come across one small bug with my library though - if files have a $ in the name the transcode fails with a file not found exception.
I've made a little patch that quotes dollars in the names if they exist. :: Code :: ***************
*** 436,441 **** --- 436,443 ---- # or the srcfile is more recent then the dest file, we encode. if ( !$destInfo || $B_FORCE || ( $srcModTime > $destModTime) ) { $file =~ s/\`/\'/g; + $file =~ s/\$/\\\$/g; + $destinationFile =~ s/\$/\\\$/g; $inFile = "$DIR_PREFIX_SOURCE/$file" . "c"; chop ($inFile); $outFile = "$DIR_PREFIX_DEST/$destinationFile" . "g"; Back to top |
Version 2.9.0 features that patch, and also now has the new verbosity level method that 3.0 is going to have.
Those levels are: --default, single line per operation, same as earlier --silent this is default, so if you want that, just leave it as is. That's my preferred screen output mode for what it's worth, which is why it's now the default. --debug is the old default, and is the full output, including flac, ogg, conversion output. --verbose is a bit more verbose than --default, without the full conversion output from the flac/ogg/mp3 functions. Thanks for the patch, hope you continue to find acxi useful, I certainly do. Remember, if you create user config file, you don't need to update the actual script itself, and with version 3.0, you will have to use a user config file no matter what, so best to start now. When will 3.0 come? Who knows, but I do see signs that it will support wav and other things, ie, it should be fairly complete, but I'm not the one doing the coding on it so whenever it will be ready is when it will be ready. But for now, 2.9 will work fine for everyone, 3 will simply have a few more options and features from what I understand. Back to top |
I'm a happy user of your script.
I was wondering though if you planned to add multithread capabilities? I've an Atom-based NAS and I'm sure the 3 other idle cores would be happy to participate to my daily mirroring effort :) Back to top |
Do I have any plans to multithread this basic perl script? No, I don't.
Will I accept an intelligently and competently written patch that seamlessly integrates into the existing code, alters no functionality, but adds multithreading? Yes, I will. Back to top |
Well, not a multithread patch, but I just created a function that cleans the DEST path of folders that disappeared in the SOURCE path.
:: Code ::
sub clean_target_directories { my $dir; @dirs; $bDirDeleted; $bDirDeleted = '0'; @dirs = `cd "$DIR_PREFIX_DEST" && find . -type d -print`; eval $PRINT_LINE_LARGE; if ( ! $B_SILENT ) { print "Checking to see if script needs to remove target directories...\n"; } else { print "Update destination directories... "; } foreach $dir (@dirs) { $dir =~ s/\n$//; $dir =~ s/^\.\///; # check to see if the destination dir still exists if ( !(stat ("$DIR_PREFIX_SOURCE/$dir")) ) { # stat failed so delete the target directory eval $PRINT_LINE_SMALL; if ( ! $B_SILENT ) { print "REMOVING TARGET DIRECTORY:\n\t$DIR_PREFIX_DEST/$dir\n"; } else { print "\nRemoving target directory: $dir"; } $dir =~ s/\`/\'/g; $result = `cd "$DIR_PREFIX_DEST" && rm -R "$dir"`; $bDirDeleted = 'true'; $B_DEST_CHANGED = 'true'; } } if ( ! $bDirDeleted ){ if ( ! $B_SILENT ) { print "No clean up required. Continuing...\n"; } else { print "none required."; } } } I'm looking into multithreading just for curiosity sake, but it's way beyond my skills... Back to top |
Doesn't check the files though. I'll work on that.
Back to top |
looking good so far, once it's done looks like it will work.
Something like this will probably be an option, not a default though. Back to top |
New function that clean the DEST folder. I recommend to use first the directory cleaning function and then this one, just to speed up the process.
:: Code ::
sub clean_target_files { my $file; @files; $sourceFile; $srcInfo; my $bFileDeleted; $file = ''; $rmFile = ''; $sourceFile = ''; $bFileDeleted = '0'; $srcInfo = ''; @files = `cd "$DIR_PREFIX_DEST" && find . -type f -print`; foreach $file (@files) { $file =~ s/\n$//; $file =~ s/^\.\///; #print "F: $DIR_PREFIX_DEST/$file\n"; # Figure out what the source file would be... $sourceFile = $file; $sourceFile =~ s/\.$OUTPUT_TYPE$/\.$INPUT_TYPE/; # Not replaced if not of $OUTPUT_TYPE #print "S: $DIR_PREFIX_SOURCE/$sourceFile\n"; # Now stat the sourceFile, and see if it exists. If not delete the converted file $srcInfo = stat ("$DIR_PREFIX_SOURCE/$sourceFile"); if ( !$srcInfo ) { $file =~ s/\`/\'/g; $rmFile = "$DIR_PREFIX_DEST/$file" . "g"; chop ($rmFile); eval $PRINT_LINE_SMALL; if ( ! $B_SILENT ) { print "REMOVE: $file\n"; } else { print "\nRemoving $file..."; } $rmFile =~ s/\0//g; #print "R: $rmFile\n"; $result = `rm "$rmFile"`; $bFileDeleted = 'true'; $B_DEST_CHANGED = 'true'; } } if ( ! $bFileDeleted ){ if ( ! $B_SILENT ) { print "No files to remove from the destination folder\n"; } else { print "everything is clean."; } } } Back to top |
Ok made some good progress on the multithread side :)
Need to use Thread::Queue to limit the number of concurrent threads (my first test resulted in n threads, n being the number of FLAC files needing to be converted, which is a bit too much ;)) Should come back soon with a proper patch. Back to top |
All times are GMT - 8 Hours |