/// <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); }
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); }