Exemplo n.º 1
0
        /// <summary>
        /// CUEからCDオブジェクトを生成
        /// </summary>
        /// <param name="cue">CUEシート</param>
        /// <param name="cueFilename">CUEシートのファイル名。埋め込みの場合は音源ファイル名。</param>
        /// <param name="alternativeFilename">FILE命令の代替とする音源のファイル名。</param>
        /// <param name="readStream">音源のファイルまで読んで解析するかどうか。trueでないとビットレートや最終トラックの長さが取得できない</param>
        /// <returns>CDオブジェクト</returns>
        private static CD ConvertCue2CD(CUESheet cue, string cueFilename, string alternativeFilename = null, bool readStream = true)
        {
            var    cd           = new CD();
            var    info         = new StreamInfo();
            string lastFilename = null;

            CD.Track prevTrack = null, currentTrack = null;
            for (int i = 0; i < cue.Tracks.Count; i++)
            {
                var cueTr = cue.Tracks[i];
                if (cueTr.Type != Tags.CUESheet.TrackType.AUDIO)
                {
                    continue;
                }
                currentTrack = new CD.Track();
                var rootedFilename = (!Path.IsPathRooted(cueTr.Filename) ? Path.GetDirectoryName(cueFilename) + Path.DirectorySeparatorChar : "") + cueTr.Filename;
                if (rootedFilename != lastFilename)
                {
                    lastFilename = rootedFilename;
                    if (readStream)
                    {
                        info      = GetStreamInfo(alternativeFilename ?? rootedFilename);
                        cd.length = cd.length.Add(info.Length);
                    }
                }
                else if (prevTrack != null)
                {
                    prevTrack.End = cueTr.Index01.ToFrames;
                }
                /* Set Stream info */
                currentTrack.bitrate  = info.Bitrate;
                currentTrack.channels = info.Channels;
                currentTrack.freq     = info.Freq;

                currentTrack.Start              = cueTr.Index01.ToFrames;
                currentTrack.End                = (int)(info.LengthInSec * 75);
                currentTrack.file_name          = cueFilename + new String(' ', (i + 1));
                currentTrack.file_name_CUESheet = rootedFilename;

                /* Set track info to Tag */
                currentTrack.AddTag("TRACK", (i + 1).ToString());
                currentTrack.AddTag("TITLE", cueTr.Title);
                currentTrack.AddTag("ARTIST", cueTr.Performer);
                currentTrack.AddTag("COMMENT", cueTr.Comment);
                currentTrack.AddTag("ISRC", cueTr.Isrc);
                currentTrack.AddTag("TRACK GAIN", cueTr.Gain);
                currentTrack.AddTag("TRACK PEAK", cueTr.Peak);

                /* Set album info to Tag */
                currentTrack.AddTag("ALBUM", cue.Title);
                currentTrack.AddTag("ARTIST", cue.Performer);
                currentTrack.AddTag("ALBUM ARTIST", cue.Performer);
                currentTrack.AddTag("GENRE", cue.Genre);
                currentTrack.AddTag("DATE", cue.Date);
                currentTrack.AddTag("COMMENT", cue.Comment);
                currentTrack.AddTag("ALBUM GAIN", cue.Gain);
                currentTrack.AddTag("ALBUM PEAK", cue.Peak);

                cd.tracks.Add(currentTrack);
                prevTrack = currentTrack;
            }
            return(cd);
        }
Exemplo n.º 2
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);
        }