IIS 7.0 用 Web プレイリスト - カスタム プロバイダーによる Web プレイリストの拡張

公開日: 2008 年 4 月 21 日 (作業者: vsood (英語))

更新日: 2009 年 9 月 9 日 (作業者: vsood (英語))

カスタム プロバイダーの記述

インターフェイスの実装

プレイリスト プロバイダー インターフェイスに含まれるインターフェイスは次のとおりです。

  • IPlaylistProvider: カスタム プロバイダーのルート インターフェイスです。 このインターフェイスを使用して、プロバイダーの初期化またはシャットダウンの際に実行が必要な任意のコードを追加できます。
  • IPlaylistRequestInfo: このインターフェイスにより、カスタム プロバイダーは HTTP 要求の属性にアクセスできます。 これらの属性は、インターネット インフォメーション サービス (IIS) のパイプラインにおいて、サーバー変数として公開されます。 カスタム プロバイダーは、このインターフェイスを使用することにより、一部のデータをプロバイダーに文字列として書き込むこともできます。
  • IPlaylistInfo: プレイリストの枠組みを定義します。 プレイリスト エントリのコレクションを、IPlaylistEntryInfoCollection として保持します。
  • IPlaylistEntryInfo: プレイリスト内の個々のエントリを表します。 Title、CanSeek などのプロパティを保持します。
  • IPlaylistEntryInfoCollection: このインターフェイスにより、カスタム プロバイダーは、一連のプレイリスト エントリを IPlaylistEntryInfo オブジェクトとしてスキャンできます。
  • IPlaylistFileInfo (省略可能): プレイリストが ファイルに保存される場合に、ファイルの情報を保持します。このインターフェイスを使用して、ファイル ストリームにアクセスできます。 IIS パイプラインにはこの情報が既に存在するため、このインターフェイスを使用するとカスタム プロバイダーは同じ機能を実装する必要がなくなります。 ファイルベースのプロバイダーを記述することを想定している場合は、IPlaylistFileInfo が便利です。 IPlaylistFileInfo を使用すると、IIS パイプラインからのファイル情報を使用でき、ファイルを開くなどのロジックをプロバイダーに実装することなくファイル コンテンツにアクセスできます。

IPlaylistFileInfo 以外はすべて必須インターフェイスであり、カスタム プロバイダーに実装する必要があります。

サンプル コード

以下のサンプル コードでは、要求された URL を再生する前に広告を追加する方法を示しています。 このコードは、カスタム プロバイダーを記述する際の参考例として提供されています (このため、ハードコードの文字列を含んでいます)。このコードはサポート対象ではなく、権利の許諾は伴いません。

using System;
using Microsoft.Web.Media.Playlist.Provider;
using System.Runtime.InteropServices;

namespace Microsoft.Web.Management.Media.Playlist.ProviderSample 
{
    public class PlaylistEntryInfo : IPlaylistEntryInfo
    {
        public PlaylistEntryInfo(string name, bool canSeekOrSkip)
        {
            _name = name;
            _canSeekOrSkip = canSeekOrSkip;
        }

        ENTRY_TYPE IPlaylistEntryInfo.EntryType
        {
            get
            {
                return ENTRY_TYPE.EntryTypePhysicalFile;
            }
        }

        string IPlaylistEntryInfo.Uri
        {
            get
            {
                return PlaylistProvider.MediaDirectory + _name;
            }
        }

        Object IPlaylistEntryInfo.GetProperty(PLAYLIST_ENTRY_PROPERTY_TYPE propertyName)
        {
            switch (propertyName)
            {
                case PLAYLIST_ENTRY_PROPERTY_TYPE.PlaylistEntryProperty_CanSeek:
                case PLAYLIST_ENTRY_PROPERTY_TYPE.PlaylistEntryProperty_CanSkipBackward:
                case PLAYLIST_ENTRY_PROPERTY_TYPE.PlaylistEntryProperty_CanSkipForward:
                    return _canSeekOrSkip;
                default:
                    return null;
            }
        }

        private string _name;
        private bool _canSeekOrSkip;
    }

    public class PlaylistInfo : IPlaylistInfo, IPlaylistEntryInfoCollection
    {
        public PlaylistInfo(string adname, string filename)
        {
            _entries = new IPlaylistEntryInfo[2];
            _entries[0] = new PlaylistEntryInfo(adname, false);
            _entries[1] = new PlaylistEntryInfo(filename, true);
        }

        IPlaylistEntryInfoCollection IPlaylistInfo.Entries
        {
            get
            {
                return this;
            }
        }

        uint IPlaylistEntryInfoCollection.Count
        {
            get
            {
                return 2;
            }
        }

        IPlaylistEntryInfo IPlaylistEntryInfoCollection.this[uint index]
        {
            get
            {
                return _entries[index];
            }
        }

        Object IPlaylistInfo.GetProperty(PLAYLIST_PROPERTY_TYPE propertyName)
        {
            if (propertyName == PLAYLIST_PROPERTY_TYPE.PlaylistProperty_Title)
            {
                return "Wrapper Playlist";
            }
            return null;
        }

        void IPlaylistInfo.EndRequestStatus(uint urlEntryId, uint status, int completionStatus, ulong bytesSent)
        {
            // No processing for EndRequest
        }

        private IPlaylistEntryInfo[] _entries;
    }

    [Guid("D5178953-96A0-4ebd-B511-024897DA2C09")]
    [ProgId("SamplePlaylistProvider.ProviderSample")]
    [ComVisible(true)]
    public class PlaylistProvider : IPlaylistProvider
    {
        IPlaylistInfo IPlaylistProvider.GetPlaylistInfo(IPlaylistRequestInfo requestInfo)
        {
            String path = requestInfo.Path;
            String name = path.Substring(path.LastIndexOf('/') + 1);
            name = name.Substring(0, name.LastIndexOf(".")) + FileExtension;
            return new PlaylistInfo(Advertisement + FileExtension, name);
        }

        void IPlaylistProvider.Initialize() 
        {
            //Load defaults for this provider... from config/xml etc
            MediaDirectory = @"C:\Test\Media\";
            Advertisement = "advertisement";
            FileExtension = ".flv";
        }

        void IPlaylistProvider.Shutdown() { }

        public static String MediaDirectory;
        public static String Advertisement;
        public static String FileExtension;
    }
}

カスタム プロバイダーの構築

.NET ベースのプロバイダーの構築

.NET ベースのプロバイダーを構築するには、次の 3 段階の手順を行います。

  1. タイプ ライブラリを作成する (リリース済みの playlisthandler.dll にアクセスできる場合は、このステップを省略できます)
    • midl /I<含める Web プレイリストへのパス> playlistprovider.idl /tlb playlistprovider.tlb /win32
    • midl /I<含める Web プレイリストへのパス> playlistprovider.idl /tlb playlistprovider.tlb /x64
      <含める Web プレイリストへのパス> には、解凍したインターフェイス ファイルも置かれている場所を指定します。
       
  2. タイプをアセンブリとしてインポートする
    1. **ステップ 1 で作成した .tlb を使用する場合

      **tlbimp/out:<出力ディレクトリ>\<出力プロバイダー タイプ ライブラリ.tlb> /namespace:<プロバイダーの名前空間> <ハンドラー参照>

      (*例: tlbimp /out:E:\myprovider\playlistprovder.dll /namespace:Microsoft.Web.Media.Playlist.Provider E:\myprovider\*playlistprovider.tlb )

    2. リリース済みの playlisthandler.dll を使用する場合

      tlbimp/out:<出力ディレクトリ>\<出力プロバイダーdll.dll> /namespace:<プロバイダーの名前空間> <プレイリスト ハンドラーへのパス>\playlisthandler.dll

      (例: tlbimp /out:E:\myprovider\playlistprovder.dll /namespace:Microsoft.Web.Media.Playlist.Provider E:\myprovider\playlisthandler.dll )

  3. ステップ 2 で作成したアセンブリへの参照を指定して、カスタム プロバイダーをコンパイルする
    Csc.exe /noconfig /nowarn:1701,1702 /errorreport:prompt /warn:4 /define:TRACE
    /reference:..\playlistprovder.dll
    /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll
    /debug:pdbonly /filealign:512 /optimize+
    /out:obj\Release\providersample.dll
    /target:library AssemblyInfo.cs PlaylistProvider.cs

ネイティブ プロバイダー (C++) の構築

リソース」に、Web プレイリスト インターフェイス ファイルへのリンクを記載しています。 ファイルを解凍したら、以下の手順を行います。

  1. ソース コードに、適切なプラットフォームのヘッダー ファイルを含めます。

  2. IDE (Visual Studio など) を使用して、プロバイダーの dll を構築します。

カスタム プロバイダーのインストールと実行

プレイリスト機能を使用した、カスタム プロバイダー用構成エントリの追加

1. インターネット インフォメーション サービス (IIS) マネージャーで、サイト レベルにある [プレイリスト] をクリックします (図 1 を参照)。

    Ee890791.Prov1(ja-jp,TechNet.10).jpg

     図 1. IIS 7.0 マネージャー - プレイリスト ページを開く

2. [操作] ウィンドウで、[プロバイダを構成します] をクリックします。 サイトに登録されているプロバイダーの一覧が表示されます (図 2 を参照)。

     Ee890791.cw6(ja-jp,TechNet.10).jpg

     図 2. IIS 7.0 マネージャー - プレイリスト プロバイダー ページを開く

3. [操作] ウィンドウで、[追加] をクリックします (図 3 を参照)。

     Ee890791.prov3(ja-jp,TechNet.10).jpg

     図 3. [プレイリスト プロバイダーの追加] ダイアログ ボックスを開く

4. [プレイリスト プロバイダーの追加] ダイアログ ボックスで、以下の詳細を記入します。 終わったら、[OK] をクリックします (図 4、5 を参照)。

  • [プロバイダー名]: プロバイダーのフレンドリ名を入力します。 プレイリスト プロバイダー ページのプロバイダーを識別するためにのみ使用します。

  • [説明]: プロバイダーの説明を入力します。 このフィールドは、プロバイダーについての簡単な説明を登録するために使用できます。 プロバイダーを識別するために、管理者のみが使用します。

  • [プログラム ID]: プロバイダーのコードで使用する COM ProgID を入力します。 この ID は、実行時のプロバイダーの検出と読み込みに使用されます。

  • [ファイル拡張子]: プロバイダーと連携するプレイリスト用のファイル名拡張子を入力します。プレイリスト機能では、Web プレイリスト (拡張子 .isx のファイル) が処理されます。 このフィールドに拡張子を指定すると、IIS 構成にハンドラーのマッピングが追加され、プレイリスト機能でその拡張子に対する要求を処理できるようになります。

  • [ファイルベース ハンドラー] (省略可能): 前に説明したとおり、このフィールドは省略できます。 プロバイダーでプレイリストをファイルに保存する場合、このチェック ボックスをオンにすると、IIS 7.0 パイプラインから必要なファイルの詳細とファイル コンテンツへのアクセス ストリームが提供されます。

  • [ビット数] (64 ビット システムのみ): プロバイダーが WOW 層で 32 ビットとして動作するか、64 ビットとして動作するか、その両方として動作するかを選択します。 IIS 構成には、要求を処理するための関連構成エントリが追加されます。

     Ee890791.cw7(ja-jp,TechNet.10).jpg

     図 4. [プレイリスト プロバイダーの追加] ダイアログ ボックス

     Ee890791.cw8(ja-jp,TechNet.10).jpg

     図 5. カスタム プロバイダー構成のビット数のオプション

カスタム プロバイダーの手動登録

前に示した手順に従って関連構成エントリを追加した後は、プロバイダーを登録する必要があります。

ネイティブ カスタム プロバイダーの登録

32 ビット システムの場合、ネイティブ カスタム プロバイダーを登録するには次を行います。

  1. 管理者特権でコマンド シェルを起動します。これには、[スタート] ボタンをクリックし、[コマンド プロンプト] を右クリックして、[管理者として実行] をクリックします。

  2. 次のコマンドを入力します: %WINDIR%\system32\regsvr32.exe <プロバイダー dll 名.dll>プロバイダー dll 名.dll には、プロバイダーの dll を指定します。

64 ビット システムの場合、ネイティブ カスタム プロバイダーを登録するには次を行います。

  1. 管理者特権でコマンド シェルを起動します。これには、[スタート] ボタンをクリックし、[コマンド プロンプト] を右クリックして、[管理者として実行] をクリックします。

  2. 次のコマンドを入力します。

    • ネイティブ 64 ビットの場合 - %WINDIR%\system32\regsvr32.exe <プロバイダー dll 名.dll>プロバイダー dll 名.dll には、プロバイダーの dll を指定します。

    • WOW 層でサポートされる 32 ビットの場合 - %WINDIR%\syswow64\regsvr32.exe <プロバイダー dll 名.dll>プロバイダー dll 名.dll には、プロバイダーの dll を指定します。

.NET ベースのカスタム プロバイダーの登録

32 ビット システムの場合、.NET ベースのカスタム プロバイダーを登録するには次を行います。

  1. 管理者特権でコマンド シェルを起動します。これには、[スタート] ボタンをクリックし、[コマンド プロンプト] を右クリックして、[管理者として実行] をクリックします。

  2. コマンド プロンプトで、.NET Framework のディレクトリ (例、C:\Windows\Microsoft.NET\Framework\v2.0.50727) まで移動します。

  3. 次のコマンドを入力します: RegAsm.exe <プロバイダー dll 名.dll>プロバイダー dll 名.dll には、プロバイダーの dll を指定します。

64 ビット システムの場合、.NET ベースのカスタム プロバイダーを登録するには次を行います。

  1. 管理者特権でコマンド シェルを起動します。これには、[スタート] ボタンをクリックし、[コマンド プロンプト] を右クリックして、[管理者として実行] をクリックします。

  2. マンド プロンプトで、.NET Framework のディレクトリ (例、C:\Windows\Microsoft.NET\Framework64\v2.0.50727) まで移動します。

  3. 次のコマンドを入力します: RegAsm.exe <プロバイダー dll 名.dll>プロバイダー dll 名.dll には、プロバイダーの dll を指定します。

64 ビット システムの場合で、WOW 層で 32 ビットとして実行する場合、.NET ベースのカスタム プロバイダーを登録するには次を行います。

  1. 管理者特権でコマンド シェルを起動します。これには、[スタート] ボタンをクリックし、[コマンド プロンプト] を右クリックして、[管理者として実行] をクリックします。

  2. コマンド プロンプトで、.NET Framework のディレクトリ (例、C:\Windows\Microsoft.NET\Framework\v2.0.50727) まで移動します。

  3. 次のコマンドを入力します: RegAsm.exe <プロバイダー dll 名.dll>プロバイダー dll 名.dll には、プロバイダーの dll を指定します。

リソース

Web プレイリスト インターフェイス: こちらからファイルをダウンロードし、コンピューター上のディレクトリに解凍してください。 このディレクトリの場所は、Web プレイリストのインクルード パスになります。

Web プレイリスト拡張機能サポート: Microsoft Developer Network (MSDN) (英語) で、Web プレイリストのプログラミング リファレンスとプログラミング ガイドをご確認ください。

まとめ

ここでは、カスタム プロバイダーを記述してシステムにインストールする方法を紹介しました。 記述に関する部分は、たたき台として使用してください。詳細については、ソフトウェア開発キット (SDK) を確認することをお勧めします。

ここで紹介しているサンプル コードは、理解を助けるための参考例です。 このコードはサポート対象ではなく、権利の許諾は伴いません。

関連コンテンツ

記事