Spotnet import, header backfill, staging and counter grouping, faster search
Spotnet (CONCEPT D29): - Index free.pt fully and import spots with their descriptions, categories and NZBs; a spot renames its release, since Spotnet names are more trustworthy than names derived from subjects. - Find passwords in spot descriptions too, and tell "needs a password we have" from "needs a password we don't have". Content inspection: - List the contents of 7z (.7z.001) archives, SFV sets, nicovideo uploads and other archive-like files; mark yEncBin .bin containers as encrypted. - Take real names from yEnc headers for randomly named files, and merge uploads that were split across posts. Storage (D31, D32): - Store segment lists zstd-compressed behind the FileStore accessor. - group:backfill indexes older headers at low priority and pauses when the NVMe or HDD part of the database gets too large. Grouping (D35, D36): - Lone header segments wait in staged_segments until a second segment of their file arrives, which drops the per-article junk binaries. - Counter grouping joins random-subject uploads by poster, [i/M] counter, part count and day. Search and maintenance (D33, D34): - A trigram-indexed search_text column, smaller indexes, estimated stats. - Passes that clean up nonsense names; weekly index maintenance; GC budgets per kind. - Web UI: grey out stale results while a search runs and cancel superseded requests. Count only up to 1,000 matches for the page, which made filter clicks take seconds (Newznab keeps the 10,000 cap). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
bcb9be5da9
commit
be8a3d4580
97 files changed
+4454
-268
No files matched your search
@@ -263,6 +263,41 @@ kbd {
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
/* While a new search runs, the previous results stay in place but greyed out. */
|
||||
.release-list.stale {
|
||||
opacity: 0.4;
|
||||
pointer-events: none;
|
||||
transition: opacity 0.12s ease-out;
|
||||
}
|
||||
|
||||
.results[aria-busy='true'] .summary::after {
|
||||
content: '';
|
||||
display: block;
|
||||
height: 2px;
|
||||
margin-top: 6px;
|
||||
border-radius: 1px;
|
||||
background: linear-gradient(90deg, transparent, var(--accent), transparent);
|
||||
background-size: 40% 100%;
|
||||
background-repeat: no-repeat;
|
||||
animation: searching 1s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes searching {
|
||||
from {
|
||||
background-position: -40% 0;
|
||||
}
|
||||
to {
|
||||
background-position: 140% 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
.results[aria-busy='true'] .summary::after {
|
||||
animation: none;
|
||||
background: var(--accent-soft);
|
||||
}
|
||||
}
|
||||
|
||||
.release-list {
|
||||
list-style: none;
|
||||
margin: 0;
|
||||
@@ -563,6 +598,70 @@ kbd {
|
||||
color: var(--bad);
|
||||
}
|
||||
|
||||
.notice-good {
|
||||
background: var(--good-soft);
|
||||
color: var(--good);
|
||||
}
|
||||
|
||||
.notice .password {
|
||||
padding: 1px 6px;
|
||||
border-radius: 4px;
|
||||
background: var(--surface);
|
||||
color: var(--text);
|
||||
font-family: var(--mono);
|
||||
user-select: all;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
.spot {
|
||||
display: flex;
|
||||
gap: 16px;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.spot-image {
|
||||
flex: none;
|
||||
width: 140px;
|
||||
height: auto;
|
||||
border-radius: 6px;
|
||||
background: var(--surface-2);
|
||||
}
|
||||
|
||||
.spot-body {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
}
|
||||
|
||||
.spot-body .facts {
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.spot-description {
|
||||
font-size: 13.5px;
|
||||
line-height: 1.55;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
.spot-description a,
|
||||
.spot-links a {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.spot-links {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
margin-top: 12px;
|
||||
font-size: 13px;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
@media (max-width: 560px) {
|
||||
.spot {
|
||||
flex-direction: column;
|
||||
}
|
||||
}
|
||||
|
||||
.notice-warn {
|
||||
background: var(--warn-soft);
|
||||
color: var(--warn);
|
||||
|
||||
Reference in new issue
Block a user