psmutil

package
v1.30.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 20, 2026 License: GPL-3.0 Imports: 11 Imported by: 0

Documentation

Overview

Package psmutil scrapes sites running PornSiteManager — a multi-tenant adult CMS hosted at gcs.pornsitemanager.com that powers the Frenchporn network (Citebeur, Eurocreme, Hard Kinks, AlphaMales, …) and likely other brands too. Every site exposes its catalog through a JSON-LD ItemList embedded directly in the HTML, so a clean scraper doesn't need detail-page fetches at all.

Detection signals:

  • `gcs.pornsitemanager.com` referenced for thumbs / favicons.
  • Listing pages at `{base}/{locale}/videos` (locale is typically `en`).
  • `<script type="application/ld+json">` containing `{"@type": "ItemList", "itemListElement": [...]}` with 12 `VideoObject` entries per page.
  • Pagination via `?page=N`; past-end pages return HTTP 200 with zero items.
  • Scene URL form: `/{locale}/videos/detail/{ID}-{slug}` (numeric ID + slug).

JSON-LD VideoObject fields used:

{
  "url":           "https://www.citebeur.com/en/videos/detail/46311-hey-bro",
  "name":          "Hey bro, let's fuck him together",
  "thumbnailUrl":  "https://gcs.pornsitemanager.com/store/.../hd/img.jpg",
  "datePublished": "2026-05-27",
  "description":   "When Kalys arrives at the underground parking lot…",
  "actor": [ {"name": "Choppeur"}, {"name": "Kévin Frenchboy"}, … ]
}

What's NOT in the JSON-LD (and skipped for now): duration, scene-specific tags. The HTML has duration in some sites' player markup but not uniformly; tags exist only as global sidebar category lists, not scene-specific.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Scraper

type Scraper struct {
	// contains filtered or unexported fields
}

func New

func New(cfg SiteConfig) *Scraper

func (*Scraper) ID

func (s *Scraper) ID() string

func (*Scraper) ListScenes

func (s *Scraper) ListScenes(ctx context.Context, studioURL string, opts scraper.ListOpts) (<-chan scraper.SceneResult, error)

func (*Scraper) MatchesURL

func (s *Scraper) MatchesURL(u string) bool

func (*Scraper) Patterns

func (s *Scraper) Patterns() []string

type SiteConfig

type SiteConfig struct {
	ID       string
	SiteBase string // e.g. "https://www.citebeur.com" — no trailing slash
	Studio   string
	Locale   string // typically "en"; falls back to "en" if zero
	Patterns []string
	MatchRe  *regexp.Regexp
}

SiteConfig describes one PornSiteManager-backed site.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL