Readme
This commit is contained in:
292
README.md
Normal file
292
README.md
Normal 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
|
||||
Reference in New Issue
Block a user