/// <summary> /// 予約情報の更新があれば再読み込みする /// </summary> /// <returns></returns> public ErrCode ReloadReserveInfo() { ErrCode ret = ErrCode.CMD_SUCCESS; try { if (updateReserveInfo == true) { if (cmd == null) { ret = ErrCode.CMD_ERR; } else { reserveList.Clear(); reserveList = null; reserveList = new Dictionary <uint, ReserveData>(); tunerReserveList.Clear(); tunerReserveList = null; tunerReserveList = new Dictionary <uint, TunerReserveInfo>(); List <ReserveData> list = new List <ReserveData>(); List <TunerReserveInfo> list2 = new List <TunerReserveInfo>(); ret = (ErrCode)cmd.SendEnumReserve(ref list); if (ret == ErrCode.CMD_SUCCESS) { ret = (ErrCode)cmd.SendEnumTunerReserve(ref list2); if (ret == ErrCode.CMD_SUCCESS) { foreach (ReserveData info in list) { reserveList.Add(info.ReserveID, info); } foreach (TunerReserveInfo info in list2) { tunerReserveList.Add(info.tunerID, info); } updateReserveInfo = false; } } list.Clear(); list2.Clear(); list = null; list2 = null; } } } catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } return(ret); }
/// <summary> /// 予約情報の更新があれば再読み込みする /// </summary> /// <returns></returns> public ErrCode ReloadReserveInfo() { ErrCode ret = ErrCode.CMD_SUCCESS; try { if (updateReserveInfo == true) { if (cmd == null) { return(ErrCode.CMD_ERR); } reserveList = new Dictionary <uint, ReserveData>(); tunerReserveList = new Dictionary <uint, TunerReserveInfo>(); var list = new List <ReserveData>(); var list2 = new List <TunerReserveInfo>(); ret = (ErrCode)cmd.SendEnumReserve(ref list); if (ret != ErrCode.CMD_SUCCESS) { return(ret); } ret = (ErrCode)cmd.SendEnumTunerReserve(ref list2); if (ret != ErrCode.CMD_SUCCESS) { return(ret); } list.ForEach(info => reserveList.Add(info.ReserveID, info)); list2.ForEach(info => tunerReserveList.Add(info.tunerID, info)); updateReserveInfo = false; } } catch (Exception ex) { MessageBox.Show(ex.Message + "\r\n" + ex.StackTrace); } return(ret); }
static void Main(string[] args) { if (args.Length < 2) { Console.WriteLine("Usage: EdcbSchUploader <user> <pass> [epgurl] [slot] [upload_url]"); Environment.Exit(2); } // サービス名としょぼかる放送局名の対応ファイル"SyoboiCh.txt"があれば読み込む var chMap = new Dictionary <string, string>(); try { string[] chList = File.ReadAllText( Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), "SyoboiCh.txt"), Encoding.GetEncoding(932) ).Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries); foreach (string ch in chList) { string[] chSplit = ch.Split(new char[] { '\t' }); if (chSplit.Length >= 2 && chSplit[0].StartsWith(";") == false) { chMap[chSplit[0]] = chSplit[1]; } } } catch { } // EpgTimerSrvから予約情報を取得 var cmd = new CtrlCmdUtil(); var rl = new List <ReserveData>(); var tl = new List <TunerReserveInfo>(); if (cmd.SendEnumReserve(ref rl) != ErrCode.CMD_SUCCESS || cmd.SendEnumTunerReserve(ref tl) != ErrCode.CMD_SUCCESS) { Console.WriteLine("Failed to communicate with EpgTimerSrv."); Environment.Exit(1); } string data = ""; int dataCount = 0; foreach (ReserveData r in rl) { string tuner = null; foreach (TunerReserveInfo tr in tl) { if (tr.reserveList.Contains(r.ReserveID)) { // T+{BonDriver番号(上2桁)}+{チューナ番号(下2桁)},チューナ不足はT9999 tuner = "T" + ("" + (10000 + Math.Min(tr.tunerID / 65536, 99) * 100 + Math.Min(tr.tunerID % 65536, 99))).Substring(1); break; } } if (tuner != null && r.RecSetting.RecMode <= 3 && r.RecSetting.Priority >= UPLOAD_REC_PRIORITY) { // "最大200行" if (dataCount++ >= 200) { break; } else { // "開始時間 終了時間 デバイス名 番組名 放送局名 サブタイトル オフセット XID" string title = r.Title.Replace("\t", "").Replace("\r", "").Replace("\n", ""); data += "" + (r.StartTime.ToUniversalTime() - (new DateTime(1970, 1, 1))).TotalSeconds + "\t" + (r.StartTime.ToUniversalTime().AddSeconds(r.DurationSecond) - (new DateTime(1970, 1, 1))).TotalSeconds + "\t" + tuner + "\t" + (title.Length > UPLOAD_TITLE_MAXLEN ? title.Substring(0, UPLOAD_TITLE_MAXLEN - 1) + "…" : title) + "\t" + (chMap.ContainsKey(r.StationName) ? chMap[r.StationName] : r.StationName) + "\t\t0\t" + r.ReserveID + "\n"; } } } // 以前の内容と同じなら送信しない string lastPath = Path.ChangeExtension(Assembly.GetEntryAssembly().Location, "last"); try { if (File.ReadAllText(lastPath) == data.Replace("\n", "\r\n")) { Console.WriteLine("Not modified, nothing to do."); Environment.Exit(0); } } catch { } // しょぼかるのPOSTは"Expect: 100-Continue"に対応してないっぽい ServicePointManager.Expect100Continue = false; // 予約情報をサーバに送信 using (var wc = new WebClientWithTimeout()) { // WebClientはデフォルトでIEのプロキシ設定に従う(wc.Proxy = WebRequest.DefaultWebProxy) // 認証プロキシなど必要であればwc.Proxyをここで設定すること wc.Timeout = TIMEOUT; wc.Encoding = Encoding.UTF8; wc.Credentials = new NetworkCredential(Uri.EscapeDataString(args[0]), Uri.EscapeDataString(args[1])); wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded"; wc.Headers[HttpRequestHeader.UserAgent] = USER_AGENT; var body = new System.Collections.Specialized.NameValueCollection(); body["slot"] = args.Length < 4 ? "0" : args[3]; body["devcolors"] = DEV_COLORS; body["epgurl"] = args.Length < 3 ? "" : args[2]; body["data"] = data; try { wc.UploadValues(args.Length < 5 ? UPLOAD_URL : args[4], body); File.WriteAllText(lastPath, data.Replace("\n", "\r\n"), Encoding.UTF8); } catch (Exception ex) { Console.WriteLine(ex.GetType().ToString() + " : " + ex.Message); Environment.Exit(1); } } Console.WriteLine("Done."); Environment.Exit(0); }