/[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 236 by william, Sun Mar 17 08:20:06 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    using GBPVR.Public;
14    using GBPVR.Backend.Common;
15  namespace GBPVRProgramDatabaseFixer  namespace GBPVRProgramDatabaseFixer
16  {  {
17      class Program      class Program
18      {      {
19            static ISQLLITE sqlite;
20          static string XMLTV_FILE = "";          static string XMLTV_FILE = "";
21          static string GBPVR_DATABASE = "";          static string GBPVR_DATABASE = "";
22    
23            //static bool LOADING_XMLTV_FILE = false;
24          static bool XMLTV_INSTANCE_CREATED = false;          static bool XMLTV_INSTANCE_CREATED = false;
25            //static int LAST_REPORTED_XMLTV_PROGRESS = 0;
26    
         static int LAST_REPORTED_XMLTV_PROGRESS =0;  
27    
28          static FileInfo fi_XMLTVFILE;          //static bool LOADING_GBPVR_DATABASE = false;
29            static bool SQLLIST_INSTANCE_CREATED = false;
30            //static int LAST_REPORTED_SQLLITE_PROGRESS = 0;
31    
32            //static int LAST_REPORTED_PROGRESS = 0;
33    
34            static FileInfo fi_XMLTVFILE;
35            static FileInfo fi_GBPVRDATABASE;
36          static void CreateLog()          static void CreateLog()
37          {          {
38              string log_path = Application.StartupPath;              string log_path = Application.StartupPath;
# Line 78  namespace GBPVRProgramDatabaseFixer Line 91  namespace GBPVRProgramDatabaseFixer
91              }              }
92    
93              LoadXMLTVFile();              LoadXMLTVFile();
94                LoadGBPVRDatabase();
95                PerformDatabaseProcessing();
96            }
97    
98            static void ConsoleOverwritePreviosLine(string format, params object[] args)
99            {
100                Console.WriteLine(format,args);
101                Console.SetCursorPosition(0, Console.CursorTop - 1);
102          }          }
103    
104          static void gLog_ReportProgress(object sender, ReportProgressEventArgs e)          static void gLog_ReportProgress(object sender, ReportProgressEventArgs e)
105          {          {
106              if (LAST_REPORTED_XMLTV_PROGRESS != e.Progress)              object k = e.UserState; // we will assum that is a status message
107                if (k == null) // assume we do not have a user status message (ie: is only a progress message)
108                {
109                    if (sender == null) { ConsoleOverwritePreviosLine("Progress: {0} ", e.Progress); }
110                    else { ConsoleOverwritePreviosLine("{0}: Progress: {1:00}%", sender.GetType().Name, e.Progress); }
111                }
112                else // assume we have a user status message
113              {              {
114                  Console.WriteLine("XMLTV: {0} Loading: {1:00}%", fi_XMLTVFILE.Name, e.Progress);                  if (sender == null) { ConsoleOverwritePreviosLine("{0} ", k.ToString()); }
115                  LAST_REPORTED_XMLTV_PROGRESS = e.Progress;                  else { ConsoleOverwritePreviosLine("{0}: {1}", sender.GetType().Name, k.ToString()); }
116              }              }
117          }          }
118          static void LoadXMLTVFile()          static void LoadXMLTVFile()
119          {          {
120                //LOADING_XMLTV_FILE = true;
121              if (string.IsNullOrEmpty(XMLTV_FILE))              if (string.IsNullOrEmpty(XMLTV_FILE))
122              {              {
123                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");                  gLog.Error.WriteLine("XMLTV File is either a null or empty string.");
124                    //LOADING_XMLTV_FILE = false;
125                  return;                  return;
126              }              }
127              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);              fi_XMLTVFILE = new FileInfo(XMLTV_FILE);
128              if (!fi_XMLTVFILE.Exists)              if (!fi_XMLTVFILE.Exists)
129              {              {
130                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);                  gLog.Error.WriteLine("Could not find XMLTV File: {0}", fi_XMLTVFILE.FullName);
131                    //LOADING_XMLTV_FILE = false;
132                  return;                  return;
133              }              }
134    
135              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));              XMLTV.Create(fi_XMLTVFILE.FullName, new EventHandler<EventArgs>(XMLTV_OnInstanceCreated));
136              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }              while (!XMLTV_INSTANCE_CREATED) { Application.DoEvents(); }
137                //LOADING_XMLTV_FILE = false;
138          }          }
   
139          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }          static void XMLTV_OnInstanceCreated(object sender, EventArgs e) { XMLTV_INSTANCE_CREATED = true; }
140    
141            static void LoadGBPVRDatabase()
142            {
143                //LOADING_GBPVR_DATABASE = true;
144                if (string.IsNullOrEmpty(GBPVR_DATABASE))
145                {
146                    gLog.Error.WriteLine("GBPVR Datbase is either a null or empty string.");
147                    //LOADING_GBPVR_DATABASE = false;
148                    return;
149                }
150                fi_GBPVRDATABASE = new FileInfo(GBPVR_DATABASE);
151                if (!fi_GBPVRDATABASE.Exists)
152                {
153                    gLog.Error.WriteLine("Could not find GBPVR Database: {0}", fi_GBPVRDATABASE.FullName);
154                    //LOADING_GBPVR_DATABASE = false;
155                    return;
156                }
157                sqlite = SQLLITE.Create(fi_GBPVRDATABASE.FullName, new EventHandler<EventArgs>(SQLLITE_OnInstanceCreated));
158                while (!SQLLIST_INSTANCE_CREATED) { Application.DoEvents(); }
159                //LOADING_GBPVR_DATABASE = false;
160            }
161            static void SQLLITE_OnInstanceCreated(object sender, EventArgs e) { SQLLIST_INSTANCE_CREATED = true; }
162    
163            static void PerformDatabaseProcessing()
164            {
165                var sqllite_channels = sqlite.Channels;
166                var sqllite_recordings = sqlite.Recordings;
167                var sqllite_programs = sqlite.Programs;
168                Type datatype;
169                var xmlt_raw_program_data = (IProgramDefinitionList)XMLTV.CreateBindingSourceFromData(XMLTV.GetPrograms(), out datatype);
170                var xmltv_programs = xmlt_raw_program_data.ToList().OrderBy(p => DateTime.Parse(p.Start)).ToList();
171                var sqllite_programs_startdate_range = sqlite.GetProgramsDateRange(sqllite_programs);
172                var xmltv_programs_startdate_range = GetXMLTVProgramStartDateRange(xmltv_programs);
173                var gbpvr_invalid_programs = new List<SQLLITE.IPROGRAMME>();
174                var gbpvr_valid_programs = sqlite.FixGBPVRProgramsDatabase(sqllite_programs, xmltv_programs, out gbpvr_invalid_programs);    
175                sqlite.RemoveOldGBPVRPrograms(gbpvr_invalid_programs);
176                sqlite.UpdateGBPVRPrograms(gbpvr_valid_programs);
177    
178                sqllite_programs.Clear();
179                gbpvr_valid_programs.ForEach(s=>sqllite_programs.Add(s.NewProgram));
180    
181                CheckScheduledRecordingsForDiscrepancies(sqllite_recordings,sqllite_programs);
182            }
183    
184            static IDateTimeRange GetXMLTVProgramStartDateRange(List<libxmltv.Interfaces.IProgramDefinition> programs)
185            {
186                IDateTimeRange range = DateTimeRange.Create();
187                var list = new List<libxmltv.Interfaces.IProgramDefinition>(programs.ToArray());
188                DateTime first = new DateTime();
189                DateTime last = new DateTime();
190                first = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().First().Start);
191                last = DateTime.Parse(list.OrderBy(s => DateTime.Parse(s.Start)).ToList().Last().Start);
192                gLog.Verbose.Debug.WriteLine("\tFirst: {0} = ({1})", first.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), first.ToDateTimeString());
193                gLog.Verbose.Debug.WriteLine("\tLast: {0} = ({1})", last.ToString("yyyy/MM/dd HH:mm:ss.fffffff"), last.ToDateTimeString());
194                range = DateTimeRange.Create(first, last);
195                return range;
196            }
197    
198            static void CheckScheduledRecordingsForDiscrepancies(List<SQLLITE.IRECORDING_SCHEDULE> recordings, List<SQLLITE.IPROGRAMME> programs)
199            {
200                List<SQLLITE.IRECORDING_SCHEDULE> recordings_to_delete = new List<SQLLITE.IRECORDING_SCHEDULE>();
201                //List<SQLLITE.IRECORDING_SCHEDULE> deleted_recordings = new List<SQLLITE.IRECORDING_SCHEDULE>();
202                //List<SQLLITE.IRECORDING_SCHEDULE> reocurring_recordings = new List<SQLLITE.IRECORDING_SCHEDULE>();
203    
204    
205                //reocurring_recordings = recordings.FindAll(s => s.recording_type != (long)RecordingType.TYPE_RECORD_ONCE).ToList();
206    
207                foreach (var recording in recordings)
208                {
209                    RecordingStatus status = (RecordingStatus)recording.status;
210                    RecordingType type = (RecordingType)recording.recording_type;
211                    if (type == RecordingType.TYPE_RECORD_SEASON)
212                    {
213                        continue; // ignore TYPE_RECORD_SEASON
214                    }
215                    if (status != RecordingStatus.STATUS_PENDING)
216                    {
217                        continue; // ignore any status except STATUS_PENDING
218                    }
219                    if (recording.recording_group == 0 && recording.programme_oid == 0)
220                    {
221                        continue; // ignore manual recordings
222                    }
223                    // verify data for this recording
224                    var recording_oid = recording.oid;
225                    var programme_oid = recording.programme_oid;
226                    var filename = recording.filename;
227                    var manual_start_time = recording.manual_start_time;
228                    var manual_end_time = recording.manual_end_time;
229                    var manual_channel_oid = recording.manual_channel_oid;
230    
231                    // lookup program by oid
232                    var entry = programs.Find(s => s.oid == programme_oid);
233                    if (entry == null)
234                    {
235                        gLog.Warn.WriteLine("Unable to find program with oid: '{0}' for recording with oid: '{1}' -- assuming it should be deleted", programme_oid, recording_oid);
236                        //throw new NullReferenceException(string.Format("Unable to find program with oid: '{0}' for recording with oid: '{1}'", programme_oid, recording_oid));
237                        //deleted_recordings.Add(recording);
238                    }
239                    else
240                    {
241                        recordings_to_delete.Add(recording);        
242                    }
243                }
244                recordings_to_delete.TrimExcess();
245                if (recordings_to_delete.Count > 0)
246                {
247                    gLog.Info.WriteLine("Found {0} recordings to delete.", recordings_to_delete.Count);
248                    sqlite.DeleteGBPVRScheduledRecordings(recordings_to_delete);
249                }
250    
251                try
252                {
253                    //IScheduleHelper helper = ScheduleHelper.getInstance();
254                    //helper.ForceRecordingScheduleReload();
255                }
256                catch (Exception ex)
257                {
258                    gLog.Error.WriteLine(ex.ToString());
259                }
260            }
261      }      }
262  }  }

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

  ViewVC Help
Powered by ViewVC 1.1.22