Compare commits

..

No commits in common. "9150aaeed6d65a6ffaf005f8fe06b91780c53344" and "b130e984304a7100dc355262dbb4aa16c773ad76" have entirely different histories.

63 changed files with 123 additions and 125 deletions

View File

@ -434,19 +434,19 @@ const releasesFragment = `
or: [
{
entity: {
showcased: {
equalTo: true
slug: {
notEqualTo: "analvids"
}
}
}
{
studio: {
showcased: {
equalTo: true
slug: {
in: ["giorgiograndi"]
}
}
}
]
],
},
first: $limit,
offset: $offset,

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "traxxx",
"version": "1.220.0",
"version": "1.219.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "traxxx",
"version": "1.220.0",
"version": "1.219.0",
"license": "ISC",
"dependencies": {
"@casl/ability": "^5.2.2",

View File

@ -1,6 +1,6 @@
{
"name": "traxxx",
"version": "1.220.0",
"version": "1.219.0",
"description": "All the latest porn releases in one place",
"main": "src/app.js",
"scripts": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.5 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 685 B

After

Width:  |  Height:  |  Size: 685 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

View File

@ -514,12 +514,10 @@ const networks = [
name: 'Pure Taboo',
url: 'https://www.puretaboo.com',
description: 'PureTaboo.com is the ultimate site for family taboo porn, featuring submissive teens & virgins in rough sex videos in ultra 4k HD.',
parent: 'gamma',
parameters: {
layout: 'api',
scene: 'https://www.puretaboo.com/en/video',
referer: 'https://www.puretaboo.com',
},
parent: 'gamma',
},
{
slug: 'realitykings',

View File

@ -369,12 +369,21 @@ const sites = [
url: 'https://accidentalgangbang.com',
parent: 'adulttime',
tags: ['gangbang'],
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
scene: false,
},
},
{
name: 'ASMR Fantasy',
slug: 'asmrfantasy',
url: 'https://asmrfantasy.com',
parent: 'adulttime',
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
deep: 'https://21sextury.com/en/video',
scene: false,
},
},
{
name: 'Being Trans 24/7',
@ -382,24 +391,38 @@ const sites = [
url: 'https://www.adulttime.com/series/being-trans',
parent: 'adulttime',
tags: ['transsexual'],
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
scene: false,
},
},
{
name: 'Between The Sheets',
slug: 'betweenthesheets',
url: 'https://www.adulttime.com/series/between-the-sheets',
parent: 'adulttime',
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
scene: false,
},
},
{
name: 'Bubblegum Dungeon',
slug: 'bubblegumdungeon',
url: 'https://www.bubblegumdungeon.com',
parent: 'adulttime',
parameters: {
scene: false,
},
},
{
name: 'Caught Fapping',
slug: 'caughtfapping',
url: 'https://www.caughtfapping.com',
parent: 'adulttime',
parameters: {
scene: false,
},
{
name: 'Forbidden Seductions',
slug: 'forbiddenseductions',
url: 'https://www.adulttime.com/series/forbidden-seductions',
parent: 'adulttime',
},
{
name: 'Futa Sentai Squad',
@ -407,17 +430,37 @@ const sites = [
url: 'https://www.futasentaisquad.com',
tags: ['animated'],
parent: 'adulttime',
parameters: {
scene: false,
},
},
{
name: 'Future Darkly',
slug: 'futuredarkly',
url: 'https://www.futuredarkly.com',
parent: 'adulttime',
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
scene: false,
},
},
{
name: 'Girlcore',
slug: 'girlcore',
url: 'https://www.girlcore.com',
parent: 'adulttime',
parameters: {
scene: false,
},
},
{
name: 'Girls Under Arrest',
slug: 'girlsunderarrest',
url: 'https://www.girlsunderarrest.com',
parameters: {
referer: 'https://www.isthisreal.com',
scene: 'https://www.isthisreal.com/en/video/girlsunderarrest',
},
parent: 'adulttime',
},
{
@ -425,6 +468,10 @@ const sites = [
slug: 'gostuckyourself',
url: 'https://www.adulttime.com/series/go-stuck-yourself',
parent: 'adulttime',
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
scene: false,
},
},
{
name: 'Hentai Sex School',
@ -432,6 +479,12 @@ const sites = [
url: 'https://www.hentaisexschool.com',
tags: ['hentai'],
parent: 'adulttime',
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
deep: 'https://21sextury.com/en/video',
scene: false,
includePhotos: false,
},
},
{
name: 'Lady Gonzo',
@ -441,22 +494,22 @@ const sites = [
parent: 'adulttime',
},
{
name: 'Lesbian Dating Stories',
slug: 'lesbiandatingstories',
url: 'https://www.adulttime.com/series/lesbian-dating-stories',
name: 'Lesbian Revenge',
slug: 'lesbianrevenge',
url: 'https://www.lesbianrevenge.com',
parent: 'adulttime',
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
},
{
name: 'Midnight Stories',
slug: 'midnightstories',
url: 'https://www.adulttime.com/series/midnight-stories',
parent: 'adulttime',
},
{
name: 'Mommy\'s Boy',
slug: 'mommysboy',
url: 'https://www.mommysboy.com',
parent: 'adulttime',
parameters: {
scene: false,
},
},
{
name: 'Naked Sword',
@ -464,6 +517,10 @@ const sites = [
url: 'https://www.adulttime.com/studio/nakedsword',
parent: 'adulttime',
tags: ['gay'],
parameters: {
layout: 'api',
referer: 'https://freetour.adulttime.com/en/join',
},
},
{
name: 'Out Of The Family',
@ -471,12 +528,21 @@ const sites = [
url: 'https://www.outofthefamily.com',
parent: 'adulttime',
},
{
name: 'Poly Family Life',
slug: 'polyfamilylife',
url: 'https://www.adulttime.com/series/poly-family-life',
parent: 'adulttime',
},
{
name: 'Pretty Dirty',
slug: 'prettydirty',
alias: ['prdi'],
url: 'https://www.prettydirty.com',
parent: 'adulttime',
parameters: {
referer: 'https://www.prettydirty.com',
},
},
{
name: 'Shape Of Beauty',
@ -489,6 +555,9 @@ const sites = [
slug: 'shewantshim',
url: 'https://www.adulttime.com/series/she-wants-him',
parent: 'adulttime',
parameters: {
scene: false,
},
},
{
name: 'Transfixed',
@ -503,53 +572,35 @@ const sites = [
url: 'https://www.truelesbian.com',
tags: ['lesbian'],
parent: 'adulttime',
parameters: {
referer: 'https://freetour.adulttime.com/en/join',
scene: false,
},
// ADULT TIME no API results
/*
{
name: 'Between The Sheets',
slug: 'betweenthesheets',
url: 'https://www.adulttime.com/series/between-the-sheets',
parent: 'adulttime',
},
{
name: 'Daddy\'s Boy',
slug: 'daddysboy',
url: 'https://www.adulttime.com/series/daddys-boy',
name: 'Under The Bed',
slug: 'underthebed',
url: 'https://www.underthebed.com',
parent: 'adulttime',
parameters: {
scene: 'https://www.puretaboo.com/en/video',
referer: 'https://www.puretaboo.com',
},
{
name: 'Future Darkly',
slug: 'futuredarkly',
url: 'https://www.futuredarkly.com',
parent: 'adulttime',
},
{
name: 'Lesbian Revenge',
slug: 'lesbianrevenge',
url: 'https://www.lesbianrevenge.com',
parent: 'adulttime',
},
{
name: 'Peach Cake',
slug: 'peachcake',
url: 'https://www.adulttime.com/series/peach-cake',
parent: 'adulttime',
},
{
name: 'Poly Family Life',
slug: 'polyfamilylife',
url: 'https://www.adulttime.com/series/poly-family-life',
parent: 'adulttime',
},
{
name: 'Straight, But...',
slug: 'straightbut',
url: 'https://www.adulttime.com/series/straight-but',
parent: 'adulttime',
},
*/
// ADULT TIME INDEPENDENT
{
name: 'Pure Taboo',
slug: 'puretaboo',
url: 'https://www.puretaboo.com',
parent: 'adulttime',
independent: true,
parameters: {
layout: 'api',
scene: false,
referer: 'https://www.puretaboo.com',
// mobile: 'https://m.dpfanatics.com/en/video',
},
},
{
name: 'Blake Mason',
slug: 'blakemason',
@ -5216,7 +5267,6 @@ const sites = [
alias: ['legalporno', 'clip', 'gonzo'],
url: 'https://www.analvids.com',
independent: true,
showcased: false, // showcased per studio
parent: 'wgcz',
},
// LETS DOE IT
@ -7759,19 +7809,6 @@ const sites = [
url: 'https://www.private.com/site/private-stars',
parent: 'private',
},
// PURE TABOO
{
name: 'Pure Taboo',
slug: 'puretaboo',
url: 'https://www.puretaboo.com',
parent: 'puretaboo',
},
{
name: 'Under The Bed',
slug: 'underthebed',
url: 'https://www.underthebed.com',
parent: 'adulttime',
},
// RADICAL ENTERTAINMENT
{
name: 'PurgatoryX',
@ -11542,7 +11579,6 @@ exports.seed = (knex) => Promise.resolve()
priority: site.priority || 0,
independent: !!site.independent,
visible: site.visible,
showcased: site.showcased,
has_logo: site.hasLogo === undefined ? true : site.hasLogo,
}));

View File

@ -10,7 +10,6 @@ const studios = [
alias: [
'gio',
],
showcased: true,
},
{
name: 'Gonzo.com',
@ -20,21 +19,18 @@ const studios = [
alias: [
'sz',
],
showcased: true,
},
{
name: 'Porn World',
slug: 'pornworld',
url: 'https://www.analvids.com/studios/porn-world',
parent: 'analvids',
showcased: true,
},
{
name: 'Angelo Godshack Original',
slug: 'angelogodshackoriginal',
url: 'https://www.analvids.com/studios/angelo-godshack-original',
parent: 'analvids',
showcased: true,
},
{
name: 'NRX-Studio',
@ -44,7 +40,6 @@ const studios = [
alias: [
'nrx',
],
showcased: true,
},
{
name: "Giorgio's Lab",
@ -54,7 +49,6 @@ const studios = [
alias: [
'gl',
],
showcased: true,
},
{
name: 'Yummy estudio',
@ -64,14 +58,12 @@ const studios = [
alias: [
'ye',
],
showcased: true,
},
{
name: 'XfreaX',
slug: 'xfreax',
url: 'https://www.analvids.com/studios/xfreax',
parent: 'analvids',
showcased: true,
},
{
name: 'Natasha Teen Productions',
@ -81,7 +73,6 @@ const studios = [
alias: [
'nt',
],
showcased: true,
},
{
name: 'Bang Bros',
@ -97,7 +88,6 @@ const studios = [
alias: [
'vk',
],
showcased: true,
},
{
name: 'Toby Dick Studio',
@ -117,7 +107,6 @@ const studios = [
tags: [
'transsexual',
],
showcased: true,
},
{
name: 'TheWonderToys Training Studio',
@ -133,7 +122,6 @@ const studios = [
alias: [
'nf',
],
showcased: true,
},
{
name: 'Vira Gold Films',
@ -160,11 +148,10 @@ const studios = [
parent: 'analvids',
},
{
name: 'Latin Teens Productions',
name: 'LATIN TEENS productions',
slug: 'latinteensproductions',
url: 'https://www.analvids.com/studios/latin-teens-productions',
parent: 'analvids',
showcased: true,
},
{
name: 'PISSING E ANAL FANTASY',
@ -177,7 +164,6 @@ const studios = [
slug: 'lvtstudio',
url: 'https://www.analvids.com/studios/lvt-studio',
parent: 'analvids',
showcased: true,
},
{
name: 'Sineplex CZ',
@ -187,7 +173,6 @@ const studios = [
alias: [
'sz',
],
showcased: true,
},
{
name: 'Kinky Sex',
@ -197,7 +182,6 @@ const studios = [
alias: [
'ks',
],
showcased: true,
},
{
name: 'Mambo Perv',
@ -210,7 +194,6 @@ const studios = [
slug: 'studiopl',
url: 'https://www.analvids.com/studios/studio_pl',
parent: 'analvids',
showcased: true,
},
{
name: 'Interracial Vision',
@ -220,7 +203,6 @@ const studios = [
alias: [
'iv',
],
showcased: true,
},
{
name: 'Argendana Official',
@ -242,7 +224,6 @@ const studios = [
alias: [
'rs',
],
showcased: true,
},
{
name: 'X-TV Studio',
@ -299,7 +280,6 @@ const studios = [
alias: [
'aa',
],
showcased: true,
},
{
name: 'Lydia Black Studio',
@ -326,21 +306,19 @@ const studios = [
parent: 'analvids',
},
{
name: 'Eden Does',
name: 'Eden does',
slug: 'edendoes',
url: 'https://www.analvids.com/studios/eden-does',
parent: 'analvids',
showcased: true,
},
{
name: 'Black In White',
name: 'Black in White',
slug: 'blackinwhite',
url: 'https://www.analvids.com/studios/black-in-white',
parent: 'analvids',
alias: [
'biw',
],
showcased: true,
},
{
name: 'vilevixen Studio',
@ -466,7 +444,6 @@ const studios = [
slug: 'gg',
url: 'https://www.analvids.com/studios/gg',
parent: 'analvids',
showcased: true,
},
{
name: 'Andy Casanova',
@ -530,7 +507,6 @@ const studios = [
slug: 'sineplexclassic',
url: 'https://www.analvids.com/studios/sineplex-classic',
parent: 'analvids',
showcased: true,
},
{
name: 'Porn Force',
@ -672,7 +648,6 @@ const studios = [
'af',
'anal forever',
],
showcased: true,
},
{
name: 'WeFuckin Studio',
@ -5203,12 +5178,7 @@ const studios = [
parent: 'analvids',
description: 'Producing raw amateur porn leaded by Bluff, the creator, filmmaker and photographer. The models are from a circle of friends that creates and share all together. Through webcam nights, professionally made productions or from spontaneous projects, the general desire always was to produce high quality amateur porn. A wide variety of content is offered. *No custom video request *all models are 18+ and consented to appear in the photos/videos.',
},
].map((studio) => (studio.parent === 'analvids' && studio.showcased !== true
? {
...studio,
showcased: false,
}
: studio));
];
/* eslint-disable max-len */
exports.seed = (knex) => Promise.resolve()
@ -5225,7 +5195,6 @@ exports.seed = (knex) => Promise.resolve()
type: 'studio',
parent_id: networksMap[studio.parent],
has_logo: studio.hasLogo || false,
showcased: studio.showcased,
}));
return upsert('entities', studiosWithNetwork, ['slug', 'type'], knex);

View File

@ -212,11 +212,6 @@ function getImageSources(source) {
];
}
function curateTitle(title, channel) {
// some videos are redundantly prefixed with the name of the site, i.e. Bubblegum Dungeon, Forbidden Seductions and Lady Gonzo
return title.replace(new RegExp(`^\\s*${channel.name}\\s*[:|-]\\s`, 'i'), '');
}
async function scrapeApiReleases(json, site) {
return json.map((scene) => {
if (site.parameters?.extract && scene.sitename !== site.parameters.extract) {
@ -235,7 +230,7 @@ async function scrapeApiReleases(json, site) {
dislikes: scene.ratings_down,
};
release.title = curateTitle(scene.title, site);
release.title = scene.title.replace(new RegExp(`^\\s*${site.name}\\s*[:|-]\\s`, 'i'), ''); // some videos are redundantly prefixed with the name of the site, i.e. Bubblegum Dungeon and Lady Gonzo
release.path = `/${scene.url_title}/${release.entryId}`;
if (site.parameters?.scene) release.url = `${site.parameters.scene}${release.path}`;
@ -423,7 +418,7 @@ async function scrapeReleaseApi(data, site, options) {
const release = {};
release.entryId = data.clip_id || data.movie_id;
release.title = curateTitle(data.title, site);
release.title = data.title;
release.duration = data.length;
release.date = (data.date && new Date(data.date * 1000)) || qu.parseDate(data.release_date || data.last_modified, 'YYYY-MM-DD');
release.director = data.directors[0]?.name || null;