const upsert = require('../src/utils/upsert'); const slugify = require('../src/utils/slugify'); const groups = [ { slug: 'age', name: 'Age', }, { slug: 'body', name: 'Body', }, { slug: 'clothing', name: 'Clothing', }, { slug: 'ethnicity', name: 'Ethnicity', }, { slug: 'finish', name: 'Finish', }, { slug: 'group', name: 'Group sex', }, { slug: 'hair', name: 'Hair', }, { slug: 'location', name: 'Location', }, { slug: 'oral', name: 'Oral', }, { slug: 'orientation', name: 'Orientation', }, { slug: 'penetration', name: 'Penetration', }, { slug: 'position', name: 'Position', }, { slug: 'roleplay', name: 'Roleplay', }, ]; const tags = [ { name: '180°', slug: '180', }, { name: '60 FPS', slug: '60fps', }, { name: '3D', slug: '3d', description: 'Available in 3D.', }, { name: '4K', slug: '4k', description: 'Available in high quality 4K resolution.', }, { name: '5K', slug: '5k', description: 'Available in very high quality 5K resolution.', }, { name: '7K', slug: '7k', description: 'Available in super high quality 7K resolution.', }, { name: '8K', slug: '8k', description: 'Available in extremely high quality 8K resolution.', }, { name: '69', slug: '69', group: 'position', }, { name: 'airtight', slug: 'airtight', description: 'Stuffing one cock in her ass, one in her pussy, and one in her mouth, filling all of her penetrable holes and sealing her airtight like a figurative balloon. In other words, simultaneously getting [double penetrated](/tag/dp), and giving a [blowjob](/tag/blowjob) or getting [facefucked](/tag/facefuck). Being airtight implies being [gangbanged](/tag/gangbang).', /* eslint-disable-line max-len */ priority: 9, group: 'penetration', }, { name: 'amateur', slug: 'amateur', }, { name: 'anal creampie', slug: 'anal-creampie', priority: 7, description: 'Ejaculating into the asshole.', group: 'finish', }, { name: 'anal', slug: 'anal', description: 'Getting fucked in the asshole.', priority: 9, group: 'penetration', }, { name: 'anal fingering', slug: 'anal-fingering', description: 'Inserting one or multiple fingers into the asshole.', }, { name: 'anal fisting', slug: 'anal-fisting', description: 'Shoving an entire hand into the asshole.', }, { name: 'anal prolapse', slug: 'anal-prolapse', }, { name: 'animated', slug: 'animated', }, { name: 'asian', slug: 'asian', priority: 5, group: 'ethnicity', }, { name: 'athletic', slug: 'athletic', group: 'body', }, { name: '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', }, { name: 'ass to other girl\'s mouth', slug: 'atogm', priority: 6, 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', }, { name: 'ass eating', slug: 'ass-eating', group: 'oral', priority: 6, }, { name: 'ball licking', slug: 'ball-licking', group: 'oral', }, { name: 'ballerina', slug: 'ballerina', group: 'roleplay', }, { name: 'bathroom', slug: 'bathroom', group: 'location', }, { name: 'BDSM', slug: 'bdsm', priority: 8, }, { name: 'BBC', slug: 'bbc', group: 'body', }, { name: 'behind the scenes', slug: 'bts', priority: 6, }, { name: 'big dick', slug: 'big-dick', group: 'body', }, { name: 'big butt', slug: 'big-butt', group: 'body', }, { name: 'big boobs', slug: 'big-boobs', group: 'body', }, { name: 'bisexual', slug: 'bisexual', priority: 10, }, { name: 'black hair', slug: 'black-hair', group: 'hair', }, { name: 'blindfold', slug: 'blindfold', group: 'clothing', }, { name: 'blonde', slug: 'blonde', group: 'hair', }, { name: 'blowjob', slug: 'blowjob', priority: 5, group: 'oral', }, { name: 'blowbang', slug: 'blowbang', priority: 9, description: 'Pleasuring a gang of three or more cocks by sucking and jerking off as many cocks as they can, often getting [facefucked](/tag/facefuck), groped and rubbed out, and followed by a [bukkake](/tag/bukkake). If they are getting fucked, it is a [gangbang](/tag/gangbang).', group: 'group', }, { name: 'bondage', slug: 'bondage', }, { name: 'braces', slug: 'braces', }, { name: 'brunette', slug: 'brunette', group: 'hair', }, { name: 'bukkake', slug: 'bukkake', priority: 8, description: 'Getting ejaculated on the face by a group of three or more men, often following a [blowbang](/tag/blowbang) or [gangbang](/tag/gangbang).', group: 'finish', }, { name: 'casting', slug: 'casting', }, { name: 'cheerleader', slug: 'cheerleader', group: 'roleplay', }, { name: 'choking', slug: 'choking', }, { name: 'corporal punishment', slug: 'corporal-punishment', }, { name: 'couples', slug: 'couples', }, { name: 'cowgirl', slug: 'cowgirl', }, { name: 'creampie', slug: 'creampie', priority: 8, description: 'Ejaculalating into her pussy, often shown visibly dripping out afterwards.', group: 'finish', }, { name: 'cuckold', slug: 'cuckold', }, { name: 'cum drunk', slug: 'cum-drunk', description: 'Feeling intoxicated after getting filled or covered by a large amount of semen, or literally getting "fucked silly" during intense sex.', }, { name: 'cum licking', slug: 'cum-licking', }, { name: 'cum on butt', slug: 'cum-on-butt', }, { name: 'cum on boobs', slug: 'cum-on-boobs', }, { name: 'cum on pussy', slug: 'cum-on-pussy', }, { name: 'cum swapping', slug: 'cum-swapping', }, { name: 'cumshot', slug: 'cumshot', }, { name: 'curvy', slug: 'curvy', }, { name: 'double anal', slug: 'dap', description: 'Two cocks in the ass at the same time. If there\'s a third cock in her pussy, it is [double anal TP](/tag/da-tp).', priority: 8, group: 'penetration', }, { name: 'double dildo', slug: 'double-dildo', description: 'Two girls fucking eachother using either end of a double-sided dildo. They can suck it for a [double dildo blowjob](/tag/double-dildo-blowjob), deepthroat it for a [double dildo kiss](/tag/double-dildo-kiss), or put it up their ass for [double dildo anal](/tag/double-dildo-anal).', priority: 4, }, { name: 'double dildo anal', slug: 'double-dildo-anal', description: 'Two people ass-fucking eachother with either end of a [double-sided dildo](/tag/double-dildo), "ass to ass".', priority: 4, }, { name: 'double dildo DP', slug: 'double-dildo-dp', description: 'Using a [double-sided dildo](/tag/double-dildo) on your ass and pussy [at the same time](/tag/dp).', priority: 4, }, { name: 'double dildo blowjob', slug: 'double-dildo-blowjob', description: 'Two people sucking and gagging on either end of a [double-sided dildo](/tag/double-dildo). They may deepthroat the dildo for a [double dildo kiss](/tag/double-dildo-kiss).', priority: 4, }, { name: 'double dildo kiss', slug: 'double-dildo-kiss', description: 'Deepthroating a [double-sided dildo](/tag/double-dildo) during a [double dildo blowjob](/tag/double-dildo-blowjob), all the way until you can kiss eachother\'s lips.', priority: 4, }, { name: 'triple anal', slug: 'tap', description: 'Getting fucked in the ass by not one, two, but *three* cocks at the same time.', priority: 7, group: 'penetration', }, { name: 'deepthroat', slug: 'deepthroat', priority: 6, group: 'oral', }, { name: 'double penetration', slug: 'dp', priority: 9, description: 'Fucking two cocks at once, with one in her ass, and one in her pussy. If she has another cock in her mouth, she is [airtight](/tag/airtight).', group: 'penetration', }, { name: 'dungeon', slug: 'dungeon', }, { name: 'double vaginal', slug: 'dvp', description: 'Fucking her pussy with two cocks at the same time. If there\'s a third cock in her asshole, it is [double vaginal TP](/tag/dv-tp).', priority: 8, group: 'penetration', }, { name: 'double barrel blowjob', slug: 'double-barrel-blowjob', group: 'oral', }, { name: 'double blowjob', slug: 'double-blowjob', group: 'oral', }, { name: 'doggy style', slug: 'doggy-style', group: 'position', }, { name: 'dress', slug: 'dress', group: 'clothing', }, { name: 'black', slug: 'black', priority: 5, group: 'ethnicity', }, { name: 'electric shock', slug: 'electric-shock', }, { name: 'fake boobs', slug: 'fake-boobs', }, { name: 'facefucking', slug: 'facefucking', priority: 7, group: 'oral', }, { name: 'facesitting', slug: 'facesitting', group: 'position', }, { name: 'facial', slug: 'facial', group: 'finish', }, { name: 'family', slug: 'family', priority: 7, }, { name: 'feet', slug: 'feet', }, { name: 'femdom', slug: 'femdom', }, { name: 'fingering', slug: 'fingering', }, { name: 'fisting', slug: 'fisting', }, { name: 'fisting DP', slug: 'fisting-dp', }, { name: 'MFF threesome', slug: 'mff', priority: 9, description: 'A threesome with two women and one guy, in which the women have sex with eachother.', group: 'group', }, { name: 'gag', slug: 'gag', }, { name: 'gangbang', slug: 'gangbang', description: 'Getting fucked by three or more cocks, at least two at the same time, often but not necessarily involving a [blowbang](/tag/blowbang), [spitroast](/tag/mfm), [double penetration](/tag/dp) and [airtight](/tag/airtight). If you get fucked by one guy at a time, it might be considered a [trainbang](/tag/trainbang). In a reverse gangbang, multiple women fuck one man.', /* eslint-disable-line max-len */ priority: 9, group: 'group', }, { name: 'glamcore', slug: 'glamcore', }, { name: 'glasses', slug: 'glasses', group: 'clothing', }, { name: 'fake cum', slug: 'fake-cum', group: 'finish', }, { name: 'trainbang', slug: 'trainbang', description: 'Getting fucked by a group of three or more guys taking turns in a [gangbang](/tag/gangbang), one cock after the other, and never more than one at a time.', priority: 7, group: 'group', }, { name: 'gaping', slug: 'gaping', priority: 6, }, { name: 'gay', slug: 'gay', priority: 10, }, { name: 'gloryhole', slug: 'gloryhole', }, { name: 'gonzo', slug: 'gonzo', }, { name: 'hairy', slug: 'hairy', group: 'body', }, { name: 'handjob', slug: 'handjob', }, { name: 'hardcore', slug: 'hardcore', }, { name: 'high heels', slug: 'high-heels', group: 'clothing', }, { name: 'humiliation', slug: 'humiliation', }, { name: 'indian', slug: 'indian', }, { name: 'innie pussy', slug: 'innie-pussy', }, { name: 'interracial', slug: 'interracial', priority: 7, group: 'ethnicity', }, { name: 'kissing', slug: 'kissing', }, { name: 'latex', slug: 'latex', }, { name: 'Latina', slug: 'latina', priority: 5, group: 'ethnicity', }, { name: 'leather', slug: 'leather', }, { name: 'lesbian', slug: 'lesbian', priority: 9, }, { name: 'machine dildo', slug: 'machine-dildo', }, { name: 'lingerie', slug: 'lingerie', group: 'clothing', }, { name: 'live', slug: 'live', }, { name: 'maid', slug: 'maid', group: 'roleplay', }, { name: 'massage', slug: 'massage', }, { name: 'male focus', slug: 'male-focus', priority: 7, description: 'Straight porn highlighting the male talent.', }, { name: 'masturbation', slug: 'masturbation', }, { name: 'MILF', slug: 'milf', priority: 7, group: 'age', }, { name: 'MFM threesome', slug: 'mfm', priority: 9, description: 'Two men fucking one woman, but not eachother. Typically involves a \'spitroast\', where one guy gets a blowjob and the other fucks her pussy or ass.', group: 'group', }, { name: 'miniskirt', slug: 'miniskirt', group: 'clothing', }, { name: 'missionary', slug: 'missionary', group: 'position', }, { name: 'natural boobs', slug: 'natural-boobs', group: 'body', }, { name: 'nipple clamps', slug: 'nipple-clamps', }, { name: 'nun', slug: 'nun', group: 'roleplay', }, { name: 'oil', slug: 'oil', }, { name: 'nurse', slug: 'nurse', group: 'roleplay', }, { name: 'cum in mouth', slug: 'cum-in-mouth', priority: 7, description: 'A guy ejaculating in someone\'s mouth. If they keep their lips wrapped around his cock, it is an [oral creampie](/tag/oral-creampie). They may not be able to resist [swallowing](/tag/swallowing) the cum.', group: 'finish', }, { name: 'oral creampie', slug: 'oral-creampie', priority: 7, description: 'A guy pumping his semen in someone\'s *closed* [mouth](/tag/cum-in-mouth), a variation of [cum in mouth](/tag/cum-in-mouth). His cock can be [deepthroated](/tag/deepthroat) for a [throatpie](/tag/throatpie)', group: 'finish', }, { name: 'orgy', slug: 'orgy', priority: 9, description: 'A group of (at least four) people having sex with eachother. If only one person is getting fucked, it is probably a [gangbang](/tag/gangbang).', group: 'group', }, { name: 'outdoors', slug: 'outdoors', group: 'location', }, { name: 'outie pussy', slug: 'outie-pussy', }, { name: 'pain', slug: 'pain', }, { name: 'parody', slug: 'parody', }, { name: 'pegging', slug: 'pegging', }, { name: 'petite', slug: 'petite', }, { name: 'piercings', slug: 'piercings', }, { name: 'piss drinking', slug: 'piss-drinking', priority: 6, }, { name: 'pissing', slug: 'pissing', priority: 8, }, { name: 'POV', slug: 'pov', }, { name: 'pussy eating', slug: 'pussy-eating', group: 'oral', }, { name: 'pussy to mouth', slug: 'pussy-to-mouth', priority: 5, description: 'Sucking off a cock right fresh out of your pussy.', group: 'oral', }, { name: 'pyjamas', slug: 'pyjamas', group: 'clothing', }, { name: 'redhead', slug: 'redhead', group: 'hair', }, { name: 'reverse cowgirl', slug: 'reverse-cowgirl', }, { name: 'roleplay', slug: 'roleplay', }, { name: 'rough', slug: 'rough', priority: 6, }, { name: 'saliva', slug: 'saliva', }, { name: 'schoolgirl', slug: 'schoolgirl', group: 'roleplay', }, { name: 'shaved', slug: 'shaved', }, { name: 'shoes on', slug: 'shoes-on', group: 'clothing', }, { name: 'short hair', slug: 'short-hair', group: 'hair', }, { name: 'skirt', slug: 'skirt', group: 'clothing', }, { name: 'slapping', slug: 'slapping', }, { name: 'sloppy blowjob', slug: 'sloppy-blowjob', }, { name: 'socks', slug: 'socks', group: 'clothing', }, { name: 'solo', slug: 'solo', }, { name: 'spanking', slug: 'spanking', }, { name: 'spooning', slug: 'spooning', group: 'position', }, { name: 'strapon', slug: 'strapon', }, { name: 'small boobs', slug: 'small-boobs', }, { name: 'small butt', slug: 'small-butt', }, { name: 'speculum', slug: 'speculum', }, { name: 'squirting', slug: 'squirting', }, { name: 'standing doggy style', slug: 'standing-doggy-style', }, { name: 'stockings', slug: 'stockings', group: 'clothing', }, { name: 'strap-on dildo', slug: 'strap-on-dildo', }, { name: 'suspension', slug: 'suspension', }, { name: 'swallowing', slug: 'swallowing', group: 'finish', priority: 6, }, { name: 'swinging', slug: 'swinging', group: 'group', }, { name: 'tattoos', slug: 'tattoos', group: 'body', }, { name: 'teacher', slug: 'teacher', group: 'roleplay', }, { name: 'threesome', slug: 'threesome', priority: 8, group: 'group', }, { name: 'throatpie', slug: 'throatpie', priority: 6, description: 'An [oral creampie](/tag/oral-creampie) with his cock shoved all the way down the throat.', group: 'finish', }, { name: 'teen', slug: 'teen', group: 'age', }, { name: 'titty fucking', slug: 'titty-fucking', }, { name: 'toys', slug: 'toys', priority: 6, }, { name: 'toy anal', slug: 'toy-anal', description: 'Stuffing a toy, such as a dildo or buttplug, into the ass', priority: 7, }, { name: 'toy DP', slug: 'toy-dp', description: 'Getting [double penetrated](/tag/dp) with dildos, strap-ons or buttplugs. You can use both ends of a [double dildo](/tag/double-dildo) for a [double dildo DP](/tag/double-dildo-dp).', priority: 4, }, { name: 'transsexual', slug: 'transsexual', priority: 10, }, { name: 'DA triple penetration', slug: 'da-tp', priority: 7, description: 'Triple penetration with two cocks in the ass, and one in the pussy. Also see [double vaginal TP](/tag/dv-tp).', group: 'penetration', }, { name: 'DV triple penetration', slug: 'dv-tp', priority: 7, description: 'Triple penetration with two cocks in the pussy, and one in the ass. Also see [double anal TP](/tag/da-tp).', group: 'penetration', }, { name: 'triple penetration', slug: 'triple-penetration', priority: 7, description: 'Three cocks fucking her from behind at the same time. This can be either [double anal TP](/tag/da-tp), or [double vaginal TP](/tag/dv-tp).', }, { name: 'trimmed', slug: 'trimmed', }, { name: 'uniform', slug: 'uniform', }, { name: 'van', slug: 'van', group: 'location', }, { name: 'vibrator', slug: 'vibrator', }, { name: 'voyeur', slug: 'voyeur', }, { name: 'virtual reality', slug: 'vr', }, { name: 'quarantine', slug: 'quarantine', description: 'The 2019 Coronavirus outbreak (COVID-19) forced sensible people to quarantine at home, spawning a new porn theme featuring self-isolation and masks.', }, { name: 'Russian', slug: 'russian', priority: 4, group: 'ethnicity', }, { name: 'wet', slug: 'wet', }, { name: 'white', slug: 'white', priority: 7, group: 'ethnicity', }, { name: 'wife', slug: 'wife', }, { name: 'office', slug: 'office', group: 'location', }, ]; const aliases = [ { name: '2on1', for: 'threesome', }, { name: '2-on-1', for: 'threesome', }, { name: '2 on 1', for: 'threesome', }, { name: '3+ on 1', for: 'gangbang', }, { name: 'anal sex', for: 'anal', }, { name: 'anal gape', for: 'gaping', }, { name: 'anilingus', for: 'ass-eating', }, { name: 'analingus', for: 'ass-eating', }, { name: 'analingus male', for: 'ass-eating', }, { name: 'asians', for: 'asian', }, { name: 'asian female', for: 'asian', }, { name: 'ass fingering', for: 'anal-fingering', }, { name: 'anal toys', for: 'toy-anal', }, { name: 'ass licking', for: 'ass-eating', }, { name: 'asslicking', for: 'ass-eating', }, { name: 'ass fucking', for: 'anal', }, { name: 'ass to ass', for: 'double-dildo-anal', secondary: true, }, { name: 'ass to other girl\'s mouth', for: 'atogm', }, { name: 'ass to other girls mouth', for: 'atogm', }, { name: 'ass to other mouth', for: 'atogm', }, { name: 'ass to other mouth', for: 'atom', }, { name: 'atm', for: 'atm', secondary: true, }, { name: 'a2m', for: 'atm', secondary: true, }, { name: 'bald pussy', for: 'shaved', }, { name: 'ball gag', for: 'gag', }, { name: 'ball lick', for: 'ball-licking', }, { name: 'ball suck', for: 'ball-licking', }, { name: 'ball sucking', for: 'ball-licking', }, { name: 'boob fucking', for: 'titty-fucking', }, { name: 'bts', for: 'bts', secondary: true, }, { name: 'behind the scene', for: 'bts', }, { name: 'blindfolded', for: 'blindfold', secondary: true, }, { name: 'making of', for: 'bts', secondary: true, }, { name: 'mfm', for: 'mmf', }, { name: 'fmf', for: 'mff', }, { name: 'mff', for: 'mff', }, { name: 'ffm', for: 'mff', }, { name: 'bgb', for: 'mfm', }, { name: 'big ass', for: 'big-butt', }, { name: 'big black cock', for: 'bbc', }, { name: 'big black cocks', for: 'bbc', }, { name: 'big cocks', for: 'big-dick', }, { name: 'big cock', for: 'big-dick', }, { name: 'big booty', for: 'big-butt', }, { name: 'big butts', for: 'big-butt', }, { name: 'big tits', for: 'big-boobs', }, { name: 'busty - big boobs', for: 'big-boobs', }, { name: 'busty: big beautiful breast', for: 'big-boobs', }, { name: 'bi', for: 'bisexual', }, { name: 'ebony', for: 'black', }, { name: 'blonde hair', for: 'blonde', }, { name: 'blonde female', for: 'blonde', }, { name: 'blondes', for: 'blonde', }, { name: 'blow job', for: 'blowjob', }, { name: 'blowjobs', for: 'blowjob', }, { name: 'blowjob pov', for: 'blowjob', }, { name: 'blowjob (double)', for: 'double-blowjob', }, { name: 'blowjob - double', for: 'double-blowjob', }, { name: 'blowjob (pov)', for: 'blowjob', }, { name: 'blowjob - pov', for: 'blowjob', }, { name: 'boob job', for: 'fake-boobs', }, { name: 'boobjob', for: 'fake-boobs', }, { name: 'brown hair', for: 'brunette', }, { name: 'brunettes', for: 'brunette', }, { name: 'buttplug', for: 'anal-toys', secondary: true, }, { name: 'butt plug', for: 'anal-toys', }, { name: 'butt plugs', for: 'anal-toys', }, { name: 'caning', for: 'corporal-punishment', }, { name: 'cattle prod', for: 'electric-shock', }, { name: 'cheer leader', for: 'cheerleader', }, { name: 'clover clamps', for: 'nipple-clamps', }, { name: 'couples fantasies', for: 'couples', }, { name: 'couple sex', for: 'couples', }, { name: 'creampies', for: 'creampie', }, { name: 'creampie - anal', for: 'anal-creampie', }, { name: 'crop', // a type of whip, not [sic] short for corporal for: 'corporal-punishment', }, { name: 'cum cleaning', for: 'cum-licking', }, { name: 'cuck', for: 'cuckold', }, { name: 'oral creampie', for: 'cum-in-mouth', secondary: true, }, { name: 'cum on ass', for: 'cum-on-butt', }, { name: 'cum on tits', for: 'cum-on-boobs', }, { name: 'cum swallow', for: 'swallowing', }, { name: 'cum swallowing', for: 'swallowing', }, { name: 'cum shot', for: 'cumshot', }, { name: 'cunnilingus', for: 'pussy-eating', }, { name: 'cunilingus', for: 'pussy-eating', }, { name: 'pussy licking', for: 'pussy-eating', }, { name: 'deep throat', for: 'deepthroat', secondary: true, }, { name: 'deepthroating', for: 'deepthroat', }, { name: 'dildo', for: 'toys', }, { name: 'doggystyle', for: 'doggy-style', secondary: true, }, { name: 'doggy style - pov', for: 'doggy-style', }, { name: 'doggie style', for: 'doggy-style', }, { name: 'doggystyle (standing)', for: 'standing-doggy-style', }, { name: 'doggystyle - standing', for: 'standing-doggy-style', }, { name: 'doggystyle regular', for: 'doggy-style', }, { name: 'dom', for: 'bdsm', }, { name: 'domination', for: 'bdsm', }, { name: 'dominatrix', for: 'femdom', secondary: true, }, { name: 'dp', for: 'dp', secondary: true, }, { name: 'double dildo deepthroat', for: 'double-dildo-kiss', }, { name: 'double penetration (dp)', for: 'dp', }, { name: 'double penetration - dp', for: 'dp', }, { name: 'double anal (dap)', for: 'dap', }, { name: 'double anal penetration (dap)', for: 'dap', }, { name: 'dpp', for: 'dvp', secondary: true, }, { name: 'double vaginal (dvp)', for: 'dvp', }, { name: 'double vaginal penetration (dvp)', for: 'dvp', }, { name: 'double vaginal (dpp)', for: 'dvp', }, { name: 'double pussy penetration', for: 'dvp', }, { name: 'double pussy penetration (dpp)', for: 'dvp', }, { name: 'drool', for: 'saliva', }, { name: 'enhanced', for: 'fake-boobs', }, { name: 'enhanced tits', for: 'fake-boobs', }, { name: 'enhanced boobs', for: 'fake-boobs', secondary: true, }, { name: 'facefuck', for: 'facefucking', }, { name: 'face fuck', for: 'facefucking', }, { name: 'face fucking', for: 'facefucking', }, { name: 'face sitting', for: 'facesitting', }, { name: 'facial cumshot', for: 'facial', }, { name: 'facials', for: 'facial', }, { name: 'facial - multiple', for: 'facial', }, { name: 'fake tits', for: 'fake-boobs', secondary: true, }, { name: 'flagellation', for: 'corporal-punishment', }, { name: 'flogging', for: 'corporal-punishment', }, { name: 'foot fetish', for: 'feet', }, { name: 'french kissing', for: 'kissing', }, { name: 'gape', for: 'gaping', secondary: true, }, { name: 'gapes', for: 'gaping', secondary: true, }, { name: 'gapes (gaping asshole)', for: 'gaping', }, { name: 'glam', for: 'glamcore', }, { name: 'glory hole', for: 'gloryhole', }, { name: 'group sex', for: 'orgy', }, { name: 'huge tits', for: 'big-boobs', }, { name: 'huge toys', for: 'toys', }, { name: 'incest', for: 'family', secondary: true, }, { name: 'incest fantasy', for: 'family', }, { name: 'innie', for: 'innie-pussy', }, { name: 'lashing', for: 'corporal-punishment', }, { name: 'lezdom', for: 'lesbian', }, { name: 'mini-skirt', for: 'miniskirt', }, { name: 'mmf', for: 'mfm', }, { name: 'mature & milf', for: 'milf', }, { name: 'milfs', for: 'milf', }, { name: 'natural', for: 'natural-boobs', }, { name: 'natural tits', for: 'natural-boobs', }, { name: 'oiled', for: 'oil', }, { name: 'oral', for: 'blowjob', }, { name: 'outie', for: 'outie-pussy', }, { name: 'piercing', for: 'piercings', }, { name: 'pierced', for: 'piercings', }, { name: 'piss', for: 'pissing', }, { name: 'pee', for: 'pissing', }, { name: 'peeing', for: 'pissing', }, { name: 'prolapse', for: 'anal-prolapse', }, { name: 'prolapsing', for: 'anal-prolapse', }, { name: 'raven', for: 'black-hair', }, { name: 'raven hair', for: 'black-hair', }, { name: 'red hair', for: 'redhead', }, { name: 'red head', for: 'redhead', }, { name: 'ginger', for: 'redhead', }, { name: 'redhead babes', for: 'redhead', }, { name: 'rimming', for: 'ass-eating', secondary: true, }, { name: 'rimjob', for: 'ass-eating', secondary: true, }, { name: 'role play', for: 'roleplay', }, { name: 'rope bondage', for: 'bondage', }, { name: 'rough sex', for: 'rough', }, { name: 'russian pornstar', for: 'russian', }, { name: 'school girl', for: 'schoolgirl', }, { name: 'sadomasochism', for: 'bdsm', }, { name: 'sadism', for: 'bdsm', }, { name: 'scissoring', for: 'lesbian', }, { name: 'sex toys', for: 'toys', }, { name: 'shaved pussy', for: 'shaved', }, { name: 'shoes', for: 'shoes-on', }, { name: 'slave', for: 'bdsm', }, { name: 'small ass', for: 'small-butt', }, { name: 'small tits', for: 'small-boobs', }, { name: 'spit', for: 'saliva', }, { name: 'spitroast', for: 'mfm', secondary: true, }, { name: 'sex toy', for: 'toys', }, { name: 'standing doggystyle', for: 'standing-doggy-style', }, { name: 'swallow', for: 'swallowing', }, { name: 'swingers', for: 'swinging', }, { name: 'strap-on', for: 'strap-on-dildo', }, { name: 'strap on', for: 'strap-on-dildo', }, { name: 'strap on dildo', for: 'strap-on-dildo', }, { name: 'sub', for: 'bdsm', }, { name: 'submission', for: 'bdsm', }, { name: 'squirt', for: 'squirting', }, { name: 'tattoo', for: 'tattoos', secondary: true, }, { name: 'teens', for: 'teen', }, { name: 'throat fucking', for: 'facefucking', }, { name: 'tiny boobs', for: 'small-boobs', }, { name: 'tiny tits', for: 'small-boobs', }, { name: 'tittyfuck', for: 'titty-fucking', secondary: true, }, { name: 'tp', for: 'triple-penetration', }, { name: 'trans', for: 'transsexual', }, { name: 'transgender', for: 'transsexual', secondary: true, }, { name: 'ts', for: 'transsexual', }, { name: 'ts cock', for: 'transsexual', }, { name: 'trimmed pussy', for: 'trimmed', }, { name: 'vr', for: 'vr', }, { name: 'whipping', for: 'corporal-punishment', }, { name: 'caucasian', for: 'white', }, { name: 'work', for: 'office', }, { name: 'workplace', for: 'office', }, { name: 'zapper', for: 'electric-shock', }, ]; exports.seed = knex => Promise.resolve() .then(async () => upsert('tags_groups', groups, 'slug', knex)) .then(async () => { const groupEntries = await knex('tags_groups').select('*'); const groupsMap = groupEntries.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {}); const tagsWithGroups = tags.map(tag => ({ name: tag.name, slug: tag.slug || slugify(tag.name), description: tag.description, priority: tag.priority || 0, group_id: tag.group ? groupsMap[tag.group] : null, alias_for: null, })); return upsert('tags', tagsWithGroups, 'slug'); }) .then(async () => { const tagEntries = await knex('tags').select('*').where({ alias_for: null }); const tagsMap = tagEntries.reduce((acc, { id, slug }) => ({ ...acc, [slug]: id }), {}); const tagAliases = aliases.map(alias => ({ name: alias.name, alias_for: tagsMap[alias.for], secondary: !!alias.secondary, })); return upsert('tags', tagAliases, 'name'); });