/[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 212 by william, Sun Mar 17 00:56:37 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; // we will assum that is a status message
130                if (k == null) // assume we do not have a user status message (ie: is only a progress message)
131                {
132                    if (sender == null)
133                    {
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                        ConsoleOverwritePreviosLine("Progress: {0} ", e.Progress);
144                    }
145                    else
146                    {
147                        //if (LAST_REPORTED_PROGRESS != e.Progress)
148                        //{
149                        //    ConsoleOverwritePreviosLine("{0}: Progress: {1:00}%", sender.GetType().Name, e.Progress);
150                        //    LAST_REPORTED_PROGRESS = e.Progress;
151                        //    if (e.Progress == 100)
152                        //    {
153                        //        Console.WriteLine("{0}: Progress: {1:00}%", sender.GetType().Name, e.Progress);
154                        //    }
155                        //}
156                        ConsoleOverwritePreviosLine("{0}: Progress: {1:00}%", sender.GetType().Name, e.Progress);
157                    }
158                }
159                else // assume we have a user status message
160              {              {
161                  Console.WriteLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);                  if (sender == null)
162                  LAST_REPORTED_XMLTV_PROGRESS = e.Progress;                  {
163                        //if (LAST_REPORTED_PROGRESS != e.Progress)
164                        //{
165                        //    ConsoleOverwritePreviosLine("Progress: {0} ", k.ToString());
166                        //    LAST_REPORTED_PROGRESS = e.Progress;
167                        //    if (e.Progress == 100)
168                        //    {
169                        //        Console.WriteLine("Progress: {0} ", k.ToString());
170                        //    }
171                        //}
172                        ConsoleOverwritePreviosLine("{0} ", k.ToString());
173                    }
174                    else
175                    {
176                        //if (LAST_REPORTED_PROGRESS != e.Progress)
177                        //{
178                        //    ConsoleOverwritePreviosLine("{0}: {1}", sender.GetType().Name, k.ToString());
179                        //    LAST_REPORTED_PROGRESS = e.Progress;
180                        //    if (e.Progress == 100)
181                        //    {
182                        //        Console.WriteLine("{0}: {1}", sender.GetType().Name, k.ToString());
183                        //    }
184                        //}
185                        ConsoleOverwritePreviosLine("{0}: {1}", sender.GetType().Name, k.ToString());
186                    }
187              }              }
188          }          }
189          static void LoadXMLTVFile()          static void LoadXMLTVFile()
190          {          {
191                //LOADING_XMLTV_FILE = true;
192              if (string.IsNullOrEmpty(XMLTV_FILE))              if (string.IsNullOrEmpty(XMLTV_FILE))
193              {              {
194                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");
195                    //LOADING_XMLTV_FILE = false;
196                  return;                  return;
197              }              }
198              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);
199              if (!fi_XMLTVFILE.Exists)              if (!fi_XMLTVFILE.Exists)
200              {              {
201                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);
202                    //LOADING_XMLTV_FILE = false;
203                  return;                  return;
204              }              }
205    
206              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));
207              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }
208                //LOADING_XMLTV_FILE = false;
209          }          }
   
210          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }
211    
212            static void LoadGBPVRDatabase()
213            {
214                //LOADING_GBPVR_DATABASE = true;
215                if (string.IsNullOrEmpty(GBPVR_DATABASE))
216                {
217                    gLog.Error.WriteLine("GBPVR Datbase is either a null or empty string.");
218                    //LOADING_GBPVR_DATABASE = false;
219                    return;
220                }
221                fi_GBPVRDATABASE = new FileInfo(GBPVR_DATABASE);
222                if (!fi_GBPVRDATABASE.Exists)
223                {
224                    gLog.Error.WriteLine("Could not find GBPVR Database: {0}", fi_GBPVRDATABASE.FullName);
225                    //LOADING_GBPVR_DATABASE = false;
226                    return;
227                }
228                sqlite = SQLLITE.Create(fi_GBPVRDATABASE.FullName, new EventHandler<EventArgs>(SQLLITE_OnInstanceCreated));
229                while (!SQLLIST_INSTANCE_CREATED) { Application.DoEvents(); }
230                //LOADING_GBPVR_DATABASE = false;
231            }
232            static void SQLLITE_OnInstanceCreated(object sender, EventArgs e) { SQLLIST_INSTANCE_CREATED = true; }
233    
234    
235            //static List<SQLLITE.IPROGRAMME> gbpvr_invalid_programs;
236            //static List<SQLLITE.IPROGRAMME> gbpvr_valid_programs;
237            //static List<SQLLITE.ICHANNEL> gbpvr_channels;
238            //static List<SQLLITE.IRECORDING_SCHEDULE> gbpvr_recordings;
239            //static List<libxmltv.Interfaces.IProgramDefinition> xmltv_programs;
240            static void PerformDatabaseProcessing()
241            {
242                var sqllite_channels = sqlite.Channels;
243                var sqllite_recordings = sqlite.Recordings;
244                var sqllite_programs = sqlite.Programs;
245                Type datatype;
246                var xmlt_raw_program_data = (IProgramDefinitionList)XMLTV.CreateBindingSourceFromData(XMLTV.GetPrograms(), out datatype);
247                var xmltv_programs = xmlt_raw_program_data.ToList().OrderBy(p => DateTime.Parse(p.Start)).ToList();
248                var sqllite_programs_startdate_range = sqlite.GetProgramsDateRange(sqllite_programs);
249                var xmltv_programs_startdate_range = GetXMLTVProgramStartDateRange(xmltv_programs);
250                var gbpvr_invalid_programs = new List<SQLLITE.IPROGRAMME>();
251                var gbpvr_valid_programs = sqlite.FixGBPVRProgramsDatabase(sqllite_programs, xmltv_programs, out gbpvr_invalid_programs);
252                //xmltv_programs = xmltv_programs.OrderBy(s => s.ChannelNumber).ThenBy(s => DateTime.Parse(s.Start)).ToList();
253                //sqllite_channels.TrimExcess();
254                //gbpvr_invalid_programs.TrimExcess();
255                //gbpvr_valid_programs.TrimExcess();
256                //sqllite_programs.TrimExcess();
257                //xmltv_programs.TrimExcess();
258                //CheckScheduledRecordingsForDiscrepancies(sqllite_recordings);
259                //CheckProgramsForDiscrepancies(gbpvr_valid_programs, xmltv_programs);
260    
261                sqlite.RemoveOldGBPVRPrograms(gbpvr_invalid_programs);
262                sqlite.UpdateGBPVRPrograms(gbpvr_valid_programs);
263    
264            }
265    
266            static IDateTimeRange GetXMLTVProgramStartDateRange(List<libxmltv.Interfaces.IProgramDefinition> programs)
267            {
268                IDateTimeRange range = DateTimeRange.Create();
269                var list = new List<libxmltv.Interfaces.IProgramDefinition>(programs.ToArray());
270                DateTime first = new DateTime();
271                DateTime last = new DateTime();
272                first = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().First().Start);
273                last = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().Last().Start);
274                gLog.Verbose.Debug.WriteLine("\tFirst: {0} = ({1})", first.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), first.ToDateTimeString());
275                gLog.Verbose.Debug.WriteLine("\tLast: {0} = ({1})", last.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), last.ToDateTimeString());
276                range = DateTimeRange.Create(first, last);
277                return range;
278            }
279    
280            static void CheckScheduledRecordingsForDiscrepancies(List<SQLLITE.IRECORDING_SCHEDULE> gbpvr)
281            {
282                ////gLog.Warn.WriteLine("CheckScheduledRecordingsForDiscrepancies() has not been implemented");
283                //var manual_gbpvr_recordings = gbpvr.FindAll(p => p.recording_type == 0).ToList();
284    
285                //foreach (var manual_recording in manual_gbpvr_recordings)
286                //{
287                //    string title = manual_recording.filename;
288                //    DateTime start = manual_recording.manual_start_time;
289                //    DateTime end = manual_recording.manual_end_time;
290                //    long channel_oid = manual_recording.manual_channel_oid;
291                //    var found_channel = gbpvr_channels.Find(p => p.oid == channel_oid);
292                //    var channel_number = found_channel.channel_number;
293                //    var found_program = xmltv_programs.ToList().Find(p =>
294                //        p.Title.ToLower() == title.ToLower() &&
295                //        p.Start == start.ToDateTimeString() &&
296                //        p.Stop == end.ToDateTimeString() &&
297                //        p.ChannelNumber == channel_number
298                //        );
299                //    if (found_program != null)
300                //    {
301                //        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());
302                //    }
303                //    else
304                //    {
305                //        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());
306                //        // find the program on the channel at the start time
307                //        var correct_program = xmltv_programs.ToList().Find(p =>
308                //            p.ChannelNumber == channel_number &&
309                //            p.Start == start.ToDateTimeString()
310                //            );
311                //        if (correct_program != null)
312                //        {
313                //            gLog.Warn.WriteLine("\tThis will be recorded: {0}", correct_program.ToString());
314                //        }
315                //    }
316                //}
317            }
318    
319            static void CheckProgramsForDiscrepancies(List<SQLLITE.IPROGRAMME> list_gbpvr, List<libxmltv.Interfaces.IProgramDefinition> list_xmltv)
320            {
321                ////gLog.Warn.WriteLine("CheckProgramsForDiscrepancies() has not been implemented");
322                //var gbpvr = list_gbpvr.ToArray();
323                //var xmltv = list_xmltv.ToArray();
324                ////if (gbpvr.Count() != xmltv.Count())
325                ////{
326                ////    throw new ArgumentOutOfRangeException("gbpvr.Count/xmltv.Count", string.Format("gbpvr.Count: '0x{0:x8}' != xmltv.Count: '0x{1:x8}'", gbpvr.Count(),xmltv.Count()));
327                ////}
328                ////for (int i = 0; i < gbpvr.Count(); i++)
329                ////{
330                ////    var gbpvr_entry = gbpvr[i];
331                ////    var xmltv_entry = gbpvr_entry.AsXMLTVProgramDefinition(sqlite);
332                ////    if (!xmltv[i].Equals(xmltv_entry))
333                ////    {
334                ////        gLog.Warn.WriteLine("Warning GBPVR Program oid: {0} might be invalid", gbpvr_entry.oid);
335                ////    }
336                ////}
337            }
338      }      }
339  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22