public Set(string path) { Folder = new DirectoryInfo(path); Photos = new List <PhotoInfo>(); if (System.IO.File.Exists(Path.Combine(path, "ignore"))) { return; } foreach (FileInfo file in Folder.EnumerateFiles("*.jpg")) { PhotoInfo p = new PhotoInfo(file); Photos.Add(p); } }
/// <summary> /// The main thread /// </summary> void UploadPhotoList() { // If a folder is just a date (yyyy-mm-dd), we don't upload it - we only do so if // some text has been added to provide a meaningful name. This regex extracts the // meaningful part of the name in group 1 Regex alt = new Regex(@"^[\d- ]*(.*?)$", RegexOptions.Compiled); PowerModeChangedEventHandler eh = null; if (Settings.Default.WaitLogging) { Log("Adding power handler"); eh = new PowerModeChangedEventHandler(delegate(object sender, PowerModeChangedEventArgs e) { Log("Power " + e.Mode); }); SystemEvents.PowerModeChanged += eh; } try { do { try { Form.Log("Starting"); Form.Sets = Sets = new Dictionary <string, Set>(); Form.AltSets = AltSets = new Dictionary <string, Set>(); Form.ClearFolders(); Form.LogError(""); foreach (string folder in Directory.EnumerateDirectories(Settings.Default.Folder)) { if (TaskCancelled()) { return; } Form.Status("Loading folder {0}", folder); Set s = new Set(folder); if (s.Photos.Count > 0) { Match m = alt.Match(s.Folder.Name); if (m.Success) { // The folder name starts with a date string key = m.Groups[1].Value; if (key == "") { Form.Error("Ignored folder {0} with no description", folder); continue; } // Index set by name part only, in case date has been removed from Flickr set name AltSets[key] = s; } Sets[s.Folder.Name] = s; Form.AddFolder(s); } } // Have finished building local folder list Form.Status(""); // Now compute hashes foreach (Set s in Sets.Values) { if (TaskCancelled()) { return; } Form.Status("Checking folder {0}", s.Folder.Name); int i = 0; foreach (PhotoInfo p in s.Photos) { if (TaskCancelled()) { return; } p.LoadHash(); Form.UpdatePhoto(s, i++); } } Form.Status(""); if (Settings.Default.AccessToken == null) { Form.Log("Not logged in"); return; } // Wait until start time (if a start time is specified) if (Wait(false)) { return; } // Prevent computer going to sleep during upload uint executionState = NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED); if (executionState == 0) { Form.LogError("SetThreadExecutionState failed."); } try { Form.Status("Downloading Flickr sets"); // Get Flickr sets PhotosetCollection sets = Flickr.PhotosetsGetList(1, 1000); if (TaskCancelled()) { return; } foreach (Photoset set in sets) { Set ours; // Match Flickr sets to ours if (Sets.TryGetValue(set.Title, out ours) || AltSets.TryGetValue(set.Title, out ours)) { ours.Id = set.PhotosetId; } } foreach (Set s in Sets.Values) { if (TaskCancelled()) { return; } // Photos matched in the Flickr set HashSet <PhotoInfo> matched = new HashSet <PhotoInfo>(); bool changed = false; if (s.Id != null) { // There is a Flickr set - get Flickr's list of photos in the set Form.Status("Downloading photo details for set {0}", s.Folder.Name); foreach (Photo p in Flickr.PhotosetsGetPhotos(s.Id, PhotoSearchExtras.DateUploaded, 1, 1000)) { if (TaskCancelled()) { return; } // Match by Id, name, file name or description PhotoInfo info = s.Photos.FirstOrDefault(pf => pf.Flickr.Id == p.PhotoId || pf.Name == p.Title || pf.FileName == p.Title || pf.Description == p.Description); if (info != null) { matched.Add(info); if (info.Flickr.Uploaded != p.DateUploaded) { changed = true; } info.Flickr.Id = p.PhotoId; info.Flickr.Uploaded = p.DateUploaded; } } } // Now look for local photos not in the Flickr set foreach (PhotoInfo p in s.Photos) { if (!matched.Contains(p)) { if (p.Flickr.Id != null) { // Photo is already on Flickr, but is not in this set if (TaskCancelled()) { return; } if (DateTime.Now >= stop) { Form.Log("Reached stop time"); return; } try { Flickr.PhotosetsAddPhoto(s.Id, p.Flickr.Id); } catch { // Cannot add photo - perhaps it was deleted from Flickr - mark it as missing p.Flickr.Id = null; p.Flickr.Uploaded = null; changed = true; } } } } if (changed) { Form.UpdateSet(s); } // Upload remaining photos foreach (PhotoInfo p in s.Photos) { if (TaskCancelled()) { return; } if (p.Flickr.Id != null) { continue; // Photo is already on Flickr } if (DateTime.Now >= stop) { Form.Log("Reached stop time"); return; } Form.Log("Uploading {0}", p.FullName); try { if (TaskCancelled()) { return; } p.Flickr.Id = Flickr.UploadPicture(p.FullName, p.Name, p.Description, "", false, true, false); p.Flickr.Uploaded = DateTime.Now; if (changed) { Form.UpdatePhoto(s, s.Photos.IndexOf(p)); } if (s.Id == null) { Form.Log("Creating set {0}", s.Folder.Name); s.Id = Flickr.PhotosetsCreate(s.Folder.Name, p.Flickr.Id).PhotosetId; } else { Flickr.PhotosetsAddPhoto(s.Id, p.Flickr.Id); } } catch (Exception ex) { Form.LogError("Exception: {0}", ex); } } } Form.Status(""); Form.LogError("Completed"); } finally { if (executionState != 0) { NativeMethods.SetThreadExecutionState(executionState); } } } catch (Exception ex) { try { Form.LogError("Exception: {0}", ex); } catch { } } } while (!Wait(true)); } finally { if (eh != null) { Log("Removing power handler"); SystemEvents.PowerModeChanged -= eh; } } }