@Override
    public void run() {
      FeedImage image = DBReader.getFeedImage(DownloadService.this, request.getFeedfileId());
      if (image == null) {
        throw new IllegalStateException("Could not find downloaded image in database");
      }

      image.setFile_url(request.getDestination());
      image.setDownloaded(true);

      saveDownloadStatus(status);
      sendDownloadHandledIntent();
      DBWriter.setFeedImage(DownloadService.this, image);
      numberOfDownloads.decrementAndGet();
      queryDownloadsAsync();
    }
 @Override
 public void run() {
   if (request.isDeleteOnFailure()) {
     if (BuildConfig.DEBUG) Log.d(TAG, "Ignoring failed download, deleteOnFailure=true");
   } else {
     File dest = new File(request.getDestination());
     if (dest.exists() && request.getFeedfileType() == FeedMedia.FEEDFILETYPE_FEEDMEDIA) {
       Log.d(TAG, "File has been partially downloaded. Writing file url");
       FeedMedia media = DBReader.getFeedMedia(DownloadService.this, request.getFeedfileId());
       media.setFile_url(request.getDestination());
       try {
         DBWriter.setFeedMedia(DownloadService.this, media).get();
       } catch (InterruptedException e) {
         e.printStackTrace();
       } catch (ExecutionException e) {
         e.printStackTrace();
       }
     }
   }
 }
    @Override
    public void run() {
      FeedMedia media = DBReader.getFeedMedia(DownloadService.this, request.getFeedfileId());
      if (media == null) {
        throw new IllegalStateException("Could not find downloaded media object in database");
      }
      boolean chaptersRead = false;
      media.setDownloaded(true);
      media.setFile_url(request.getDestination());

      // Get duration
      MediaMetadataRetriever mmr = null;
      try {
        mmr = new MediaMetadataRetriever();
        mmr.setDataSource(media.getFile_url());
        String durationStr = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
        media.setDuration(Integer.parseInt(durationStr));
        if (AppConfig.DEBUG) Log.d(TAG, "Duration of file is " + media.getDuration());
      } catch (NumberFormatException e) {
        e.printStackTrace();
      } catch (RuntimeException e) {
        e.printStackTrace();
      } finally {
        if (mmr != null) {
          mmr.release();
        }
      }

      if (media.getItem().getChapters() == null) {
        ChapterUtils.loadChaptersFromFileUrl(media);
        if (media.getItem().getChapters() != null) {
          chaptersRead = true;
        }
      }

      try {
        if (chaptersRead) {
          DBWriter.setFeedItem(DownloadService.this, media.getItem()).get();
        }
        DBWriter.setFeedMedia(DownloadService.this, media).get();
        if (!DBTasks.isInQueue(DownloadService.this, media.getItem().getId())) {
          DBWriter.addQueueItem(DownloadService.this, media.getItem().getId()).get();
        }
      } catch (ExecutionException e) {
        e.printStackTrace();
        status =
            new DownloadStatus(
                media,
                media.getEpisodeTitle(),
                DownloadError.ERROR_DB_ACCESS_ERROR,
                false,
                e.getMessage());
      } catch (InterruptedException e) {
        e.printStackTrace();
        status =
            new DownloadStatus(
                media,
                media.getEpisodeTitle(),
                DownloadError.ERROR_DB_ACCESS_ERROR,
                false,
                e.getMessage());
      }

      saveDownloadStatus(status);
      sendDownloadHandledIntent();

      numberOfDownloads.decrementAndGet();
      queryDownloadsAsync();
    }
    public void run() {
      Feed savedFeed = null;

      Feed feed = new Feed(request.getSource(), new Date());
      feed.setFile_url(request.getDestination());
      feed.setDownloaded(true);

      reason = null;
      String reasonDetailed = null;
      successful = true;
      FeedHandler feedHandler = new FeedHandler();

      try {
        feed = feedHandler.parseFeed(feed);
        if (AppConfig.DEBUG) Log.d(TAG, feed.getTitle() + " parsed");
        if (checkFeedData(feed) == false) {
          throw new InvalidFeedException();
        }
        // Save information of feed in DB
        savedFeed = DBTasks.updateFeed(DownloadService.this, feed);
        // Download Feed Image if provided and not downloaded
        if (savedFeed.getImage() != null && savedFeed.getImage().isDownloaded() == false) {
          if (AppConfig.DEBUG) Log.d(TAG, "Feed has image; Downloading....");
          savedFeed.getImage().setFeed(savedFeed);
          final Feed savedFeedRef = savedFeed;
          try {
            requester.downloadImage(DownloadService.this, savedFeedRef.getImage());
          } catch (DownloadRequestException e) {
            e.printStackTrace();
            DBWriter.addDownloadStatus(
                DownloadService.this,
                new DownloadStatus(
                    savedFeedRef.getImage(),
                    savedFeedRef.getImage().getHumanReadableIdentifier(),
                    DownloadError.ERROR_REQUEST_ERROR,
                    false,
                    e.getMessage()));
          }
        }

      } catch (SAXException e) {
        successful = false;
        e.printStackTrace();
        reason = DownloadError.ERROR_PARSER_EXCEPTION;
        reasonDetailed = e.getMessage();
      } catch (IOException e) {
        successful = false;
        e.printStackTrace();
        reason = DownloadError.ERROR_PARSER_EXCEPTION;
        reasonDetailed = e.getMessage();
      } catch (ParserConfigurationException e) {
        successful = false;
        e.printStackTrace();
        reason = DownloadError.ERROR_PARSER_EXCEPTION;
        reasonDetailed = e.getMessage();
      } catch (UnsupportedFeedtypeException e) {
        e.printStackTrace();
        successful = false;
        reason = DownloadError.ERROR_UNSUPPORTED_TYPE;
        reasonDetailed = e.getMessage();
      } catch (InvalidFeedException e) {
        e.printStackTrace();
        successful = false;
        reason = DownloadError.ERROR_PARSER_EXCEPTION;
        reasonDetailed = e.getMessage();
      }

      // cleanup();
      if (savedFeed == null) {
        savedFeed = feed;
      }

      saveDownloadStatus(
          new DownloadStatus(
              savedFeed,
              savedFeed.getHumanReadableIdentifier(),
              reason,
              successful,
              reasonDetailed));
      sendDownloadHandledIntent();
      numberOfDownloads.decrementAndGet();
      queryDownloadsAsync();
    }
 /**
  * Adds a new DownloadStatus object to the list of completed downloads and saves it in the
  * database
  *
  * @param status the download that is going to be saved
  */
 private void saveDownloadStatus(DownloadStatus status) {
   completedDownloads.add(status);
   DBWriter.addDownloadStatus(this, status);
 }