From 4bd6e39a8cc9cf9d60e3398be8df59f1c116d6ff Mon Sep 17 00:00:00 2001 From: DebaucheryLibrarian Date: Mon, 9 Feb 2026 01:17:15 +0100 Subject: [PATCH] Added SicFlics. --- seeds/02_sites.js | 56 ++++++++++++++++ src/entities.js | 2 +- src/scrapers/releases.js | 2 + src/scrapers/sicflics.js | 137 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 src/scrapers/sicflics.js diff --git a/seeds/02_sites.js b/seeds/02_sites.js index 5a610b9b..246116a7 100755 --- a/seeds/02_sites.js +++ b/seeds/02_sites.js @@ -13343,6 +13343,62 @@ const sites = [ id: 'young-perps', }, }, + // SIC FLICS + { + slug: 'sicflics', + name: 'Sic Flics', + styled: 'SicFlics', + url: 'https://www.sicflics.com', + parameters: { + layout: 'mobile', // has scene links + actorTags: { + maria: 'Queen Maria', + crazywifeslut: 'CrazyWifeSlut', + kassiopeia: 'Kassiopeia', + alexis: 'Alexis Fisting Queen', // aka Loose Cunt Whore Alexis + selene: 'Goddess Selene', + helen: 'Queen Helen', + nikoletta: 'Nikoletta', + tabby: 'Tabby Tender', + queen_eva: 'Queen Eva', + alexbreecooper: 'Alex Bree Cooper', + yoni: 'Queen Yoni', + lily: 'Queen Lily', + mabel: 'Queen Mabel', + starryfawn: 'Starryfawnn', + sarah: 'Fist Queen Sarah', + anna: 'Queen Anna', + lulu: 'Lulu Blair', + marie_kaleida: 'Marie Kaleida', + ivy: 'Queen Ivy', + lilly_fuck_slut: 'Lilly Fuck Slut', + julie: 'Queen Julie', + msbwur: 'MrsBwur', + natusamare: 'Natus Amare', + kitty: 'Kitty', // not referred to as queen + celia: 'Queen Celia', + bella: 'Queen Bella', + sasha: 'Queen Sasha', + angel: 'Queen Angel', + ceelcee: 'Celia Dragon', + candy: 'Queen candy', + caroline: 'Queen caroline', + sophie: 'Sophie Belle', + mary: 'Queen Mary', + mayya: 'Mayya Moore', + misa: 'Broken Doll Misa', + noa_fox: 'Noa Fox', + sophia: 'Sophia', // not referred to as queen + sharpie_queen: 'Sharpie Queen', + cute_psycho_princess: 'Sharpie Queen', // alias + masha: 'Masha Yang', + abigail: 'Abigail Dupree', + ksu: 'Ksu Colt', + kitten: 'Shroomkitten', + chelly: 'Queen Chelly', + }, + }, + }, // TEEN CORE CLUB { name: 'Analyzed Girls', diff --git a/src/entities.js b/src/entities.js index 7ec4982c..f5338704 100755 --- a/src/entities.js +++ b/src/entities.js @@ -123,7 +123,7 @@ function urlToHostname(url) { try { const hostname = new URL(url) .hostname - .match(/(www\.)?(.*)/)?.at(-1); + .match(/(www\.|m\.)?(.*)/)?.at(-1); return hostname; } catch (error) { diff --git a/src/scrapers/releases.js b/src/scrapers/releases.js index 50dd0397..3071b97c 100644 --- a/src/scrapers/releases.js +++ b/src/scrapers/releases.js @@ -62,6 +62,7 @@ const radical = require('./radical'); const rickysroom = require('./rickysroom'); const sexlikereal = require('./sexlikereal'); const score = require('./score'); +const sicflics = require('./sicflics'); const snowvalley = require('./snowvalley'); const spizoo = require('./spizoo'); const teamskeet = require('./teamskeet'); @@ -166,6 +167,7 @@ module.exports = { rickysroom, score, sexlikereal, + sicflics, snowvalley, spizoo, swallowsalon: julesjordan, diff --git a/src/scrapers/sicflics.js b/src/scrapers/sicflics.js new file mode 100644 index 00000000..7a74d033 --- /dev/null +++ b/src/scrapers/sicflics.js @@ -0,0 +1,137 @@ +'use strict'; + +const unprint = require('unprint'); + +const slugify = require('../utils/slugify'); + +function scrapeLatest(scenes) { + return scenes.map(({ query }) => { + const release = {}; + + release.entryId = query.dataset('a[data-movie]', 'movie'); + release.shootId = release.entryId; + + release.title = query.content('.vidtitle p:first-child'); + release.description = query.text('.collapse p'); + + release.date = query.date('.vidtitle p:last-child', 'MMMM Do, YYYY'); + release.poster = query.img('.vidthumb img'); + + release.forceDeep = true; + + return release; + }); +} + +async function fetchLatest(channel, page) { + const res = await unprint.get(`https://www.sicflics.com/cinema/12-chronological-order/page${page}.html`, { selectAll: '.update-wrap' }); + + if (res.ok) { + return scrapeLatest(res.context, channel); + } + + return res.status; +} + +function scrapeLatestMobile(scenes) { + return scenes.map(({ query }) => { + const release = {}; + + release.url = query.url('a[href*="movie/"]'); + + release.entryId = new URL(release.url).pathname.match(/\/movie\/c\/(\d+)/)?.[1]; + release.shootId = release.entryId; + + release.title = query.content('.titlebg h4'); + release.date = query.date('.date span', 'MMMM Do, YYYY'); + + release.poster = query.img('a img.thumb'); + + return release; + }); +} + +async function fetchLatestMobile(channel, page) { + const res = await unprint.get(`https://m.sicflics.com/cinema/12-chronological-order/page${page}.html`, { selectAll: '.episode-box' }); + + if (res.ok) { + return scrapeLatestMobile(res.context, channel); + } + + return res.status; +} + +function scrapeScene({ query }, entryId, parameters) { + const release = { entryId }; + + release.title = query.content('h4'); + release.date = query.date('span[title="Date Added"]', 'MMMM Do, YYYY'); + + const tags = query.contents('.vidwrap a[href="#"]').map((tag) => tag.replace('#', '')); + + if (parameters?.actorTags) { + release.actors = tags.map((tag) => parameters.actorTags[slugify(tag, '_')]).filter(Boolean); + release.tags = tags.filter((tag) => !parameters.actorTags[slugify(tag, '_')]); + } else { + release.tags = tags; + } + + return release; +} + +async function fetchScene(_url, _channel, baseRelease, { parameters }) { + if (!baseRelease?.entryId) { + return null; + } + + const res = await unprint.get(`https://www2.sicflics.com/v6/v6.pop.php?id=${baseRelease.entryId}`); + + if (res.ok) { + return scrapeScene(res.context, baseRelease.entryId, parameters); + } + + return res.status; +} + +function scrapeSceneMobile({ query }, url, parameters) { + const release = {}; + + release.entryId = new URL(url).pathname.match(/\/movie\/c\/(\d+)/)?.[1]; + + release.title = query.content('.single-title'); + release.description = query.text('.moviedesc'); + + release.date = query.date('//strong[contains(text(), "Uploaded on")]/following-sibling::text()', 'MMMM Do, YYYY'); + + const tags = query.contents('.player-block a[href*="/tag"]').map((tag) => tag.replace('#', '')); + + if (parameters?.actorTags) { + release.actors = tags.map((tag) => parameters.actorTags[slugify(tag, '_')]).filter(Boolean); + release.tags = tags.filter((tag) => !parameters.actorTags[slugify(tag, '_')]); + } else { + release.tags = tags; + } + + release.poster = query.img('.thumb-pad img'); + + return release; +} + +async function fetchSceneMobile(url, _channel, _baseRelease, { parameters }) { + const res = await unprint.get(url, { select: '.player-block' }); + + if (res.ok) { + return scrapeSceneMobile(res.context, url, parameters); + } + + return res.status; +} + +module.exports = { + fetchLatest, + fetchScene, + mobile: { + fetchLatest: fetchLatestMobile, + fetchScene: fetchSceneMobile, + }, +};