Ejemplo n.º 1
0
        // 生成と終了


        /// <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
        }
Ejemplo n.º 2
0
        // 生成と終了


        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;
            }
        }
Ejemplo n.º 3
0
        /// <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;
            }
        }