Piped-Backend/src/main/java/me/kavin/piped/Main.java

179 lines
5.6 KiB
Java
Raw Normal View History

2020-11-12 21:19:45 +00:00
package me.kavin.piped;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.schabi.newpipe.extractor.NewPipe;
import org.schabi.newpipe.extractor.localization.Localization;
2020-11-15 08:47:50 +00:00
import io.netty.buffer.ByteBufAllocator;
2020-11-12 21:19:45 +00:00
import io.netty.handler.codec.http.QueryStringDecoder;
import me.kavin.piped.consts.Constants;
import me.kavin.piped.utils.DownloaderImpl;
import me.kavin.piped.utils.ResponseHelper;
import me.kavin.piped.utils.SponsorBlockUtils;
import reactor.core.publisher.Flux;
import reactor.netty.ByteBufFlux;
2020-11-15 08:47:50 +00:00
import reactor.netty.NettyOutbound;
2020-11-12 21:19:45 +00:00
import reactor.netty.http.server.HttpServer;
2020-11-15 08:47:50 +00:00
import reactor.netty.http.server.HttpServerResponse;
2020-11-12 21:19:45 +00:00
public class Main {
public static void main(String[] args) throws Exception {
// SyndFeed feed = new SyndFeedInput().build(new XmlReader(new FileInputStream("pubsub.xml")));
//
// feed.getEntries().forEach(entry -> {
// System.out.println(entry.getLinks().get(0).getHref());
// System.out.println(entry.getAuthors().get(0).getUri());
// });
NewPipe.init(new DownloaderImpl(), new Localization("en", "US"));
HttpServer.create().port(Constants.PORT).route(routes -> {
routes.get("/webhooks/pubsub", (req, res) -> {
QueryStringDecoder query = new QueryStringDecoder(req.uri());
try {
2020-11-15 11:57:04 +00:00
return writeResponse(res, query.parameters().get("hub.challenge").get(0), 200, "private");
2020-11-12 21:19:45 +00:00
} catch (Exception e) {
e.printStackTrace();
2020-11-15 08:47:50 +00:00
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
2020-11-12 21:19:45 +00:00
}
});
routes.post("/webhooks/pubsub", (req, res) -> {
try {
req.receive().asString().subscribe(str -> System.out.println(str));
2020-11-15 11:57:04 +00:00
return writeResponse(res, "ok", 200, "private");
2020-11-12 21:19:45 +00:00
} catch (Exception e) {
e.printStackTrace();
2020-11-15 08:47:50 +00:00
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
2020-11-12 21:19:45 +00:00
}
});
routes.get("/sponsors/{videoId}", (req, res) -> {
QueryStringDecoder query = new QueryStringDecoder(req.uri());
try {
2020-11-15 08:47:50 +00:00
return writeResponse(res, SponsorBlockUtils.getSponsors(req.param("videoId"),
query.parameters().get("category").get(0)), 200, "public, max-age=3600");
2020-11-12 21:19:45 +00:00
} catch (Exception e) {
e.printStackTrace();
2020-11-15 08:47:50 +00:00
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
2020-11-12 21:19:45 +00:00
}
});
routes.get("/streams/{videoId}", (req, res) -> {
try {
// The stream links are valid for 6 hours.
2020-11-15 11:57:04 +00:00
return writeResponse(res, ResponseHelper.streamsResponse(req.param("videoId")), 200,
"public, s-maxage=21540");
2020-11-12 21:19:45 +00:00
} catch (Exception e) {
e.printStackTrace();
2020-11-15 08:47:50 +00:00
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
2020-11-12 21:19:45 +00:00
}
});
routes.get("/channels/{channelId}", (req, res) -> {
try {
2020-11-15 08:47:50 +00:00
return writeResponse(res, ResponseHelper.channelResponse(req.param("channelId")), 200,
"public, max-age=600");
2020-11-12 21:19:45 +00:00
} catch (Exception e) {
e.printStackTrace();
2020-11-15 08:47:50 +00:00
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
2020-11-12 21:19:45 +00:00
}
});
2020-11-25 05:26:25 +00:00
routes.get("/nextpage/channels/{channelId}", (req, res) -> {
QueryStringDecoder query = new QueryStringDecoder(req.uri());
try {
return writeResponse(res, ResponseHelper.channelPageResponse(req.param("channelId"),
query.parameters().get("url").get(0)), 200, "public, max-age=3600");
} catch (Exception e) {
e.printStackTrace();
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
}
});
routes.get("/suggestions", (req, res) -> {
QueryStringDecoder query = new QueryStringDecoder(req.uri());
try {
return writeResponse(res,
ResponseHelper.suggestionsResponse(query.parameters().get("query").get(0)), 200,
"public, max-age=600");
} catch (Exception e) {
e.printStackTrace();
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
}
});
2020-12-09 13:30:42 +00:00
routes.get("/search", (req, res) -> {
QueryStringDecoder query = new QueryStringDecoder(req.uri());
try {
return writeResponse(res, ResponseHelper.searchResponse(query.parameters().get("q").get(0)), 200,
"public, max-age=600");
} catch (Exception e) {
e.printStackTrace();
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
}
});
2020-12-14 07:11:42 +00:00
routes.get("/nextpage/search", (req, res) -> {
QueryStringDecoder query = new QueryStringDecoder(req.uri());
try {
return writeResponse(res,
ResponseHelper.searchPageResponse(query.parameters().get("q").get(0),
query.parameters().get("url").get(0), query.parameters().get("id").get(0)),
200, "public, max-age=3600");
} catch (Exception e) {
e.printStackTrace();
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
}
});
2020-11-12 21:19:45 +00:00
routes.get("/trending", (req, res) -> {
try {
2020-11-15 08:47:50 +00:00
return writeResponse(res, ResponseHelper.trendingResponse(), 200, "public, max-age=3600");
2020-11-12 21:19:45 +00:00
} catch (Exception e) {
e.printStackTrace();
2020-11-15 08:47:50 +00:00
return writeResponse(res, ExceptionUtils.getStackTrace(e), 500, "private");
2020-11-12 21:19:45 +00:00
}
});
}).bindNow();
Thread.sleep(Long.MAX_VALUE);
}
2020-11-15 08:47:50 +00:00
public static NettyOutbound writeResponse(HttpServerResponse res, String resp, int code, String cache) {
return res.compression(true).addHeader("Access-Control-Allow-Origin", "*").addHeader("Cache-Control", cache)
.send(ByteBufFlux.fromString(Flux.just(resp), java.nio.charset.StandardCharsets.UTF_8,
ByteBufAllocator.DEFAULT));
}
2020-11-12 21:19:45 +00:00
}