All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mServer.crawler.sender.arte.MediathekArte_de Maven / Gradle / Ivy

There is a newer version: 3.1.64
Show newest version
/*
 * MediathekView
 * Copyright (C) 2008 W. Xaver
 * W.Xaver[at]googlemail.com
 * http://zdfmediathk.sourceforge.net/
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see .
 */
package mServer.crawler.sender.arte;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import de.mediathekview.mlib.Config;
import de.mediathekview.mlib.Const;
import de.mediathekview.mlib.daten.DatenFilm;
import de.mediathekview.mlib.daten.ListeFilme;
import de.mediathekview.mlib.tool.Log;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.CopyOnWriteArrayList;
import mServer.crawler.CrawlerTool;
import mServer.crawler.FilmeSuchen;
import mServer.crawler.sender.MediathekReader;

public class MediathekArte_de extends MediathekReader {

  /*
     * Informationen zu den ARTE-URLs:
     * {} sind nur Makierungen, dass es Platzhalter sind, sie gehören nicht zur URL.
     * 
     * Allgemeine URL eines Films:  (050169-002-A = ID des Films); (die-spur-der-steine = Titel)
     * http://www.arte.tv/de/videos/{050169-002-A}/{die-spur-der-steine}
     * 
     * Alle Sendungen: (Deutsch = DE; Französisch = FR)
     * https://api.arte.tv/api/opa/v3/videos?channel={DE}
     * 
     * Informationen zum Film: (050169-002-A = ID des Films); (de für deutsch / fr für französisch)
     * https://api.arte.tv/api/player/v1/config/{de}/{050169-002-A}?platform=ARTE_NEXT
     * 
     * Zweite Quelle für Informationen zum Film: (050169-002-A = ID des Films); (de für deutsch / fr für französisch)
     * https://api.arte.tv/api/opa/v3/programs/{de}/{050169-002-A}
     * 
     * Hintergrundinfos zum Laden der Filme nach Kategorien im langen Lauf:
     * 1. statische Informationen über verfügbare Kategorien laden: URL_STATIC_CONTENT
     * 2. für jede Kategorie die Unterkategorien ermitteln: URL_CATEGORY
     * 3. für jede Unterkategorie die enthaltenen ProgramId ermitteln: URL_SUBCATEGORY
     * 4. für alle ProgramIds die Videoinformationen laden (wie kurze Variante)
   */
  private static final Logger LOG = LogManager.getLogger(MediathekArte_de.class);
  private final static String SENDERNAME = Const.ARTE_DE;
  private static final String ARTE_API_TAG_URL_PATTERN = "https://api.arte.tv/api/opa/v3/videos?channel=%s&arteSchedulingDay=%s";

  private static final String URL_SUBCATEGORY
          = "https://www.arte.tv/guide/api/api/zones/%s/web/videos_subcategory_%s/?page=%s&limit=100";

  private static final String[] SUBCATEGORIES = new String[]{
    "AJO", "AUV", "KUL", "DCY", "ENQ", "JUN",
    "ACC", "CMG", "FLM", "CMU", "MCL",
    "CHU", "FIC", "SES",
    "ART", "POP", "IDE",
    "ADS", "CLA", "JAZ", "MUA", "MUD", "OPE",
    "ENB", "ENN", "SAN", "TEC",
    "ATA", "EVA", "NEA", "VIA",
    "CIV", "LGP", "XXE"
  };

  private static final DateTimeFormatter ARTE_API_DATEFORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  protected String LANG_CODE = "de";
  protected String URL_CONCERT = "http://concert.arte.tv/de/videos/all";
  protected String URL_CONCERT_NOT_CONTAIN = "-STF";
  protected String TIME_1 = "
  • Sendetermine:
  • "; protected String TIME_2 = "um"; public MediathekArte_de(FilmeSuchen ssearch, int startPrio) { super(ssearch, SENDERNAME,/* threads */ 2, /* urlWarten */ 200, startPrio); } public MediathekArte_de(FilmeSuchen ssearch, int startPrio, String name) { super(ssearch, name,/* threads */ 2, /* urlWarten */ 200, startPrio); } //=================================== // public //=================================== @Override public void addToList() { meldungStart(); if (Config.getStop()) { meldungThreadUndFertig(); } else { if (CrawlerTool.loadLongMax()) { addCategories(); meldungAddMax(listeThemen.size()); for (int t = 0; t < getMaxThreadLaufen(); ++t) { Thread th = new CategoryLoader(); th.setName(getSendername() + t); th.start(); } } else { addTage(); meldungAddMax(listeThemen.size()); for (int t = 0; t < getMaxThreadLaufen(); ++t) { Thread th = new ThemaLaden(); th.setName(getSendername() + t); th.start(); } } } } private void addCategories() { for (String subCategory : SUBCATEGORIES) { String subCategoryUrl = String.format(URL_SUBCATEGORY, LANG_CODE.toLowerCase(), subCategory, 1); listeThemen.add(new String[]{subCategory, subCategoryUrl}); } } private void addTage() { // http://www.arte.tv/guide/de/plus7/videos?day=-2&page=1&isLoading=true&sort=newest&country=DE for (int i = 0; i <= 14; ++i) { String u = String.format(ARTE_API_TAG_URL_PATTERN, LANG_CODE.toUpperCase(), LocalDate.now().minusDays(i).format(ARTE_API_DATEFORMATTER)); listeThemen.add(new String[]{u}); } } class ThemaLaden extends Thread { @Override public void run() { try { meldungAddThread(); String link[]; while (!Config.getStop() && (link = listeThemen.getListeThemen()) != null) { meldungProgress(link[0] /* url */); addFilmeForTag(link[0]); } } catch (Exception ex) { Log.errorLog(894330854, ex, ""); } meldungThreadUndFertig(); } private void addFilmeForTag(String aUrl) { Gson gson = new GsonBuilder().registerTypeAdapter(ListeFilme.class, new ArteDatenFilmDeserializer(LANG_CODE, getSendername())).create(); ListeFilme loadedFilme = ArteHttpClient.executeRequest(LOG, gson, aUrl, ListeFilme.class); if (loadedFilme != null) { loadedFilme.forEach((film) -> { addFilm(film); }); } } } /** * Lädt die Filme für jede Kategorie */ class CategoryLoader extends Thread { @Override public void run() { try { meldungAddThread(); String link[]; while (!Config.getStop() && (link = listeThemen.getListeThemen()) != null) { meldungProgress(link[0] + "/" + link[1] /* url */); loadSubCategory(link[0], link[1]); } } catch (Exception ex) { Log.errorLog(894330854, ex, ""); } meldungThreadUndFertig(); } private void loadSubCategory(String aCategory, String aUrl) { Gson gson = new GsonBuilder().registerTypeAdapter(ArteCategoryFilmsDTO.class, new ArteCategoryFilmListDeserializer()).create(); // erste Seite laden int i = 2; ArteCategoryFilmsDTO dto = loadSubCategoryPage(gson, aUrl); if (dto != null) { ArteCategoryFilmsDTO nextDto = dto; while (nextDto != null && nextDto.hasNextPage()) { // weitere Seiten laden und zu programId-liste des ersten DTO hinzufügen String url = String.format(URL_SUBCATEGORY, LANG_CODE.toLowerCase(), aCategory, i); nextDto = loadSubCategoryPage(gson, url); if (nextDto != null) { nextDto.getProgramIds().forEach(programId -> dto.addProgramId(programId)); } i++; } // alle programIds verarbeiten ListeFilme loadedFilme = loadPrograms(dto); loadedFilme.forEach((film) -> { addFilm(film); }); } } private ListeFilme loadPrograms(ArteCategoryFilmsDTO dto) { ListeFilme listeFilme = new ListeFilme(); Collection futureFilme = new ArrayList<>(); dto.getProgramIds().forEach(programId -> { try { futureFilme.add(new ArteProgramIdToDatenFilmCallable(programId, LANG_CODE, getSendername()).call()); } catch (Exception exception) { LOG.error("Es ist ein Fehler beim lesen der Arte Filme aufgetreten.", exception); } }); CopyOnWriteArrayList finishedFilme = new CopyOnWriteArrayList<>(); futureFilme.parallelStream().forEach(finishedFilm -> { try { if (finishedFilm != null) { finishedFilme.add(finishedFilm); } } catch (Exception exception) { LOG.error("Es ist ein Fehler beim lesen der Arte Filme aufgetreten.", exception); } }); listeFilme.addAll(finishedFilme); return listeFilme; } private ArteCategoryFilmsDTO loadSubCategoryPage(Gson gson, String aUrl) { return ArteHttpClient.executeRequest(LOG, gson, aUrl, ArteCategoryFilmsDTO.class); } } }




    © 2015 - 2025 Weber Informatics LLC | Privacy Policy