このページは、動画や静画の情報を扱うには、どうすれば良いかをまとめたものである。
なお、C#で開発しているため、C#ベースで記述してある。
また、これが最善である保証はない上、設計上間違っていることがあるため、鵜呑みにしないこと。

情報管理設計図.gif
情報管理概要図

■ 概要

  管理クラスと単体情報クラスの2つに大きく分けて考える。
  単体情報とは、1つの動画、1つの静画などそれぞれの情報を扱うためで
  sm9やsg100など個別にインスタンスが生成されるものとする。

  それらのインスタンスを管理するために管理クラス "ManagerBase" がある。

■ 管理クラス

  ManagerBaseクラスは、全ての単体情報を管理するための基本的な機能を提供します。
  またabstractであるため、そのままでは利用できず、ManagerBaseを継承してMovieInfoManager、SeigaInfoManagerといった具合に
  それぞれの単体情報を管理するためのクラスを作成する必要があります。

  理由としては、動画も静画も情報の取り方(API等)がそれぞれ異なるからで、どうやって取得するのか定義しなければならないからです。
  なお、ManagerBaseの派生クラスは、必ず DataWebGetメソッドを実装しなければなりません。

  ● 単体情報のインスタンスの管理
  
    ● どのように情報を取得するか
      内部では、" Dictionary<string,T> DataCache " でインスタンスを管理しており、要求があれば、そこから取り出す。
      情報の取得を行う優先度は、下記に示した通りである。
      
      1, キャッシュ
      2, ローカルデータベース
      3, Web(ニコニコ側)

      例えば、ローカルデータベースに存在するからと1ヶ月も前の情報を取得してたのでは、その情報に価値がないことになる。
      そのため、ある一定時間が経過した場合は、データベースに存在したとしてもWebに問い合わせて最新情報を得ようとする。
      また、GetInfo("sm9",true) のように第二引数をtrueにすることで強制的に最新情報に更新できる。
      
    ● スレッド
      GetInfoメソッドは、スレッドを止めずにすぐに制御を返す。
      そのため、情報が未取得なインスタンスを返すため若干の注意が必要かも知れない。
       
      実際にAPI等から情報取得は、バックグラウンドスレッドで行われる。
      最新情報を取得したら、イベント "Event_NewDataGet" が発行される。
       
      情報取得待ちの管理には、キューを使用する。

  ● 単体情報
   InfoBaseクラスを継承して動画情報を扱うための MovieInfo 、 静画情報を扱うための SeigaInfoクラスを定義する。
   
    ● InfoBaseクラスにより提供されるもの
   
     IDプロパティは、情報オブジェクトの固有IDとして使用する。
     これは、動画番号や静画番号と一意に関連しており、sm9やsg100、co9999999などである。
     また、IDプロパティは、ローカルデータベースのプライマリーキーとして使用される。
     
     ○プロパティ

        1, 最終更新時間   LastAccessTime
        2, 最終参照時間   LastDataUpdateTime
        3, 初回情報取得時間 FastDataGetTime
        4, 情報更新間隔   IntervalUpdate
        5, 情報の状態    CheckData
            状態
                OK    : 正常に情報を取得している
                Delete    : ニコニコ側で削除されている
                Unknown  : 未取得
                Old    : 古い情報のため更新する必要がある。

  ● ライブラリ利用側のサンプルコード

	 1,MovieInfoManager<MovieInfo> movieManager = new MovieInfoManager<MovieInfo>();
	 2,movieManager.Event_NewDataGet += new ManagerBase<MovieInfo>.NewDataGetHandler( delegate(MovieInfo info , bool success) {
	 3,	Console.WriteLine("動画情報取得:{0} - {1}",info.ID,info.Title);
	 4,} );
	 5,
	 6,MovieInfo temp1 = movieManager.GetInfo( "sm9" );
	 7,MovieInfo temp2 = movieManager.NewGetInfo( "sm2011" );


    1行目は、動画情報を管理するためにMovieInfoManagerのインスタンスを生成。
    2~4行目は、最新情報を取得したときに通知される、Event_NewDataGetイベントをキャッチしてそれに対応した処理を行う。

    6行目は、sm9の動画情報(単体情報)を取得するがtemp1は、すぐに制御を返す為、タイトルや時間が空や0である可能性がある。
    一方、7行目は、sm2011の最新情報を得る、こちらは、情報を取得できるまで制御を戻さないのでtemp2には、確実にタイトルや時間などの情報が格納されている。