/[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 167 by william, Sat Mar 16 13:26:09 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 int LAST_REPORTED_PROGRESS = 0;
31    
32            static FileInfo fi_XMLTVFILE;
33            static FileInfo fi_GBPVRDATABASE;
34          static void CreateLog()          static void CreateLog()
35          {          {
36              string log_path = Application.StartupPath;              string log_path = Application.StartupPath;
# Line 78  namespace GBPVRProgramDatabaseFixer Line 89  namespace GBPVRProgramDatabaseFixer
89              }              }
90    
91              LoadXMLTVFile();              LoadXMLTVFile();
92                LoadGBPVRDatabase();
93                PerformDatabaseProcessing();
94            }
95    
96            static void ConsoleOverwritePreviosLine(string format, params object[] args)
97            {
98                Console.WriteLine(format,args);
99                Console.SetCursorPosition(0, Console.CursorTop - 1);
100          }          }
101    
102          static void gLog_ReportProgress(object sender, ReportProgressEventArgs e)          static void gLog_ReportProgress(object sender, ReportProgressEventArgs e)
103          {          {
104              if (LAST_REPORTED_XMLTV_PROGRESS != e.Progress)              //if (!XMLTV_INSTANCE_CREATED && LOADING_XMLTV_FILE)
105                //{
106                //    if (LAST_REPORTED_XMLTV_PROGRESS != e.Progress)
107                //    {
108                //        ConsoleOverwritePreviosLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
109                //        LAST_REPORTED_XMLTV_PROGRESS = e.Progress;
110                //        if (e.Progress == 100)
111                //        {
112                //            Console.WriteLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
113                //        }
114                //    }
115                //}
116                //if (!SQLLIST_INSTANCE_CREATED && LOADING_GBPVR_DATABASE)
117                //{
118                //    if (LAST_REPORTED_SQLLITE_PROGRESS != e.Progress)
119                //    {
120                //        ConsoleOverwritePreviosLine("SQLLITE: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
121                //        LAST_REPORTED_SQLLITE_PROGRESS = e.Progress;
122                //        if (e.Progress == 100)
123                //        {
124                //            Console.WriteLine("SQLLITE: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);
125                //        }
126                //    }
127                //}
128    
129                object k = e.UserState;
130                if (k == null)
131              {              {
132                  Console.WriteLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);                  if (sender == null)
133                  LAST_REPORTED_XMLTV_PROGRESS = e.Progress;                  {
134                        if (LAST_REPORTED_PROGRESS != e.Progress)
135                        {
136                            ConsoleOverwritePreviosLine("Progress: {0} ", e.Progress);
137                            LAST_REPORTED_PROGRESS = e.Progress;
138                            if (e.Progress == 100)
139                            {
140                                Console.WriteLine("Progress: {0} ", e.Progress);
141                            }
142                        }
143                    }
144                    else
145                    {
146                        if (LAST_REPORTED_PROGRESS != e.Progress)
147                        {
148                            ConsoleOverwritePreviosLine("{0}: Progress: {1:00}%", sender.GetType().Name, e.Progress);
149                            LAST_REPORTED_PROGRESS = e.Progress;
150                            if (e.Progress == 100)
151                            {
152                                Console.WriteLine("{0}: Progress: {1:00}%", sender.GetType().Name, e.Progress);
153                            }
154                        }
155                    }
156                }
157                else
158                {
159                    if (sender == null)
160                    {
161                        if (LAST_REPORTED_PROGRESS != e.Progress)
162                        {
163                            ConsoleOverwritePreviosLine("Progress: {0} ", k.ToString());
164                            LAST_REPORTED_PROGRESS = e.Progress;
165                            if (e.Progress == 100)
166                            {
167                                Console.WriteLine("Progress: {0} ", k.ToString());
168                            }
169                        }
170                    }
171                    else
172                    {
173                        if (LAST_REPORTED_PROGRESS != e.Progress)
174                        {
175                            ConsoleOverwritePreviosLine("{0}: {1}", sender.GetType().Name, k.ToString());
176                            LAST_REPORTED_PROGRESS = e.Progress;
177                            if (e.Progress == 100)
178                            {
179                                Console.WriteLine("{0}: {1}", sender.GetType().Name, k.ToString());
180                            }
181                        }
182                    }
183              }              }
184          }          }
185          static void LoadXMLTVFile()          static void LoadXMLTVFile()
186          {          {
187                //LOADING_XMLTV_FILE = true;
188              if (string.IsNullOrEmpty(XMLTV_FILE))              if (string.IsNullOrEmpty(XMLTV_FILE))
189              {              {
190                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");
191                    //LOADING_XMLTV_FILE = false;
192                  return;                  return;
193              }              }
194              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);
195              if (!fi_XMLTVFILE.Exists)              if (!fi_XMLTVFILE.Exists)
196              {              {
197                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);
198                    //LOADING_XMLTV_FILE = false;
199                  return;                  return;
200              }              }
201    
202              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));
203              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }
204                //LOADING_XMLTV_FILE = false;
205          }          }
   
206          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }
207    
208            static void LoadGBPVRDatabase()
209            {
210                //LOADING_GBPVR_DATABASE = true;
211                if (string.IsNullOrEmpty(GBPVR_DATABASE))
212                {
213                    gLog.Error.WriteLine("GBPVR Datbase is either a null or empty string.");
214                    //LOADING_GBPVR_DATABASE = false;
215                    return;
216                }
217                fi_GBPVRDATABASE = new FileInfo(GBPVR_DATABASE);
218                if (!fi_GBPVRDATABASE.Exists)
219                {
220                    gLog.Error.WriteLine("Could not find GBPVR Database: {0}", fi_GBPVRDATABASE.FullName);
221                    //LOADING_GBPVR_DATABASE = false;
222                    return;
223                }
224                sqlite = SQLLITE.Create(fi_GBPVRDATABASE.FullName, new EventHandler<EventArgs>(SQLLITE_OnInstanceCreated));
225                while (!SQLLIST_INSTANCE_CREATED) { Application.DoEvents(); }
226                //LOADING_GBPVR_DATABASE = false;
227            }
228            static void SQLLITE_OnInstanceCreated(object sender, EventArgs e) { SQLLIST_INSTANCE_CREATED = true; }
229    
230    
231            //static List<SQLLITE.IPROGRAMME> gbpvr_invalid_programs;
232            //static List<SQLLITE.IPROGRAMME> gbpvr_valid_programs;
233            //static List<SQLLITE.ICHANNEL> gbpvr_channels;
234            //static List<SQLLITE.IRECORDING_SCHEDULE> gbpvr_recordings;
235            //static List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs;
236            static void PerformDatabaseProcessing()
237            {
238                var sqllite_channels = sqlite.Channels;
239                var sqllite_recordings = sqlite.Recordings;
240                var sqllite_programs = sqlite.Programs;
241                Type datatype;
242                var xmlt_raw_program_data = (IProgramDefinitionList)XMLTV.CreateBindingSourceFromData(XMLTV.GetPrograms(), out datatype);
243                var xmltv_programs = xmlt_raw_program_data.ToList().OrderBy(p => DateTime.Parse(p.Start)).ToList();
244                var sqllite_programs_startdate_range = sqlite.GetProgramsDateRange(sqllite_programs);
245                var xmltv_programs_startdate_range = GetXMLTVProgramStartDateRange(xmltv_programs);
246                var gbpvr_invalid_programs = new List<SQLLITE.IPROGRAMME>();
247                var gbpvr_valid_programs = sqlite.GetValidPrograms(sqllite_programs, xmltv_programs, out gbpvr_invalid_programs);
248                xmltv_programs = xmltv_programs.OrderBy(s => s.ChannelNumber).ThenBy(s => DateTime.Parse(s.Start)).ToList();
249                //sqllite_channels.TrimExcess();
250                //gbpvr_invalid_programs.TrimExcess();
251                //gbpvr_valid_programs.TrimExcess();
252                //sqllite_programs.TrimExcess();
253                //xmltv_programs.TrimExcess();
254                //CheckScheduledRecordingsForDiscrepancies(sqllite_recordings);
255                //CheckProgramsForDiscrepancies(gbpvr_valid_programs, xmltv_programs);
256            }
257    
258            static IDateTimeRange GetXMLTVProgramStartDateRange(List<libxmltv.Interfaces.IProgramDefinition> programs)
259            {
260                IDateTimeRange range = DateTimeRange.Create();
261                var list = new List<libxmltv.Interfaces.IProgramDefinition>(programs.ToArray());
262                DateTime first = new DateTime();
263                DateTime last = new DateTime();
264                first = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().First().Start);
265                last = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().Last().Start);
266                gLog.Verbose.Debug.WriteLine("\tFirst: {0} = ({1})", first.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), first.ToDateTimeString());
267                gLog.Verbose.Debug.WriteLine("\tLast: {0} = ({1})", last.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), last.ToDateTimeString());
268                range = DateTimeRange.Create(first, last);
269                return range;
270            }
271    
272            static void CheckScheduledRecordingsForDiscrepancies(List<SQLLITE.IRECORDING_SCHEDULE> gbpvr)
273            {
274                ////gLog.Warn.WriteLine("CheckScheduledRecordingsForDiscrepancies() has not been implemented");
275                //var manual_gbpvr_recordings = gbpvr.FindAll(p => p.recording_type == 0).ToList();
276    
277                //foreach (var manual_recording in manual_gbpvr_recordings)
278                //{
279                //    string title = manual_recording.filename;
280                //    DateTime start = manual_recording.manual_start_time;
281                //    DateTime end = manual_recording.manual_end_time;
282                //    long channel_oid = manual_recording.manual_channel_oid;
283                //    var found_channel = gbpvr_channels.Find(p => p.oid == channel_oid);
284                //    var channel_number = found_channel.channel_number;
285                //    var found_program = xmltv_programs.ToList().Find(p =>
286                //        p.Title.ToLower() == title.ToLower() &&
287                //        p.Start == start.ToDateTimeString() &&
288                //        p.Stop == end.ToDateTimeString() &&
289                //        p.ChannelNumber == channel_number
290                //        );
291                //    if (found_program != null)
292                //    {
293                //        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());
294                //    }
295                //    else
296                //    {
297                //        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());
298                //        // find the program on the channel at the start time
299                //        var correct_program = xmltv_programs.ToList().Find(p =>
300                //            p.ChannelNumber == channel_number &&
301                //            p.Start == start.ToDateTimeString()
302                //            );
303                //        if (correct_program != null)
304                //        {
305                //            gLog.Warn.WriteLine("\tThis will be recorded: {0}", correct_program.ToString());
306                //        }
307                //    }
308                //}
309            }
310    
311            static void CheckProgramsForDiscrepancies(List<SQLLITE.IPROGRAMME> list_gbpvr, List<libxmltv.Interfaces.IProgramDefinition> list_xmltv)
312            {
313                ////gLog.Warn.WriteLine("CheckProgramsForDiscrepancies() has not been implemented");
314                //var gbpvr = list_gbpvr.ToArray();
315                //var xmltv = list_xmltv.ToArray();
316                ////if (gbpvr.Count() != xmltv.Count())
317                ////{
318                ////    throw new ArgumentOutOfRangeException("gbpvr.Count/xmltv.Count", string.Format("gbpvr.Count: '0x{0:x8}' != xmltv.Count: '0x{1:x8}'", gbpvr.Count(),xmltv.Count()));
319                ////}
320                ////for (int i = 0; i < gbpvr.Count(); i++)
321                ////{
322                ////    var gbpvr_entry = gbpvr[i];
323                ////    var xmltv_entry = gbpvr_entry.AsXMLTVProgramDefinition(sqlite);
324                ////    if (!xmltv[i].Equals(xmltv_entry))
325                ////    {
326                ////        gLog.Warn.WriteLine("Warning GBPVR Program oid: {0} might be invalid", gbpvr_entry.oid);
327                ////    }
328                ////}
329            }
330      }      }
331  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22