public int crawlComicFiles() {
    // Crawls the Two paths in settings for comic archive files.
    ComicFindFilter filter = new ComicFindFilter();
    Stack<String> stack = new Stack<String>();
    File[] fList;
    File fObj;
    String tmp, path;
    Boolean useFolderAsSeries = false;
    SeriesParser sParser = new SeriesParser();

    // ............................................
    // Set initial paths
    if (!mSyncFld1.isEmpty()) stack.push(mSyncFld1);
    if (!mSyncFld2.isEmpty()) stack.push(mSyncFld2);
    if (stack.size() == 0) return ComicLibrary.STATUS_NOSETTINGS;

    // ............................................
    SQLiteStatement sql =
        mDb.compileStatement(
            "INSERT INTO ComicLibrary(isCoverExists,pgCount,pgRead,pgCurrent,comicID,title,path,series) VALUES(0,0,0,0,?,?,?,?);");
    mDb.beginTransaction();

    while (!stack.isEmpty()) {
      // get list and do some validation
      fObj = new File(stack.pop());
      if (!fObj.exists()) continue;
      fList = fObj.listFiles(filter);
      if (fList == null) continue;

      // files/dir found.
      for (File file : fList) {
        if (file.isDirectory()) stack.push(file.getPath()); // add to stack to continue to crawl.
        else {
          // ------------------------------
          // Check if already in library
          sendProgress(file.getName());
          path = file.getPath();

          tmp =
              mDb.scalar(
                  "SELECT comicID FROM ComicLibrary WHERE path = '" + path.replace("'", "''") + "'",
                  null);
          if (!tmp.isEmpty()) continue;

          // ------------------------------
          // Not found, add it to library.
          sql.clearBindings();
          sql.bindString(1, UUID.randomUUID().toString());
          sql.bindString(2, sage.io.Path.removeExt(file.getName()));
          sql.bindString(3, path);
          sql.bindString(4, ComicLibrary.UKNOWN_SERIES);

          // if(useFolderAsSeries) sql.bindString(4,file.getParentFile().getName());
          // else sql.bindString(4,sParser.get(path)); //sql.bindNull(4);

          if (sql.executeInsert() == 0) {
            System.err.println("ERROR saving comic to database");
          }
          //
        } // if
      } // for
    } // while

    // ............................................
    mDb.commit();
    mDb.endTransaction();

    return ComicLibrary.STATUS_COMPLETE;
  } // func
  /*========================================================
  Process : Create Thumbs, GetPage Count, Remove not found file*/
  private void processLibrary() {
    StringBuilder delList =
        new StringBuilder(); // Can't delete records with an open cursor, save IDs and delete later.
    // int[] outVar = {0,0}; //PageCount,IsCoverCreated
    String[] comicInfo = {"", "", ""}; // Page Count,Path to Cover Entry,Path to Meta Data
    String[] comicMeta; // Title,Series,Volume,Issue
    File file;
    String tmp, comicID, sql, comicPath, seriesName;
    iComicArchive archive;

    Cursor cur = mDb.raw("SELECT comicID,path,isCoverExists,series,title FROM ComicLibrary", null);
    SeriesParser sParser = null;

    for (boolean isOk = cur.moveToFirst(); isOk; isOk = cur.moveToNext()) {
      comicID = cur.getString(0);
      comicPath = cur.getString(1);
      file = new File(comicPath);

      // .........................................
      // if file does not exist, remove from library.
      if (!file.exists()) {
        sendProgress("Removing reference to " + cur.getString(1));
        delList.append(",'" + comicID + "'"); // add id to list

        try { // delete thumbnail if available
          file = new File(mCachePath + comicID + ".jpg");
          if (file.exists()) file.delete();
        } catch (Exception e) {
        }

        continue;
      } // if

      // .........................................
      // if thumb has not been generated.
      if (cur.getString(2).equals("0")) {
        sendProgress("Creating thumbnail for " + comicPath);
        archive = ComicLoader.getArchiveInstance(comicPath);
        archive.getLibraryData(comicInfo);

        // No images in archive, then delete
        if (comicInfo[0] == "0") {
          delList.append(",'" + comicID + "'");
          continue;
        } // if

        sql = "pgCount=" + comicInfo[0]; // Start Building the update query.
        // Create ThumbNail
        if (ComicLibrary.createThumb(
            mCoverHeight, mCoverQuality, archive, comicInfo[1], mCachePath + comicID + ".jpg"))
          sql += ",isCoverExists=1";

        // Get Meta Information
        comicMeta = archive.getMeta(); // Title,Series,Volume,Issue
        if (comicMeta != null) {
          if (!comicMeta[0].isEmpty())
            sql += ",title = '" + comicMeta[0].replaceAll("'", "''") + "'";
          if (!comicMeta[1].isEmpty())
            sql += ",series = '" + comicMeta[1].replaceAll("'", "''") + "'";
        } // if}

        // Save information to the db.
        mDb.execSql(
            String.format("UPDATE ComicLibrary SET %s WHERE comicID = '%s'", sql, comicID), null);
        if (comicMeta != null && comicMeta[1] != "")
          continue; // Since series was updated from meta, Don't continue the rest of the loop which
                    // handles the series
      } // if

      // .........................................
      // if series does not exist, create a series name.
      seriesName = cur.getString(3);
      if (seriesName == null
          || seriesName.isEmpty()
          || seriesName.compareToIgnoreCase(ComicLibrary.UKNOWN_SERIES) == 0) {
        if (mUseFldForSeries) seriesName = sage.io.Path.getParentName(comicPath);
        else {
          if (sParser == null) sParser = new SeriesParser(); // JIT
          seriesName = sParser.get(comicPath);

          // if seriesName ends up being the path, use the parent folder as the series name.
          if (seriesName == comicPath) seriesName = sage.io.Path.getParentName(comicPath);
        } // if

        if (!seriesName.isEmpty())
          mDb.execSql(
              String.format(
                  "UPDATE ComicLibrary SET series='%s' WHERE comicID = '%s'",
                  seriesName.replace("'", "''"), comicID),
              null);
      } // if
    } // for

    cur.close();
    cur = null;

    // .........................................
    // if there is a list of items to delete, do it now in one swoop.
    if (delList.length() > 0) {
      sendProgress("Cleaning up library...");
      mDb.execSql(
          String.format(
              "DELETE FROM ComicLibrary WHERE comicID in (%s)", delList.toString().substring(1)),
          null);
    } // if
  } // func
  /*========================================================
  Finding File/Folders to save into the database.*/
  public int crawlComicFolders() {
    // ....................................
    // Setup Variables
    Activity activity = (Activity) mContext;
    String[] cols =
        new String[] {
          MediaStore.Images.Media._ID,
          MediaStore.Images.Media.BUCKET_DISPLAY_NAME,
          MediaStore.Images.Media.DATE_TAKEN,
          MediaStore.MediaColumns.DATA
        };

    // ....................................
    // Determine the where clause for the media query
    String[] sWhereAry;
    String sWhere;

    if (!mSyncFld1.isEmpty() && !mSyncFld2.isEmpty()) {
      sWhereAry = new String[] {mSyncFld1 + "%", mSyncFld2 + "%"};
      sWhere =
          MediaStore.Images.Media.DATA
              + " like ? OR "
              + MediaStore.Images.Media.DATA
              + " like ?) GROUP BY (2";
    } else if (!mSyncFld1.isEmpty()) {
      sWhereAry = new String[] {mSyncFld1 + "%"};
      sWhere = MediaStore.Images.Media.DATA + " like ?) GROUP BY (2";
    } else if (!mSyncFld2.isEmpty()) {
      sWhereAry = new String[] {mSyncFld2 + "%"};
      sWhere = MediaStore.Images.Media.DATA + " like ?) GROUP BY (2";
    } else {
      return 0;
    } // if

    // ....................................
    // Query both External and Internal then merge results
    Cursor[] aryCur = new Cursor[2];
    Cursor eCur =
        activity
            .getContentResolver()
            .query(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                cols,
                sWhere,
                sWhereAry,
                null); // "MAX(datetaken) DESC"
    Cursor iCur =
        activity
            .getContentResolver()
            .query(MediaStore.Images.Media.INTERNAL_CONTENT_URI, cols, sWhere, sWhereAry, null);

    eCur.moveToFirst();
    aryCur[0] = eCur;
    iCur.moveToFirst();
    aryCur[1] = iCur;
    MergeCursor mcur = new MergeCursor(aryCur);

    // Loop through cursor
    if (mcur.moveToFirst()) {
      int dCol =
          mcur.getColumnIndex(
              MediaStore.MediaColumns.DATA); // .getColumnIndex(MediaStore.MediaColumns.DATA);
      String path = "", tmp = "";

      SQLiteStatement sql =
          mDb.compileStatement(
              "INSERT INTO ComicLibrary(isCoverExists,pgCount,pgRead,pgCurrent,comicID,title,path,series) VALUES(0,0,0,1,?,?,?,?);");
      mDb.beginTransaction();

      do {
        // ------------------------------
        // Check if already in library
        path = sage.io.Path.removeLast(mcur.getString(dCol)); // Remove Filename from the path
        sendProgress(path);

        tmp =
            mDb.scalar(
                "SELECT comicID FROM ComicLibrary WHERE path = '" + path.replace("'", "''") + "'",
                null);
        if (!tmp.isEmpty()) continue;

        // ------------------------------
        // Not found, add it to library.
        sql.clearBindings();
        sql.bindString(1, UUID.randomUUID().toString());
        sql.bindString(2, sage.io.Path.getLast(path));
        sql.bindString(3, path);
        sql.bindString(4, ComicLibrary.UKNOWN_SERIES);
        // if(useFolderAsSeries) sql.bindString(4,file.getParentFile().getName());
        // else sql.bindString(4,sParser.get(path)); //sql.bindNull(4);

        if (sql.executeInsert() == 0) {
          System.err.println("ERROR saving folder to db");
        }
      } while (mcur.moveToNext());

      // ............................................
      mDb.commit();
      mDb.endTransaction();
    } // if

    mcur.close();
    return ComicLibrary.STATUS_COMPLETE;
  } // func