예제 #1
0
        public static CD Read(string filename, bool readStream)
        {
            var tag = MetaTag.readTagByFilename(filename, false);
            CD  cd  = CUEReader.ReadFromString(tag.Find((e) => e.Key == "CUESHEET").Value.ToString(), filename, readStream);

            if (cd == null)
            {
                return(null);
            }
            long bits    = (new FileInfo(filename)).Length * 8;
            int  bitrate = 1410 * 1000;

            try
            {
                using (var strm = new BASS.FileStream(filename, BASS.Stream.StreamFlag.BASS_STREAM_DECODE))
                {
                    bitrate = (int)(bits / strm.length);
                }
            }
            catch (Exception ex) {
                Logger.Error("cannot open file (by BASS)" + filename);
                Logger.Debug(ex);
            }

            foreach (var tr in cd.tracks)
            {
                // トラック番号取得
                int trackindex = 0;
                var trackIndex = tr.tag.Find((match) => match.Key == "TRACK" ? true : false);
                trackindex = int.Parse(trackIndex.Value.ToString());

                // その他、ディスク全体のタグ情報をまとめてぶっこむ
                foreach (var disctag in tag)
                {
                    tr.tag.RemoveAll(_ => _.Key == disctag.Key);
                    tr.tag.Add(disctag);
                }

                // InCUEの拡張タグ(?)をトラックのタグに付加
                var customColumns = tag.FindAll((e) => e.Key.IndexOf(string.Format("CUE_TRACK{0:00}_", trackindex)) == 0);
                foreach (var col in customColumns)
                {
                    string key = new Regex(@"^CUE_TRACK\d\d_(?<1>.*)$").Match(col.Key).Groups[1].Value;
                    tr.tag.RemoveAll(_ => _.Key == key);
                    tr.tag.Insert(0, new KeyValuePair <string, object>(key, col.Value));
                }

                // PERFORMERがないとき、ARTISTをPERFORMERとして扱う
                if (tr.tag.Find((e) => { return(e.Key == "PERFORMER"); }).Value == null)
                {
                    var artist = tr.tag.Find((e) => { return(e.Key == "ARTIST"); });
                    if (artist.Value != null)
                    {
                        tr.tag.Add(new KeyValuePair <string, object>("PERFORMER", artist.Value));
                    }
                }

                // InCUE内のFILE名が実体と異なっている場合があるため、ビットレートを付加しなおす
                tr.bitrate = bitrate;
            }
            return(cd);
        }
예제 #2
0
        /// <summary>
        /// CUEシートを解析する
        /// </summary>
        /// <param name="file_name">ファイル名</param>
        /// <param name="lastModifySTMT">modifyを取得するプリペアドステートメント</param>
        private void AnalyzeCUE(string file_name, List <LuteaAudioTrack> threadLocalResults, SQLite3DB.STMT lastModifySTMT)
        {
            // 既に処理済みの場合はreturn
            if (AlreadyAnalyzedFiles.Contains(file_name))
            {
                return;
            }

            // 処理済みファイルに追加
            lock (AlreadyAnalyzedFiles)
            {
                AlreadyAnalyzedFiles.Add(file_name);
            }

            // ファイルを解析
            var cd = CUEReader.ReadFromFile(file_name, true);

            if (cd == null)
            {
                return;
            }

            string lastCheckedFilename       = null;
            bool   lastCheckedFileShouldSkip = false;
            bool   modifyed = LastModifyDatetime(lastModifySTMT, file_name) <= new System.IO.FileInfo(file_name).LastWriteTime;

            foreach (CD.Track tr in cd.tracks)
            {
                if (tr.file_name_CUESheet == "")
                {
                    continue;
                }

                // 実体ストリームが存在しない、またはCUESHEETが埋め込まれているなら、.cueファイルとしてのインポートはスキップする。
                if (lastCheckedFilename != tr.file_name_CUESheet)
                {
                    lastCheckedFilename       = tr.file_name_CUESheet;
                    lastCheckedFileShouldSkip = false;

                    if (!System.IO.File.Exists(tr.file_name_CUESheet))
                    {
                        lastCheckedFileShouldSkip = true;
                    }

                    // CUEシートが埋め込まれているならスキップ
                    var tagInRealStream = MetaTag.readTagByFilename(tr.file_name_CUESheet, false);
                    if (tagInRealStream != null && (tagInRealStream.Exists(e => e.Key == "CUESHEET")))
                    {
                        lastCheckedFileShouldSkip = true;
                    }
                }
                // ストリームのタグにCUESHEETがある時はなにもしない
                if (lastCheckedFileShouldSkip)
                {
                    continue;
                }

                lock (AlreadyAnalyzedFiles)
                {
                    AlreadyAnalyzedFiles.AddRange(cd.tracks.Select(_ => _.file_name_CUESheet));
                }
                if (modifyed || !IsFastMode)
                {
                    threadLocalResults.Add(tr);
                }
            }
        }