Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Text
Imports Jssk.Util
Imports Jssk.CastaNet
'''
''' Wcpeクラス
'''
''' CastaNetにアタッチする「WCPE」放送局のクラスです。ICNStationインターフェースを実装します。
'''
'''
''' TELLA
'''
''' 2006/08/08 新規作成
''' 2007/09/05 修正(プロパティ追加等)
'''
Public Class Wcpe : Implements ICNStation
Private eHeaderTexts As String()
Private eDispName As String = "WCPE"
Private eDispInfo As String = "[WCPE] http://theclassicalstation.org/" & vbNewLine & _
"WCPEはクラシック音楽放送における" & vbNewLine & _
"素晴らしさに捧げられた非営利的で、" & vbNewLine & _
"独立していて、リスナーによって" & vbNewLine & _
"支持されたステーションです。" & vbNewLine & _
"(WCPEサイトより)"
Private eStreamUrl As String = "mms://rx-wes-sea150.rbn.com/farm/pull/tx-rbn-sea08:1259/wmtencoder/wcpe/wcpeint/wmlive/wcpewin.asf"
Private ePlayListUrlPart As String = "http://theclassicalstation.org/music/@DayOfTheWeek@.shtml"
Private eCodePage As Integer = Encoding.Default.CodePage ' システムデフォルト
Private eTimeDiff As Integer = -13
' 日付文字列を日付に変換するためのDateTimeFormatInfo
Dim eDtfi As DateTimeFormatInfo = New DateTimeFormatInfo()
' PlayListUrlが呼ばれたときに渡された日本時間に対応する現地時間の日付
Private eDateLcl As DateTime
'''
''' コンストラクタです。
'''
Sub New()
Me.eDtfi.FullDateTimePattern = "MMMM d, yyyy" ' 例:August 8, 2006
End Sub
#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 dow As DayOfWeek = dTimeLcl.DayOfWeek()
Dim dowStr As String = [Enum].GetName(GetType(DayOfWeek), dow).ToLower()
' sunday
' monday
' tuesday
' wednesday
' thursday
' friday
' saturday
' このあと引き続いて呼ばれるPlayListメソッドのために現地日付を保存する
Me.eDateLcl = dTimeLcl.Date
Return Me.ePlayListUrlPart.Replace("@DayOfTheWeek@", dowStr)
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を用意する
Dim playList_ As List(Of String()) = New List(Of String())()
' 渡されたテキストから日付部分を取り出す(例:August 8, 2006)
Dim dTimeLclStr As String = ComUtil.GetSubstring(playListText, "", ":", 0)
' 日付文字列から日付に変換する
Dim dateLcl As DateTime = Convert.ToDateTime(dTimeLclStr, Me.eDtfi)
' 直前に呼ばれたPlayListUrlメソッドで保存した現地日付と異なる場合はここで戻る
If dateLcl <> Me.eDateLcl Then Return playList_
' 曲目リストが含まれている部分を取り出す
Dim tuneList As String = ComUtil.GetSubstring(playListText, "", "", 0)
' すべての
タグについて繰り返す
Dim idx As Integer = 0
Do
' @@ 各種情報を取り出す @@
' 曲情報全体
Dim tuneInfo As String = ComUtil.GetSubstring(tuneList, "
", "
", idx, idx)
If tuneInfo Is Nothing Then Exit Do
' 番組表の1レコードの一次元配列を作成する
Dim playListArran(5) As String
' すべてのタグについて繰り返す
Dim cdNo As String = String.Empty
Dim idx2 As Integer = 0
Dim itemIdx As Integer = 0
Do While itemIdx < 8
Dim item As String = ComUtil.GetSubstring(tuneInfo, " | ", " | ", idx2, idx2)
Select Case itemIdx
Case 0
' とばし
Case 1
' 放送時刻
playListArran(0) = item
Case 2
' CDサイトURL
Dim cdUrl As String = ComUtil.GetSubstring(item, "
''' 任意情報を受け取ります。
'''
''' CastaNetは、各放送局の設定ファイルの [COption]Info キーに設定されている文字列を
''' このメソッドを呼び出して実装クラスに渡します。
''' このメソッドは、CastaNetが実装クラスのインスタンスを生成した直後に呼び出します。
'''
''' 任意情報の使用目的や書式などは、このインターフェースの実装者が自由に決めてください。
'''
'''
''' 情報の文字列
Sub OptionInfo(ByVal info As String) Implements ICNStation.OptionInfo
' 現バージョンでは実装なし
End Sub
#End Region
End Class