@@ -179,7 +179,7 @@ export default {
}
.alias {
- fill: var(--highlight);
+ fill: var(--shadow);
}
}
@@ -192,7 +192,7 @@ export default {
}
&.died {
- fill: var(--lighten);
+ fill: var(--shadow);
}
}
@@ -271,6 +271,11 @@ export default {
margin: 0 0 0 .5rem;
}
+.age-now,
+.age-death {
+ margin: 0 .25rem 0 0;
+}
+
.age-then {
color: var(--lighten);
}
diff --git a/assets/js/curate.js b/assets/js/curate.js
index 22f42076..ab440d21 100644
--- a/assets/js/curate.js
+++ b/assets/js/curate.js
@@ -57,6 +57,10 @@ function curateActor(actor, release, curateActorRelease) {
curatedActor.releases = actor.releases.map(actorRelease => curateActorRelease(actorRelease.release));
}
+ if (actor.aliasFor) {
+ curatedActor.aliasFor = curateActor(curatedActor.aliasFor);
+ }
+
return curatedActor;
}
diff --git a/assets/js/networks/actions.js b/assets/js/networks/actions.js
index 48752c61..8e42949e 100644
--- a/assets/js/networks/actions.js
+++ b/assets/js/networks/actions.js
@@ -12,7 +12,7 @@ function initNetworksActions(store, _router) {
}) {
const { before, after, orderBy } = getDateRange(range);
- const { network, releases } = await graphql(`
+ const { network, connection: { releases, totalCount } } = await graphql(`
query Network(
$networkSlug: String!
$limit:Int = 10,
@@ -71,47 +71,50 @@ function initNetworksActions(store, _router) {
url
}
}
- releases(
- first: $limit
+ connection: releasesConnection(
+ first: $limit
offset: $offset
- orderBy: $orderBy
- filter: {
- site: {
- or: [
- { network: { slug: { equalTo: $networkSlug } } },
- { network: { parent: { slug: { equalTo: $networkSlug } } } }
- ]
- }
- or: [
- {
- date: {
- lessThan: $before,
- greaterThan: $after
- }
- },
- {
- date: {
- isNull: true
- },
- createdAt: {
- lessThan: $beforeTime,
- greaterThan: $afterTime,
- }
- }
- ]
- releasesTagsConnection: {
- none: {
- tag: {
- slug: {
- in: $exclude
- }
- }
- }
- }
- }
- ) {
- ${releaseFields}
- }
+ orderBy: $orderBy
+ filter: {
+ site: {
+ or: [
+ { network: { slug: { equalTo: $networkSlug } } },
+ { network: { parent: { slug: { equalTo: $networkSlug } } } }
+ ]
+ }
+ or: [
+ {
+ date: {
+ lessThan: $before,
+ greaterThan: $after
+ }
+ },
+ {
+ date: {
+ isNull: true
+ },
+ createdAt: {
+ lessThan: $beforeTime,
+ greaterThan: $afterTime,
+ }
+ }
+ ]
+ releasesTagsConnection: {
+ none: {
+ tag: {
+ slug: {
+ in: $exclude
+ }
+ }
+ }
+ }
+ }
+ ) {
+ releases: nodes {
+ ${releaseFields}
+ }
+ totalCount
+ }
}
`, {
networkSlug,
@@ -125,7 +128,10 @@ function initNetworksActions(store, _router) {
exclude: store.state.ui.filter,
});
- return curateNetwork(network, releases);
+ return {
+ network: curateNetwork(network, releases),
+ totalCount,
+ };
}
async function fetchNetworks({ _commit }) {
diff --git a/assets/js/router.js b/assets/js/router.js
index 5ae8bfd8..b53a6cbf 100644
--- a/assets/js/router.js
+++ b/assets/js/router.js
@@ -101,11 +101,12 @@ const routes = [
params: {
...from.params,
range: 'latest',
+ pageNumber: 1,
},
}),
},
{
- path: '/network/:networkSlug/:range',
+ path: '/network/:networkSlug/:range/:pageNumber?',
component: Network,
name: 'networkRange',
},
diff --git a/assets/js/ui/actions.js b/assets/js/ui/actions.js
index 5364b7eb..2f3f139e 100644
--- a/assets/js/ui/actions.js
+++ b/assets/js/ui/actions.js
@@ -92,14 +92,18 @@ function initUiActions(_store, _router) {
name
slug
age
+ ageAtDeath
dateOfBirth
+ dateOfDeath
gender
aliasFor: actorByAliasFor {
id
name
slug
age
+ ageAtDeath
dateOfBirth
+ dateOfDeath
gender
network {
id
diff --git a/public/img/tags/ass-to-mouth/0.jpeg b/public/img/tags/ass-to-mouth/0.jpeg
deleted file mode 100644
index 79a8dd2a..00000000
Binary files a/public/img/tags/ass-to-mouth/0.jpeg and /dev/null differ
diff --git a/public/img/tags/ass-to-mouth/lazy/0.jpeg b/public/img/tags/ass-to-mouth/lazy/0.jpeg
deleted file mode 100644
index d1e31658..00000000
Binary files a/public/img/tags/ass-to-mouth/lazy/0.jpeg and /dev/null differ
diff --git a/public/img/tags/ass-to-mouth/thumbs/0.jpeg b/public/img/tags/ass-to-mouth/thumbs/0.jpeg
deleted file mode 100644
index 5e2317ec..00000000
Binary files a/public/img/tags/ass-to-mouth/thumbs/0.jpeg and /dev/null differ
diff --git a/public/img/tags/atm/0.jpeg b/public/img/tags/atm/0.jpeg
new file mode 100644
index 00000000..bf39b91c
Binary files /dev/null and b/public/img/tags/atm/0.jpeg differ
diff --git a/public/img/tags/ass-to-mouth/1.jpeg b/public/img/tags/atm/1.jpeg
similarity index 100%
rename from public/img/tags/ass-to-mouth/1.jpeg
rename to public/img/tags/atm/1.jpeg
diff --git a/public/img/tags/atm/2.jpeg b/public/img/tags/atm/2.jpeg
new file mode 100644
index 00000000..fb93f843
Binary files /dev/null and b/public/img/tags/atm/2.jpeg differ
diff --git a/public/img/tags/atm/3.jpeg b/public/img/tags/atm/3.jpeg
new file mode 100644
index 00000000..6e397e03
Binary files /dev/null and b/public/img/tags/atm/3.jpeg differ
diff --git a/public/img/tags/atm/4.jpeg b/public/img/tags/atm/4.jpeg
new file mode 100644
index 00000000..ca791b09
Binary files /dev/null and b/public/img/tags/atm/4.jpeg differ
diff --git a/public/img/tags/atm/lazy/0.jpeg b/public/img/tags/atm/lazy/0.jpeg
new file mode 100644
index 00000000..2c319ea9
Binary files /dev/null and b/public/img/tags/atm/lazy/0.jpeg differ
diff --git a/public/img/tags/atm/lazy/1.jpeg b/public/img/tags/atm/lazy/1.jpeg
new file mode 100644
index 00000000..a595fc58
Binary files /dev/null and b/public/img/tags/atm/lazy/1.jpeg differ
diff --git a/public/img/tags/atm/lazy/2.jpeg b/public/img/tags/atm/lazy/2.jpeg
new file mode 100644
index 00000000..25ee2064
Binary files /dev/null and b/public/img/tags/atm/lazy/2.jpeg differ
diff --git a/public/img/tags/atm/lazy/3.jpeg b/public/img/tags/atm/lazy/3.jpeg
new file mode 100644
index 00000000..a7959f38
Binary files /dev/null and b/public/img/tags/atm/lazy/3.jpeg differ
diff --git a/public/img/tags/atm/thumbs/0.jpeg b/public/img/tags/atm/thumbs/0.jpeg
new file mode 100644
index 00000000..bfac366b
Binary files /dev/null and b/public/img/tags/atm/thumbs/0.jpeg differ
diff --git a/public/img/tags/atm/thumbs/1.jpeg b/public/img/tags/atm/thumbs/1.jpeg
new file mode 100644
index 00000000..0e0101ee
Binary files /dev/null and b/public/img/tags/atm/thumbs/1.jpeg differ
diff --git a/public/img/tags/atm/thumbs/2.jpeg b/public/img/tags/atm/thumbs/2.jpeg
new file mode 100644
index 00000000..dec9df92
Binary files /dev/null and b/public/img/tags/atm/thumbs/2.jpeg differ
diff --git a/public/img/tags/atm/thumbs/3.jpeg b/public/img/tags/atm/thumbs/3.jpeg
new file mode 100644
index 00000000..3e6fa2cf
Binary files /dev/null and b/public/img/tags/atm/thumbs/3.jpeg differ
diff --git a/public/img/tags/mfm/5.jpeg b/public/img/tags/mfm/5.jpeg
deleted file mode 100644
index ae457269..00000000
Binary files a/public/img/tags/mfm/5.jpeg and /dev/null differ
diff --git a/public/img/tags/mfm/6.jpeg b/public/img/tags/mfm/6.jpeg
new file mode 100644
index 00000000..f016e197
Binary files /dev/null and b/public/img/tags/mfm/6.jpeg differ
diff --git a/public/img/tags/mfm/lazy/6.jpeg b/public/img/tags/mfm/lazy/6.jpeg
new file mode 100644
index 00000000..9c8c10d4
Binary files /dev/null and b/public/img/tags/mfm/lazy/6.jpeg differ
diff --git a/public/img/tags/mfm/thumbs/0.jpeg b/public/img/tags/mfm/thumbs/0.jpeg
index b2ed8114..7c480532 100644
Binary files a/public/img/tags/mfm/thumbs/0.jpeg and b/public/img/tags/mfm/thumbs/0.jpeg differ
diff --git a/public/img/tags/mfm/thumbs/1.jpeg b/public/img/tags/mfm/thumbs/1.jpeg
index 5e545d2e..485c526f 100644
Binary files a/public/img/tags/mfm/thumbs/1.jpeg and b/public/img/tags/mfm/thumbs/1.jpeg differ
diff --git a/public/img/tags/mfm/thumbs/2.jpeg b/public/img/tags/mfm/thumbs/2.jpeg
index 553093db..00580c50 100644
Binary files a/public/img/tags/mfm/thumbs/2.jpeg and b/public/img/tags/mfm/thumbs/2.jpeg differ
diff --git a/public/img/tags/mfm/thumbs/3.jpeg b/public/img/tags/mfm/thumbs/3.jpeg
index 8a60def1..3b241699 100644
Binary files a/public/img/tags/mfm/thumbs/3.jpeg and b/public/img/tags/mfm/thumbs/3.jpeg differ
diff --git a/public/img/tags/mfm/thumbs/4.jpeg b/public/img/tags/mfm/thumbs/4.jpeg
index 18256787..31478339 100644
Binary files a/public/img/tags/mfm/thumbs/4.jpeg and b/public/img/tags/mfm/thumbs/4.jpeg differ
diff --git a/public/img/tags/mfm/thumbs/5.jpeg b/public/img/tags/mfm/thumbs/5.jpeg
index 44faf997..97359ad6 100644
Binary files a/public/img/tags/mfm/thumbs/5.jpeg and b/public/img/tags/mfm/thumbs/5.jpeg differ
diff --git a/public/img/tags/mfm/thumbs/6.jpeg b/public/img/tags/mfm/thumbs/6.jpeg
new file mode 100644
index 00000000..a69935f3
Binary files /dev/null and b/public/img/tags/mfm/thumbs/6.jpeg differ
diff --git a/seeds/00_tags.js b/seeds/00_tags.js
index bbc85ea8..23cbff4e 100644
--- a/seeds/00_tags.js
+++ b/seeds/00_tags.js
@@ -128,7 +128,7 @@ const tags = [
},
{
name: 'ass to mouth',
- slug: 'ass-to-mouth',
+ slug: 'atm',
priority: 6,
description: 'Sucking off a cock right after it fucked your ass. If it has been in someone else\'s ass, it may be called [ATOGM](/tag/atogm).',
group: 'oral',
@@ -137,7 +137,7 @@ const tags = [
name: 'ass to other girl\'s mouth',
slug: 'atogm',
priority: 6,
- description: '[Ass to mouth](/tag/ass-to-mouth) with a cock that has been in someone else\'s ass. ATOGM may also be the gay variation "ass to other guy\'s mouth".',
+ description: '[Ass to mouth](/tag/atm) with a cock that has been in someone else\'s ass. ATOGM may also be the gay variation "ass to other guy\'s mouth".',
group: 'oral',
},
{
@@ -795,6 +795,7 @@ const tags = [
{
name: 'threesome',
slug: 'threesome',
+ priority: 8,
group: 'group',
},
{
@@ -961,13 +962,13 @@ const aliases = [
for: 'atom',
},
{
- name: 'atm',
- for: 'ass-to-mouth',
+ name: 'ass to mouth',
+ for: 'atm',
secondary: true,
},
{
name: 'a2m',
- for: 'ass-to-mouth',
+ for: 'atm',
secondary: true,
},
{
@@ -1446,6 +1447,10 @@ const aliases = [
name: 'mature & milf',
for: 'milf',
},
+ {
+ name: 'milfs',
+ for: 'milf',
+ },
{
name: 'natural',
for: 'natural-boobs',
diff --git a/seeds/04_media.js b/seeds/04_media.js
index 67263e03..217fb542 100644
--- a/seeds/04_media.js
+++ b/seeds/04_media.js
@@ -591,7 +591,7 @@ const tagPosters = [
['anal-creampie', 1, 'Aleska Diamond in "Aleska Wants More" for Asshole Fever'],
['ass-eating', 0, 'Angelica Heart and Leanna Sweet in "ATM Bitches" for Asshole Fever'],
['asian', 0, 'Alina Li in "Slut Puppies 8" for Jules Jordan'],
- ['ass-to-mouth', 0, 'Helena Sweet in "Teen Tryout" for Asshole Fever'],
+ ['atm', 2, 'Jureka Del Mar in "Stretched Out" for Her Limit'],
['atogm', 0, 'Alysa Gap and Logan in "Anal Buffet 4" for Evil Angel'],
['bdsm', 0, 'Dani Daniels in "The Traning of Dani Daniels, Day 2" for The Training of O at Kink'],
['behind-the-scenes', 0, 'Janice Griffith in "Day With A Pornstar: Janice" for Brazzers'],
@@ -626,7 +626,7 @@ const tagPosters = [
['maid', 0, 'Whitney Wright in "Dredd Up Your Ass 2" for Jules Jordan'],
['milf', 0, 'Olivia Austin in "Dredd 3" for Jules Jordan'],
['mff', 0, 'Madison Ivy, Adriana Chechik and Keiran Lee in "Day With A Pornstar" for Brazzers'],
- ['mfm', 5, 'Vina Sky in "Slut Puppies 15" for Jules Jordan'],
+ ['mfm', 6, 'Honey Gold in "Slut Puppies 12" for Jules Jordan'],
['natural-boobs', 0, 'Autumn Falls in "Manuel Ferrara\'s Ripe 7" for Jules Jordan'],
['nurse', 0, 'Sarah Vandella in "Cum For Nurse Sarah" for Brazzers'],
['oil', 0, 'Jada Stevens in "Jada Stevens Anal Ass Oiled Up For James Deen\'s Cock" for Jules Jordan'],
@@ -659,6 +659,8 @@ const tagPhotos = [
['airtight', 2, 'Dakota Skye in "Dakota Goes Nuts" for ArchAngel'],
['airtight', 3, 'Anita Bellini in "Triple Dick Gangbang" for Hands On Hardcore (DDF Network)'],
['anal-creampie', 0, 'Gina Valentina and Jane Wilde in "A Very Special Anniversary" for Tushy'],
+ ['atm', 0, 'Roxy Lips in "Under Her Coat" for 21 Naturals'],
+ ['atm', 3, 'Natasha Teen in "Work That Ass!" for Her Limit'],
['asian', 'poster', 'Vina Sky in "Slut Puppies 15" for Jules Jordan'],
// ['asian', 1, 'Alina Li in "Oil Overload 11" for Jules Jordan'],
// ['anal', 'poster', 'Jynx Maze in "Anal Buffet 6" for Evil Angel'],
@@ -700,7 +702,7 @@ const tagPhotos = [
['gaping', 'poster', 'Zoey Monroe in "Manuel DPs Them All 5" for Jules Jordan'],
['gaping', 2, 'Alex Grey in "DP Masters 5" for Jules Jordan'],
['latina', 0, 'Abby Lee Brazil for Bang Bros'],
- // ['mfm', 0, 'Vina Sky in "Jules Jordan\'s Three Ways" for Jules Jordan'],
+ ['mfm', 4, 'Vina Sky in "Jules Jordan\'s Three Ways" for Jules Jordan'],
['mfm', 1, 'Jynx Maze in "Don\'t Make Me Beg 4" for Evil Angel'],
['oil', 1, 'Emily Willis in "Emily Willis Has A Squirting Anal Orgasm" for Jules Jordan'],
['orgy', 'poster', 'Zoey Mornoe (DP), Jillian Janson (sex), Frida Sante, Katerina Kay and Natasha Starr in "Orgy Masters 6" for Jules Jordan'],
diff --git a/src/scrapers/bangbros.js b/src/scrapers/bangbros.js
index 5af4bf3e..0f2bf8f4 100644
--- a/src/scrapers/bangbros.js
+++ b/src/scrapers/bangbros.js
@@ -16,7 +16,7 @@ function scrape(html, site) {
return sceneElements.map((element) => {
const sceneLinkElement = $(element).find('.thmb_lnk');
const title = sceneLinkElement.attr('title');
- const url = site.legacy
+ const url = site.parameters?.legacy
? `https://${site.url}{sceneLinkElement.attr('href')}`
: `https://bangbros.com${sceneLinkElement.attr('href')}`;
const shootId = sceneLinkElement.attr('id') && sceneLinkElement.attr('id').split('-')[1];
@@ -150,14 +150,14 @@ function scrapeSceneLegacy({ qu }, url) {
return release;
}
-function scrapeProfile(html) {
+function scrapeProfile(html, scope) {
const { q } = ex(html);
const profile = {};
const avatar = q('.profilePic img', 'src');
if (avatar) profile.avatar = `https:${avatar}`;
- profile.releases = scrape(html);
+ profile.releases = scrape(html, scope.network);
return profile;
}
@@ -221,7 +221,7 @@ async function fetchScene(url, site, release) {
return scrapeScene(res.item.html, url, site);
}
-async function fetchProfile(actorName) {
+async function fetchProfile(actorName, scope) {
const actorSlug = slugify(actorName);
const url = `https://bangbros.com/search/${actorSlug}`;
const res = await bhttp.get(url);
@@ -233,7 +233,7 @@ async function fetchProfile(actorName) {
const actorRes = await bhttp.get(actorUrl);
if (actorRes.statusCode === 200) {
- return scrapeProfile(actorRes.body.toString());
+ return scrapeProfile(actorRes.body.toString(), scope);
}
}
}
diff --git a/src/scrapers/brazzers.js b/src/scrapers/brazzers.js
index 80a409ac..7199a3ef 100644
--- a/src/scrapers/brazzers.js
+++ b/src/scrapers/brazzers.js
@@ -100,7 +100,7 @@ async function scrapeScene(html, url, _site) {
const siteElement = $('.niche-site-logo');
// const siteUrl = `https://www.brazzers.com${siteElement.attr('href').slice(0, -1)}`;
const siteName = siteElement.attr('title');
- release.channel = siteName.replace(/\s+/g, '').toLowerCase();
+ release.channel = slugify(siteName, '');
release.tags = $('.tag-card-container a').map((tagIndex, tagElement) => $(tagElement).text()).toArray();
release.photos = $('.carousel-thumb a').map((photoIndex, photoElement) => `https:${$(photoElement).attr('href')}`).toArray();
diff --git a/src/scrapers/naughtyamerica.js b/src/scrapers/naughtyamerica.js
index d16ab706..fd2c3551 100644
--- a/src/scrapers/naughtyamerica.js
+++ b/src/scrapers/naughtyamerica.js
@@ -59,16 +59,17 @@ function scrapeScene(html, url, site) {
const originalUrl = `${protocol}//${hostname}${pathname}`;
const entryId = originalUrl.split('-').slice(-1)[0];
- const title = sceneElement.find('h1.scene-title.grey-text').text();
+ const title = sceneElement.find('h1.scene-title').text();
const description = sceneElement.find('.synopsis').contents().slice(2).text().replace(/[\s\n]+/g, ' ').trim();
- const date = moment.utc(sceneElement.find('span.entry-date').text(), 'MMM D, YYYY').toDate();
- const actors = $('a.scene-title.grey-text.link').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
+ const date = moment.utc(sceneElement.find('span.entry-date').text()?.match(/\w+ \d{1,2}, \d{4}/), 'MMM D, YYYY').toDate();
+ const actors = $('.performer-list a, h1 a.scene-title').map((actorIndex, actorElement) => $(actorElement).text()).toArray();
const duration = Number(sceneElement.find('.duration-ratings .duration').text().slice(10, -4)) * 60;
- const poster = `https:${$('video, dl8-video').attr('poster')}`;
- const photos = $('.contain-scene-images.desktop-only a').map((index, el) => `https:${$(el).attr('href')}`).toArray();
+ const posterPath = $('video, dl8-video').attr('poster') || $('img.start-card').attr('src');
+ const poster = posterPath && `https:${posterPath}`;
+ const photos = $('.contain-scene-images.desktop-only a').map((index, el) => $(el).attr('href')).toArray().filter(Boolean).map(photo => `https:${photo}`);
const trailerEl = $('source');
const trailerSrc = trailerEl.attr('src');
@@ -90,10 +91,10 @@ function scrapeScene(html, url, site) {
tags,
photos,
poster,
- trailer: {
+ trailer: trailerSrc ? {
src: trailerSrc,
type: trailerType,
- },
+ } : null,
rating: null,
site,
channel,
diff --git a/src/store-releases.js b/src/store-releases.js
index 2481ed08..b2440fe0 100644
--- a/src/store-releases.js
+++ b/src/store-releases.js
@@ -25,7 +25,7 @@ function curateReleaseEntry(release, batchId, existingRelease) {
shoot_id: release.shootId || null,
studio_id: release.studio?.id || null,
url: release.url,
- date: release.date,
+ date: Number(release.date) ? release.date : null,
slug,
description: release.description,
duration: release.duration,
@@ -47,7 +47,7 @@ function curateReleaseEntry(release, batchId, existingRelease) {
}
async function attachChannelSites(releases) {
- const releasesWithoutSite = releases.filter(release => release.channel && (!release.site || release.site.isNetwork));
+ const releasesWithoutSite = releases.filter(release => release.channel && (!release.site || release.site.isNetwork || release.site.slug !== release.channel));
const channelSites = await knex('sites')
.leftJoin('networks', 'networks.id', 'sites.network_id')
@@ -58,10 +58,6 @@ async function attachChannelSites(releases) {
const releasesWithChannelSite = await Promise.all(releases
.map(async (release) => {
- if (release.site && !release.site.isNetwork) {
- return release;
- }
-
if (release.channel && channelSitesBySlug[release.channel]) {
const curatedSite = await curateSite(channelSitesBySlug[release.channel]);
@@ -71,6 +67,11 @@ async function attachChannelSites(releases) {
};
}
+ if (release.site && !release.site.isNetwork) {
+ return release;
+ }
+
+
if (release.site && release.site.isNetwork) {
return {
...release,
@@ -129,6 +130,10 @@ function attachReleaseIds(releases, storedReleases) {
function filterInternalDuplicateReleases(releases) {
const releasesBySiteIdAndEntryId = releases.reduce((acc, release) => {
+ if (!release.site) {
+ return acc;
+ }
+
if (!acc[release.site.id]) {
acc[release.site.id] = {};
}
@@ -221,7 +226,7 @@ async function storeReleases(releases) {
const curatedNewReleaseEntries = uniqueReleases.map(release => curateReleaseEntry(release, batchId));
- const storedReleases = await knex('releases').insert(curatedNewReleaseEntries).returning('*');
+ const storedReleases = await knex.batchInsert('releases', curatedNewReleaseEntries).returning('*');
// TODO: update duplicate releases
const storedReleaseEntries = Array.isArray(storedReleases) ? storedReleases : [];
diff --git a/src/utils/posters.js b/src/utils/posters.js
index 178af2c6..2321f1eb 100644
--- a/src/utils/posters.js
+++ b/src/utils/posters.js
@@ -25,7 +25,7 @@ async function actorPosters(actorNames) {
const source = path.join(config.media.path, poster.path);
const directory = path.join(config.media.path, 'extracted', poster.actor_name);
- const target = path.join(directory, `${poster.actor_name} - ${poster.network_name}: ${poster.site_name} - ${poster.title.replace(/[/.]/g, '_')} (${moment.utc(poster.date).format('YYYY-MM-DD')})-${poster.index}.jpeg`);
+ const target = path.join(directory, `${poster.actor_name} - ${poster.network_name}: ${poster.site_name} - ${poster.title.replace(/[/.]/g, '_') || poster.actor_name} (${moment.utc(poster.date).format('YYYY-MM-DD')})-${poster.index}.jpeg`);
await fs.mkdir(path.join(directory), { recursive: true });
const file = await fs.readFile(source);
diff --git a/src/utils/slugify.js b/src/utils/slugify.js
index c1e2f5c3..38c4678f 100644
--- a/src/utils/slugify.js
+++ b/src/utils/slugify.js
@@ -1,14 +1,45 @@
'use strict';
+const substitutes = {
+ à: 'a',
+ á: 'a',
+ ä: 'a',
+ å: 'a',
+ æ: 'ae',
+ ç: 'c',
+ è: 'e',
+ é: 'e',
+ ë: 'e',
+ ì: 'i',
+ í: 'i',
+ ï: 'i',
+ ǹ: 'n',
+ ń: 'n',
+ ñ: 'n',
+ ò: 'o',
+ ó: 'o',
+ ö: 'o',
+ ø: 'o',
+ œ: 'oe',
+ ß: 'ss',
+ ù: 'u',
+ ú: 'u',
+ ü: 'u',
+ ỳ: 'y',
+ ý: 'y',
+ ÿ: 'y',
+};
+
function slugify(string, delimiter = '-', {
encode = false,
+ removeAccents = true,
limit = 1000,
} = {}) {
if (!string || typeof string !== 'string') {
return string;
}
- const slugComponents = string.trim().toLowerCase().match(/\w+/g);
+ const slugComponents = string.trim().toLowerCase().match(/[A-Za-zÀ-ÖØ-öø-ÿ]+/g);
if (!slugComponents) {
return '';
@@ -18,6 +49,12 @@ function slugify(string, delimiter = '-', {
const accSlug = `${acc}${index > 0 ? delimiter : ''}${component}`;
if (accSlug.length < limit) {
+ if (removeAccents) {
+ return accSlug.replace(/[à-ÿ]/g, (match) => {
+ return substitutes[match] || '';
+ });
+ }
+
return accSlug;
}