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
|