Imports System Imports System.Collections.Generic Imports System.Reflection Imports Jssk.Util Imports Jssk.CastaNet ''' ''' RadioClassiqueクラス ''' ''' CastaNetにアタッチする「Radio Classique」放送局のクラスです。ICNStationインターフェースを実装します。 ''' ''' ''' TELLA ''' ''' 2006/08/16 新規作成 ''' 2007/09/05 修正(プロパティ追加等) ''' Public Class RadioClassique : Implements ICNStation Private eHeaderTexts As String() = {"作曲", "曲名", "詳細", "情報リンク"} Private eDispName As String = "Radio Classique" Private eDispInfo As String = "[Radio Classique] http://www.radioclassique.fr/" & vbNewLine & _ "番組表は1日分を何回かに分けて取得するので" & vbNewLine & _ "ちょっと時間がかかります。" & vbNewLine & _ "また、CD欄のURLは不明です。" Private eStreamUrl As String = "mms://viptvr.yacast.net/tvr_radioclassique?site" Private ePlayListUrlPart As String = "http://www.radioclassique.fr/programmes.cfm?jour=@dd/MM/yy@" Private eCodePage As Integer = 1252 ' iso-8859-1 Private eTimeDiff As Integer = -7 ' 番組表取得URLの保存 Private ePlayListUrl As String #Region "// プロパティ //////////////////////////////////////////////////" '//////////////////////////////////////////////////////////////////////////////// '// プロパティ '//////////////////////////////////////////////////////////////////////////////// ''' ''' 番組表のヘッダーテキストを設定・取得します。 ''' ''' ヘッダーテキスト Property HeaderTexts() As String() Implements ICNStation.HeaderTexts Set(ByVal value As String()) Me.eHeaderTexts = value End Set Get Return Me.eHeaderTexts End Get End Property ''' ''' CastaNetの「放送局選択」コンボボックス等に表示する放送局名を設定・取得します。 ''' ''' 放送局名 Property DispName() As String Implements ICNStation.DispName Set(ByVal value As String) Me.eDispName = value End Set Get Return Me.eDispName End Get End Property ''' ''' CastaNetの情報アイコンを指したとき等に表示される放送局の情報を設定・取得します。 ''' ''' 放送局の情報 Property DispInfo() As String Implements ICNStation.DispInfo Set(ByVal value As String) Me.eDispInfo = value End Set Get Return Me.eDispInfo End Get End Property ''' ''' 放送を聴くためのストリームのURLを設定・取得します。 ''' ''' ストリームURL Property StreamUrl() As String Implements ICNStation.StreamUrl Set(ByVal value As String) Me.eStreamUrl = value End Set Get Return Me.eStreamUrl End Get End Property ''' ''' 番組表を取得するためのURLの一部を設定・取得します。 ''' ''' 番組表取得URLの一部 Property PlayListUrlPart() As String Implements ICNStation.PlayListUrlPart Set(ByVal value As String) Me.ePlayListUrlPart = value End Set Get Return Me.ePlayListUrlPart End Get End Property ''' ''' 番組表の読み込み時に指定する文字セットのWindowsコードページ値を設定・取得します。 ''' ''' Windowsコードページ値 Property CodePage() As Integer Implements ICNStation.CodePage Set(ByVal value As Integer) Me.eCodePage = value End Set Get Return Me.eCodePage End Get End Property ''' ''' 日本との時差を設定・取得します。 ''' ''' 日本との時差(h) Property TimeDiff() As Integer Implements ICNStation.TimeDiff Set(ByVal value As Integer) Me.eTimeDiff = value End Set Get Return Me.eTimeDiff End Get End Property #End Region #Region "// Public メソッド ////////////////////////////////////////////////////////////" '//////////////////////////////////////////////////////////////////////////////// '// Public メソッド '//////////////////////////////////////////////////////////////////////////////// ''' ''' 指定された日本時間に対応する番組表を取得するためのURLを返します。 ''' ''' ※ CastaNetから引数で渡された日本時間を適宜加工してURLを組み立てて返すことになると思います。 ''' ※ 必要に応じてURLエンコードを行ってください。 ''' ''' ''' 日本時間 ''' 番組表取得URL Function PlayListUrl(ByVal dTimeJpn As DateTime) As String Implements ICNStation.PlayListUrl ' 指定された日本時間から現地時間を取得する Dim dTimeLcl As DateTime = dTimeJpn.AddHours(Me.eTimeDiff) ' 現地日付文字列を作成する Dim dateLclStr As String = dTimeLcl.ToString("dd/MM/yy") ' 番組表取得URLを作成する Dim playListUrl_ As String = Me.ePlayListUrlPart.Replace("@dd/MM/yy@", dateLclStr) ' 番組表取得URLを保存する Me.ePlayListUrl = playListUrl_ & "&h=" Return playListUrl_ End Function ''' ''' 番組表を返します。 ''' ''' CastaNetがPlayListUrl()メソッドを呼び出して得たURLにアクセスし、読み込んだテキストを引数で渡します。 ''' ''' 必要な情報が1回で取得できないときは、第3引数のnextUrlに次のURLを渡したうえで、Nothingを返してください。 ''' CastaNetはそのURLにアクセスして情報を取得し、再度第1引数に渡してこのメソッドを呼び出します。 ''' 何回目の呼び出しかは第2引数で知ることができます。 ''' 最終的に必要な情報がそろったら、下記のようなリストを作成して返してください。 ''' ''' 番組表は、以下の項目順で格納された文字列配列をList(Of String())に格納して返してください。 ''' ''' +----------+--------+--------+--------+--------+-----------------+ ''' | (0) | (1) | (2) | (3) | (4) | (5) | ''' +----------+--------+--------+--------+--------+-----------------+ ''' | 現地時刻 | 作曲者 | 曲名 | 演奏者 | CD番号 | CD購入サイトURL | ''' +----------+--------+--------+--------+--------+-----------------+ ''' ''' ※ 「現地時刻」はDateTimeに変換できる正しい文字列をセットしてください。 ''' ※ 「現地時刻」は時刻部分だけをセットしてください。(例:"12:01 am") ''' ※ 情報の無い項目にはNothingをセットしてください。 ''' ※ 各レコードの格納順は自由です。時間等でソートされている必要はありません。 ''' ※ HTMLデコードはCastaNet本体側で行いますので、実装クラスでは特に必要ありません。 ''' ''' ''' 番組表の情報を含んだテキスト ''' CastaNetからこのメソッドが呼ばれた回数、最初は0 ''' 次の情報の取得先URL ''' 番組表を格納したList、取得できなかったときは要素数を0にして返す、さらに情報が欲しいときはNothingを返す Function PlayList(ByVal playListText As String, ByVal callCount As Integer, ByRef nextUrl As String) As List(Of String()) Implements ICNStation.PlayList ' 番組表を格納するListを用意する Static playList_ As List(Of String()) = New List(Of String())() ' 時間帯リストを用意する Static timeZoneList As List(Of String) = New List(Of String)() ' 1回目の実行のとき If callCount = 0 Then ' 番組表リストをクリアする playList_.Clear() ' 時間帯リストをクリアする timeZoneList.Clear() ' 時間帯のリストが含まれている部分の開始位置を取得する Dim idx As Integer = playListText.IndexOf("") ' すべての時間帯について繰り返す Do ' 1つの時間帯を取得する(間) Dim timeZone As String = ComUtil.GetSubstring(playListText, "", "", idx, idx) ' 時間文字列を取得する Dim timeStr As String = ComUtil.GetSubstring(timeZone, " ", "", 0) If timeStr Is Nothing Then Exit Do ' 「h」を「:」に、「」を空文字に変換する timeStr = timeStr.Replace("h"c, ":"c).Replace("", String.Empty) ' 5文字を超えていたら最後の5文字だけ取得する ' 例:23:00 If timeStr.Length > 5 Then timeStr = timeStr.Substring(timeStr.Length - 5, 5) ' 時間帯リストに追加する timeZoneList.Add(timeStr) Loop ' 次のURLを返す ' 例:http://www.radioclassique.fr/programmes.cfm?jour=14/08/06&h=01:00 nextUrl = Me.ePlayListUrl & timeZoneList(0) Return Nothing ' 2回目以降の実行のとき Else ' 曲目のリストが含まれている部分の開始位置を取得する Dim idx As Integer = playListText.IndexOf("
") ' すべての曲目について繰り返す Do ' 1つの曲目を取得する(

間) Dim tuneInfo As String = ComUtil.GetSubstring(playListText, "

", idx, idx) Dim idx2 As Integer = 0 ' 放送時刻 Dim startTime As String = ComUtil.GetSubstring(tuneInfo, "arial12blc"">", "
", idx2, idx2) ' 放送時刻が取得できなかったときはループを抜ける If startTime Is Nothing Then Exit Do ' 「h」を「:」に変換する startTime = startTime.Replace("h"c, ":"c) ' 作曲者 Dim composer As String = ComUtil.GetSubstring(tuneInfo, String.Empty, "", idx2, idx2) ' 曲名 Dim tuneName As String = ComUtil.GetSubstring(tuneInfo, "oeuvre"">", "
", idx2, idx2) ' 演奏者 Dim player As String = ComUtil.GetSubstring(tuneInfo, String.Empty, "
", idx2, idx2) ' CD番号 Dim cdNo As String = ComUtil.GetSubstring(tuneInfo, "(", ").", idx2, idx2) ' 番組表の1レコードの一次元配列を作成する Dim playListArran(5) As String ' 各項目の値をセットする playListArran(0) = startTime playListArran(1) = composer.Trim() playListArran(2) = tuneName.Trim() playListArran(3) = player.Trim() playListArran(4) = cdNo playListArran(5) = Nothing ' この配列をListに追加する playList_.Add(playListArran) Loop ' まだ取得する時間帯があるとき If callCount < timeZoneList.Count Then ' 次のURLを返す nextUrl = Me.ePlayListUrl & timeZoneList(callCount) Return Nothing ' もう取得する時間帯がないとき Else Return playList_ End If End If End Function ''' ''' 任意情報を受け取ります。 ''' ''' CastaNetは、各放送局の設定ファイルの [COption]Info キーに設定されている文字列を ''' このメソッドを呼び出して実装クラスに渡します。 ''' このメソッドは、CastaNetが実装クラスのインスタンスを生成した直後に呼び出します。 ''' ''' 任意情報の使用目的や書式などは、このインターフェースの実装者が自由に決めてください。 ''' ''' ''' 情報の文字列 Sub OptionInfo(ByVal info As String) Implements ICNStation.OptionInfo ' 現バージョンでは実装なし End Sub #End Region End Class