Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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;
            }
        }