2017-03-07 8 views
0

私はRubyを初めて使用していますので、私の無知を許してください。移動前にRuby Mp3Infoが正しく終了していません

私は音楽を整理するのに役立つ簡単なアプリケーションを作成しました。このアプリケーションは、単純に、フォルダを読み込み、MP3ファイルのすべてを取得します:

Titleタグが含まれている場合は、アーティストタグに

をそれを移動してからちょうど「(偉業を分割..(偉業をsomeArtist。) ..) 'のものを別に保管して別に保管して、自分の音楽をジャンル別/アーティスト別/アルバム別/曲ファイル別に整理することができます。

これは私のすべての音楽を解析し、この方法で「フィーチャー」を取り除くことで最小限に抑えることができます。「Eminem(feat。Rihanna)」は別のフォルダを持たず、代わりに「Eminem」フォルダ内に配置されます。

はここに私のソースです:私の "moveFilesIntoFolders" メソッド内

require "pry" 
require "mp3info" 
require "fileutils" 

PATH = "C:/Users/MyUser/Desktop/MusicFolder" 

$mediaFiles = [] 
$errorRenaming = [] 
$errorMoving = [] 

class MusicFile 
    attr_accessor :fileName, :fullyQualifiedPath, :soloArtist 
    def initialize(fileName, fullyQualifiedPath) 
    @fileName = fileName 
    @fullyQualifiedPath = fullyQualifiedPath 
    end 
end 

def printFiles 
    parseFileIntoArray 
    $mediaFiles.each do |item| 
    puts item.fullyQualifiedPath #prints all fileName's within the array 
    end 
end 


private 
def parseFileIntoArray 
    fullyQualifiedFileNames = Dir.glob("#{PATH}/**/*.mp3").select { |fn| File.file?(fn) } 

    fullyQualifiedFileNames.each do |files| 
    $mediaFiles << MusicFile.new(files.split('/')[-1], files) #Store fully qualified filename inside of Array 
    end 
end 

#take all files, read artist 
#remove (feat) from it and store artist 

def moveFilesIntoFolders 
    $mediaFiles.each do |file| 
    mp3File = Mp3Info.open(file.fullyQualifiedPath) #WHOLE PROGRAM DIES RIGHT HERE 
    destinationFolder = "#{PATH}/CONVERTED/#{mp3File.tag.genre_s}/#{file.soloArtist}/#{mp3File.tag.album}" 
    unless File.directory?(destinationFolder) 
     begin 
     FileUtils.mkdir_p(destinationFolder) 
     rescue => exception 
     puts exception.backtrace 
     puts "Error creating directory #{destinationFolder}" 
     end 
    end 
    File.open(file.fullyQualifiedPath, "r") do |itemToMove| 
     begin 
     FileUtils.cp(itemToMove, destinationFolder) 
     rescue => exception 
     puts exception.backtrace 
     $errorMoving << file.fileName 
     $errorMoving.each do |error| 
      puts "errors moving: #{error}" 
     end 
     end 
    end 
    mp3File.close 
    end 
    puts "leaving moveFilesIntoFolders" 
end 

def getFeatAndParse 
    $mediaFiles.each do |item| 
    mp3File = Mp3Info.open(item.fullyQualifiedPath) 
    item.soloArtist = mp3File.tag.artist 
     if mp3File.tag.title.include?("(feat") 
     theIndex = mp3File.tag.title.index("(feat") 
     substring = mp3File.tag.title[theIndex..-1] 
     elsif mp3File.tag.artist.include?("(feat") 
      theIndex = mp3File.tag.artist.index("(feat") 
      substring = mp3File.tag.artist[theIndex..-1] 
     end 
     mp3File.tag.artist.slice! substring 
     mp3File.tag.artist = mp3File.tag.artist.split.join(" ") 
     item.soloArtist = mp3File.tag.artist 
     mp3File.tag.artist = "#{mp3File.tag.artist} #{substring}" 
     mp3File.close 
     begin 
     File.rename(item.fullyQualifiedPath, "#{PATH}/#{mp3File.tag.title} - #{item.soloArtist} - #{mp3File.tag.album}.mp3") 
     rescue => exception 
     puts exception.backtrace 
     $errorRenaming << item.fileName 
     $errorRenaming.each do |error| 
      puts "errors renaming: #{error}" 
     end 
     end 
    end 
end 


parseFileIntoArray 
getFeatAndParse 
moveFilesIntoFolders 

、それはMP3File.openステートメントの例外をスローします。次のように 例外は次のとおりです。

D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0.8.10/lib/mp3 
info.rb:244:in `initialize': No such file or directory @ rb_sysopen - C:/Users/MyUser/Desktop/MusicFolder/test.mp3 (Errno::ENOENT) 
     from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0 
.8.10/lib/mp3info.rb:244:in `new' 
     from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0 
.8.10/lib/mp3info.rb:244:in `reload' 
     from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0 
.8.10/lib/mp3info.rb:230:in `initialize' 
     from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0 
.8.10/lib/mp3info.rb:300:in `new' 
     from D:/Program Files/Ruby23-x64/lib/ruby/gems/2.3.0/gems/ruby-mp3info-0 
.8.10/lib/mp3info.rb:300:in `open' 
     from ./main.rb:59:in `block in moveFilesIntoFolders' 
     from ./main.rb:58:in `each' 
     from ./main.rb:58:in `moveFilesIntoFolders' 
     from ./main.rb:124:in `<main>' 

このの終わりには、すべてのファイルが正しい名前に変更されています。フォルダに移動するだけで失敗しました。私の考えは、オペレーティングシステムがまだすべてのファイルの名前を変更したり反映したりしていないため、ファイルを移動しようとすると別のソースからすでに読み込まれているため例外が発生しているということです。

の「moveIntoFolders」メソッドを実行した後にアプリケーションを再実行すると、完全に機能します。私が名前の変更をしていて、すぐに例外を引き起こしている別の方法で動かしているという事実だけです。 Rubyがプロセスを完全に終了するのを待たせる方法はありますか?私は「スリープ」コマンドを実行しようとしても動作しませんでした。

私は言語について十分に知りませんし、問題を理解するためにPryを使ってもデバッグ経験があります。

何か助けていただければ幸いです。

答えて

0

移動時に非同期ストリームが開いていないことを確認して問題を修正しました。

私はちょうどオブジェクト自体

def moveFilesIntoFolders 
    $mediaFiles.each do |file| 
    destinationFolder = "#{PATH}/CONVERTED/#{file.genre}/#{file.soloArtist}/#{file.album}" 
    unless File.directory?(destinationFolder) 
     begin 
     FileUtils.mkdir_p(destinationFolder) 
     rescue => exception 
     puts exception.backtrace 
     puts "Error creating directory #{destinationFolder}" 
     end 
    end 
    File.open(file.fullyQualifiedPath, "r") do |itemToMove| 
     begin 
     FileUtils.cp(itemToMove, destinationFolder) 
     rescue => exception 
     puts exception.backtrace 
     $errorMoving << file.fileName 
     $errorMoving.each do |error| 
      puts "errors moving: #{error}" 
     end 
     end 
    end 
    end 
end 
で、それが引いたデータを保持
関連する問題