diff --git a/README.md b/README.md index 71a4a421e..1fc1c37c4 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ If you're using Gradle, you could add NewPipe Extractor as a dependency with the 3. If you are using tools to minimize your project, make sure to keep the files below, by e.g. adding the following lines to your proguard file: ``` ## Rules for NewPipeExtractor --keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; } -keep class org.mozilla.javascript.** { *; } -keep class org.mozilla.classfile.ClassFileWriter -dontwarn org.mozilla.javascript.tools.** diff --git a/settings.gradle b/settings.gradle index 725f65056..81908ff58 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ -include 'extractor', 'timeago-parser' +include 'extractor', 'timeago-parser', 'timeago-generator' rootProject.name = 'NewPipeExtractor' \ No newline at end of file diff --git a/timeago-generator/build.gradle b/timeago-generator/build.gradle new file mode 100644 index 000000000..8e8e73907 --- /dev/null +++ b/timeago-generator/build.gradle @@ -0,0 +1,5 @@ +dependencies { + implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion" + implementation "com.google.code.findbugs:jsr305:$jsr305Version" + implementation project(":timeago-parser") +} diff --git a/timeago-parser/raw/java/CheckAll.java b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/CheckAll.java similarity index 98% rename from timeago-parser/raw/java/CheckAll.java rename to timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/CheckAll.java index 5f9349a10..18a326824 100644 --- a/timeago-parser/raw/java/CheckAll.java +++ b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/CheckAll.java @@ -1,3 +1,5 @@ +package org.schabi.newpipe.timeago_generator; + import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; diff --git a/timeago-parser/raw/java/GenerateOverview.java b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/GenerateOverview.java similarity index 98% rename from timeago-parser/raw/java/GenerateOverview.java rename to timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/GenerateOverview.java index f9f8d832d..387d55ca5 100644 --- a/timeago-parser/raw/java/GenerateOverview.java +++ b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/GenerateOverview.java @@ -1,3 +1,5 @@ +package org.schabi.newpipe.timeago_generator; + import com.grack.nanojson.JsonAppendableWriter; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; diff --git a/timeago-parser/raw/java/GeneratePatternClasses.java b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/GeneratePatternClasses.java similarity index 65% rename from timeago-parser/raw/java/GeneratePatternClasses.java rename to timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/GeneratePatternClasses.java index cb395c7df..a2ef2ffa4 100644 --- a/timeago-parser/raw/java/GeneratePatternClasses.java +++ b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/GeneratePatternClasses.java @@ -1,12 +1,20 @@ +package org.schabi.newpipe.timeago_generator; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.time.temporal.ChronoUnit; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + import com.grack.nanojson.JsonArray; import com.grack.nanojson.JsonObject; import com.grack.nanojson.JsonParser; import com.grack.nanojson.JsonParserException; -import org.schabi.newpipe.extractor.timeago.PatternsHolder; -import org.schabi.newpipe.extractor.timeago.TimeAgoUnit; - -import java.io.*; -import java.util.*; public class GeneratePatternClasses { public static void main(String[] args) throws FileNotFoundException, JsonParserException { @@ -16,6 +24,8 @@ public class GeneratePatternClasses { final JsonObject from = JsonParser.object().from(resourceAsStream); final TreeMap map = new TreeMap<>(from); + final StringBuilder patternMapEntries = new StringBuilder(); + for (Map.Entry entry : map.entrySet()) { final String languageCode = entry.getKey().replace('-', '_'); final Map unitsList = (Map) entry.getValue(); @@ -31,16 +41,17 @@ public class GeneratePatternClasses { final JsonArray years = (JsonArray) unitsList.get("years"); final StringBuilder specialCasesString = new StringBuilder(); - specialCasesConstruct(TimeAgoUnit.SECONDS, seconds, specialCasesString); - specialCasesConstruct(TimeAgoUnit.MINUTES, minutes, specialCasesString); - specialCasesConstruct(TimeAgoUnit.HOURS, hours, specialCasesString); - specialCasesConstruct(TimeAgoUnit.DAYS, days, specialCasesString); - specialCasesConstruct(TimeAgoUnit.WEEKS, weeks, specialCasesString); - specialCasesConstruct(TimeAgoUnit.MONTHS, months, specialCasesString); - specialCasesConstruct(TimeAgoUnit.YEARS, years, specialCasesString); + specialCasesConstruct(ChronoUnit.SECONDS, seconds, specialCasesString); + specialCasesConstruct(ChronoUnit.MINUTES, minutes, specialCasesString); + specialCasesConstruct(ChronoUnit.HOURS, hours, specialCasesString); + specialCasesConstruct(ChronoUnit.DAYS, days, specialCasesString); + specialCasesConstruct(ChronoUnit.WEEKS, weeks, specialCasesString); + specialCasesConstruct(ChronoUnit.MONTHS, months, specialCasesString); + specialCasesConstruct(ChronoUnit.YEARS, years, specialCasesString); System.out.println("Generating \"" + languageCode + "\" pattern class..."); + try (final FileWriter fileOut = new FileWriter( "timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/patterns/" + languageCode + ".java")) { @@ -48,7 +59,7 @@ public class GeneratePatternClasses { "\n" + "package org.schabi.newpipe.extractor.timeago.patterns;\n\n" + "import org.schabi.newpipe.extractor.timeago.PatternsHolder;\n" + - (specialCasesString.length() > 0 ? "import org.schabi.newpipe.extractor.timeago.TimeAgoUnit;\n" : "") + + (specialCasesString.length() > 0 ? "\nimport java.time.temporal.ChronoUnit;\n" : "") + "\n" + "public class " + languageCode + " extends PatternsHolder {\n" + " private static final String WORD_SEPARATOR = \"" + wordSeparator + "\";\n" + @@ -76,10 +87,38 @@ public class GeneratePatternClasses { } catch (IOException e) { e.printStackTrace(); } + + patternMapEntries.append(" patternMap.put(\"") + .append(languageCode).append("\", ") + .append(languageCode).append(".getInstance());\n"); + } + + try (final FileWriter fileOut = new FileWriter( + "timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternMap.java")) { + final String patternMapClass = INFO_CLASS_GENERATED + "\n" + + "\n" + + "package org.schabi.newpipe.extractor.timeago;\n\n" + + "import org.schabi.newpipe.extractor.timeago.patterns.*;\n" + + "import java.util.HashMap;\n" + + "import java.util.Map;\n\n" + + "public class PatternMap {\n" + + " private static final Map patternMap = new HashMap<>();\n" + + "\n" + + " static {\n" + + patternMapEntries + + " }\n" + + "\n" + + " public static PatternsHolder getPattern(final String languageCode) {\n" + + " return patternMap.get(languageCode);\n" + + " }\n" + + "}"; + fileOut.write(patternMapClass); + } catch (IOException e) { + e.printStackTrace(); } } - private static void specialCasesConstruct(TimeAgoUnit unit, JsonArray array, StringBuilder stringBuilder) { + private static void specialCasesConstruct(ChronoUnit unit, JsonArray array, StringBuilder stringBuilder) { final Iterator iterator = array.iterator(); while (iterator.hasNext()) { final Object o = iterator.next(); @@ -91,7 +130,7 @@ public class GeneratePatternClasses { iterator.remove(); stringBuilder.append(" ") - .append("putSpecialCase(TimeAgoUnit.").append(unit.name()) + .append("putSpecialCase(ChronoUnit.").append(unit.name()) .append(", \"").append(caseText).append("\"") .append(", ").append(caseAmount).append(");").append("\n"); } @@ -113,4 +152,4 @@ public class GeneratePatternClasses { return toReturn.toString(); } -} \ No newline at end of file +} diff --git a/timeago-parser/raw/java/Utils.java b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/Utils.java similarity index 95% rename from timeago-parser/raw/java/Utils.java rename to timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/Utils.java index a9781a9b9..1167f1b3d 100644 --- a/timeago-parser/raw/java/Utils.java +++ b/timeago-generator/src/main/java/org/schabi/newpipe/timeago_generator/Utils.java @@ -1,3 +1,5 @@ +package org.schabi.newpipe.timeago_generator; + import java.util.*; public class Utils { diff --git a/timeago-parser/build.gradle b/timeago-parser/build.gradle index 04dc5cab5..7e1cbb679 100644 --- a/timeago-parser/build.gradle +++ b/timeago-parser/build.gradle @@ -1,4 +1,3 @@ dependencies { - implementation "com.github.TeamNewPipe:nanojson:$nanojsonVersion" implementation "com.google.code.findbugs:jsr305:$jsr305Version" } diff --git a/timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternMap.java b/timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternMap.java new file mode 100644 index 000000000..7f721656e --- /dev/null +++ b/timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternMap.java @@ -0,0 +1,100 @@ +/**/// DO NOT MODIFY THIS FILE MANUALLY +/**/// This class was automatically generated by "GeneratePatternClasses.java", +/**/// modify the "unique_patterns.json" and re-generate instead. + +package org.schabi.newpipe.extractor.timeago; + +import org.schabi.newpipe.extractor.timeago.patterns.*; +import java.util.HashMap; +import java.util.Map; + +public class PatternMap { + private static final Map patternMap = new HashMap<>(); + + static { + patternMap.put("af", af.getInstance()); + patternMap.put("am", am.getInstance()); + patternMap.put("ar", ar.getInstance()); + patternMap.put("az", az.getInstance()); + patternMap.put("be", be.getInstance()); + patternMap.put("bg", bg.getInstance()); + patternMap.put("bn", bn.getInstance()); + patternMap.put("bs", bs.getInstance()); + patternMap.put("ca", ca.getInstance()); + patternMap.put("cs", cs.getInstance()); + patternMap.put("da", da.getInstance()); + patternMap.put("de", de.getInstance()); + patternMap.put("el", el.getInstance()); + patternMap.put("en", en.getInstance()); + patternMap.put("en_GB", en_GB.getInstance()); + patternMap.put("es", es.getInstance()); + patternMap.put("es_419", es_419.getInstance()); + patternMap.put("es_US", es_US.getInstance()); + patternMap.put("et", et.getInstance()); + patternMap.put("eu", eu.getInstance()); + patternMap.put("fa", fa.getInstance()); + patternMap.put("fi", fi.getInstance()); + patternMap.put("fil", fil.getInstance()); + patternMap.put("fr", fr.getInstance()); + patternMap.put("fr_CA", fr_CA.getInstance()); + patternMap.put("gl", gl.getInstance()); + patternMap.put("gu", gu.getInstance()); + patternMap.put("hi", hi.getInstance()); + patternMap.put("hr", hr.getInstance()); + patternMap.put("hu", hu.getInstance()); + patternMap.put("hy", hy.getInstance()); + patternMap.put("id", id.getInstance()); + patternMap.put("is", is.getInstance()); + patternMap.put("it", it.getInstance()); + patternMap.put("iw", iw.getInstance()); + patternMap.put("ja", ja.getInstance()); + patternMap.put("ka", ka.getInstance()); + patternMap.put("kk", kk.getInstance()); + patternMap.put("km", km.getInstance()); + patternMap.put("kn", kn.getInstance()); + patternMap.put("ko", ko.getInstance()); + patternMap.put("ky", ky.getInstance()); + patternMap.put("lo", lo.getInstance()); + patternMap.put("lt", lt.getInstance()); + patternMap.put("lv", lv.getInstance()); + patternMap.put("mk", mk.getInstance()); + patternMap.put("ml", ml.getInstance()); + patternMap.put("mn", mn.getInstance()); + patternMap.put("mr", mr.getInstance()); + patternMap.put("ms", ms.getInstance()); + patternMap.put("my", my.getInstance()); + patternMap.put("ne", ne.getInstance()); + patternMap.put("nl", nl.getInstance()); + patternMap.put("no", no.getInstance()); + patternMap.put("pa", pa.getInstance()); + patternMap.put("pl", pl.getInstance()); + patternMap.put("pt", pt.getInstance()); + patternMap.put("pt_PT", pt_PT.getInstance()); + patternMap.put("ro", ro.getInstance()); + patternMap.put("ru", ru.getInstance()); + patternMap.put("si", si.getInstance()); + patternMap.put("sk", sk.getInstance()); + patternMap.put("sl", sl.getInstance()); + patternMap.put("sq", sq.getInstance()); + patternMap.put("sr", sr.getInstance()); + patternMap.put("sr_Latn", sr_Latn.getInstance()); + patternMap.put("sv", sv.getInstance()); + patternMap.put("sw", sw.getInstance()); + patternMap.put("ta", ta.getInstance()); + patternMap.put("te", te.getInstance()); + patternMap.put("th", th.getInstance()); + patternMap.put("tr", tr.getInstance()); + patternMap.put("uk", uk.getInstance()); + patternMap.put("ur", ur.getInstance()); + patternMap.put("uz", uz.getInstance()); + patternMap.put("vi", vi.getInstance()); + patternMap.put("zh_CN", zh_CN.getInstance()); + patternMap.put("zh_HK", zh_HK.getInstance()); + patternMap.put("zh_TW", zh_TW.getInstance()); + patternMap.put("zu", zu.getInstance()); + } + + public static PatternsHolder getPattern(final String languageCode) { + return patternMap.get(languageCode); + } +} \ No newline at end of file diff --git a/timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternsManager.java b/timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternsManager.java index 22f939166..537fe4b70 100644 --- a/timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternsManager.java +++ b/timeago-parser/src/main/java/org/schabi/newpipe/extractor/timeago/PatternsManager.java @@ -2,7 +2,6 @@ package org.schabi.newpipe.extractor.timeago; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.lang.reflect.InvocationTargetException; public class PatternsManager { /** @@ -14,18 +13,6 @@ public class PatternsManager { public static PatternsHolder getPatterns(@Nonnull String languageCode, @Nullable String countryCode) { final String targetLocalizationClassName = languageCode + (countryCode == null || countryCode.isEmpty() ? "" : "_" + countryCode); - - try { - final Class targetClass = Class.forName( - "org.schabi.newpipe.extractor.timeago.patterns." + targetLocalizationClassName); - - return (PatternsHolder) targetClass.getDeclaredMethod("getInstance").invoke(null); - } catch (ClassNotFoundException ignored) { - // Target localization is not supported - } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { - e.printStackTrace(); - } - - return null; + return PatternMap.getPattern(targetLocalizationClassName); } }