diff --git a/m3u8script/LICENSE b/m3u8script/LICENSE new file mode 100644 index 0000000..6885c5b --- /dev/null +++ b/m3u8script/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 eneller + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/m3u8script/README.md b/m3u8script/README.md new file mode 100644 index 0000000..fdc462a --- /dev/null +++ b/m3u8script/README.md @@ -0,0 +1,40 @@ +# m3u8script +A script to facilitate downloading videos saved as .m3u8 in general. + +## Finding the .m3u8 file +[Please extract the URL to your .m3u8 file first:](findm3u8.mp4) +1. Open the developer tools +2. Go to the network tab and reload the page +3. locate an entry containing an m3u8 link +4. copy the link + +In pictures: +![](find1.png) +![](find2.png) +(Pictures taken in Firefox) +

+![](brave.png) +(Pictures taken in Brave (Chromium Browser)) + +## Using the tool +The tool does not need to be installed, only downloaded (m3u8script.java). All you might need to do is [install the Java Development Kit, or JDK,](https://www.oracle.com/de/java/technologies/javase-jdk15-downloads.html) and set the CLASSPATH variable. +You can then run it: +![java m3u8script.java](cli.jpg) + +When encountering an error, you might also try +`java -cp ./ m3u8script.java` + +## Options +|option|explanation| +|----|----| +|`-single m3u8URL`| allows you to download and convert a single .m3u8 file. In this case, output must either end in a *folder/* or *file.m3u8*| +|`-multi textfile`| allows you to specify the path to a text file that contains links to .m3u8 files (one on each line), allowing hands-free batch processing. -output must specify a folder path| +|`-output fileorfolder`| specifies a local directory path. When using ’-multi’, it must contain only a folder name, since filenames will be applied automatically. When used with -single, it can contain a full filename with the extension .m3u8. If you want to use automatic naming, just specify a folder path| +|`-prefix prefixToUse`| You can use this command to specify the pattern this script should look for. Default should work in most cases. | + +Example: `java m3u8script.java -multi /home/guest/Downloads/list.txt -output /home/guest/Downloads/videos` + +## Downloading +You can then use ffmpeg or VLC media player to download the videos: + +![vlc](vlc.png) diff --git a/m3u8script/brave.png b/m3u8script/brave.png new file mode 100644 index 0000000..35e1a8c Binary files /dev/null and b/m3u8script/brave.png differ diff --git a/m3u8script/cli.jpg b/m3u8script/cli.jpg new file mode 100644 index 0000000..921d992 Binary files /dev/null and b/m3u8script/cli.jpg differ diff --git a/m3u8script/find1.png b/m3u8script/find1.png new file mode 100644 index 0000000..cd71992 Binary files /dev/null and b/m3u8script/find1.png differ diff --git a/m3u8script/find2.png b/m3u8script/find2.png new file mode 100644 index 0000000..17a1c8c Binary files /dev/null and b/m3u8script/find2.png differ diff --git a/m3u8script/findm3u8.mp4 b/m3u8script/findm3u8.mp4 new file mode 100644 index 0000000..d90fcf0 Binary files /dev/null and b/m3u8script/findm3u8.mp4 differ diff --git a/m3u8script/m3u8script.java b/m3u8script/m3u8script.java new file mode 100644 index 0000000..30a26e8 --- /dev/null +++ b/m3u8script/m3u8script.java @@ -0,0 +1,137 @@ +package de.eneller.scripts; + +import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Arrays; +import java.util.Scanner; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class m3u8script { + public static Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + + public static void main(String[] args) { + logger.setLevel(Level.ALL); + if (args.length < 2) { + printHelp(); + System.exit(1); + } + System.out.println(Arrays.toString(args)); + String url = ""; + String inputFile = ""; + String prefix = "media_"; + String output = ""; + boolean m = false; + for (int i = 0; i < args.length - 1; i++) { + switch (args[i]) { + case "-single": + url = args[i + 1].trim(); + break; + case "-multi": + inputFile = args[i + 1].trim(); + m = true; + break; + case "-prefix": + prefix = args[i + 1].trim(); + break; + case "-output": + output = args[i + 1].trim(); + break; + } + } + if (m == false) { + if (output.matches(".*\\.m3u8$") == false) { + output = output + "/"; + } + parse(url, output, prefix); + } else { + String[] pathArr = output.split("/"); + + if (output.matches(".*/$") == false) { + output = output + "/"; + } + + try (Scanner scn = new Scanner(new File(inputFile));) { + + String data; + int c = 0; + int a = 0; + while (scn.hasNextLine()) { + a++; + data = scn.nextLine(); + if (parse(data, output, prefix)) { + c++; + } + } + logger.log(Level.INFO, c + " out of " + a + " operations successfully completed. In case of errors, please check the log."); + } catch (FileNotFoundException e) { + logger.log(Level.SEVERE, "Couldnt find input file"); + } + } + + } + + public static boolean parse(String m3u8WebPath, String outputPath, String matchPrefix) { + boolean b = true; + try { + URL url = new URL(m3u8WebPath); + Scanner scn = new Scanner((new BufferedReader(new InputStreamReader(url.openStream())))); + String[] splitWebPath = m3u8WebPath.split("/"); + String m3u8WebPrefix = ""; + for (int i = 0; i < splitWebPath.length - 1; i++) { + m3u8WebPrefix = m3u8WebPrefix + splitWebPath[i] + "/"; + } + if (outputPath.matches(".*/$")) { + String generatedFileName = splitWebPath[splitWebPath.length - 2]; + generatedFileName = generatedFileName.replaceAll("%20", "_"); + generatedFileName = generatedFileName.replaceAll("\\.smil", ".m3u8"); + outputPath = outputPath + generatedFileName; + } + + File outm3u8 = new File(outputPath); + + if (outm3u8.createNewFile()) { + logger.log(Level.INFO, "File created at " + outputPath); + } else { + logger.log(Level.WARNING, "File already exists, please specify a different path " + outputPath); + return false; + } + + FileWriter outWriter = new FileWriter(outm3u8); + String data = ""; + while (scn.hasNextLine()) { + data = scn.nextLine(); + if (data.startsWith(matchPrefix)) { + data = m3u8WebPrefix + data; + } + outWriter.write(data + "\n"); + } + outWriter.close(); + scn.close(); + } catch (FileNotFoundException e) { + logger.log(Level.SEVERE, "Couldnt find .m3u8 file at specified path"); + } catch (MalformedURLException e) { + logger.log(Level.SEVERE, "Couldnt read file at URL"); + } catch (IOException e) { + logger.log(Level.SEVERE, "An error occured while trying to create the output file, please check that your path exists"); + } + + + return true; + } + + public static String getInput(String s) { + Scanner scn = new Scanner(System.in); + System.out.println(s); + return scn.nextLine(); + } + + public static void printHelp() { + System.out.println("Seems like you tried to run the script without specifying necessary parameters." + System.lineSeparator() + + "The following commands are available:" + System.lineSeparator() + System.lineSeparator() + + "Use -multi yourfile.txt to specify the absolute path to an input file containing a list of URLs" + System.lineSeparator() + + "Or use -single urlto.m3u8 in combination with -output /path/to/output/folderorfile" + System.lineSeparator() + System.lineSeparator() + + "Please go to https://github.com/eneller/m3u8script for additional help"); + } +} diff --git a/m3u8script/vlc.png b/m3u8script/vlc.png new file mode 100644 index 0000000..6345a4f Binary files /dev/null and b/m3u8script/vlc.png differ