/// <summary> /// insert album art /// </summary> /// <param name="tag">the id3 tag</param> /// <param name="current_dir">current directory</param> /// <returns>count</returns> public uint InsertArt(object song_id, TagLib.File tag_file) { string art = null; string key = null; byte[] hash = null; byte[] data = null; string type = string.Empty; string mime_type = string.Empty; string description = string.Empty; string current_dir = Path.GetDirectoryName(tag_file.Name); TagLib.Tag tag = tag_file.Tag; if (tag.Pictures.Length == 0) { return(0); } uint inserted = 0; DDLHelper helper = new DDLHelper(db); helper.DeleteArtLinks(song_id); foreach (TagLib.IPicture pic in tag.Pictures) { art = GenerateFileName(pic); data = new byte[pic.Data.Count]; pic.Data.CopyTo(data, 0); type = pic.Type.ToString(); mime_type = pic.MimeType; description = pic.Description; if (pic.MimeType != "-->") // no support for linked art { hash = ComputeHash(data); uint id = 0; key = string.Empty; if (isDuplicateInsert(hash, out id)) { string file = null; if (isOrphanedInsert(id, out file)) { // write file SaveArt(file, data); } key = id.ToString(); } else { // write file SaveArt(art, data); key = Insert(hash, art, type, description, mime_type); ++inserted; } CreateLink(song_id, key); } } return(inserted); }
/// <summary> /// thread function may or may not be an actual thread /// </summary> /// <param name="fork"></param> public void Scan() { if (running) { OnSyncError(); return; } OnStateChanged(State.Starting); OnStateChanged(State.PrepareStep); running = true; DateTime start = DateTime.Now; try { try { // remove OnStateChanged(State.CreateDB); db_mgr = new DDLHelper(mysql_connection); // Create DATABASE if (Settings.Default.create_db) { OnMessage("Executing create scripts..."); string schema_name = Settings.Default.schema; string sql = "DROP DATABASE IF EXISTS " + schema_name; mysql_connection.ExecuteNonQuery(sql); db_mgr.CreateDatabase(schema_name); db_mgr.ExecuteCreateScript(); } OnMessage("Executing update scripts..."); // change to database mysql_connection.ChangeDatabase(Settings.Default.schema); // get version info db_mgr.InitializeVersionInfo(); reporter.DBPeviousVersion = db_mgr.CurrentVersion.ToString(); reporter.DBVersion = db_mgr.UpdateVersion.ToString(); db_mgr.UpdateDatabase(); // update OnMessage("Database has been updated"); // check for stop signal pause.WaitOne(); if (!running) { return; } OnStateChanged(State.PrepareStep); // make sure database set mysql_connection.ChangeDatabase(Settings.Default.schema); // SCAN TAGS if (Settings.Default.ScanTags) { OnStateChanged(State.Scanning); int len = Settings.Default.Dirs.Count; // scan just root or all in list if (len > 0) { for (int i = 0; i < len && running; ++i) { Thread(Settings.Default.Dirs[i]); } } else { Thread(Settings.Default.music_root); } OnStateChanged(State.PrepareStep); } } catch (MySqlException exp) { OnError(exp.Message); return; } OnDirectoryProcessing("None."); // check for stop signal pause.WaitOne(); if (!running) { return; } // check for stop signal pause.WaitOne(); if (!running) { return; } // CLEAN if (Settings.Default.Clean) { OnStateChanged(State.Cleaning); if (Settings.Default.insert_art) { reporter.DeleteArtFileCount = art_importer.DeleteOrphanedFiles(); reporter.DeleteArtCount = art_importer.DeleteOrphanedInserts(); } //reporter.DeleteSongCount = Clean(); OnStateChanged(State.PrepareStep); } // check for stop signal pause.WaitOne(); if (!running) { return; } // OPITIMIZE if (Settings.Default.Optimize) { OnStateChanged(State.Optimizing); Optimize(); } } catch (Exception e) { } finally { DateTime end = DateTime.Now; TimeSpan ts = (TimeSpan)(end - start); string elapsed = ts.Hours.ToString("D") + ":" + ts.Minutes.ToString("D") + ":" + ts.Seconds.ToString("D2"); // +"::" + ts.Milliseconds.ToString( "D4" ); OnMessage("Completed at " + end.ToShortTimeString() + " elapsed time " + elapsed + "."); Close(); OnStateChanged(State.Stopping); OnStateChanged(State.Idle); running = false; } }