2020-11-12 21:19:45 +00:00
|
|
|
package me.kavin.piped.consts;
|
|
|
|
|
2022-11-27 00:31:47 +00:00
|
|
|
import com.fasterxml.jackson.databind.DeserializationFeature;
|
2022-01-31 04:17:16 +00:00
|
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
2022-10-27 10:55:44 +00:00
|
|
|
import com.fasterxml.jackson.databind.json.JsonMapper;
|
2022-11-26 19:14:02 +00:00
|
|
|
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
2022-09-18 13:15:58 +00:00
|
|
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
2023-02-02 13:00:35 +00:00
|
|
|
import io.minio.MinioClient;
|
2022-01-31 04:17:16 +00:00
|
|
|
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
|
|
|
|
import me.kavin.piped.utils.PageMixin;
|
2022-11-27 00:03:16 +00:00
|
|
|
import me.kavin.piped.utils.RequestUtils;
|
2022-11-15 19:21:36 +00:00
|
|
|
import me.kavin.piped.utils.resp.ListLinkHandlerMixin;
|
2022-02-02 21:05:22 +00:00
|
|
|
import okhttp3.OkHttpClient;
|
|
|
|
import okhttp3.brotli.BrotliInterceptor;
|
2022-02-22 09:16:45 +00:00
|
|
|
import org.apache.commons.io.IOUtils;
|
2022-01-31 04:17:16 +00:00
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
|
import org.schabi.newpipe.extractor.NewPipe;
|
|
|
|
import org.schabi.newpipe.extractor.Page;
|
|
|
|
import org.schabi.newpipe.extractor.StreamingService;
|
2022-11-15 19:21:36 +00:00
|
|
|
import org.schabi.newpipe.extractor.linkhandler.ListLinkHandler;
|
2022-11-26 19:14:02 +00:00
|
|
|
import org.schabi.newpipe.extractor.localization.ContentCountry;
|
2023-07-28 10:42:21 +00:00
|
|
|
import rocks.kavin.reqwest4j.ReqwestUtils;
|
2022-01-31 04:17:16 +00:00
|
|
|
|
2022-02-22 09:16:45 +00:00
|
|
|
import java.io.File;
|
2020-11-12 21:19:45 +00:00
|
|
|
import java.io.FileReader;
|
2021-08-13 18:38:15 +00:00
|
|
|
import java.net.InetSocketAddress;
|
|
|
|
import java.net.ProxySelector;
|
2023-11-20 05:17:29 +00:00
|
|
|
import java.nio.charset.StandardCharsets;
|
2022-10-23 18:17:04 +00:00
|
|
|
import java.util.List;
|
2023-11-20 05:17:29 +00:00
|
|
|
import java.util.Optional;
|
2020-11-12 21:19:45 +00:00
|
|
|
import java.util.Properties;
|
2022-11-27 00:03:16 +00:00
|
|
|
import java.util.regex.Pattern;
|
2020-11-12 21:19:45 +00:00
|
|
|
|
|
|
|
public class Constants {
|
|
|
|
|
2023-01-29 12:16:57 +00:00
|
|
|
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Firefox/102.0";
|
2020-11-12 21:19:45 +00:00
|
|
|
|
|
|
|
public static final int PORT;
|
2021-03-29 13:59:10 +00:00
|
|
|
public static final String HTTP_WORKERS;
|
2020-11-12 21:19:45 +00:00
|
|
|
|
2020-11-12 21:40:50 +00:00
|
|
|
public static final String PROXY_PART;
|
|
|
|
|
2022-04-25 06:42:59 +00:00
|
|
|
public static final String IMAGE_PROXY_PART;
|
|
|
|
|
2023-11-20 05:17:29 +00:00
|
|
|
public static final byte[] PROXY_HASH_SECRET;
|
|
|
|
|
2021-03-04 14:14:52 +00:00
|
|
|
public static final String CAPTCHA_BASE_URL, CAPTCHA_API_KEY;
|
|
|
|
|
2020-11-12 21:19:45 +00:00
|
|
|
public static final StreamingService YOUTUBE_SERVICE;
|
|
|
|
|
2021-07-16 22:40:46 +00:00
|
|
|
public static final String PUBLIC_URL;
|
|
|
|
|
2022-06-25 09:22:45 +00:00
|
|
|
public static final String PUBSUB_URL;
|
2022-10-23 18:17:04 +00:00
|
|
|
|
2022-10-04 07:44:53 +00:00
|
|
|
public static final String PUBSUB_HUB_URL;
|
2022-06-25 09:22:45 +00:00
|
|
|
|
2023-07-04 18:14:37 +00:00
|
|
|
public static final String REQWEST_PROXY;
|
2023-08-21 08:39:53 +00:00
|
|
|
public static final String REQWEST_PROXY_USER;
|
|
|
|
public static final String REQWEST_PROXY_PASS;
|
2021-08-13 18:38:15 +00:00
|
|
|
|
2021-09-09 08:05:19 +00:00
|
|
|
public static final String FRONTEND_URL;
|
|
|
|
|
2022-02-02 21:05:22 +00:00
|
|
|
public static final OkHttpClient h2client;
|
|
|
|
public static final OkHttpClient h2_no_redir_client;
|
2020-11-12 21:19:45 +00:00
|
|
|
|
2021-10-04 18:57:56 +00:00
|
|
|
public static final boolean COMPROMISED_PASSWORD_CHECK;
|
|
|
|
|
2021-11-09 06:27:29 +00:00
|
|
|
public static final boolean DISABLE_REGISTRATION;
|
|
|
|
|
2022-01-31 04:17:16 +00:00
|
|
|
public static final int FEED_RETENTION;
|
|
|
|
|
2022-06-25 09:19:06 +00:00
|
|
|
public static final boolean DISABLE_TIMERS;
|
|
|
|
|
2022-06-27 16:11:22 +00:00
|
|
|
public static final String RYD_PROXY_URL;
|
|
|
|
|
2022-10-23 18:17:04 +00:00
|
|
|
public static final List<String> SPONSORBLOCK_SERVERS;
|
|
|
|
|
2022-06-27 16:11:22 +00:00
|
|
|
public static final boolean DISABLE_RYD;
|
|
|
|
|
2022-07-19 08:20:42 +00:00
|
|
|
public static final boolean DISABLE_SERVER;
|
|
|
|
|
2022-07-22 03:52:48 +00:00
|
|
|
public static final boolean DISABLE_LBRY;
|
|
|
|
|
2022-07-31 17:45:28 +00:00
|
|
|
public static final int SUBSCRIPTIONS_EXPIRY;
|
|
|
|
|
2023-12-17 04:50:47 +00:00
|
|
|
public static final boolean CONSENT_COOKIE;
|
|
|
|
|
2022-10-30 19:56:04 +00:00
|
|
|
public static final String SENTRY_DSN;
|
|
|
|
|
2023-02-02 13:00:35 +00:00
|
|
|
public static final String S3_ENDPOINT;
|
|
|
|
|
|
|
|
public static final String S3_ACCESS_KEY;
|
|
|
|
|
|
|
|
public static final String S3_SECRET_KEY;
|
|
|
|
|
|
|
|
public static final String S3_BUCKET;
|
|
|
|
|
|
|
|
public static final MinioClient S3_CLIENT;
|
|
|
|
|
2022-11-13 00:12:55 +00:00
|
|
|
public static final String MATRIX_ROOM = "#piped-events:matrix.org";
|
|
|
|
|
|
|
|
public static final String MATRIX_SERVER;
|
|
|
|
|
|
|
|
public static final String MATRIX_TOKEN;
|
|
|
|
|
2022-11-27 00:03:16 +00:00
|
|
|
public static final String GEO_RESTRICTION_CHECKER_URL;
|
|
|
|
|
2023-12-17 02:11:23 +00:00
|
|
|
public static String YOUTUBE_COUNTRY;
|
2022-11-27 00:03:16 +00:00
|
|
|
|
2022-02-22 09:16:45 +00:00
|
|
|
public static final String VERSION;
|
|
|
|
|
2022-10-27 10:55:44 +00:00
|
|
|
public static final ObjectMapper mapper = JsonMapper.builder()
|
|
|
|
.addMixIn(Page.class, PageMixin.class)
|
2022-11-15 19:21:36 +00:00
|
|
|
.addMixIn(ListLinkHandler.class, ListLinkHandlerMixin.class)
|
2022-11-27 00:31:47 +00:00
|
|
|
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
|
2022-10-27 10:55:44 +00:00
|
|
|
.build();
|
2020-11-12 21:19:45 +00:00
|
|
|
|
2021-07-16 22:40:46 +00:00
|
|
|
public static final Object2ObjectOpenHashMap<String, String> hibernateProperties = new Object2ObjectOpenHashMap<>();
|
|
|
|
|
2022-09-18 13:15:58 +00:00
|
|
|
public static final ObjectNode frontendProperties = mapper.createObjectNode();
|
|
|
|
|
2020-11-12 21:19:45 +00:00
|
|
|
static {
|
2021-02-24 09:52:29 +00:00
|
|
|
Properties prop = new Properties();
|
|
|
|
try {
|
|
|
|
YOUTUBE_SERVICE = NewPipe.getService(0);
|
2022-11-15 09:43:35 +00:00
|
|
|
|
|
|
|
if (new File("config.properties").exists()) {
|
|
|
|
prop.load(new FileReader("config.properties"));
|
|
|
|
}
|
2021-02-24 09:52:29 +00:00
|
|
|
|
2021-11-23 00:21:18 +00:00
|
|
|
PORT = Integer.parseInt(getProperty(prop, "PORT", "8080"));
|
|
|
|
HTTP_WORKERS = getProperty(prop, "HTTP_WORKERS",
|
|
|
|
String.valueOf(Runtime.getRuntime().availableProcessors()));
|
|
|
|
PROXY_PART = getProperty(prop, "PROXY_PART");
|
2022-04-25 06:42:59 +00:00
|
|
|
IMAGE_PROXY_PART = getProperty(prop, "IMAGE_PROXY_PART", PROXY_PART);
|
2023-11-20 05:17:29 +00:00
|
|
|
PROXY_HASH_SECRET = Optional.ofNullable(getProperty(prop, "PROXY_HASH_SECRET")).map(s -> s.getBytes(StandardCharsets.UTF_8)).orElse(null);
|
2021-11-23 00:21:18 +00:00
|
|
|
CAPTCHA_BASE_URL = getProperty(prop, "CAPTCHA_BASE_URL");
|
|
|
|
CAPTCHA_API_KEY = getProperty(prop, "CAPTCHA_API_KEY");
|
|
|
|
PUBLIC_URL = getProperty(prop, "API_URL");
|
2022-06-25 09:22:45 +00:00
|
|
|
PUBSUB_URL = getProperty(prop, "PUBSUB_URL", PUBLIC_URL);
|
2022-10-04 07:44:53 +00:00
|
|
|
PUBSUB_HUB_URL = getProperty(prop, "PUBSUB_HUB_URL", "https://pubsubhubbub.appspot.com/subscribe");
|
2023-07-04 18:14:37 +00:00
|
|
|
REQWEST_PROXY = getProperty(prop, "REQWEST_PROXY");
|
2023-08-21 08:39:53 +00:00
|
|
|
REQWEST_PROXY_USER = getProperty(prop, "REQWEST_PROXY_USER");
|
|
|
|
REQWEST_PROXY_PASS = getProperty(prop, "REQWEST_PROXY_PASS");
|
2022-11-11 19:52:51 +00:00
|
|
|
FRONTEND_URL = getProperty(prop, "FRONTEND_URL", "https://piped.video");
|
2021-11-23 00:21:18 +00:00
|
|
|
COMPROMISED_PASSWORD_CHECK = Boolean.parseBoolean(getProperty(prop, "COMPROMISED_PASSWORD_CHECK", "true"));
|
|
|
|
DISABLE_REGISTRATION = Boolean.parseBoolean(getProperty(prop, "DISABLE_REGISTRATION", "false"));
|
2022-01-31 04:17:16 +00:00
|
|
|
FEED_RETENTION = Integer.parseInt(getProperty(prop, "FEED_RETENTION", "30"));
|
2022-06-25 09:19:06 +00:00
|
|
|
DISABLE_TIMERS = Boolean.parseBoolean(getProperty(prop, "DISABLE_TIMERS", "false"));
|
2022-06-27 16:11:22 +00:00
|
|
|
RYD_PROXY_URL = getProperty(prop, "RYD_PROXY_URL", "https://ryd-proxy.kavin.rocks");
|
2022-10-23 18:17:04 +00:00
|
|
|
SPONSORBLOCK_SERVERS = List.of(getProperty(prop, "SPONSORBLOCK_SERVERS", "https://sponsor.ajay.app,https://sponsorblock.kavin.rocks")
|
|
|
|
.split(","));
|
2022-06-27 16:11:22 +00:00
|
|
|
DISABLE_RYD = Boolean.parseBoolean(getProperty(prop, "DISABLE_RYD", "false"));
|
2022-07-19 08:20:42 +00:00
|
|
|
DISABLE_SERVER = Boolean.parseBoolean(getProperty(prop, "DISABLE_SERVER", "false"));
|
2022-07-22 03:52:48 +00:00
|
|
|
DISABLE_LBRY = Boolean.parseBoolean(getProperty(prop, "DISABLE_LBRY", "false"));
|
2022-07-31 17:45:28 +00:00
|
|
|
SUBSCRIPTIONS_EXPIRY = Integer.parseInt(getProperty(prop, "SUBSCRIPTIONS_EXPIRY", "30"));
|
2023-12-17 04:50:47 +00:00
|
|
|
CONSENT_COOKIE = Boolean.parseBoolean(getProperty(prop, "CONSENT_COOKIE", "true"));
|
2022-10-30 19:56:04 +00:00
|
|
|
SENTRY_DSN = getProperty(prop, "SENTRY_DSN", "");
|
2023-02-02 13:00:35 +00:00
|
|
|
S3_ENDPOINT = getProperty(prop, "S3_ENDPOINT");
|
|
|
|
S3_ACCESS_KEY = getProperty(prop, "S3_ACCESS_KEY");
|
|
|
|
S3_SECRET_KEY = getProperty(prop, "S3_SECRET_KEY");
|
|
|
|
S3_BUCKET = getProperty(prop, "S3_BUCKET");
|
|
|
|
if (S3_ENDPOINT != null) {
|
|
|
|
S3_CLIENT = MinioClient.builder()
|
|
|
|
.endpoint(S3_ENDPOINT)
|
|
|
|
.credentials(S3_ACCESS_KEY, S3_SECRET_KEY)
|
|
|
|
.build();
|
|
|
|
} else {
|
|
|
|
S3_CLIENT = null;
|
|
|
|
}
|
2021-11-23 01:50:06 +00:00
|
|
|
System.getenv().forEach((key, value) -> {
|
|
|
|
if (key.startsWith("hibernate"))
|
|
|
|
hibernateProperties.put(key, value);
|
|
|
|
});
|
2022-11-13 00:12:55 +00:00
|
|
|
MATRIX_SERVER = getProperty(prop, "MATRIX_SERVER", "https://matrix-client.matrix.org");
|
|
|
|
MATRIX_TOKEN = getProperty(prop, "MATRIX_TOKEN");
|
2022-11-27 00:03:16 +00:00
|
|
|
GEO_RESTRICTION_CHECKER_URL = getProperty(prop, "GEO_RESTRICTION_CHECKER_URL");
|
2021-07-16 22:40:46 +00:00
|
|
|
prop.forEach((_key, _value) -> {
|
|
|
|
String key = String.valueOf(_key), value = String.valueOf(_value);
|
|
|
|
if (key.startsWith("hibernate"))
|
|
|
|
hibernateProperties.put(key, value);
|
2022-09-25 21:33:29 +00:00
|
|
|
else if (key.startsWith("frontend."))
|
|
|
|
frontendProperties.put(StringUtils.substringAfter(key, "frontend."), value);
|
2021-07-16 22:40:46 +00:00
|
|
|
});
|
2022-11-20 20:53:53 +00:00
|
|
|
frontendProperties.put("imageProxyUrl", IMAGE_PROXY_PART);
|
2022-11-26 19:14:02 +00:00
|
|
|
frontendProperties.putArray("countries").addAll(
|
|
|
|
YOUTUBE_SERVICE.getSupportedCountries().stream().map(ContentCountry::getCountryCode)
|
|
|
|
.map(JsonNodeFactory.instance::textNode).toList()
|
|
|
|
);
|
2023-02-02 15:52:51 +00:00
|
|
|
frontendProperties.put("s3Enabled", S3_CLIENT != null);
|
2023-07-13 12:53:00 +00:00
|
|
|
frontendProperties.put("registrationDisabled", DISABLE_REGISTRATION);
|
2022-11-20 20:42:41 +00:00
|
|
|
|
2022-06-18 18:10:26 +00:00
|
|
|
// transform hibernate properties for legacy configurations
|
2022-06-17 15:37:10 +00:00
|
|
|
hibernateProperties.replace("hibernate.dialect",
|
|
|
|
"org.hibernate.dialect.PostgreSQL10Dialect",
|
|
|
|
"org.hibernate.dialect.PostgreSQLDialect"
|
|
|
|
);
|
|
|
|
|
2022-02-02 21:05:22 +00:00
|
|
|
OkHttpClient.Builder builder = new OkHttpClient.Builder()
|
|
|
|
.followRedirects(true)
|
|
|
|
.addInterceptor(BrotliInterceptor.INSTANCE);
|
|
|
|
OkHttpClient.Builder builder_noredir = new OkHttpClient.Builder()
|
|
|
|
.followRedirects(false)
|
|
|
|
.addInterceptor(BrotliInterceptor.INSTANCE);
|
2021-08-13 18:38:15 +00:00
|
|
|
h2client = builder.build();
|
|
|
|
h2_no_redir_client = builder_noredir.build();
|
2022-02-22 09:16:45 +00:00
|
|
|
VERSION = new File("VERSION").exists() ?
|
|
|
|
IOUtils.toString(new FileReader("VERSION")) :
|
|
|
|
"unknown";
|
2021-02-24 09:52:29 +00:00
|
|
|
} catch (Exception e) {
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
}
|
2020-11-12 21:19:45 +00:00
|
|
|
}
|
2021-11-23 00:21:18 +00:00
|
|
|
|
2022-11-15 19:21:36 +00:00
|
|
|
private static String getProperty(final Properties prop, String key) {
|
2021-11-23 00:21:18 +00:00
|
|
|
return getProperty(prop, key, null);
|
|
|
|
}
|
|
|
|
|
2022-11-15 19:21:36 +00:00
|
|
|
private static String getProperty(final Properties prop, String key, String def) {
|
2021-11-23 00:21:18 +00:00
|
|
|
|
|
|
|
final String envVal = System.getenv(key);
|
|
|
|
|
|
|
|
if (envVal != null)
|
|
|
|
return envVal;
|
|
|
|
|
|
|
|
return prop.getProperty(key, def);
|
|
|
|
}
|
2020-11-12 21:19:45 +00:00
|
|
|
}
|