diff --git a/MServer-Config.yaml b/MServer-Config.yaml index 1cfa05b8e..f76c79ef4 100644 --- a/MServer-Config.yaml +++ b/MServer-Config.yaml @@ -32,6 +32,12 @@ senderIncluded: # list of films to be ignored by crawler search ignoreFilmlistPath: "ignoreFilmlist.txt" +# list of livestreams to be added +importLivestreamConfiguration: + active: false + path: "live-streams.json" + format: OLD_JSON + # The formats in which the filmlist should be saved to. # Possible are: JSON, OLD_JSON, JSON_COMPRESSED_XZ, OLD_JSON_COMPRESSED_XZ, JSON_COMPRESSED_GZIP, OLD_JSON_COMPRESSED_BZIP, JSON_COMPRESSED_GZIP, OLD_JSON_COMPRESSED_BZIP filmlistSaveFormats: diff --git a/src/main/java/de/mediathekview/mserver/base/config/ImportLivestreamConfiguration.java b/src/main/java/de/mediathekview/mserver/base/config/ImportLivestreamConfiguration.java new file mode 100644 index 000000000..e3fd898cc --- /dev/null +++ b/src/main/java/de/mediathekview/mserver/base/config/ImportLivestreamConfiguration.java @@ -0,0 +1,58 @@ +package de.mediathekview.mserver.base.config; + +import java.util.Objects; + +import de.mediathekview.mlib.filmlisten.FilmlistFormats; + +public class ImportLivestreamConfiguration { + private final Boolean active; + private final String path; + private final FilmlistFormats format; + + public ImportLivestreamConfiguration(Boolean active, String path, FilmlistFormats format) { + this.active = active; + this.path = path; + this.format = format; + } + + public ImportLivestreamConfiguration() { + this.active = null; + this.path = null; + this.format = null; + } + + public Boolean isActive() { + return active; + } + public String getPath() { + return path; + } + public FilmlistFormats getFormat() { + return format; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof final ImportLivestreamConfiguration that)) { + return false; + } + if (!super.equals(obj)) { + return false; + } + return Objects.equals(isActive(), that.isActive()) + && Objects.equals(getPath(), that.getPath()) + && Objects.equals(getFormat(), that.getFormat()); + } + + @Override + public int hashCode() { + return Objects.hash( + super.hashCode(), + isActive(), + getPath(), + getFormat()); + } +} diff --git a/src/main/java/de/mediathekview/mserver/base/config/MServerConfigDTO.java b/src/main/java/de/mediathekview/mserver/base/config/MServerConfigDTO.java index edba1decf..c23f4b762 100644 --- a/src/main/java/de/mediathekview/mserver/base/config/MServerConfigDTO.java +++ b/src/main/java/de/mediathekview/mserver/base/config/MServerConfigDTO.java @@ -16,6 +16,8 @@ public class MServerConfigDTO extends MServerBasicConfigDTO implements ConfigDTO private final String filmlistIdFilePath; /** ignore certain film by title **/ private final String ignoreFilmlistPath; + /** add livestreams from external list **/ + private final ImportLivestreamConfiguration importLivestreamConfiguration; /** The maximum amount of cpu threads to be used. */ private Integer maximumCpuThreads; /** @@ -86,7 +88,8 @@ public MServerConfigDTO() { writeFilmlistIdFileEnabled = true; filmlistIdFilePath = "filmlist.id"; ignoreFilmlistPath = "ignoreFilmlist.txt"; - + importLivestreamConfiguration = new ImportLivestreamConfiguration(false, "live-streams.json", FilmlistFormats.OLD_JSON); + Arrays.stream(Sender.values()) .forEach(sender -> senderConfigurations.put(sender, new MServerBasicConfigDTO(this))); } @@ -235,6 +238,11 @@ public String getIgnoreFilmslistPath() { return ignoreFilmlistPath; } + public ImportLivestreamConfiguration getImportLivestreamConfiguration() { + return importLivestreamConfiguration; + } + + /** * Loads the {@link Sender} specific configuration and if it not exist creates one. * @@ -285,7 +293,8 @@ && getFilmlistImportFormat() == that.getFilmlistImportFormat() && Objects.equals(getFilmlistHashFilePath(), that.getFilmlistHashFilePath()) && Objects.equals(getWriteFilmlistIdFileEnabled(), that.getWriteFilmlistIdFileEnabled()) && Objects.equals(getFilmlistIdFilePath(), that.getFilmlistIdFilePath()) - && Objects.equals(getIgnoreFilmslistPath(), that.getIgnoreFilmslistPath()); + && Objects.equals(getIgnoreFilmslistPath(), that.getIgnoreFilmslistPath()) + && Objects.equals(getImportLivestreamConfiguration(), that.getImportLivestreamConfiguration()); } @Override @@ -310,7 +319,8 @@ public int hashCode() { getFilmlistHashFilePath(), getWriteFilmlistIdFileEnabled(), getFilmlistIdFilePath(), - getIgnoreFilmslistPath()); + getIgnoreFilmslistPath(), + getImportLivestreamConfiguration()); } public void initializeSenderConfigurations() { diff --git a/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java b/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java index 00e4639c0..9ea05f9f3 100644 --- a/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java +++ b/src/main/java/de/mediathekview/mserver/crawler/CrawlerManager.java @@ -155,6 +155,30 @@ public void importFilmlist() { importFilmlist(config.getFilmlistImportFormat(), config.getFilmlistImportLocation()); } } + + public void importLivestreamFilmlist() { + if (Boolean.TRUE.equals(config.getImportLivestreamConfiguration().isActive())) { + importLivestreamFilmlist(config.getImportLivestreamConfiguration().getFormat(), config.getImportLivestreamConfiguration().getPath()); + } + } + + public void importLivestreamFilmlist(final FilmlistFormats aFormat, final String aFilmlistLocation) { + try { + final Optional importedFilmlist; + if (aFilmlistLocation.startsWith(HTTP)) { + importedFilmlist = importFilmListFromURl(aFormat, aFilmlistLocation); + } else { + importedFilmlist = importFilmlistFromFile(aFormat, aFilmlistLocation); + } + // remove livestreams + filmlist.getFilms().entrySet().removeIf(entry -> entry.getValue().getThema().equalsIgnoreCase("Livestream")); + // add new + importedFilmlist.ifPresent( imp -> imp.getFilms().entrySet().forEach( entry -> filmlist.add(entry.getValue()))); + // + } catch (final IOException ioException) { + LOG.fatal(String.format(FILMLIST_IMPORT_ERROR_TEMPLATE, aFilmlistLocation), ioException); + } + } /** * Imports the film list with the given {@link FilmlistFormats} and the given location. @@ -503,4 +527,9 @@ private void runCrawlers(final AbstractCrawler... aCrawlers) { Thread.currentThread().interrupt(); } } + + // Added to allow JUNIT tests + public Filmlist getFilmlist() { + return filmlist; + } } diff --git a/src/main/java/de/mediathekview/mserver/ui/config/MServerConfigUI.java b/src/main/java/de/mediathekview/mserver/ui/config/MServerConfigUI.java index a8bcd8f2e..5a07fc7af 100644 --- a/src/main/java/de/mediathekview/mserver/ui/config/MServerConfigUI.java +++ b/src/main/java/de/mediathekview/mserver/ui/config/MServerConfigUI.java @@ -101,6 +101,9 @@ void start() { if (config.getFilmlistImporEnabled() != null && config.getFilmlistImporEnabled()) { manager.importFilmlist(); } + if (Boolean.TRUE.equals(config.getImportLivestreamConfiguration().isActive())) { + manager.importLivestreamFilmlist(); + } } finally { manager.filterFilmlist(); manager.saveFilmlist(); diff --git a/src/main/resources/MServer-Config.yaml b/src/main/resources/MServer-Config.yaml index 2c740e040..a08211881 100644 --- a/src/main/resources/MServer-Config.yaml +++ b/src/main/resources/MServer-Config.yaml @@ -26,6 +26,12 @@ senderIncluded: # list of films to be ignored by crawler search ignoreFilmlistPath: "ignoreFilmlist.txt" +# list of livestreams to be added +importLivestreamConfiguration: + active: false + path: "src/main/resources/live-streams.json" + format: OLD_JSON + # The formats in which the filmlist should be saved to. # Possible are: JSON, OLD_JSON, JSON_COMPRESSED_XZ, OLD_JSON_COMPRESSED_XZ, JSON_COMPRESSED_GZIP, OLD_JSON_COMPRESSED_BZIP, JSON_COMPRESSED_GZIP, OLD_JSON_COMPRESSED_BZIP filmlistSaveFormats: diff --git a/src/main/resources/live-streams.json b/src/main/resources/live-streams.json new file mode 100644 index 000000000..303906445 --- /dev/null +++ b/src/main/resources/live-streams.json @@ -0,0 +1 @@ +{"Filmliste":["20.08.2023, 14:22","20.08.2023, 14:22","3.1.213"," [Vers.: 3.1.213 ]","b37878aa-d85f-41d1-89ab-053ccf278b2f"],"Filmliste":["Sender","Thema","Titel","Datum","Zeit","Dauer","Größe [MB]","Beschreibung","Url","Website","Url Untertitel","Url RTMP","Url Klein","Url RTMP Klein","Url HD","Url RTMP HD","DatumL","Url History","Geo","neu"],"X":["ARD","Livestream","tagesschau24 Livestream","","","00:00:00","0","","https://tagesschau.akamaized.net/hls/live/2020115/tagesschau/tagesschau_1/master.m3u8","","","","","","","","0","","","false"],"X":["","","ARD-alpha Livestream","","","00:00:00","0","","https://mcdn.br.de/br/fs/ard_alpha/hls/de/master.m3u8","","","","","","","","0","","","false"],"X":["","","one HD Livestream","","","00:00:00","0","","https://mcdn.one.ard.de/ardone/hls/master.m3u8","","","","","","","","0","","","false"],"X":["","","Das Erste HD Livestream","","","00:00:00","0","","https://mcdn.daserste.de/daserste/de/master.m3u8","","","","","","","","0","","","false"],"X":["ARTE.DE","","ARTE HD Livestream","","","00:00:00","0","","https://artesimulcast.akamaized.net/hls/live/2030993/artelive_de/master.m3u8","","","","","","","","0","","","false"],"X":["ARTE.FR","","ARTE HD (FR) Livestream","","","00:00:00","0","","https://artesimulcast.akamaized.net/hls/live/2031003/artelive_fr/master.m3u8","","","","","","","","0","","","false"],"X":["BR","","BR Fernsehen Nord HD Livestream","","","00:00:00","0","","https://mcdn.br.de/br/fs/bfs_nord/hls/de/master.m3u8","","","","","","","","0","","","false"],"X":["","","BR Fernsehen Süd HD Livestream","","","00:00:00","0","","https://brcdn.vo.llnwd.net/br/fs/bfs_sued/hls/de/master.m3u8","","","","","","","","0","","","false"],"X":["3Sat","","3sat Livestream","","","00:00:00","0","","https://zdf-hls-18.akamaized.net/hls/live/2016501/dach/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["DW","","Deutsche Welle Livestream","","","00:00:00","0","","https://dwamdstream111.akamaized.net/hls/live/2017972/dwstream111/index.m3u8","","","","","","","","0","","","false"],"X":["","","Deutsche Welle (ES) Livestream","","","00:00:00","0","","https://dwamdstream109.akamaized.net/hls/live/2017970/dwstream109/index.m3u8","","","","","","","","0","","","false"],"X":["","","Deutsche Welle+ Livestream","","","00:00:00","0","","https://dwamdstream110.akamaized.net/hls/live/2017971/dwstream110/index.m3u8","","","","","","","","0","","","false"],"X":["","","Deutsche Welle (EN) Livestream","","","00:00:00","0","","https://dwamdstream107.akamaized.net/hls/live/2017968/dwstream107/index.m3u8","","","","","","","","0","","","false"],"X":["HR","","hr-fernsehen Livestream","","","00:00:00","0","","https://hrhlsde.akamaized.net/hls/live/2024526/hrhlsde/index.m3u8","","","","","","","","0","","","false"],"X":["KiKA","","KiKA Livestream","","","00:00:00","0","","https://kikageohls.akamaized.net/hls/live/2022693/livetvkika_de/master.m3u8","","","","","","","","0","","","false"],"X":["MDR","","MDR Sachsen HD Livestream","","","00:00:00","0","","https://mdrtvsnhls.akamaized.net/hls/live/2016928/mdrtvsn/index.m3u8","","","","","","","","0","","","false"],"X":["","","MDR Thüringen HD Livestream","","","00:00:00","0","","https://mdrtvthhls.akamaized.net/hls/live/2016880/mdrtvth/index.m3u8","","","","","","","","0","","","false"],"X":["","","MDR Sachsen-Anhalt HD Livestream","","","00:00:00","0","","https://mdrtvsahls.akamaized.net/hls/live/2016879/mdrtvsa/index.m3u8","","","","","","","","0","","","false"],"X":["NDR","","NDR Schleswig-Holstein HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_sh/master.m3u8","","","","","","","","0","","","false"],"X":["","","NDR Mecklenburg-Vorpommern HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_mv/master.m3u8","","","","","","","","0","","","false"],"X":["","","NDR Niedersachsen HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_nds/master.m3u8","","","","","","","","0","","","false"],"X":["","","NDR Hamburg HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_hh/master.m3u8","","","","","","","","0","","","false"],"X":["ORF","","ORF eins HD Livestream","","","00:00:00","0","","https://orf1.mdn.ors.at/out/u/orf1/q6a/manifest_6.m3u8","","","","","","","","0","","","false"],"X":["","","ORF SPORT + Livestream","","","00:00:00","0","","https://orfs.mdn.ors.at/out/u/orfs/q6a/manifest_6.m3u8","","","","","","","","0","","","false"],"X":["","","ORF III HD Livestream","","","00:00:00","0","","https://orf3.mdn.ors.at/out/u/orf3/q6a/manifest_6.m3u8","","","","","","","","0","","","false"],"X":["","","ORF 2 HD Livestream","","","00:00:00","0","","https://orf2.mdn.ors.at/out/u/orf2/qxb/manifest.m3u8","","","","","","","","0","","","false"],"X":["PHOENIX","","phoenix Livestream","","","00:00:00","0","","https://zdf-hls-19.akamaized.net/hls/live/2016502/de/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["RBB","","rbb Brandenburg HD Livestream","","","00:00:00","0","","https://rbb-hls-brandenburg.akamaized.net/hls/live/2017825/rbb_brandenburg/master.m3u8","","","","","","","","0","","","false"],"X":["","","rbb Berlin HD Livestream","","","00:00:00","0","","https://rbb-hls-berlin.akamaized.net/hls/live/2017824/rbb_berlin/master.m3u8","","","","","","","","0","","","false"],"X":["SR","","SR Fernsehen HD Livestream","","","00:00:00","0","","https://srfs.akamaized.net/hls/live/689649/srfsgeo/index.m3u8","","","","","","","","0","","","false"],"X":["SWR","","SWR Rheinland-Pfalz HD Livestream","","","00:00:00","0","","https://swrrpd-hls.akamaized.net/hls/live/2018676/swrrpd/master.m3u8","","","","","","","","0","","","false"],"X":["","","SWR Baden-Württemberg HD Livestream","","","00:00:00","0","","https://swrbwd-hls.akamaized.net/hls/live/2018672/swrbwd/master.m3u8","","","","","","","","0","","","false"],"X":["WDR","","WDR Aachen HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018019-b/wdrlz_aachen/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Köln HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2023550-b/wdrlz_koeln/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Duisburg HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018024-b/wdrlz_duisburg/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR HD Livestream","","","00:00:00","0","","https://wdrfs247.akamaized.net/hls/live/681509/wdr_msl4_fs247/index.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Ruhr HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018027-b/wdrlz_essen/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Düsseldorf HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018023-b/wdrlz_duesseldorf/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Bonn HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018021-b/wdrlz_bonn/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Dortmund HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018022-b/wdrlz_dortmund/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Bergisches Land HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018028-b/wdrlz_wuppertal/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Münsterland HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018025-b/wdrlz_muensterland/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Ostwestfalen HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018026-b/wdrlz_bielefeld/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Südwestfalen HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018020-b/wdrlz_siegen/master.m3u8","","","","","","","","0","","","false"],"X":["ZDF","","ZDF HD Livestream","","","00:00:00","0","","https://zdf-hls-15.akamaized.net/hls/live/2016498/de/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["","","ZDFinfo HD Livestream","","","00:00:00","0","","https://zdf-hls-17.akamaized.net/hls/live/2016500/de/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["","","ZDFneo HD Livestream","","","00:00:00","0","","https://zdf-hls-16.akamaized.net/hls/live/2016499/de/veryhigh/master.m3u8","","","","","","","","0","","","false"]} \ No newline at end of file diff --git a/src/test/java/de/mediathekview/mserver/crawler/CrawlerManagerLivestreamTest.java b/src/test/java/de/mediathekview/mserver/crawler/CrawlerManagerLivestreamTest.java new file mode 100644 index 000000000..2c376b710 --- /dev/null +++ b/src/test/java/de/mediathekview/mserver/crawler/CrawlerManagerLivestreamTest.java @@ -0,0 +1,119 @@ +package de.mediathekview.mserver.crawler; + +import de.mediathekview.mlib.filmlisten.FilmlistFormats; +import de.mediathekview.mlib.messages.Message; +import de.mediathekview.mlib.messages.MessageTypes; +import de.mediathekview.mlib.messages.MessageUtil; +import de.mediathekview.mlib.messages.listener.MessageListener; +import de.mediathekview.mserver.testhelper.FileReader; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.params.provider.Arguments.arguments; +import static org.junit.jupiter.api.Assertions.fail; + + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Comparator; +import java.util.Date; +import java.util.stream.Stream; + + +public class CrawlerManagerLivestreamTest implements MessageListener { + + private static final Logger LOG = LogManager.getLogger(CrawlerManagerLivestreamTest.class); + private static final String TEMP_FOLDER_NAME_PATTERN = "MSERVER_TEST_%d"; + private static Path testFileFolderPath; + + static Stream getTestArgumentForFilmlistsInDifferentFormats() { + return Stream.of( + arguments(FilmlistFormats.JSON, "filmlists/TestFilmlistNewJson.json", "filmlists/livestream/live-streams.json", 3, 50), + arguments(FilmlistFormats.JSON_COMPRESSED_XZ, "filmlists/TestFilmlistNewJson.json.xz", "filmlists/livestream/live-streams.json.xz", 3, 50), + arguments(FilmlistFormats.JSON_COMPRESSED_BZIP, "filmlists/TestFilmlistNewJson.json.bz", "filmlists/livestream/live-streams.json.bz", 3, 50), + arguments(FilmlistFormats.JSON_COMPRESSED_GZIP, "filmlists/TestFilmlistNewJson.json.gz", "filmlists/livestream/live-streams.json.gz", 3, 50), + arguments(FilmlistFormats.OLD_JSON, "filmlists/TestFilmlist.json", "filmlists/livestream/live-streams_old.json", 3, 50), + arguments(FilmlistFormats.OLD_JSON_COMPRESSED_XZ, "filmlists/TestFilmlist.json.xz", "filmlists/livestream/live-streams_old.json.xz", 3, 50), + arguments(FilmlistFormats.OLD_JSON_COMPRESSED_BZIP, "filmlists/TestFilmlist.json.bz", "filmlists/livestream/live-streams_old.json.bz", 3, 50), + arguments(FilmlistFormats.OLD_JSON_COMPRESSED_GZIP, "filmlists/TestFilmlist.json.gz", "filmlists/livestream/live-streams_old.json.gz", 3, 50), + arguments(FilmlistFormats.JSON, "filmlists/livestream/live-streams.json", "filmlists/livestream/live-streams.json", 47, 47) + ); + } + + @ParameterizedTest + @Execution(ExecutionMode.SAME_THREAD) + @MethodSource("getTestArgumentForFilmlistsInDifferentFormats") + public void testSaveAndImport(final FilmlistFormats format, final String filmlistPath,final String livestreamPath, final int expectedInitialSize, final int expectedAfterImport) { + CrawlerManager crawlerManagerForEachRun = createEmptyCrawlerManager(); + final Path filmListFilePath = FileReader.getPath(filmlistPath); + final Path livestreamFilmListFilePath = FileReader.getPath(livestreamPath); + crawlerManagerForEachRun.addMessageListener(this); + crawlerManagerForEachRun.importFilmlist(format, filmListFilePath.toAbsolutePath().toString()); + // + assertThat(crawlerManagerForEachRun.getFilmlist().getFilms()).hasSize(expectedInitialSize); + // + crawlerManagerForEachRun.importLivestreamFilmlist(format, livestreamFilmListFilePath.toAbsolutePath().toString()); + // + assertThat(crawlerManagerForEachRun.getFilmlist().getFilms()).hasSize(expectedAfterImport); + // + crawlerManagerForEachRun.saveFilmlist(testFileFolderPath.resolve(filmlistPath), format); + // + assertThat(testFileFolderPath.resolve(filmlistPath)).exists(); + } + + public CrawlerManager createEmptyCrawlerManager() { + // reset singelton CrawlerManager to have an empty filmlist + Field instance; + try { + instance = CrawlerManager.class.getDeclaredField("instance"); + instance.setAccessible(true); + instance.set(null, null); + } catch (Exception e) { + fail("Exception mooking crawler manager: " + e.getMessage()); + } // + return CrawlerManager.getInstance(); + } + + @AfterAll + public static void deleteTempFiles() throws IOException { + Files.walk(testFileFolderPath) + .sorted(Comparator.reverseOrder()) + .map(Path::toFile) + .forEach(File::delete); + } + + @BeforeAll + public static void initTestData() throws Exception { + testFileFolderPath = Files.createTempDirectory(formatWithDate(TEMP_FOLDER_NAME_PATTERN)); + Files.createDirectory(testFileFolderPath.resolve("filmlists")); + } + + private static String formatWithDate(final String aPattern) { + return String.format(aPattern, new Date().getTime()); + } + + @Override + public void consumeMessage(final Message aMessage, final Object... aParameters) { + if (MessageTypes.FATAL_ERROR.equals(aMessage.getMessageType())) { + fail(String.format(MessageUtil.getInstance().loadMessageText(aMessage), aParameters)); + } else { + LOG.info( + String.format( + "%s: %s", + aMessage.getMessageType().name(), + String.format(MessageUtil.getInstance().loadMessageText(aMessage), aParameters))); + } + } + +} diff --git a/src/test/java/de/mediathekview/mserver/crawler/CrawlerManagerTest.java b/src/test/java/de/mediathekview/mserver/crawler/CrawlerManagerTest.java index 9085ef0f8..74c8ff5bb 100644 --- a/src/test/java/de/mediathekview/mserver/crawler/CrawlerManagerTest.java +++ b/src/test/java/de/mediathekview/mserver/crawler/CrawlerManagerTest.java @@ -17,44 +17,57 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Arrays; import java.util.Collection; import java.util.Comparator; import java.util.Date; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.fail; @RunWith(Parameterized.class) public class CrawlerManagerTest implements MessageListener { private static final Logger LOG = LogManager.getLogger(CrawlerManagerTest.class); private static final String TEMP_FOLDER_NAME_PATTERN = "MSERVER_TEST_%d"; - private static final CrawlerManager CRAWLER_MANAGER = CrawlerManager.getInstance(); private static Path testFileFolderPath; + private final CrawlerManager CRAWLER_MANAGER; private final String filmlistPath; private final FilmlistFormats format; + private final int expectedSize; - public CrawlerManagerTest(final String aFilmlistPath, final FilmlistFormats aFormat) { + public CrawlerManagerTest(final String aFilmlistPath, final FilmlistFormats aFormat, final int aExpectedSize) { filmlistPath = aFilmlistPath; + expectedSize = aExpectedSize; format = aFormat; + // reset singelton CrawlerManager + Field instance; + try { + instance = CrawlerManager.class.getDeclaredField("instance"); + instance.setAccessible(true); + instance.set(null, null); + } catch (Exception e) { + fail("Exception mooking crawler manager: " + e.getMessage()); + } // + CRAWLER_MANAGER = CrawlerManager.getInstance(); } @Parameterized.Parameters(name = "Test {index} Filmlist for {0} with {1}") public static Collection data() { return Arrays.asList( new Object[][] { - {"filmlists/TestFilmlistNewJson.json", FilmlistFormats.JSON}, - {"filmlists/TestFilmlistNewJson.json.xz", FilmlistFormats.JSON_COMPRESSED_XZ}, - {"filmlists/TestFilmlistNewJson.json.bz", FilmlistFormats.JSON_COMPRESSED_BZIP}, - {"filmlists/TestFilmlistNewJson.json.gz", FilmlistFormats.JSON_COMPRESSED_GZIP}, - {"filmlists/TestFilmlist.json", FilmlistFormats.OLD_JSON}, - {"filmlists/TestFilmlist.json.xz", FilmlistFormats.OLD_JSON_COMPRESSED_XZ}, - {"filmlists/TestFilmlist.json.bz", FilmlistFormats.OLD_JSON_COMPRESSED_BZIP}, - {"filmlists/TestFilmlist.json.gz", FilmlistFormats.OLD_JSON_COMPRESSED_GZIP} + {"filmlists/TestFilmlistNewJson.json", FilmlistFormats.JSON,3}, + {"filmlists/TestFilmlistNewJson.json.xz", FilmlistFormats.JSON_COMPRESSED_XZ, 3}, + {"filmlists/TestFilmlistNewJson.json.bz", FilmlistFormats.JSON_COMPRESSED_BZIP, 3}, + {"filmlists/TestFilmlistNewJson.json.gz", FilmlistFormats.JSON_COMPRESSED_GZIP, 3}, + {"filmlists/TestFilmlist.json", FilmlistFormats.OLD_JSON, 3}, + {"filmlists/TestFilmlist.json.xz", FilmlistFormats.OLD_JSON_COMPRESSED_XZ, 3}, + {"filmlists/TestFilmlist.json.bz", FilmlistFormats.OLD_JSON_COMPRESSED_BZIP, 3}, + {"filmlists/TestFilmlist.json.gz", FilmlistFormats.OLD_JSON_COMPRESSED_GZIP, 3} }); } @@ -67,7 +80,7 @@ public static void deleteTempFiles() throws IOException { } @BeforeClass - public static void initTestData() throws IOException { + public static void initTestData() throws Exception { testFileFolderPath = Files.createTempDirectory(formatWithDate(TEMP_FOLDER_NAME_PATTERN)); Files.createDirectory(testFileFolderPath.resolve("filmlists")); } @@ -95,6 +108,7 @@ public void testSaveAndImport() { synchronized (CRAWLER_MANAGER) { CRAWLER_MANAGER.addMessageListener(this); CRAWLER_MANAGER.importFilmlist(format, filmListFilePath.toAbsolutePath().toString()); + assertThat(CRAWLER_MANAGER.getFilmlist().getFilms()).hasSize(expectedSize); CRAWLER_MANAGER.saveFilmlist(testFileFolderPath.resolve(filmlistPath), format); assertThat(testFileFolderPath.resolve(filmlistPath)).exists(); } diff --git a/src/test/resources/MServer-JUnit-Config.yaml b/src/test/resources/MServer-JUnit-Config.yaml index 718ade55f..960627267 100644 --- a/src/test/resources/MServer-JUnit-Config.yaml +++ b/src/test/resources/MServer-JUnit-Config.yaml @@ -16,6 +16,12 @@ maximumServerDurationInMinutes: 0 senderIncluded: - BR +# list of livestreams to be added +importLivestreamConfiguration: + active: false + path: "src/main/resources/live-streams.json" + format: OLD_JSON + # If set the server will be awake after the crawler run and restarts the run after the given amount. #schedules: # HalfDay: diff --git a/src/test/resources/MediathekView_Messages_de_DE.properties b/src/test/resources/MediathekView_Messages_de_DE.properties new file mode 100644 index 000000000..e1f461a5a --- /dev/null +++ b/src/test/resources/MediathekView_Messages_de_DE.properties @@ -0,0 +1,40 @@ +crawlerDocumentLoadError=Der Crawler f\u00FCr den Sender "%s" konnte die Seite "%s" aufgrund des HTTP Fehlers "%d" nicht laden. +crawlerEnd=FERTIG %s, dauer %d Minuten [Verarbeitet: %d, Fehler: %d, Fehlerquote: %.2f%%] +crawlerError=Es ist ein Fehler beim Crawlen des Senders %s aufgetreten. +crawlerProgress=%s %.2f%% davon %.2f%% Fehler innerhalb von %s. %s bis zum Ende. [Aktuell: %d, Maximal: %d, Fehler: %d, Fehlerquote: %.2f%%] +crawlerProgressWithTimeLimit=%s %.2f%% davon %.2f%% Fehler innerhalb von %s. %s bis zum Ende. %s bis Crawler Zeitlimit erreicht! [Aktuell: %d, Maximal: %d, Fehler: %d, Fehlerquote: %.2f%%] +crawlerStart=Beginne mit %s +crawlerTimeout=Der Crawler f\u00C3\u00BCr den Sender %s hat das Zeitlimit erreicht. +debugAllSendungCount=F\u00FCr %s konnten %d Sendungen gefunden werden. +debugAllSendungFolgenCount=F\u00FCr %s konnten insgesamt %d Folgen in allen Sendungen gefunden werden. +debugInvalidUrl=Bei der Bearbeitung von %s ist ein Fehler auf Grund einer fehlerhaften URL aufgetreten: "%s". +debugKika.convertingFinished=Konvertierung fertiggestellt. Beginn des letzten Schrittes der Erfassung der Videodetails f\u00FCr %s. +debugKika.sendungVerpasstOverviewPages=Sammeln der URLs f\u00FCr die \u00DCbersichtsseiten der "Sendung Verpasst" von %s. +debugKika.sendungsfolgenOverviewPages=%d Sendungen f\u00FCr %s gefunden. Die URLs f\u00FCr die Sendungsfolgen-\u00DCbersichtsseiten werden nun gesammelt. +debugKika.sendungsfolgenUrlConverting=Konvertierung der Sendungsfolgen-URLs in Video-Detail-URLs f\u00FCr %s. +debugKika.sendungsfolgenUrls=Gefunden %d Sendungsfolgen \u00DCbersichtsseiten f\u00FCr %s. Nun werden die URLs f\u00FCr die Sendungsfolgen gesammelt. +debugKika.senungVerpasstPages=%d "Sendung Verpasst" \u00DCbersichtsseiten von %s gefunden. +debugMissingElement=W\u00E4hrend der Bearbeitung von %s ist ein Fehler auf Grund eines Fehlenden Elements "%s" aufgetreten. +debugMissingSendungfolgenCount=F\u00FCr %s konnen %d Folgen im Bereich "Sendung verpasst" gefunden werden. +fileCopyError=Beim kopieren der Filmliste/n ist ein Fehler aufgetreten +fileCopyTargetExists=Beim kopieren der Filmliste/n ist "%s" bereits vorhanden und wird \u00FCberschrieben. +filmlistImportFileNoReadPermission=Die zu importierende Filmliste kann nicht importiert werden, da Dateirechte zum lesen fehlen. Bitte pr\u00FCfen Sie die Dateirechte folgender Datei: "%s" +filmlistImportFileNotFound=Es konnte keine Filmliste mit dem folgenden Pfad gefunden werden: "%s" +filmlistImportUrlInvalid=Die URL der zu importierenden Filmliste ist invalide. Bitte \u00FCberpr\u00FCfen Sie die folgende URL: "%s" +filmlistSavePathInvalid=Der folgende Pfad ist als Speicherziel f\u00FCr die Filmliste unzul\u00E4ssig. Bitte pr\u00FCfen Sie den Pfad: "%s" +filmlistSavePathMissingRights=Die Filmliste konnte aufgrund fehlender Dateirechte nicht geschrieben werden. Bitte pr\u00FCfen Sie die Dateirechte f\u00FCr: "%s" +formatNotInSaveFormats=Das f\u00FCr den Upload angegebene Filmlist Format %s ist nicht mit bei den Filmlist speicher Formaten aufgef\u00FChrt und kann somit nicht verwendet werden da es auch nicht generiert wird. +noFilmlistFormatConfigured=In der Konfiguration wurde kein Filmlisten Format angegeben. +noFilmlistImportFormatInConfig=In der Konfiguration ist kein Format f\u00FCr die zu importierende Filmliste angegeben. +noFilmlistImportLocationInConfig=In der Konfiguration ist kein/e Pfad/URL f\u00FCr die zu importierende Filmliste angegeben. +noFilmlistSavePathForFormatConfigured=In der Konfiguration wurde nicht angegeben, wo die Filmliste mit dem Format "%s" gespeichert werden soll. +noFilmlistSavePathsConfigured=In der Konfiguration wurde nicht angegebe, wo die Filmliste/n gespeichert werden sollen. +serverError=Es ist ein Fehler beim Crawlen aufgetreten. +serverTimeout=Der MServer hat das Zeitlimit erreicht. +uiGenerateDefaultConfigFileFailed=Die standard Konfiguration konnte nicht unter "%s" gespeichert werden. +uiToManyArguments=Es wurden mehr Programm Argumente angegeben als erwartet wurden. +uiUnknownArgument=Das Programm Argument "%s" ist nicht bekannt.\nFolgende Argumente k\u00F6nnen angegeben werden:\n"%s" - Erzeugt eine Konfigurationsdatei mit der standard Konfiguration. +debugParseFailure=Bei %s konnte "%s" nicht mit dem Pattern "%s" geparsed werde. +filmlistHashFileCantWrite=Die Filmlisten-Hash-Datei "%s" kann nicht geschrieben werden! +filmlistIdFileCantWrite=Die Filmlisten-Id-Datei "%s" kann nicht geschrieben werden! + diff --git a/src/test/resources/filmlists/livestream/live-streams.json b/src/test/resources/filmlists/livestream/live-streams.json new file mode 100644 index 000000000..57c047c54 --- /dev/null +++ b/src/test/resources/filmlists/livestream/live-streams.json @@ -0,0 +1 @@ +{"films":{"76bf4f71-e316-4eb2-a21f-fe3f847a5ab0":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://rbb-hls-brandenburg.akamaized.net/hls/live/2017825/rbb_brandenburg/master.m3u8","fileSize":0}},"uuid":"76bf4f71-e316-4eb2-a21f-fe3f847a5ab0","sender":"RBB","geoLocations":[],"titel":"rbb Brandenburg HD Livestream","thema":"Livestream","beschreibung":""},"9928dc16-c887-474e-ae5b-365c720de03f":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_sh/master.m3u8","fileSize":0}},"uuid":"9928dc16-c887-474e-ae5b-365c720de03f","sender":"NDR","geoLocations":[],"titel":"NDR Schleswig-Holstein HD Livestream","thema":"Livestream","beschreibung":""},"fe86050e-f20a-4e16-a1c0-a273fd6ef14a":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://orf1.mdn.ors.at/out/u/orf1/q6a/manifest_6.m3u8","fileSize":0}},"uuid":"fe86050e-f20a-4e16-a1c0-a273fd6ef14a","sender":"ORF","geoLocations":[],"titel":"ORF eins HD Livestream","thema":"Livestream","beschreibung":""},"276f1e16-74f6-49e2-8229-d5d4e46ab7fe":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mdrtvsnhls.akamaized.net/hls/live/2016928/mdrtvsn/index.m3u8","fileSize":0}},"uuid":"276f1e16-74f6-49e2-8229-d5d4e46ab7fe","sender":"MDR","geoLocations":[],"titel":"MDR Sachsen HD Livestream","thema":"Livestream","beschreibung":""},"9a151263-96d8-47b0-b5d4-5172b8f9fac4":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://artesimulcast.akamaized.net/hls/live/2031003/artelive_fr/master.m3u8","fileSize":0}},"uuid":"9a151263-96d8-47b0-b5d4-5172b8f9fac4","sender":"ARTE_FR","geoLocations":[],"titel":"ARTE HD (FR) Livestream","thema":"Livestream","beschreibung":""},"4ed2d99e-c7dd-4964-943d-6683ef78adb5":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://zdf-hls-19.akamaized.net/hls/live/2016502/de/veryhigh/master.m3u8","fileSize":0}},"uuid":"4ed2d99e-c7dd-4964-943d-6683ef78adb5","sender":"PHOENIX","geoLocations":[],"titel":"phoenix Livestream","thema":"Livestream","beschreibung":""},"f6f629a0-5b11-4766-9a28-6045487d52b6":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://dwamdstream111.akamaized.net/hls/live/2017972/dwstream111/index.m3u8","fileSize":0}},"uuid":"f6f629a0-5b11-4766-9a28-6045487d52b6","sender":"DW","geoLocations":[],"titel":"Deutsche Welle Livestream","thema":"Livestream","beschreibung":""},"e7a6d2fd-721f-4a86-8d77-ee40fbf59908":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://rbb-hls-berlin.akamaized.net/hls/live/2017824/rbb_berlin/master.m3u8","fileSize":0}},"uuid":"e7a6d2fd-721f-4a86-8d77-ee40fbf59908","sender":"RBB","geoLocations":[],"titel":"rbb Berlin HD Livestream","thema":"Livestream","beschreibung":""},"82bf5856-ff35-4116-ad6c-645806f26d46":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018019-b/wdrlz_aachen/master.m3u8","fileSize":0}},"uuid":"82bf5856-ff35-4116-ad6c-645806f26d46","sender":"WDR","geoLocations":[],"titel":"WDR Aachen HD Livestream","thema":"Livestream","beschreibung":""},"929853cf-bc9c-4f0a-8141-b88fdaf71133":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2023550-b/wdrlz_koeln/master.m3u8","fileSize":0}},"uuid":"929853cf-bc9c-4f0a-8141-b88fdaf71133","sender":"WDR","geoLocations":[],"titel":"WDR Köln HD Livestream","thema":"Livestream","beschreibung":""},"cfb418a1-f30d-4745-a745-9818899e8292":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018024-b/wdrlz_duisburg/master.m3u8","fileSize":0}},"uuid":"cfb418a1-f30d-4745-a745-9818899e8292","sender":"WDR","geoLocations":[],"titel":"WDR Duisburg HD Livestream","thema":"Livestream","beschreibung":""},"3beb2d7c-f906-4935-9806-291a095f96aa":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrfs247.akamaized.net/hls/live/681509/wdr_msl4_fs247/index.m3u8","fileSize":0}},"uuid":"3beb2d7c-f906-4935-9806-291a095f96aa","sender":"WDR","geoLocations":[],"titel":"WDR HD Livestream","thema":"Livestream","beschreibung":""},"47f88957-d426-4610-8714-843e45fcbd41":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://hrhlsde.akamaized.net/hls/live/2024526/hrhlsde/index.m3u8","fileSize":0}},"uuid":"47f88957-d426-4610-8714-843e45fcbd41","sender":"HR","geoLocations":[],"titel":"hr-fernsehen Livestream","thema":"Livestream","beschreibung":""},"35cb46d4-029d-44e6-a2bc-10516b33b735":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_mv/master.m3u8","fileSize":0}},"uuid":"35cb46d4-029d-44e6-a2bc-10516b33b735","sender":"NDR","geoLocations":[],"titel":"NDR Mecklenburg-Vorpommern HD Livestream","thema":"Livestream","beschreibung":""},"b129c988-a0ec-4464-aa1f-b52b66c1aa0c":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018027-b/wdrlz_essen/master.m3u8","fileSize":0}},"uuid":"b129c988-a0ec-4464-aa1f-b52b66c1aa0c","sender":"WDR","geoLocations":[],"titel":"WDR Ruhr HD Livestream","thema":"Livestream","beschreibung":""},"c1658423-b3d5-454a-a32f-be3cad24443e":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://artesimulcast.akamaized.net/hls/live/2030993/artelive_de/master.m3u8","fileSize":0}},"uuid":"c1658423-b3d5-454a-a32f-be3cad24443e","sender":"ARTE_DE","geoLocations":[],"titel":"ARTE HD Livestream","thema":"Livestream","beschreibung":""},"1ef238d3-d910-4852-84ba-bf89387b53fa":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mdrtvthhls.akamaized.net/hls/live/2016880/mdrtvth/index.m3u8","fileSize":0}},"uuid":"1ef238d3-d910-4852-84ba-bf89387b53fa","sender":"MDR","geoLocations":[],"titel":"MDR Thüringen HD Livestream","thema":"Livestream","beschreibung":""},"64c15469-2c36-49c0-803e-a2c314ee669f":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018023-b/wdrlz_duesseldorf/master.m3u8","fileSize":0}},"uuid":"64c15469-2c36-49c0-803e-a2c314ee669f","sender":"WDR","geoLocations":[],"titel":"WDR Düsseldorf HD Livestream","thema":"Livestream","beschreibung":""},"532e47dd-fb28-4dad-9cb2-625dc9e2d56c":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018021-b/wdrlz_bonn/master.m3u8","fileSize":0}},"uuid":"532e47dd-fb28-4dad-9cb2-625dc9e2d56c","sender":"WDR","geoLocations":[],"titel":"WDR Bonn HD Livestream","thema":"Livestream","beschreibung":""},"d16a5ac2-93a8-4875-a85f-be8fcc171eab":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://tagesschau.akamaized.net/hls/live/2020115/tagesschau/tagesschau_1/master.m3u8","fileSize":0}},"uuid":"d16a5ac2-93a8-4875-a85f-be8fcc171eab","sender":"ARD","geoLocations":[],"titel":"tagesschau24 Livestream","thema":"Livestream","beschreibung":""},"ddde7d4a-16a0-43d8-be95-6f814d350a17":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://srfs.akamaized.net/hls/live/689649/srfsgeo/index.m3u8","fileSize":0}},"uuid":"ddde7d4a-16a0-43d8-be95-6f814d350a17","sender":"SR","geoLocations":[],"titel":"SR Fernsehen HD Livestream","thema":"Livestream","beschreibung":""},"54e4b8c0-7692-40ff-b44f-084eec55e040":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://orfs.mdn.ors.at/out/u/orfs/q6a/manifest_6.m3u8","fileSize":0}},"uuid":"54e4b8c0-7692-40ff-b44f-084eec55e040","sender":"ORF","geoLocations":[],"titel":"ORF SPORT + Livestream","thema":"Livestream","beschreibung":""},"b0dd33aa-ad33-44bc-95d4-c3459b00f476":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.br.de/br/fs/ard_alpha/hls/de/master.m3u8","fileSize":0}},"uuid":"b0dd33aa-ad33-44bc-95d4-c3459b00f476","sender":"ARD","geoLocations":[],"titel":"ARD-alpha Livestream","thema":"Livestream","beschreibung":""},"635b4873-91fc-4fdd-b07f-2fa003424cf4":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_nds/master.m3u8","fileSize":0}},"uuid":"635b4873-91fc-4fdd-b07f-2fa003424cf4","sender":"NDR","geoLocations":[],"titel":"NDR Niedersachsen HD Livestream","thema":"Livestream","beschreibung":""},"83205ca3-380d-446b-b0e4-3c3f29fe33e2":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://orf3.mdn.ors.at/out/u/orf3/q6a/manifest_6.m3u8","fileSize":0}},"uuid":"83205ca3-380d-446b-b0e4-3c3f29fe33e2","sender":"ORF","geoLocations":[],"titel":"ORF III HD Livestream","thema":"Livestream","beschreibung":""},"5bf312b2-e3e1-4a9c-92e9-35acf5bc17a1":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://dwamdstream109.akamaized.net/hls/live/2017970/dwstream109/index.m3u8","fileSize":0}},"uuid":"5bf312b2-e3e1-4a9c-92e9-35acf5bc17a1","sender":"DW","geoLocations":[],"titel":"Deutsche Welle (ES) Livestream","thema":"Livestream","beschreibung":""},"060de0c7-8997-409a-9f7b-ae306181f52b":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mdrtvsahls.akamaized.net/hls/live/2016879/mdrtvsa/index.m3u8","fileSize":0}},"uuid":"060de0c7-8997-409a-9f7b-ae306181f52b","sender":"MDR","geoLocations":[],"titel":"MDR Sachsen-Anhalt HD Livestream","thema":"Livestream","beschreibung":""},"fa953118-9f96-4715-bf6c-38c995007bc3":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://swrrpd-hls.akamaized.net/hls/live/2018676/swrrpd/master.m3u8","fileSize":0}},"uuid":"fa953118-9f96-4715-bf6c-38c995007bc3","sender":"SWR","geoLocations":[],"titel":"SWR Rheinland-Pfalz HD Livestream","thema":"Livestream","beschreibung":""},"ddc1d975-6477-4941-8333-9b2e76c1d6f4":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.br.de/br/fs/bfs_nord/hls/de/master.m3u8","fileSize":0}},"uuid":"ddc1d975-6477-4941-8333-9b2e76c1d6f4","sender":"BR","geoLocations":[],"titel":"BR Fernsehen Nord HD Livestream","thema":"Livestream","beschreibung":""},"e95a6d2a-339b-42ad-8f9d-2529603c9ae5":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://zdf-hls-15.akamaized.net/hls/live/2016498/de/veryhigh/master.m3u8","fileSize":0}},"uuid":"e95a6d2a-339b-42ad-8f9d-2529603c9ae5","sender":"ZDF","geoLocations":[],"titel":"ZDF HD Livestream","thema":"Livestream","beschreibung":""},"656918d0-6c5f-4749-93f5-71933bc36ae5":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://zdf-hls-18.akamaized.net/hls/live/2016501/dach/veryhigh/master.m3u8","fileSize":0}},"uuid":"656918d0-6c5f-4749-93f5-71933bc36ae5","sender":"DREISAT","geoLocations":[],"titel":"3sat Livestream","thema":"Livestream","beschreibung":""},"4216b9dd-cc38-4b95-a819-6d0fca2aa06a":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018022-b/wdrlz_dortmund/master.m3u8","fileSize":0}},"uuid":"4216b9dd-cc38-4b95-a819-6d0fca2aa06a","sender":"WDR","geoLocations":[],"titel":"WDR Dortmund HD Livestream","thema":"Livestream","beschreibung":""},"61a0f339-34f7-427c-b451-f14f544344bf":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.one.ard.de/ardone/hls/master.m3u8","fileSize":0}},"uuid":"61a0f339-34f7-427c-b451-f14f544344bf","sender":"ARD","geoLocations":[],"titel":"one HD Livestream","thema":"Livestream","beschreibung":""},"68509654-9900-408f-981f-e301aa21f107":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://zdf-hls-17.akamaized.net/hls/live/2016500/de/veryhigh/master.m3u8","fileSize":0}},"uuid":"68509654-9900-408f-981f-e301aa21f107","sender":"ZDF","geoLocations":[],"titel":"ZDFinfo HD Livestream","thema":"Livestream","beschreibung":""},"4564e071-827f-499f-8db7-a0d6ce65f1c2":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://dwamdstream110.akamaized.net/hls/live/2017971/dwstream110/index.m3u8","fileSize":0}},"uuid":"4564e071-827f-499f-8db7-a0d6ce65f1c2","sender":"DW","geoLocations":[],"titel":"Deutsche Welle+ Livestream","thema":"Livestream","beschreibung":""},"974cac3f-f6a8-44e0-8022-e37d9c384a6a":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018028-b/wdrlz_wuppertal/master.m3u8","fileSize":0}},"uuid":"974cac3f-f6a8-44e0-8022-e37d9c384a6a","sender":"WDR","geoLocations":[],"titel":"WDR Bergisches Land HD Livestream","thema":"Livestream","beschreibung":""},"8a6693ae-0ef3-4ac2-b1a0-86967c8deeb4":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://brcdn.vo.llnwd.net/br/fs/bfs_sued/hls/de/master.m3u8","fileSize":0}},"uuid":"8a6693ae-0ef3-4ac2-b1a0-86967c8deeb4","sender":"BR","geoLocations":[],"titel":"BR Fernsehen Süd HD Livestream","thema":"Livestream","beschreibung":""},"649af736-d7de-4812-9960-58656179ab6a":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.daserste.de/daserste/de/master.m3u8","fileSize":0}},"uuid":"649af736-d7de-4812-9960-58656179ab6a","sender":"ARD","geoLocations":[],"titel":"Das Erste HD Livestream","thema":"Livestream","beschreibung":""},"f715f2c9-ba28-4369-94c9-ebb42e4c131a":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018025-b/wdrlz_muensterland/master.m3u8","fileSize":0}},"uuid":"f715f2c9-ba28-4369-94c9-ebb42e4c131a","sender":"WDR","geoLocations":[],"titel":"WDR Münsterland HD Livestream","thema":"Livestream","beschreibung":""},"ea767b42-f823-45ff-820c-4aeed266b2d4":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://dwamdstream107.akamaized.net/hls/live/2017968/dwstream107/index.m3u8","fileSize":0}},"uuid":"ea767b42-f823-45ff-820c-4aeed266b2d4","sender":"DW","geoLocations":[],"titel":"Deutsche Welle (EN) Livestream","thema":"Livestream","beschreibung":""},"56078180-d851-4587-800c-cdb9021ae647":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://kikageohls.akamaized.net/hls/live/2022693/livetvkika_de/master.m3u8","fileSize":0}},"uuid":"56078180-d851-4587-800c-cdb9021ae647","sender":"KIKA","geoLocations":[],"titel":"KiKA Livestream","thema":"Livestream","beschreibung":""},"5c4bcf7b-98d0-454f-b049-8c401e2a8375":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://swrbwd-hls.akamaized.net/hls/live/2018672/swrbwd/master.m3u8","fileSize":0}},"uuid":"5c4bcf7b-98d0-454f-b049-8c401e2a8375","sender":"SWR","geoLocations":[],"titel":"SWR Baden-Württemberg HD Livestream","thema":"Livestream","beschreibung":""},"d305bb43-93a6-4fb2-95cd-f0733e3cb2ea":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://orf2.mdn.ors.at/out/u/orf2/qxb/manifest.m3u8","fileSize":0}},"uuid":"d305bb43-93a6-4fb2-95cd-f0733e3cb2ea","sender":"ORF","geoLocations":[],"titel":"ORF 2 HD Livestream","thema":"Livestream","beschreibung":""},"edf84a76-cc7f-4320-9bdd-f55eca405c69":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018026-b/wdrlz_bielefeld/master.m3u8","fileSize":0}},"uuid":"edf84a76-cc7f-4320-9bdd-f55eca405c69","sender":"WDR","geoLocations":[],"titel":"WDR Ostwestfalen HD Livestream","thema":"Livestream","beschreibung":""},"303c2237-79fd-462e-935e-fb1f56b6c8d3":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://zdf-hls-16.akamaized.net/hls/live/2016499/de/veryhigh/master.m3u8","fileSize":0}},"uuid":"303c2237-79fd-462e-935e-fb1f56b6c8d3","sender":"ZDF","geoLocations":[],"titel":"ZDFneo HD Livestream","thema":"Livestream","beschreibung":""},"a6223302-81c8-41c2-8c25-de0de33795cb":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://wdrlokalzeit.akamaized.net/hls/live/2018020-b/wdrlz_siegen/master.m3u8","fileSize":0}},"uuid":"a6223302-81c8-41c2-8c25-de0de33795cb","sender":"WDR","geoLocations":[],"titel":"WDR Südwestfalen HD Livestream","thema":"Livestream","beschreibung":""},"8c18d716-fb90-413c-a8fc-e9d786970161":{"subtitles":[],"audioDescriptions":{},"signLanguages":{},"neu":false,"urls":{"NORMAL":{"url":"https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_hh/master.m3u8","fileSize":0}},"uuid":"8c18d716-fb90-413c-a8fc-e9d786970161","sender":"NDR","geoLocations":[],"titel":"NDR Hamburg HD Livestream","thema":"Livestream","beschreibung":""}},"podcasts":{},"livestreams":{},"creationDate":"2023-08-20T14:22:44","listId":"b37878aa-d85f-41d1-89ab-053ccf278b2f"} \ No newline at end of file diff --git a/src/test/resources/filmlists/livestream/live-streams.json.bz b/src/test/resources/filmlists/livestream/live-streams.json.bz new file mode 100644 index 000000000..760ea369b Binary files /dev/null and b/src/test/resources/filmlists/livestream/live-streams.json.bz differ diff --git a/src/test/resources/filmlists/livestream/live-streams.json.gz b/src/test/resources/filmlists/livestream/live-streams.json.gz new file mode 100644 index 000000000..da8717a55 Binary files /dev/null and b/src/test/resources/filmlists/livestream/live-streams.json.gz differ diff --git a/src/test/resources/filmlists/livestream/live-streams.json.xz b/src/test/resources/filmlists/livestream/live-streams.json.xz new file mode 100644 index 000000000..c443b2df3 Binary files /dev/null and b/src/test/resources/filmlists/livestream/live-streams.json.xz differ diff --git a/src/test/resources/filmlists/livestream/live-streams_old.json b/src/test/resources/filmlists/livestream/live-streams_old.json new file mode 100644 index 000000000..303906445 --- /dev/null +++ b/src/test/resources/filmlists/livestream/live-streams_old.json @@ -0,0 +1 @@ +{"Filmliste":["20.08.2023, 14:22","20.08.2023, 14:22","3.1.213"," [Vers.: 3.1.213 ]","b37878aa-d85f-41d1-89ab-053ccf278b2f"],"Filmliste":["Sender","Thema","Titel","Datum","Zeit","Dauer","Größe [MB]","Beschreibung","Url","Website","Url Untertitel","Url RTMP","Url Klein","Url RTMP Klein","Url HD","Url RTMP HD","DatumL","Url History","Geo","neu"],"X":["ARD","Livestream","tagesschau24 Livestream","","","00:00:00","0","","https://tagesschau.akamaized.net/hls/live/2020115/tagesschau/tagesschau_1/master.m3u8","","","","","","","","0","","","false"],"X":["","","ARD-alpha Livestream","","","00:00:00","0","","https://mcdn.br.de/br/fs/ard_alpha/hls/de/master.m3u8","","","","","","","","0","","","false"],"X":["","","one HD Livestream","","","00:00:00","0","","https://mcdn.one.ard.de/ardone/hls/master.m3u8","","","","","","","","0","","","false"],"X":["","","Das Erste HD Livestream","","","00:00:00","0","","https://mcdn.daserste.de/daserste/de/master.m3u8","","","","","","","","0","","","false"],"X":["ARTE.DE","","ARTE HD Livestream","","","00:00:00","0","","https://artesimulcast.akamaized.net/hls/live/2030993/artelive_de/master.m3u8","","","","","","","","0","","","false"],"X":["ARTE.FR","","ARTE HD (FR) Livestream","","","00:00:00","0","","https://artesimulcast.akamaized.net/hls/live/2031003/artelive_fr/master.m3u8","","","","","","","","0","","","false"],"X":["BR","","BR Fernsehen Nord HD Livestream","","","00:00:00","0","","https://mcdn.br.de/br/fs/bfs_nord/hls/de/master.m3u8","","","","","","","","0","","","false"],"X":["","","BR Fernsehen Süd HD Livestream","","","00:00:00","0","","https://brcdn.vo.llnwd.net/br/fs/bfs_sued/hls/de/master.m3u8","","","","","","","","0","","","false"],"X":["3Sat","","3sat Livestream","","","00:00:00","0","","https://zdf-hls-18.akamaized.net/hls/live/2016501/dach/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["DW","","Deutsche Welle Livestream","","","00:00:00","0","","https://dwamdstream111.akamaized.net/hls/live/2017972/dwstream111/index.m3u8","","","","","","","","0","","","false"],"X":["","","Deutsche Welle (ES) Livestream","","","00:00:00","0","","https://dwamdstream109.akamaized.net/hls/live/2017970/dwstream109/index.m3u8","","","","","","","","0","","","false"],"X":["","","Deutsche Welle+ Livestream","","","00:00:00","0","","https://dwamdstream110.akamaized.net/hls/live/2017971/dwstream110/index.m3u8","","","","","","","","0","","","false"],"X":["","","Deutsche Welle (EN) Livestream","","","00:00:00","0","","https://dwamdstream107.akamaized.net/hls/live/2017968/dwstream107/index.m3u8","","","","","","","","0","","","false"],"X":["HR","","hr-fernsehen Livestream","","","00:00:00","0","","https://hrhlsde.akamaized.net/hls/live/2024526/hrhlsde/index.m3u8","","","","","","","","0","","","false"],"X":["KiKA","","KiKA Livestream","","","00:00:00","0","","https://kikageohls.akamaized.net/hls/live/2022693/livetvkika_de/master.m3u8","","","","","","","","0","","","false"],"X":["MDR","","MDR Sachsen HD Livestream","","","00:00:00","0","","https://mdrtvsnhls.akamaized.net/hls/live/2016928/mdrtvsn/index.m3u8","","","","","","","","0","","","false"],"X":["","","MDR Thüringen HD Livestream","","","00:00:00","0","","https://mdrtvthhls.akamaized.net/hls/live/2016880/mdrtvth/index.m3u8","","","","","","","","0","","","false"],"X":["","","MDR Sachsen-Anhalt HD Livestream","","","00:00:00","0","","https://mdrtvsahls.akamaized.net/hls/live/2016879/mdrtvsa/index.m3u8","","","","","","","","0","","","false"],"X":["NDR","","NDR Schleswig-Holstein HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_sh/master.m3u8","","","","","","","","0","","","false"],"X":["","","NDR Mecklenburg-Vorpommern HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_mv/master.m3u8","","","","","","","","0","","","false"],"X":["","","NDR Niedersachsen HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_nds/master.m3u8","","","","","","","","0","","","false"],"X":["","","NDR Hamburg HD Livestream","","","00:00:00","0","","https://mcdn.ndr.de/ndr/hls/ndr_fs/ndr_hh/master.m3u8","","","","","","","","0","","","false"],"X":["ORF","","ORF eins HD Livestream","","","00:00:00","0","","https://orf1.mdn.ors.at/out/u/orf1/q6a/manifest_6.m3u8","","","","","","","","0","","","false"],"X":["","","ORF SPORT + Livestream","","","00:00:00","0","","https://orfs.mdn.ors.at/out/u/orfs/q6a/manifest_6.m3u8","","","","","","","","0","","","false"],"X":["","","ORF III HD Livestream","","","00:00:00","0","","https://orf3.mdn.ors.at/out/u/orf3/q6a/manifest_6.m3u8","","","","","","","","0","","","false"],"X":["","","ORF 2 HD Livestream","","","00:00:00","0","","https://orf2.mdn.ors.at/out/u/orf2/qxb/manifest.m3u8","","","","","","","","0","","","false"],"X":["PHOENIX","","phoenix Livestream","","","00:00:00","0","","https://zdf-hls-19.akamaized.net/hls/live/2016502/de/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["RBB","","rbb Brandenburg HD Livestream","","","00:00:00","0","","https://rbb-hls-brandenburg.akamaized.net/hls/live/2017825/rbb_brandenburg/master.m3u8","","","","","","","","0","","","false"],"X":["","","rbb Berlin HD Livestream","","","00:00:00","0","","https://rbb-hls-berlin.akamaized.net/hls/live/2017824/rbb_berlin/master.m3u8","","","","","","","","0","","","false"],"X":["SR","","SR Fernsehen HD Livestream","","","00:00:00","0","","https://srfs.akamaized.net/hls/live/689649/srfsgeo/index.m3u8","","","","","","","","0","","","false"],"X":["SWR","","SWR Rheinland-Pfalz HD Livestream","","","00:00:00","0","","https://swrrpd-hls.akamaized.net/hls/live/2018676/swrrpd/master.m3u8","","","","","","","","0","","","false"],"X":["","","SWR Baden-Württemberg HD Livestream","","","00:00:00","0","","https://swrbwd-hls.akamaized.net/hls/live/2018672/swrbwd/master.m3u8","","","","","","","","0","","","false"],"X":["WDR","","WDR Aachen HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018019-b/wdrlz_aachen/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Köln HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2023550-b/wdrlz_koeln/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Duisburg HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018024-b/wdrlz_duisburg/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR HD Livestream","","","00:00:00","0","","https://wdrfs247.akamaized.net/hls/live/681509/wdr_msl4_fs247/index.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Ruhr HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018027-b/wdrlz_essen/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Düsseldorf HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018023-b/wdrlz_duesseldorf/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Bonn HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018021-b/wdrlz_bonn/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Dortmund HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018022-b/wdrlz_dortmund/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Bergisches Land HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018028-b/wdrlz_wuppertal/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Münsterland HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018025-b/wdrlz_muensterland/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Ostwestfalen HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018026-b/wdrlz_bielefeld/master.m3u8","","","","","","","","0","","","false"],"X":["","","WDR Südwestfalen HD Livestream","","","00:00:00","0","","https://wdrlokalzeit.akamaized.net/hls/live/2018020-b/wdrlz_siegen/master.m3u8","","","","","","","","0","","","false"],"X":["ZDF","","ZDF HD Livestream","","","00:00:00","0","","https://zdf-hls-15.akamaized.net/hls/live/2016498/de/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["","","ZDFinfo HD Livestream","","","00:00:00","0","","https://zdf-hls-17.akamaized.net/hls/live/2016500/de/veryhigh/master.m3u8","","","","","","","","0","","","false"],"X":["","","ZDFneo HD Livestream","","","00:00:00","0","","https://zdf-hls-16.akamaized.net/hls/live/2016499/de/veryhigh/master.m3u8","","","","","","","","0","","","false"]} \ No newline at end of file diff --git a/src/test/resources/filmlists/livestream/live-streams_old.json.bz b/src/test/resources/filmlists/livestream/live-streams_old.json.bz new file mode 100644 index 000000000..adf570697 Binary files /dev/null and b/src/test/resources/filmlists/livestream/live-streams_old.json.bz differ diff --git a/src/test/resources/filmlists/livestream/live-streams_old.json.gz b/src/test/resources/filmlists/livestream/live-streams_old.json.gz new file mode 100644 index 000000000..42e9057c5 Binary files /dev/null and b/src/test/resources/filmlists/livestream/live-streams_old.json.gz differ diff --git a/src/test/resources/filmlists/livestream/live-streams_old.json.xz b/src/test/resources/filmlists/livestream/live-streams_old.json.xz new file mode 100644 index 000000000..9999c8918 Binary files /dev/null and b/src/test/resources/filmlists/livestream/live-streams_old.json.xz differ