// 生成と終了 /// <summary> /// 指定された <see cref="SetDef.Block"/> をもとに、初期化する。 /// </summary> public SetNode(SetDef.Block block, VariablePath 基点フォルダパス, Node 親ノード) { this.タイトル = block.Title; this.親ノード = 親ノード; using (var songdb = new SongDB()) { for (int i = 0; i < 5; i++) { this.MusicNodes[i] = null; if (block.File[i].Nullでも空でもない()) { VariablePath 曲のパス = Path.Combine(基点フォルダパス.数なしパス, block.File[i]); if (File.Exists(曲のパス.数なしパス)) { try { this.MusicNodes[i] = new MusicNode(Path.Combine(基点フォルダパス.数なしパス, block.File[i]), this); this.MusicNodes[i].難易度ラベル = block.Label[i]; this.子ノードリスト.Add(this.MusicNodes[i]); var song = songdb.Songs.Where((r) => (r.Path == this.MusicNodes[i].曲ファイルの絶対パス.数なしパス)).SingleOrDefault(); this.MusicNodes[i].難易度 = (null != song) ? (float)song.Level : 0.00f; } catch { Log.ERROR("SetNode 内での MusicNode の生成に失敗しました。"); } } else { Log.ERROR($"set.def 内に指定されたファイルが存在しません。無視します。[{曲のパス.変数付きパス}] "); } } } } // 基点フォルダパス(set.def ファイルと同じ場所)に画像ファイルがあるなら、それをノード画像として採用する。 var サムネイル画像ファイルパス = (from ファイル名 in Directory.GetFiles(基点フォルダパス.数なしパス) where _対応するサムネイル画像名.Any(thumbファイル名 => (Path.GetFileName(ファイル名).ToLower() == thumbファイル名)) select ファイル名).FirstOrDefault(); this._SetNode自身のノード画像 = (null != サムネイル画像ファイルパス) ? new テクスチャ(サムネイル画像ファイルパス) : null; // ないなら null }
// 生成と終了 public MusicNode(VariablePath 曲ファイルの絶対パス, Node 親ノード) { this.親ノード = 親ノード; this.曲ファイルの絶対パス = 曲ファイルの絶対パス; if (!AppForm.ビュアーモードである) { // (まだ存在してなければ)曲DBに追加する。 曲DB.曲を追加または更新する(this.曲ファイルの絶対パス, App進行描画.ユーザ管理.ログオン中のユーザ); } // 追加後、改めて曲DBから情報を取得する。 using (var songdb = new SongDB()) { var song = songdb.Songs.Where((r) => (r.Path == this.曲ファイルの絶対パス.数なしパス)).SingleOrDefault(); if (null == song) { return; } this.タイトル = song.Title; this.サブタイトル = ""; this.サブタイトル = song.Artist; this.曲ファイルハッシュ = song.HashId; this.難易度ラベル = "FREE"; this.難易度 = (float)song.Level; if (song.PreImage.Nullでも空でもない()) { var プレビュー画像ファイルの絶対パス = Path.Combine(Path.GetDirectoryName(song.Path), song.PreImage); this.ノード画像 = new テクスチャ(プレビュー画像ファイルの絶対パス); } if (song.PreSound.Nullでも空でもない()) { this.プレビュー音声ファイルの絶対パス = Path.Combine(Path.GetDirectoryName(song.Path), song.PreSound); } this.BGMAdjust = song.BGMAdjust; } }
/// <summary> /// 指定した曲ファイルに対応するレコードがデータベースになければレコードを追加し、 /// あればそのレコードを更新する。 /// </summary> public static void 曲を追加または更新する(VariablePath 曲ファイルパス, ユーザ設定 ユーザ設定) { try { using (var songdb = new SongDB()) { var 一パス検索クエリ = songdb.Songs.Where((song) => (song.Path == 曲ファイルパス.数なしパス)); if (0 == 一パス検索クエリ.Count()) { // (A) 同一パスを持つレコードがDBになかった var 調べる曲のハッシュ = _ファイルのハッシュを算出して返す(曲ファイルパス); var 一ハッシュレコード = songdb.Songs.Where((song) => (song.HashId == 調べる曲のハッシュ)).SingleOrDefault(); if (null == 一ハッシュレコード) { #region " (A-a) 同一ハッシュを持つレコードがDBになかった → 新規追加 " //---------------- var score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); // Songs レコード新規追加。 var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); songdb.Songs.InsertOnSubmit( new Song() { HashId = _ファイルのハッシュを算出して返す(曲ファイルパス), Title = score.曲名, Path = 曲ファイルパス.数なしパス, LastWriteTime = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"), Level = score.難易度, MinBPM = BPMs.最小BPM, MaxBPM = BPMs.最大BPM, TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCymbal], TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat], TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot], TotalNotes_Snare = ノーツ数[表示レーン種別.Snare], TotalNotes_Bass = ノーツ数[表示レーン種別.Bass], TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1], TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2], TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3], TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCymbal], PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : "", Artist = score.アーティスト名, PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : "", BGMAdjust = 0, }); songdb.DataContext.SubmitChanges(); Log.Info($"DBに曲を追加しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } else { #region " (A-b) 同一ハッシュを持つレコードがDBにあった → 更新 " //---------------- var 拡張子名 = Path.GetExtension(曲ファイルパス.数なしパス); var score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); // Songs レコード更新。 var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); var song = 一ハッシュレコード; song.Title = score.曲名; song.Path = 曲ファイルパス.数なしパス; song.LastWriteTime = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"); song.Level = score.難易度; song.MinBPM = BPMs.最小BPM; song.MaxBPM = BPMs.最大BPM; song.TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCymbal]; song.TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat]; song.TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot]; song.TotalNotes_Snare = ノーツ数[表示レーン種別.Snare]; song.TotalNotes_Bass = ノーツ数[表示レーン種別.Bass]; song.TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1]; song.TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2]; song.TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3]; song.TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCymbal]; song.PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : ""; song.Artist = score.アーティスト名; song.PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : ""; song.BGMAdjust = song.BGMAdjust; songdb.DataContext.SubmitChanges(); Log.Info($"パスが異なりハッシュが同一であるレコードが検出されたため、曲の情報を更新しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } } else { // (B) 同一パスを持つレコードがDBにあった var record = 一パス検索クエリ.Single(); string レコードの最終更新日時 = record.LastWriteTime; string 調べる曲の最終更新日時 = File.GetLastWriteTime(曲ファイルパス.数なしパス).ToString("G"); if (レコードの最終更新日時 != 調べる曲の最終更新日時) { #region " (B-a) 最終更新日時が変更されている → 更新 " //---------------- var score = (SSTFormatCurrent.スコア)null; // スコアを読み込む score = SSTFormatCurrent.スコア.ファイルから生成する(曲ファイルパス.数なしパス); var hash = _ファイルのハッシュを算出して返す(曲ファイルパス); var ノーツ数 = _ノーツ数を算出して返す(score, ユーザ設定); var BPMs = _最小最大BPMを調べて返す(score); // HashId 以外のカラムを更新する。 record.Title = score.曲名; record.LastWriteTime = 調べる曲の最終更新日時; record.Level = score.難易度; record.MinBPM = BPMs.最小BPM; record.MaxBPM = BPMs.最大BPM; record.TotalNotes_LeftCymbal = ノーツ数[表示レーン種別.LeftCymbal]; record.TotalNotes_HiHat = ノーツ数[表示レーン種別.HiHat]; record.TotalNotes_LeftPedal = ノーツ数[表示レーン種別.Foot]; record.TotalNotes_Snare = ノーツ数[表示レーン種別.Snare]; record.TotalNotes_Bass = ノーツ数[表示レーン種別.Bass]; record.TotalNotes_HighTom = ノーツ数[表示レーン種別.Tom1]; record.TotalNotes_LowTom = ノーツ数[表示レーン種別.Tom2]; record.TotalNotes_FloorTom = ノーツ数[表示レーン種別.Tom3]; record.TotalNotes_RightCymbal = ノーツ数[表示レーン種別.RightCymbal]; record.PreImage = (score.プレビュー画像ファイル名.Nullでも空でもない()) ? score.プレビュー画像ファイル名 : ""; record.Artist = score.アーティスト名; record.PreSound = (score.プレビュー音声ファイル名.Nullでも空でもない()) ? score.プレビュー音声ファイル名 : ""; record.BGMAdjust = record.BGMAdjust; if (hash != record.HashId) { // ハッシュはキーなので、これが変わったら、古いレコードを削除して、新しいレコードを追加する。 var newRecord = record.Clone(); songdb.Songs.DeleteOnSubmit(record); songdb.DataContext.SubmitChanges(); // 一度Submitして先にレコード削除を確定しないと、次のInsertがエラーになる。(PathカラムはUnique属性なので) newRecord.HashId = hash; songdb.Songs.InsertOnSubmit(newRecord); } songdb.DataContext.SubmitChanges(); Log.Info($"最終更新日時が変更されているため、曲の情報を更新しました。{曲ファイルパス.変数付きパス}"); //---------------- #endregion } else { #region " (B-b) それ以外 " //---------------- //---------------- #endregion } } } } catch (Exception e) { Log.ERROR($"曲DBへの曲の追加に失敗しました。({VariablePath.絶対パスをフォルダ変数付き絶対パスに変換して返す( e.Message )})[{曲ファイルパス.変数付きパス}]"); //throw; } }