mirror of
https://github.com/MarginaliaSearch/MarginaliaSearch.git
synced 2025-10-06 17:32:39 +02:00
Compare commits
2 Commits
deploy-010
...
deploy-010
Author | SHA1 | Date | |
---|---|---|---|
|
b1130d7a04 | ||
|
8364bcdc97 |
@@ -21,6 +21,10 @@ public class FaviconGrpcService extends FaviconAPIGrpc.FaviconAPIImplBase implem
|
||||
this.domainStateDb = domainStateDb;
|
||||
}
|
||||
|
||||
public boolean shouldRegisterService() {
|
||||
return domainStateDb.isAvailable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void getFavicon(RpcFaviconRequest request, StreamObserver<RpcFaviconResponse> responseObserver) {
|
||||
Optional<DomainStateDb.FaviconRecord> icon = domainStateDb.getIcon(request.getDomain());
|
||||
|
@@ -79,11 +79,16 @@ public class DomainStateDb implements AutoCloseable {
|
||||
return fs.asPath().resolve("domainstate.db");
|
||||
}
|
||||
else {
|
||||
throw new SQLException("Could not find crawl data storage");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public DomainStateDb(Path filename) throws SQLException {
|
||||
public DomainStateDb(@Nullable Path filename) throws SQLException {
|
||||
if (null == filename) {
|
||||
connection = null;
|
||||
return;
|
||||
}
|
||||
|
||||
String sqliteDbString = "jdbc:sqlite:" + filename.toString();
|
||||
connection = DriverManager.getConnection(sqliteDbString);
|
||||
|
||||
@@ -110,11 +115,18 @@ public class DomainStateDb implements AutoCloseable {
|
||||
|
||||
@Override
|
||||
public void close() throws SQLException {
|
||||
connection.close();
|
||||
if (connection != null) {
|
||||
connection.close();
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isAvailable() {
|
||||
return connection != null;
|
||||
}
|
||||
|
||||
public void saveIcon(String domain, FaviconRecord faviconRecord) {
|
||||
if (connection == null) throw new IllegalStateException("No connection to domainstate db");
|
||||
|
||||
try (var stmt = connection.prepareStatement("""
|
||||
INSERT OR REPLACE INTO favicon (domain, contentType, icon)
|
||||
VALUES(?, ?, ?)
|
||||
@@ -130,6 +142,9 @@ public class DomainStateDb implements AutoCloseable {
|
||||
}
|
||||
|
||||
public Optional<FaviconRecord> getIcon(String domain) {
|
||||
if (connection == null)
|
||||
return Optional.empty();
|
||||
|
||||
try (var stmt = connection.prepareStatement("SELECT contentType, icon FROM favicon WHERE DOMAIN = ?")) {
|
||||
stmt.setString(1, domain);
|
||||
var rs = stmt.executeQuery();
|
||||
@@ -150,6 +165,8 @@ public class DomainStateDb implements AutoCloseable {
|
||||
}
|
||||
|
||||
public void save(SummaryRecord record) {
|
||||
if (connection == null) throw new IllegalStateException("No connection to domainstate db");
|
||||
|
||||
try (var stmt = connection.prepareStatement("""
|
||||
INSERT OR REPLACE INTO summary (domain, lastUpdatedEpochMs, state, stateDesc, feedUrl)
|
||||
VALUES (?, ?, ?, ?, ?)
|
||||
@@ -166,6 +183,9 @@ public class DomainStateDb implements AutoCloseable {
|
||||
}
|
||||
|
||||
public Optional<SummaryRecord> get(String domainName) {
|
||||
if (connection == null)
|
||||
return Optional.empty();
|
||||
|
||||
try (var stmt = connection.prepareStatement("""
|
||||
SELECT domain, lastUpdatedEpochMs, state, stateDesc, feedUrl
|
||||
FROM summary
|
||||
|
@@ -26,15 +26,15 @@
|
||||
It operates a bit like a clock, starting at the top and working its way around clockwise.</p>
|
||||
|
||||
<div class="flex gap-4 place-items-middle">
|
||||
@template.serp.part.matchogram(mask = 90)
|
||||
@template.serp.part.matchogram(mask = 90, domain = "example.com")
|
||||
<div>This is by the beginning</div>
|
||||
</div>
|
||||
<div class="flex gap-4 place-items-middle">
|
||||
@template.serp.part.matchogram(mask = 90L<<26)
|
||||
@template.serp.part.matchogram(mask = 90L<<26, domain = "example.com")
|
||||
<div>This is in the middle</div>
|
||||
</div>
|
||||
<div class="flex gap-4 place-items-middle">
|
||||
@template.serp.part.matchogram(mask = 5L<<48)
|
||||
@template.serp.part.matchogram(mask = 5L<<48, domain = "example.com")
|
||||
<div>This is toward the end</div>
|
||||
</div>
|
||||
|
||||
|
@@ -1,11 +1,13 @@
|
||||
@import java.util.stream.IntStream
|
||||
|
||||
@param long mask
|
||||
@param String domain
|
||||
|
||||
<svg width="40" height="40">
|
||||
<svg width="40" height="40"
|
||||
style="background-image: url('/site/${domain}/favicon'); background-repeat: no-repeat; background-size: 16px 16px; background-position: center; ">
|
||||
<circle
|
||||
cx="18"
|
||||
cy="18"
|
||||
cx="20"
|
||||
cy="20"
|
||||
r="16"
|
||||
fill="none"
|
||||
stroke="#eee"
|
||||
@@ -13,10 +15,10 @@
|
||||
/>
|
||||
@for (int bit : IntStream.range(0, 56).filter(bit -> (mask & (1L << bit)) != 0).toArray())
|
||||
<line
|
||||
x1="${18 + 15*Math.sin(2 * Math.PI * bit / 56.)}"
|
||||
y1="${18 - 15*Math.cos(2 * Math.PI * bit / 56.)}"
|
||||
x2="${18 + 17*Math.sin(2 * Math.PI * bit / 56.)}"
|
||||
y2="${18 - 17*Math.cos(2 * Math.PI * bit / 56.)}"
|
||||
x1="${20 + 15*Math.sin(2 * Math.PI * bit / 56.)}"
|
||||
y1="${20 - 15*Math.cos(2 * Math.PI * bit / 56.)}"
|
||||
x2="${20 + 17*Math.sin(2 * Math.PI * bit / 56.)}"
|
||||
y2="${20 - 17*Math.cos(2 * Math.PI * bit / 56.)}"
|
||||
stroke="#444"
|
||||
stroke-width="2"
|
||||
/>
|
||||
|
@@ -12,7 +12,7 @@
|
||||
<div class="flex flex-col grow" >
|
||||
<div class="flex flex-row space-x-2 place-items-center">
|
||||
<div class="flex-0" title="Match density">
|
||||
@template.serp.part.matchogram(mask = result.first.positionsMask)
|
||||
@template.serp.part.matchogram(mask = result.first.positionsMask, domain=result.getFirst().url.domain.toString())
|
||||
</div>
|
||||
<div class="flex grow justify-between items-start">
|
||||
<div class="flex-1">
|
||||
|
Reference in New Issue
Block a user