私は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を使ってもデバッグ経験があります。
何か助けていただければ幸いです。