コード例 #1
0
        /// <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));
            }
        }
コード例 #2
0
        /// <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);
            }
        }