@Transactional(noRollbackFor = Exception.class)
  private void updatePodcast(List<Podcast> podcasts, Executor selectedExecutor) {
    initUpdate();

    log.info("Lancement de l'update");
    log.info("Traitement de {} podcasts", podcasts.size());

    podcasts
        // Launch every update
        .stream()
        .map(
            podcast ->
                supplyAsync(() -> workerService.updaterOf(podcast))
                    .thenApplyAsync(updater -> updater.update(podcast), selectedExecutor))
        .collect(
            toSet()) // Terminal operation forcing evaluation of each element upper in the stream
        // Get result of each update
        .stream()
        .map(this::wait)
        .filter(tuple -> tuple != Updater.NO_MODIFICATION_TUPLE)
        .peek((tuple) -> changeAndCommunicateUpdate(Boolean.TRUE))
        .forEach(
            tuple ->
                podcastBusiness.save(
                    attachNewItemsToPodcast(tuple.first(), tuple.middle(), tuple.last())));

    log.info("Fin du traitement des {} podcasts", podcasts.size());
    finishUpdate();
  }
  public Podcast fetchPodcastInfoByUrl(String url) throws FindPodcastNotFoundException {
    Finder specificFinder = workerService.getFinderByUrl(url);
    if (specificFinder == null) {
      return null;
    }

    return specificFinder.find(url);
  }