package xiaozhi.modules.parent.catalog; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; public final class ParentCatalog { private ParentCatalog() { } public static final int SCHEDULED_SOFT_LIMIT = 100; public static final String DEFAULT_ORG_ID = "default_org"; public static String resolveOrgId(String orgId) { if (orgId == null) { return DEFAULT_ORG_ID; } String value = orgId.trim(); if (value.isEmpty() || !value.matches("[A-Za-z0-9_-]{1,64}")) { return DEFAULT_ORG_ID; } return value; } public static String courseId(String scene, String lessonId) { String lesson = (lessonId == null || lessonId.isBlank()) ? "l1.001" : lessonId.trim(); String kind = "shadowing".equals(scene) ? "shd" : "rpt"; String id = (lesson + "-" + kind).replaceAll("[^A-Za-z0-9_-]", "-"); return id.length() < 32 ? id : id.substring(0, 31); } public static List lessonRelativePaths(String scene, String lessonId) { return lessonRelativePaths(scene, lessonId, "en"); } public static List lessonRelativePaths(String scene, String lessonId, String language) { String lesson = (lessonId == null || lessonId.isBlank()) ? "l1.001" : lessonId.trim(); return IdiomLessonCatalog.relativePaths(scene, lesson, language); } public static List uniqueLessonPaths(List files) { Set seen = new LinkedHashSet<>(); List out = new ArrayList<>(); if (files == null) { return out; } for (String raw : files) { if (raw == null) { continue; } String path = raw.replace('\\', '/').trim(); if (path.isEmpty()) { continue; } if (!path.startsWith("/")) { path = "/" + path; } if (path.contains("..") || !path.startsWith("/english_learning/") || !path.toLowerCase().endsWith(".mp3")) { continue; } if (seen.add(path)) { out.add(path); } } return out; } public static Map sceneToAppTask(String scene) { return ParentSceneCatalog.sceneToAppTask(scene); } public static List> scenes() { return ParentSceneCatalog.scenes(); } public static List> lessons(String scene) { return IdiomLessonCatalog.lessons(scene); } public static List> languagePairs() { return List.of( Map.of("id", "zh-en", "name", "中英", "ready", true), Map.of("id", "zh-fr", "name", "中法", "ready", false), Map.of("id", "zh-ja", "name", "中日", "ready", false)); } public static String sceneName(String scene) { return ParentSceneCatalog.sceneName(scene); } public static String sceneIdFromAppTask(String appId, String taskId) { return ParentSceneCatalog.sceneIdFromAppTask(appId, taskId); } public static String kindFromAppTask(String appId, String taskId) { return ParentSceneCatalog.kindFromAppTask(appId, taskId); } }