197 lines
7.7 KiB
Java
197 lines
7.7 KiB
Java
package de.gurkengewuerz.ripmewrapper.handler;
|
|
|
|
import org.eclipse.jetty.server.Request;
|
|
import org.eclipse.jetty.server.handler.AbstractHandler;
|
|
import org.json.JSONArray;
|
|
import org.json.JSONObject;
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
import javax.servlet.http.HttpServletResponse;
|
|
import java.io.IOException;
|
|
import java.io.PrintWriter;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Paths;
|
|
import java.sql.Connection;
|
|
import java.sql.DriverManager;
|
|
import java.sql.PreparedStatement;
|
|
import java.sql.ResultSet;
|
|
import java.sql.SQLException;
|
|
import java.sql.Statement;
|
|
import java.util.logging.Level;
|
|
import java.util.logging.Logger;
|
|
|
|
/**
|
|
* Created by gurkengewuerz.de on 09.10.2018.
|
|
*/
|
|
public class APIHandler extends AbstractHandler {
|
|
|
|
@Override
|
|
public void handle(String s, Request request, HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
|
|
try {
|
|
Connection connection = DriverManager.getConnection("jdbc:sqlite:reddit_meta.db");
|
|
Statement statement = connection.createStatement();
|
|
statement.setQueryTimeout(30); // set timeout to 30 sec.
|
|
|
|
|
|
JSONObject returnObject = null;
|
|
JSONArray returnArray = null;
|
|
|
|
request.setCharacterEncoding("UTF-8");
|
|
httpServletResponse.setCharacterEncoding("UTF-8");
|
|
|
|
if (s.equals("/get")) {
|
|
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
|
|
returnArray = new JSONArray();
|
|
|
|
if (request.getParameter("subreddits") != null) {
|
|
String[] subreddits = request.getParameter("subreddits").split(",");
|
|
|
|
int offset = request.getParameter("offset") == null ? -1 : Integer.valueOf(request.getParameter("offset"));
|
|
|
|
StringBuilder builder = new StringBuilder();
|
|
for (int i = 0; i < subreddits.length; i++) {
|
|
builder.append("?,");
|
|
}
|
|
|
|
String builderString = builder.deleteCharAt(builder.length() - 1).toString();
|
|
|
|
int limit = 0;
|
|
int index = 1;
|
|
|
|
|
|
if (offset != -1) {
|
|
PreparedStatement psPre = connection.prepareStatement(
|
|
"SELECT iid FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builderString + ") ORDER BY created DESC, iid DESC"
|
|
);
|
|
|
|
for (String o : subreddits) {
|
|
psPre.setString(index++, o);
|
|
}
|
|
|
|
ResultSet rsPre = psPre.executeQuery();
|
|
while (rsPre.next()) {
|
|
limit++;
|
|
if (rsPre.getInt("iid") == offset) {
|
|
break;
|
|
}
|
|
}
|
|
rsPre.close();
|
|
psPre.close();
|
|
}
|
|
|
|
// ----------------
|
|
|
|
PreparedStatement ps = connection.prepareStatement(
|
|
"SELECT iid, metalist.id, subreddit, created, path FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builderString + ") ORDER BY created DESC, iid DESC LIMIT 10 OFFSET ?"
|
|
);
|
|
|
|
index = 1;
|
|
for (String o : subreddits) {
|
|
ps.setString(index++, o);
|
|
}
|
|
|
|
ps.setInt(index, limit);
|
|
|
|
|
|
ResultSet rs = ps.executeQuery();
|
|
while (rs.next()) {
|
|
JSONObject data = new JSONObject();
|
|
data.put("iid", rs.getInt("iid"));
|
|
data.put("id", rs.getString("id"));
|
|
data.put("subreddit", rs.getString("subreddit"));
|
|
data.put("created", rs.getInt("created"));
|
|
data.put("webm", rs.getString("path").endsWith(".webm"));
|
|
data.put("mp4", rs.getString("path").endsWith(".mp4"));
|
|
returnArray.put(data);
|
|
}
|
|
rs.close();
|
|
}
|
|
} else if (s.equals("/img")) {
|
|
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
|
|
|
|
PreparedStatement ps = connection.prepareStatement("SELECT path FROM filelist WHERE iid = ? AND id = ?");
|
|
|
|
ps.setString(1, request.getParameter("iid"));
|
|
ps.setString(2, request.getParameter("id"));
|
|
|
|
ResultSet rs = ps.executeQuery();
|
|
|
|
|
|
if (rs.next()) {
|
|
String path = rs.getString("path");
|
|
|
|
|
|
byte[] encoded = Files.readAllBytes(Paths.get(path));
|
|
httpServletResponse.setContentType(Files.probeContentType(Paths.get(path)));// or png or gif, etc
|
|
httpServletResponse.setContentLength(encoded.length);
|
|
httpServletResponse.getOutputStream().write(encoded);
|
|
}
|
|
|
|
request.setHandled(true);
|
|
return;
|
|
} else if (s.equals("/info")) {
|
|
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
|
|
returnObject = new JSONObject();
|
|
|
|
ResultSet rs = statement.executeQuery("SELECT DISTINCT subreddit FROM metalist;");
|
|
JSONArray ja = new JSONArray();
|
|
while (rs.next()) {
|
|
ja.put(rs.getString("subreddit"));
|
|
}
|
|
returnObject.put("subreddits", ja);
|
|
returnObject.put("subreddits_count", ja.length());
|
|
|
|
rs = statement.executeQuery("SELECT COUNT(*) c_all FROM filelist;");
|
|
if (rs.next()) {
|
|
returnObject.put("files", rs.getInt("c_all"));
|
|
}
|
|
|
|
|
|
if (request.getParameter("subreddits") != null) {
|
|
String[] subreddits = request.getParameter("subreddits").split(",");
|
|
StringBuilder builder = new StringBuilder();
|
|
for (int i = 0; i < subreddits.length; i++) {
|
|
builder.append("?,");
|
|
}
|
|
|
|
PreparedStatement ps = connection.prepareStatement(
|
|
"SELECT COUNT(*) c FROM filelist LEFT JOIN metalist ON filelist.id = metalist.id WHERE subreddit IN (" + builder.deleteCharAt(builder.length() - 1).toString() + ")"
|
|
);
|
|
|
|
int index = 1;
|
|
for (String o : subreddits) {
|
|
ps.setString(index++, o);
|
|
}
|
|
|
|
rs = ps.executeQuery();
|
|
if (rs.next()) {
|
|
returnObject.put("files_subreddits", rs.getInt("c"));
|
|
}
|
|
}
|
|
} else {
|
|
httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);
|
|
}
|
|
|
|
httpServletResponse.setContentType("application/json; charset=utf-8");
|
|
|
|
PrintWriter out = httpServletResponse.getWriter();
|
|
if (returnObject != null) {
|
|
out.write(returnObject.toString());
|
|
} else if (returnArray != null) {
|
|
out.write(returnArray.toString());
|
|
} else {
|
|
returnObject = new JSONObject();
|
|
returnObject.put("error", "not found");
|
|
out.write(returnObject.toString());
|
|
}
|
|
|
|
request.setHandled(true);
|
|
|
|
connection.close();
|
|
} catch (SQLException e) {
|
|
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, e);
|
|
}
|
|
}
|
|
|
|
}
|