/[xmltv_parser]/trunk/GBPVRProgramDatabaseFixer/Program.cs
ViewVC logotype

Diff of /trunk/GBPVRProgramDatabaseFixer/Program.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 154 by william, Thu Mar 14 16:56:05 2013 UTC revision 164 by william, Fri Mar 15 16:57:50 2013 UTC
# Line 2  Line 2 
2  using System;  using System;
3  using System.Collections.Generic;  using System.Collections.Generic;
4  using System.Text;  using System.Text;
5    using System.Linq;
6  using Enterprise.Logging;  using Enterprise.Logging;
7  using System.Windows.Forms;  using System.Windows.Forms;
8  using System.Diagnostics;  using System.Diagnostics;
9  using System.IO;  using System.IO;
10  using libxmltv.Core;  using libxmltv.Core;
11    using libxmltv.Interfaces;
12    using libxmltv;
13  namespace GBPVRProgramDatabaseFixer  namespace GBPVRProgramDatabaseFixer
14  {  {
15      class Program      class Program
16      {      {
17            static ISQLLITE sqlite;
18          static string XMLTV_FILE = "";          static string XMLTV_FILE = "";
19          static string GBPVR_DATABASE = "";          static string GBPVR_DATABASE = "";
20    
21            static bool LOADING_XMLTV_FILE = false;
22          static bool XMLTV_INSTANCE_CREATED = false;          static bool XMLTV_INSTANCE_CREATED = false;
23            static int LAST_REPORTED_XMLTV_PROGRESS = 0;
24    
         static int LAST_REPORTED_XMLTV_PROGRESS =0;  
25    
26          static FileInfo fi_XMLTVFILE;          static bool LOADING_GBPVR_DATABASE = false;
27            static bool SQLLIST_INSTANCE_CREATED = false;
28            static int LAST_REPORTED_SQLLITE_PROGRESS = 0;
29    
30            static FileInfo fi_XMLTVFILE;
31            static FileInfo fi_GBPVRDATABASE;
32          static void CreateLog()          static void CreateLog()
33          {          {
34              string log_path = Application.StartupPath;              string log_path = Application.StartupPath;
# Line 78  namespace GBPVRProgramDatabaseFixer Line 87  namespace GBPVRProgramDatabaseFixer
87              }              }
88    
89              LoadXMLTVFile();              LoadXMLTVFile();
90                LoadGBPVRDatabase();
91                PerformDatabaseProcessing();
92            }
93    
94            static void ConsoleOverwritePreviosLine(string format, params object[] args)
95            {
96                Console.WriteLine(format,args);
97                Console.SetCursorPosition(0, Console.CursorTop - 1);
98          }          }
99    
100          static void gLog_ReportProgress(object sender, ReportProgressEventArgs e)          static void gLog_ReportProgress(object sender, ReportProgressEventArgs e)
101          {          {
102              if (LAST_REPORTED_XMLTV_PROGRESS != e.Progress)              if (!XMLTV_INSTANCE_CREATED && LOADING_XMLTV_FILE)
103              {              {
104                  Console.WriteLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);                  if (LAST_REPORTED_XMLTV_PROGRESS != e.Progress)
105                  LAST_REPORTED_XMLTV_PROGRESS = e.Progress;                  {
106                        ConsoleOverwritePreviosLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
107                        LAST_REPORTED_XMLTV_PROGRESS = e.Progress;
108                        if (e.Progress == 100)
109                        {
110                            Console.WriteLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
111                        }
112                    }
113                }
114                if (!SQLLIST_INSTANCE_CREATED && LOADING_GBPVR_DATABASE)
115                {
116                    if (LAST_REPORTED_SQLLITE_PROGRESS != e.Progress)
117                    {
118                        ConsoleOverwritePreviosLine("SQLLITE: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
119                        LAST_REPORTED_SQLLITE_PROGRESS = e.Progress;
120                        if (e.Progress == 100)
121                        {
122                            Console.WriteLine("SQLLITE: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
123                        }
124                    }
125              }              }
126          }          }
127          static void LoadXMLTVFile()          static void LoadXMLTVFile()
128          {          {
129                LOADING_XMLTV_FILE = true;
130              if (string.IsNullOrEmpty(XMLTV_FILE))              if (string.IsNullOrEmpty(XMLTV_FILE))
131              {              {
132                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");
133                    LOADING_XMLTV_FILE = false;
134                  return;                  return;
135              }              }
136              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);
137              if (!fi_XMLTVFILE.Exists)              if (!fi_XMLTVFILE.Exists)
138              {              {
139                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);
140                    LOADING_XMLTV_FILE = false;
141                  return;                  return;
142              }              }
143    
144              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));
145              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }
146                LOADING_XMLTV_FILE = false;
147          }          }
   
148          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }
149    
150            static void LoadGBPVRDatabase()
151            {
152                LOADING_GBPVR_DATABASE = true;
153                if (string.IsNullOrEmpty(GBPVR_DATABASE))
154                {
155                    gLog.Error.WriteLine("GBPVR Datbase is either a null or empty string.");
156                    LOADING_GBPVR_DATABASE = false;
157                    return;
158                }
159                fi_GBPVRDATABASE = new FileInfo(GBPVR_DATABASE);
160                if (!fi_GBPVRDATABASE.Exists)
161                {
162                    gLog.Error.WriteLine("Could not find GBPVR Database: {0}", fi_GBPVRDATABASE.FullName);
163                    LOADING_GBPVR_DATABASE = false;
164                    return;
165                }
166                sqlite = SQLLITE.Create(fi_GBPVRDATABASE.FullName, new EventHandler<EventArgs>(SQLLITE_OnInstanceCreated));
167                while (!SQLLIST_INSTANCE_CREATED) { Application.DoEvents(); }
168                LOADING_GBPVR_DATABASE = false;
169            }
170            static void SQLLITE_OnInstanceCreated(object sender, EventArgs e) { SQLLIST_INSTANCE_CREATED = true; }
171    
172    
173            static List<SQLLITE.IPROGRAMME> gbpvr_programs;
174            static List<SQLLITE.ICHANNEL> gbpvr_channels;
175            static List<SQLLITE.IRECORDING_SCHEDULE> gbpvr_recordings;
176            static List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs;
177            static void PerformDatabaseProcessing()
178            {
179                gbpvr_channels = sqlite.Channels;
180                gbpvr_programs = sqlite.Programs;
181                gbpvr_recordings = sqlite.Recordings;            
182                Type datatype;
183                var xmlt_raw_program_data = (IProgramDefinitionList)XMLTV.CreateBindingSourceFromData(XMLTV.GetPrograms(), out datatype);
184                //xmltv_programs = xmlt_raw_program_data.ToList().OrderBy(p => p.ChannelNumber).ThenBy(p => DateTime.Parse(p.Start)).ToList();
185                //xmltv_programs = xmltv_programs.FindAll(p => p.Title == "Law & Order: Criminal Intent").ToList();
186                xmltv_programs = xmlt_raw_program_data.ToList().OrderBy(p => DateTime.Parse(p.Start)).ToList();
187    
188    
189                var gbpvr_programs_startdate_range = sqlite.GetProgramsDateRange(gbpvr_programs);
190                var xmltv_programs_startdate_range = GetXMLTVProgramStartDateRange(xmltv_programs);
191                List<SQLLITE.IPROGRAMME> gbpvr_removed_programs = new List<SQLLITE.IPROGRAMME>();
192                gbpvr_programs = sqlite.FilterProgramsByDateRange(gbpvr_programs, xmltv_programs_startdate_range, out gbpvr_removed_programs);
193                xmltv_programs = xmltv_programs.OrderBy(s => s.ChannelNumber).ThenBy(s => DateTime.Parse(s.Start)).ToList();
194                CheckScheduledRecordingsForDiscrepancies();
195                CheckProgramsForDiscrepancies();
196            }
197    
198            static IDateTimeRange GetXMLTVProgramStartDateRange(List<libxmltv.Interfaces.IProgramDefinition> programs)
199            {
200                IDateTimeRange range = DateTimeRange.Create();
201                var list = new List<libxmltv.Interfaces.IProgramDefinition>(programs.ToArray());
202                DateTime first = new DateTime();
203                DateTime last = new DateTime();
204                first = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().First().Start);
205                last = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().Last().Start);
206                gLog.Info.WriteLine("\tFirst: {0} = ({1})", first.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), first.ToDateTimeString());
207                gLog.Info.WriteLine("\tLast: {0} = ({1})", last.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), last.ToDateTimeString());
208                range = DateTimeRange.Create(first, last);
209                return range;
210            }
211    
212            static void CheckScheduledRecordingsForDiscrepancies()
213            {
214                //gLog.Warn.WriteLine("CheckScheduledRecordingsForDiscrepancies() has not been implemented");
215                var manual_gbpvr_recordings = gbpvr_recordings.FindAll(p => p.recording_type == 0).ToList();
216    
217                foreach (var manual_recording in manual_gbpvr_recordings)
218                {
219                    string title = manual_recording.filename;
220                    DateTime start = manual_recording.manual_start_time;
221                    DateTime end = manual_recording.manual_end_time;
222    
223                    long channel_oid = manual_recording.manual_channel_oid;
224    
225                    var found_channel = gbpvr_channels.Find(p => p.oid == channel_oid);
226                    var channel_number = found_channel.channel_number;
227    
228                    var found_program = xmltv_programs.ToList().Find(p =>
229                        p.Title.ToLower() == title.ToLower() &&
230                        p.Start == start.ToDateTimeString() &&
231                        p.Stop == end.ToDateTimeString() &&
232                        p.ChannelNumber == channel_number
233                        );
234    
235                    if (found_program != null)
236                    {
237                        gLog.Info.WriteLine("Recording might be valid: oid='{0}' programme_oid='{1}' title='{2}' start='{3}', end='{4}'", manual_recording.oid, manual_recording.programme_oid, title, start.ToDateTimeString(), end.ToDateTimeString());
238                    }
239                    else
240                    {
241                        gLog.Warn.WriteLine("Recording may not be valid: oid='{0}' programme_oid='{1}' title='{2}' start='{3}', end='{4}'", manual_recording.oid, manual_recording.programme_oid, title, start.ToDateTimeString(), end.ToDateTimeString());
242    
243                        // find the program on the channel at the start time
244                        var correct_program = xmltv_programs.ToList().Find(p =>
245                            p.ChannelNumber == channel_number &&
246                            p.Start == start.ToDateTimeString()
247                            );
248                        if (correct_program != null)
249                        {
250                            gLog.Warn.WriteLine("\tThis will be recorded: {0}", correct_program.ToString());
251                        }
252                    }
253                }
254            }
255    
256            static void CheckProgramsForDiscrepancies()
257            {
258                gLog.Warn.WriteLine("CheckProgramsForDiscrepancies() has not been implemented");
259            }
260      }      }
261  }  }

Legend:
Removed from v.154  
changed lines
  Added in v.164

  ViewVC Help
Powered by ViewVC 1.1.22