importjava.io.Fileimportjava.util.concurrent.*importkotlin.concurrent.thread
inner classMyExecutor:Executor{private val poolSize =5var isQuit =falseprivate val blockQueue =ArrayBlockingQueue<Runnable>(poolSize)private val blockQueueReal =ArrayBlockingQueue<Runnable>(poolSize)private val threadPool:ExecutorService=Executors.newCachedThreadPool()
fun isRunning()= blockQueueReal.isNotEmpty()
fun quit(){
isQuit =trueprintln("quiting...")}
fun getTaskCount():Int{return blockQueueReal.size
}
fun getTotalCount():Int{return index
}privatevar index =1
override fun execute(command:Runnable){
blockQueue.put(command)
blockQueueReal.put(command)
index++}
init {
thread {while(!isQuit){
val runnable = blockQueue.take()
threadPool.submit {
runnable.run()
blockQueueReal.poll()}}}}}
val myExecutor =MyExecutor()
val audioMap =setOf("flac","FLAC","wav","WAV","ogg","OGG")var file =File(File("").absolutePath)
fun String.execute():Process{returnProcessBuilder("cmd","/c",this).redirectErrorStream(true).start()}
fun execute(vararg cmds:String):Process{returnProcessBuilder("cmd","/c",*cmds).redirectErrorStream(true).start()}
fun File.getSuffix():String{if(name.contains(".")){
val index = name.lastIndexOf('.')+1return name.substring(index)}return""}
fun File.getPreFix():String{if(name.contains(".")){
val index = name.lastIndexOf('.')return name.substring(0, index)}return""}
file.listFiles()?.forEach {findHIFIAudio(it)}println("parse mp3 finish.")
fun findHIFIAudio(file:File){if(file.isFile){if(audioMap.contains(file.getSuffix())){println("找到无损音乐文件$file")
val outPath = "${file.parentFile.path}${File.separatorChar}${
file.getPreFix()}.mp3"
if(File(outPath).exists()){println("文件已经存在,跳过")}else{
myExecutor.execute {
val process =execute("ffmpeg","-i",
file.path,"-ab","320k","-map_metadata","0","-id3v2_version","3",
outPath
)println(process.inputStream.reader().forEachLine {// println(it)})
process.waitFor()println("${file.name}转换结束")
file.delete()}}}}elseif(file.listFiles()?.isNotEmpty()==true){
file.listFiles()?.forEach {findHIFIAudio(it)}}}while(myExecutor.isRunning()){println("正在等待所有任务结束,剩余${myExecutor.getTaskCount()}")Thread.sleep(1000)}
myExecutor.quit()println("结束,共转换了${myExecutor.getTotalCount()}个文件。")