7
7
import de .mediathekview .mlib .daten .DatenFilm ;
8
8
import de .mediathekview .mlib .daten .ListeFilme ;
9
9
import de .mediathekview .mlib .tool .Log ;
10
- import java .time .LocalDate ;
11
- import java .time .format .DateTimeFormatter ;
12
- import java .util .ArrayList ;
13
- import java .util .Collection ;
14
- import java .util .HashMap ;
15
- import java .util .List ;
16
- import java .util .Map ;
17
- import java .util .Objects ;
18
- import java .util .Set ;
19
- import java .util .stream .Collectors ;
20
-
21
10
import mServer .crawler .CrawlerTool ;
22
11
import mServer .crawler .FilmeSuchen ;
23
12
import mServer .crawler .sender .MediathekReader ;
24
13
import org .apache .logging .log4j .LogManager ;
25
14
import org .apache .logging .log4j .Logger ;
26
15
16
+ import java .time .LocalDate ;
17
+ import java .time .format .DateTimeFormatter ;
18
+ import java .util .*;
19
+ import java .util .stream .Collectors ;
20
+
27
21
public class MediathekArte extends MediathekReader {
28
22
29
23
/*
30
- * Informationen zu den ARTE-URLs:
31
- * {} sind nur Makierungen, dass es Platzhalter sind, sie gehören nicht zur URL.
32
- *
33
- * Allgemeine URL eines Films: (050169-002-A = ID des Films); (die-spur-der-steine = Titel)
34
- * http://www.arte.tv/de/videos/{050169-002-A}/{die-spur-der-steine}
35
- *
36
- * Alle Sendungen: (Deutsch = DE; Französisch = FR)
37
- * https://api.arte.tv/api/opa/v3/videos?channel={DE}
38
- *
39
- * Informationen zum Film: (050169-002-A = ID des Films); (de für deutsch / fr für französisch)
40
- * https://api.arte.tv/api/player/v1/config/{de}/{050169-002-A}?platform=ARTE_NEXT
41
- *
42
- * Zweite Quelle für Informationen zum Film: (050169-002-A = ID des Films); (de für deutsch / fr für französisch)
43
- * https://api.arte.tv/api/opa/v3/programs/{de}/{050169-002-A}
44
- *
45
- * Hintergrundinfos zum Laden der Filme nach Kategorien im langen Lauf:
46
- * 1. statische Informationen über verfügbare Kategorien laden: URL_STATIC_CONTENT
47
- * 2. für jede Kategorie die Unterkategorien ermitteln: URL_CATEGORY
48
- * 3. für jede Unterkategorie die enthaltenen ProgramId ermitteln: URL_SUBCATEGORY
49
- * 4. für alle ProgramIds die Videoinformationen laden (wie kurze Variante)
24
+ * Informationen zu den ARTE-URLs:
25
+ * {} sind nur Makierungen, dass es Platzhalter sind, sie gehören nicht zur URL.
26
+ *
27
+ * Allgemeine URL eines Films: (050169-002-A = ID des Films); (die-spur-der-steine = Titel)
28
+ * http://www.arte.tv/de/videos/{050169-002-A}/{die-spur-der-steine}
29
+ *
30
+ * Alle Sendungen: (Deutsch = DE; Französisch = FR)
31
+ * https://api.arte.tv/api/opa/v3/videos?channel={DE}
32
+ *
33
+ * Informationen zum Film: (050169-002-A = ID des Films); (de für deutsch / fr für französisch)
34
+ * https://api.arte.tv/api/player/v1/config/{de}/{050169-002-A}?platform=ARTE_NEXT
35
+ *
36
+ * Zweite Quelle für Informationen zum Film: (050169-002-A = ID des Films); (de für deutsch / fr für französisch)
37
+ * https://api.arte.tv/api/opa/v3/programs/{de}/{050169-002-A}
38
+ *
39
+ * Hintergrundinfos zum Laden der Filme nach Kategorien im langen Lauf:
40
+ * 1. statische Informationen über verfügbare Kategorien laden: URL_STATIC_CONTENT
41
+ * 2. für jede Kategorie die Unterkategorien ermitteln: URL_CATEGORY
42
+ * 3. für jede Unterkategorie die enthaltenen ProgramId ermitteln: URL_SUBCATEGORY
43
+ * 4. für alle ProgramIds die Videoinformationen laden (wie kurze Variante)
50
44
*/
51
45
private static final Logger LOG = LogManager .getLogger (MediathekArte .class );
52
46
private static final String ARTE_API_TAG_URL_PATTERN = "https://api.arte.tv/api/opa/v3/videos?channel=%s&arteSchedulingDay=%s" ;
@@ -66,6 +60,8 @@ public class MediathekArte extends MediathekReader {
66
60
"CIV" , "LGP" , "XXE"
67
61
};
68
62
63
+ private static final String COLLECTION_URL = "https://api.arte.tv/api/opa/v3/programs/%s/%s" ;
64
+
69
65
private static final DateTimeFormatter ARTE_API_DATEFORMATTER = DateTimeFormatter .ofPattern ("yyyy-MM-dd" );
70
66
private static final boolean PARSE_SUBCATEGORY_SUB_PAGES = false ; // Flag, ob Unterseiten der Unterkategorien verarbeitet werden soll
71
67
@@ -152,7 +148,7 @@ private void addCategories() {
152
148
senderLanguages .forEach ((sender , langCode ) -> {
153
149
for (String subCategory : SUBCATEGORIES ) {
154
150
String subCategoryUrl = String .format (URL_SUBCATEGORY , langCode .toLowerCase (), subCategory , 1 );
155
- listeThemen .add (new String []{sender , langCode , subCategory , subCategoryUrl });
151
+ listeThemen .add (new String []{sender , langCode , subCategory , subCategoryUrl });
156
152
}
157
153
});
158
154
}
@@ -209,6 +205,7 @@ private void addFilmeForTag(String sender, String aUrl) {
209
205
*/
210
206
class CategoryLoader extends Thread {
211
207
208
+
212
209
@ Override
213
210
public void run () {
214
211
try {
@@ -225,19 +222,27 @@ public void run() {
225
222
}
226
223
227
224
private void loadSubCategory (String sender , String langCode , String aCategory , String aUrl ) {
228
- Gson gson = new GsonBuilder ().registerTypeAdapter (ArteCategoryFilmsDTO .class , new ArteCategoryFilmListDeserializer ()).create ();
225
+ Gson gson = new GsonBuilder ()
226
+ .registerTypeAdapter (ArteCategoryFilmsDTO .class , new ArteCategoryFilmListDeserializer ())
227
+ .create ();
228
+ Gson gsonCollection = new GsonBuilder ()
229
+ .registerTypeAdapter (ArteCategoryFilmsDTO .class , new ArteCollectionDeserializer ())
230
+ .create ();
229
231
230
232
// erste Seite laden
231
233
int i = 2 ;
232
234
ArteCategoryFilmsDTO dto = loadSubCategoryPage (gson , sender , aUrl );
233
235
if (dto != null ) {
236
+ loadCollections (sender , langCode , gsonCollection , dto );
237
+
234
238
ArteCategoryFilmsDTO nextDto = dto ;
235
239
while (PARSE_SUBCATEGORY_SUB_PAGES && nextDto != null && nextDto .hasNextPage ()) {
236
240
237
241
// weitere Seiten laden und zu programId-liste des ersten DTO hinzufügen
238
242
String url = String .format (URL_SUBCATEGORY , langCode .toLowerCase (), aCategory , i );
239
243
nextDto = loadSubCategoryPage (gson , sender , url );
240
244
if (nextDto != null ) {
245
+ loadCollections (sender , langCode , gsonCollection , nextDto );
241
246
nextDto .getProgramIds ().forEach (programId -> dto .addProgramId (programId ));
242
247
}
243
248
@@ -251,6 +256,20 @@ private void loadSubCategory(String sender, String langCode, String aCategory, S
251
256
}
252
257
}
253
258
259
+ private void loadCollections (String sender , String langCode , Gson gson , ArteCategoryFilmsDTO dto ) {
260
+ dto .getCollectionIds ().forEach (collectionId -> {
261
+ final String url = String .format (COLLECTION_URL , langCode , collectionId );
262
+ try {
263
+ final ArteCategoryFilmsDTO collectionDto = ArteHttpClient .executeRequest (sender , LOG , gson , url , ArteCategoryFilmsDTO .class );
264
+ if (collectionDto != null ) {
265
+ collectionDto .getProgramIds ().forEach (dto ::addProgramId );
266
+ }
267
+ } catch (Exception e ) {
268
+ Log .errorLog (894330855 , e , url );
269
+ }
270
+ });
271
+ }
272
+
254
273
private ListeFilme loadPrograms (String sender , String langCode , ArteCategoryFilmsDTO dto ) {
255
274
ListeFilme listeFilme = new ListeFilme ();
256
275
0 commit comments