/// <summary> /// トラックの情報をSTMTにBINDする /// </summary> /// <param name="stmt">BINDするSTMT</param> /// <param name="track">トラック情報</param> /// <param name="cols">データベースのカラムのリスト</param> private void BindTrackInfo(SQLite3DB.STMT stmt, LuteaAudioTrack track, Column[] cols) { stmt.Reset(); string extension = (((track.file_ext == "CUE") && (track is CD.Track)) ? ((CD.Track)track).file_ext_CUESheet : track.file_ext).ToUpper(); var values = cols .Select(col => { switch (col.Name) { case LibraryDBColumnTextMinimum.file_name: return(track.file_name); case LibraryDBColumnTextMinimum.file_title: return(track.file_title); case LibraryDBColumnTextMinimum.file_ext: return(extension); case LibraryDBColumnTextMinimum.file_size: return(track.file_size.ToString()); case LibraryDBColumnTextMinimum.statDuration: return(((int)track.duration).ToString()); case LibraryDBColumnTextMinimum.statChannels: return(track.channels.ToString()); case LibraryDBColumnTextMinimum.statSamplingrate: return(track.freq.ToString()); case LibraryDBColumnTextMinimum.statBitrate: return(track.bitrate.ToString()); case LibraryDBColumnTextMinimum.statVBR: return("0"); case LibraryDBColumnTextMinimum.infoCodec: return(track.codec.ToString()); case LibraryDBColumnTextMinimum.infoCodec_sub: return(extension); case LibraryDBColumnTextMinimum.infoTagtype: return("0"); case LibraryDBColumnTextMinimum.gain: return("0"); case LibraryDBColumnTextMinimum.modify: return(MusicLibrary.currentTimestamp.ToString()); default: if (!track.tag.Exists((e) => e.Key == col.MappedTagField)) { return(""); } if (track.tag.First((e) => e.Key == col.MappedTagField).Value == null) { return(""); } var tagValue = track.tag.First((e) => e.Key == col.MappedTagField).Value.ToString(); // DATEの表現形式を正規化して格納する return(col.MappedTagField == "DATE" ? normalizeDateString(tagValue) ?? tagValue : tagValue); } }); for (int i = 0; i < cols.Length; i++) { stmt.Bind(i + 1, values.ElementAt(i)); } }
/// <summary> /// 単体の音楽ファイルを解析する /// </summary> /// <param name="file_name">ファイル名</param> /// <param name="threadLocalResultQueue">スレッド固有の解析結果</param> /// <param name="lastModifySTMT">modifyを取得するプリペアドステートメント</param> private void AnalyzeStreamFile(string file_name, List <LuteaAudioTrack> threadLocalResultQueue, SQLite3DB.STMT lastModifySTMT) { // 既に処理済みの場合はreturn if (AlreadyAnalyzedFiles.Contains(file_name)) { return; } // 処理済みファイルに追加 lock (AlreadyAnalyzedFiles) { AlreadyAnalyzedFiles.Add(file_name); } if (LastModifyDatetime(lastModifySTMT, file_name) > new System.IO.FileInfo(file_name).LastWriteTime&& IsFastMode) { return; } var tag = MetaTag.readTagByFilename(file_name, false); if (tag == null) { return; } var cue = tag.Find(match => match.Key.ToUpper() == "CUESHEET"); if (cue.Key != null) { var cd = InternalCUEReader.Read(file_name, true); if (cd == null) { Logger.Error("CUESHEET is embedded. But, it has error. " + file_name); return; } threadLocalResultQueue.AddRange(cd.tracks.Cast <LuteaAudioTrack>()); } else { // PERFORMERがないとき、ARTISTをPERFORMERとして扱う if (tag.Find((e) => { return(e.Key == "PERFORMER"); }).Value == null) { var artist = tag.Find((e) => { return(e.Key == "ARTIST"); }); if (artist.Value != null) { tag.Add(new KeyValuePair <string, object>("PERFORMER", artist.Value)); } } var tr = new LuteaAudioTrack() { file_name = file_name, file_size = new System.IO.FileInfo(file_name).Length }; if (tag.Exists(_ => _.Key == "__X-LUTEA-CHANS__") && tag.Exists(_ => _.Key == "__X-LUTEA-FREQ__") && tag.Exists(_ => _.Key == "__X-LUTEA-DURATION__")) { tr.duration = int.Parse(tag.Find(_ => _.Key == "__X-LUTEA-DURATION__").Value.ToString()); tr.channels = int.Parse(tag.Find(_ => _.Key == "__X-LUTEA-CHANS__").Value.ToString()); tr.freq = int.Parse(tag.Find(_ => _.Key == "__X-LUTEA-FREQ__").Value.ToString()); } else { try { using (var strm = DecodeStreamFactory.CreateFileStreamPrimitive(file_name)) { tr.duration = (int)strm.LengthSec; tr.channels = (int)strm.Chans; tr.freq = (int)strm.Freq; } } catch (ArgumentException ex) { Logger.Error("cannot open file (by BASS)" + file_name); Logger.Debug(ex); } } tr.tag = tag; if (tr.file_ext == "M4A") { if (tag.Exists(_ => (_.Key == "PURCHASE DATE") || (_.Key == "PURCHASED"))) { if ((TypesToImport & ImportableTypes.M4A_iTunes) == 0) { return; } } else if (tr.codec == H2k6Codec.ALAC) { if ((TypesToImport & ImportableTypes.M4A_ALAC) == 0) { return; } } else { if ((TypesToImport & ImportableTypes.M4A) == 0) { return; } } } threadLocalResultQueue.Add(tr); } }