This commit is contained in:
2026-07-17 10:20:32 +02:00
parent 60e290c37e
commit 402a859a0b

292
README.md Normal file
View File

@ -0,0 +1,292 @@
# WCX Index
Lokalt index för WCX-publiceringar.
Projektet bygger ett SQLite-baserat index från JSON-data som genereras av det befintliga scraper-scriptet.
## Nuvarande flöde
```text
WCX-site
befintligt scraper-script
import/wcx_site_index.json
scripts/import_site.py
database/wcx.db
```
Importscriptet:
* lägger till nya filmer
* uppdaterar befintliga filmer när sitens `update`-datum är nyare
* lämnar oförändrade filmer orörda
* lagrar speltid som antal sekunder
## Katalogstruktur
```text
/storage/disk1/WCX/
├── database/
│ └── wcx.db
├── import/
│ └── wcx_site_index.json
└── scripts/
├── schema.sql
└── import_site.py
```
## Förutsättningar
Projektet använder:
* Python 3
* SQLite 3
* jq, valfritt för inspektion av JSON
På Ubuntu/Debian:
```bash
sudo apt update
sudo apt install sqlite3 jq
```
Python-modulerna `json`, `sqlite3` och `pathlib` ingår i Pythons standardbibliotek. Inga externa Python-paket behövs.
## Skapa databasen
Databasen skapas från `schema.sql`.
```bash
mkdir -p /storage/disk1/WCX/database
sqlite3 /storage/disk1/WCX/database/wcx.db \
< /storage/disk1/WCX/scripts/schema.sql
```
Kontrollera tabellen:
```bash
sqlite3 /storage/disk1/WCX/database/wcx.db ".schema movie"
```
## Databasmodell
Tabellen `movie` innehåller:
| Kolumn | Beskrivning |
| ------------------ | ------------------------------------------ |
| `id` | Stabilt och unikt ID från siten |
| `name` | Filmens titel |
| `aka` | Alternativt namn |
| `nationality` | Nationalitet |
| `age` | Ålder |
| `shoot_location` | Inspelningsplats |
| `shoot_date` | Inspelningsdatum |
| `duration_seconds` | Speltid i sekunder |
| `description` | Manuell beskrivning |
| `rating` | Manuell rating |
| `web_url` | Länk till detaljsidan |
| `thumbnail` | Länk till thumbnail |
| `published` | Ursprungligt publiceringsdatum |
| `updated` | Senaste uppdateringsdatum från siten |
| `created_at` | När posten skapades i databasen |
| `modified_at` | När posten senast uppdaterades i databasen |
## JSON-indata
Importscriptet läser:
```text
/storage/disk1/WCX/import/wcx_site_index.json
```
Filen ska innehålla en JSON-array.
Exempel:
```json
{
"id": "sweet-cherry_41678",
"titel": "Sweet Cherry",
"details": "https://www.woodmancastingx.com/casting-x/sweet-cherry_41678.html",
"duration": "1:37:00",
"thumb": "https://example.com/thumbnail.jpg",
"published": "2026-07-12"
}
```
Vid en uppdaterad publicering kan även följande fält finnas:
```json
{
"update": "2026-07-15"
}
```
Importscriptet accepterar både `update` och `updated`.
## Fältmappning
| JSON-fält | Databaskolumn |
| ------------------------ | ------------------ |
| `id` | `id` |
| `titel` | `name` |
| `details` | `web_url` |
| `duration` | `duration_seconds` |
| `thumb` | `thumbnail` |
| `published` | `published` |
| `update` eller `updated` | `updated` |
Speltiden konverteras till sekunder.
Exempel:
```text
37:35 → 2255
1:37:00 → 5820
```
## Kör importen
Gör scriptet körbart om det inte redan är gjort:
```bash
chmod +x /storage/disk1/WCX/scripts/import_site.py
```
Kör importen:
```bash
/storage/disk1/WCX/scripts/import_site.py
```
Exempel på resultat:
```text
Poster i JSON: 1250
Tillagda: 3
Uppdaterade: 1
Oförändrade: 1246
```
## Importregler
### Ny film
Om filmens ID inte finns i databasen skapas en ny post.
### Befintlig film utan `update`
Om filmen redan finns och site-posten saknar `update` görs ingen ändring.
### Befintlig film med `update`
Posten uppdateras när:
* databasen saknar ett `updated`-värde, eller
* sitens `update`-datum är nyare än databasens `updated`-värde
Vid en uppdatering skrivs följande sitefält över:
* `name`
* `duration_seconds`
* `web_url`
* `thumbnail`
* `published`
* `updated`
ID och manuella metadatafält påverkas inte.
Datumen lagras som `YYYY-MM-DD`, vilket gör att de kan jämföras kronologiskt som text.
## Inspektera databasen
Visa antal filmer:
```bash
sqlite3 /storage/disk1/WCX/database/wcx.db \
"SELECT COUNT(*) FROM movie;"
```
Visa några poster:
```bash
sqlite3 -header -column /storage/disk1/WCX/database/wcx.db \
"SELECT id, name, duration_seconds, published, updated
FROM movie
LIMIT 10;"
```
Visa en specifik film:
```bash
sqlite3 -header -column /storage/disk1/WCX/database/wcx.db \
"SELECT *
FROM movie
WHERE id = 'susana-melo_6707';"
```
## Testa uppdateringslogiken
Ett enkelt test är att medvetet ändra en post:
```bash
sqlite3 /storage/disk1/WCX/database/wcx.db \
"UPDATE movie
SET duration_seconds = 1,
updated = NULL
WHERE id = 'susana-melo_6707';"
```
Kör sedan importen igen:
```bash
/storage/disk1/WCX/scripts/import_site.py
```
Posten ska då uppdateras från JSON-filen och `duration_seconds` ska återställas till sitens värde.
## Återskapa databasen
Under utveckling kan databasen enkelt återskapas eftersom all automatisk site-data kan importeras igen.
```bash
rm /storage/disk1/WCX/database/wcx.db
sqlite3 /storage/disk1/WCX/database/wcx.db \
< /storage/disk1/WCX/scripts/schema.sql
/storage/disk1/WCX/scripts/import_site.py
```
Radera inte databasen på detta sätt när den senare innehåller manuellt registrerad metadata utan att först ta en backup.
## Versionshantering
Källkod och dokumentation ska versionshanteras i Git.
Databasen och importerade datafiler bör normalt inte checkas in.
Föreslagen `.gitignore`:
```gitignore
database/*.db
database/*.db-shm
database/*.db-wal
import/*.json
__pycache__/
*.pyc
```
## Nästa steg
Planerade kommande delar:
* OCR-behandling av thumbnails för nya filmer
* manuell redigering av metadata
* export av komplett index
* integration med Emby
* schemalagd körning