/// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> static void Main() { try { Application.Run(new MainForm()); // 終了時処理 try { PodcasCoSpecificProcess.ExitDisable(); } catch (IOException) { MessageBox.Show("設定ファイルが書き込めませんでした", "設定ファイル書き込みエラー"); } } catch (Exception ex) { // ログに例外情報を書き込む Log exceptionLog = new Log(AssemblyUtility.GetExecutablePath() + @"\" + PodcasCoInfo.ExceptionLogFile); StringBuilder error = new StringBuilder(); error.Append("Application: " + PodcasCoInfo.ApplicationName + " " + PodcasCoInfo.VersionNumber + "\r\n"); error.Append("Date: " + System.DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "\r\n"); error.Append("OS: " + Environment.OSVersion.ToString() + "\r\n"); error.Append("Culture: " + System.Globalization.CultureInfo.CurrentCulture.Name + "\r\n"); error.Append("Exception class: " + ex.GetType().ToString() + "\r\n"); error.Append("ToString: " + ex.ToString() + "\r\n"); error.Append("Exception message: " + "\r\n"); error.Append(ex.Message); Exception innnerEx = ex.InnerException; while (innnerEx != null) { error.Append(innnerEx.Message); error.Append("\r\n"); innnerEx = innnerEx.InnerException; } error.Append("\r\n"); error.Append("\r\n"); exceptionLog.LogThis(error.ToString(), Log.LogPrefix.date); #if DEBUG // デバッガで例外内容を確認するため、例外をアプリケーションの外に出す throw ex; #else Trace.Assert(false, "予期しないエラーが発生したため、終了します"); #endif } }
/// <summary> /// TwitterAway起動時のチェック処理。 /// </summary> public static void StartUpCheck() { // MiscPocketCompactLibrary.dllが見つからない場合は例外を投げる if (File.Exists(AssemblyUtility.GetExecutablePath() + @"\MiscPocketCompactLibrary.dll") == false) { throw new DllNotFoundException("Not found MiscPocketCompactLibrary.dll."); } }
/// <summary> /// Shoutcastの設定ファイルの保存場所を返す /// </summary> /// <returns>設定ファイルの保存場所</returns> private string GetSettingPath() { // アプリケーションの実行ディレクトリ + アプリケーションの設定ファイル return(AssemblyUtility.GetExecutablePath() + @"\" + "Setting.SHOUTcast." + parentHeadline.GetId() + ".xml"); }
/// <summary> /// ヘッドラインをネットから取得する /// </summary> public virtual void FetchHeadline() { // 時刻をセットする lastCheckTime = DateTime.Now; WebStream st = null; try { // チャンネルのリスト ArrayList alChannels = new ArrayList(); Channel channel = null; string searchWord = ((setting.SearchWord.Length != 0) ? "&s=" + setting.SearchWord : string.Empty); // 半角スペースと全角スペースを+に置き換える SHOUTcast上のURLでAND検索のスペースが+に置き換えられるため searchWord = searchWord.Replace(' ', '+').Replace(" ", "+"); string perView = ((setting.PerView.ToString().Length != 0) ? "&numresult=" + setting.PerView : string.Empty); Uri url = new Uri(Headline.SHOUTCAST_URL + "/?" + searchWord + perView); st = PocketLadioUtility.GetWebStream(url); WebTextFetch fetch = new WebTextFetch(st, Encoding.GetEncoding("Windows-1252")); if (HeadlineFetch != null) { fetch.Fetch += HeadlineFetch; } if (HeadlineFetching != null) { fetch.Fetching += HeadlineFetching; } if (HeadlineFetched != null) { fetch.Fetched += HeadlineFetched; } string httpString = fetch.ReadToEnd(); #if SHOUTCAST_HTTP_LOG // ShoutcastのHTTPのログを書き出す StreamWriter sw = null; try { sw = new StreamWriter( AssemblyUtility.GetExecutablePath() + @"\" + PocketLadioInfo.ShoutcastHttpLog, false, Encoding.GetEncoding("Windows-1252")); sw.Write(httpString); } finally { if (sw != null) { sw.Close(); } } #endif // タグの後に改行を入れる(Willcom高速化サービス対応のため) httpString = httpString.Replace(">", ">\n"); string[] lines = httpString.Split('\n'); #region HTML解析 // 順位らしき行 string maybeRankLine = string.Empty; // 1〜指定行目まではHTMLを解析しない int analyzeHtmlFirstTo = setting.IgnoreHtmlAnalyzeFirstTo; // 指定行目から行末まではHTMLを解析しない int analyzeHtmlLast = lines.Length - setting.IgnoreHtmlAnalyzeEndFrom; OnHeadlineAnalyze(new HeadlineAnalyzeEventArgs(0, -1)); // 解析したヘッドラインの個数 int analyzedCount = 0; // HTML解析 for (int lineNumber = analyzeHtmlFirstTo; lineNumber < analyzeHtmlLast && lineNumber < lines.Length; ++lineNumber) { /*** playlist.plsを検索 ***/ Match pathMatch = pathRegex.Match(lines[lineNumber]); // playlist.plsが見つかった場合 if (pathMatch.Success) { channel = new Channel(this); channel.Path = pathMatch.Groups[1].Value; /*** Rankを検索 ***/ Match rankMatch = rankRegex.Match(maybeRankLine); // Rankが見つかった場合 if (rankMatch.Success) { channel.Rank = rankMatch.Groups[1].Value; } /*** Categoryを検索 ***/ Match categoryMatch; // Categoryが見つからない場合は行を読み飛ばして検索する for (++lineNumber; lineNumber < analyzeHtmlLast; ++lineNumber) { categoryMatch = categoryRegex.Match(lines[lineNumber]); // Categoryが見つかった場合 if (categoryMatch.Success) { channel.Category = categoryMatch.Groups[1].Value; break; } } /*** ClusterUrlを検索 ***/ Match clusterUrlMatch; // ClusterUrlが見つからない場合は行を読み飛ばして検索する for (; lineNumber < analyzeHtmlLast; ++lineNumber) { clusterUrlMatch = clusterUrlRegex.Match(lines[lineNumber]); // Categoryが見つかった場合 if (clusterUrlMatch.Success) { try { channel.ClusterUrl = new Uri(clusterUrlMatch.Groups[1].Value); } catch (UriFormatException) { channel.ClusterUrl = null; } break; } } /*** Titleを検索 ***/ Match titleMatch; // Titleが見つからない場合は行を読み飛ばして検索する for (; lineNumber < analyzeHtmlLast; ++lineNumber) { titleMatch = titleRegex.Match(lines[lineNumber]); // Titleが見つかった場合 if (titleMatch.Success) { channel.Title = titleMatch.Groups[1].Value; break; } } /*** Listenerを検索 ***/ Match listenerMatch = listenerRegex.Match(lines[lineNumber]); for (; lineNumber < analyzeHtmlLast; ++lineNumber) { listenerMatch = listenerRegex.Match(lines[lineNumber]); if (listenerMatch.Success) { break; } // Now Playing:は存在しない場合があるのでリスナー数検出の中でチェックを行う Match playingNowMatch = playingNowRegex.Match(lines[lineNumber]); if (playingNowMatch.Success) { Match playingMatch = playingRegex.Match(playingNowMatch.Groups[1].Value); if (playingMatch.Success) { channel.Playing = playingMatch.Groups[1].Value; } } } try { channel.Listener = int.Parse(listenerMatch.Groups[1].Value); channel.ListenerTotal = int.Parse(listenerMatch.Groups[2].Value); } catch (ArgumentException) { ; } catch (FormatException) { ; } catch (OverflowException) { ; } /*** Bitrateを検索 ***/ Match bitrateMatch; // Bitrateが見つからない場合は行を読み飛ばして検索する for (++lineNumber; lineNumber < analyzeHtmlLast; ++lineNumber) { bitrateMatch = bitRateRegex.Match(lines[lineNumber]); // Bitrateが見つかった場合 if (bitrateMatch.Success) { try { channel.BitRate = int.Parse(bitrateMatch.Groups[1].Value); break; } catch (ArgumentException) { ; } catch (FormatException) { ; } catch (OverflowException) { ; } } } alChannels.Add(channel); OnHeadlineAnalyzing(new HeadlineAnalyzeEventArgs(++analyzedCount, -1)); } /*** Rankらしき行を保存する ***/ Match maybeRankLineMatch = maybeRankLineRegex.Match(lines[lineNumber]); if (maybeRankLineMatch.Success) { maybeRankLine = lines[lineNumber]; } } OnHeadlineAnalyzed(new HeadlineAnalyzeEventArgs(analyzedCount, analyzedCount)); channels = (Channel[])alChannels.ToArray(typeof(Channel)); #endregion } finally { if (st != null) { st.Close(); } } }