Added self hash filtering to media module. Moved Girl Girl back to Jules Jordan.
This commit is contained in:
		
							parent
							
								
									9a712e7371
								
							
						
					
					
						commit
						ad7874649f
					
				|  | @ -117,12 +117,12 @@ export default { | ||||||
| @import 'theme'; | @import 'theme'; | ||||||
| 
 | 
 | ||||||
| .banner { | .banner { | ||||||
|     background: $empty; |     background: var(--empty); | ||||||
|     flex-shrink: 0; |     flex-shrink: 0; | ||||||
|     white-space: nowrap; |     white-space: nowrap; | ||||||
|     overflow-x: auto; |     overflow-x: auto; | ||||||
|     scrollbar-width: none; |     scrollbar-width: none; | ||||||
|     box-shadow: 0 0 3px $shadow; |     box-shadow: 0 0 3px var(--shadow); | ||||||
|     font-size: 0; |     font-size: 0; | ||||||
| 
 | 
 | ||||||
|     &::-webkit-scrollbar { |     &::-webkit-scrollbar { | ||||||
|  | @ -150,7 +150,7 @@ export default { | ||||||
|     .icon { |     .icon { | ||||||
|         width: 1.5rem; |         width: 1.5rem; | ||||||
|         height: 1.5rem; |         height: 1.5rem; | ||||||
|         fill: $highlight; |         fill: var(--lighten); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     &.playing { |     &.playing { | ||||||
|  | @ -162,7 +162,7 @@ export default { | ||||||
|         opacity: 1; |         opacity: 1; | ||||||
| 
 | 
 | ||||||
|         .icon { |         .icon { | ||||||
|             fill: $highlight-strong; |             fill: var(--lighten-strong); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -42,13 +42,12 @@ export default { | ||||||
|     background: var(--profile); |     background: var(--profile); | ||||||
|     display: flex; |     display: flex; | ||||||
|     flex-direction: column; |     flex-direction: column; | ||||||
|     align-items: left; |  | ||||||
|     justify-content: flex-end; |     justify-content: flex-end; | ||||||
|     box-sizing: border-box; |     box-sizing: border-box; | ||||||
|     position: relative; |     position: relative; | ||||||
|     text-align: center; |     text-align: center; | ||||||
|     text-decoration: none; |     text-decoration: none; | ||||||
|     box-shadow: inset 0 0 3px var(--darken); |     box-shadow: 0 0 3px var(--darken-weak); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .poster { | .poster { | ||||||
|  | @ -56,7 +55,6 @@ export default { | ||||||
|     height: 16rem; |     height: 16rem; | ||||||
|     object-fit: cover; |     object-fit: cover; | ||||||
|     object-position: 50% 100%; |     object-position: 50% 100%; | ||||||
|     box-shadow: 0 0 1px var(--darken); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .title { | .title { | ||||||
|  |  | ||||||
|  | @ -296,6 +296,9 @@ exports.up = knex => Promise.resolve() | ||||||
|         table.string('piercings'); |         table.string('piercings'); | ||||||
|         table.string('tattoos'); |         table.string('tattoos'); | ||||||
| 
 | 
 | ||||||
|  |         table.datetime('updated_at') | ||||||
|  |             .defaultTo(knex.fn.now()); | ||||||
|  | 
 | ||||||
|         table.datetime('created_at') |         table.datetime('created_at') | ||||||
|             .defaultTo(knex.fn.now()); |             .defaultTo(knex.fn.now()); | ||||||
|     })) |     })) | ||||||
|  |  | ||||||
| Before Width: | Height: | Size: 8.8 KiB After Width: | Height: | Size: 8.8 KiB | 
| Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB | 
|  | @ -196,11 +196,6 @@ const networks = [ | ||||||
|         description: 'Girlsway.com has the best lesbian porn videos online! The hottest pornstars & first time lesbians in real girl on girl sex, tribbing, squirting & pussy licking action right HERE!', |         description: 'Girlsway.com has the best lesbian porn videos online! The hottest pornstars & first time lesbians in real girl on girl sex, tribbing, squirting & pussy licking action right HERE!', | ||||||
|         parent: 'gamma', |         parent: 'gamma', | ||||||
|     }, |     }, | ||||||
|     { |  | ||||||
|         slug: 'girlgirl', |  | ||||||
|         name: 'Girl Girl', |  | ||||||
|         url: 'https://www.girlgirl.com', |  | ||||||
|     }, |  | ||||||
|     { |     { | ||||||
|         slug: 'hussiepass', |         slug: 'hussiepass', | ||||||
|         name: 'Hussie Pass', |         name: 'Hussie Pass', | ||||||
|  |  | ||||||
|  | @ -2115,15 +2115,6 @@ const sites = [ | ||||||
|         tags: ['facefucking', 'blowjob'], |         tags: ['facefucking', 'blowjob'], | ||||||
|         network: 'fullpornnetwork', |         network: 'fullpornnetwork', | ||||||
|     }, |     }, | ||||||
|     // GIRL GIRL
 |  | ||||||
|     { |  | ||||||
|         slug: 'girlgirl', |  | ||||||
|         name: 'Girl Girl', |  | ||||||
|         url: 'https://www.girlgirl.com', |  | ||||||
|         tags: ['lesbian'], |  | ||||||
|         parameters: { independent: true }, |  | ||||||
|         network: 'girlgirl', |  | ||||||
|     }, |  | ||||||
|     // GIRLSWAY
 |     // GIRLSWAY
 | ||||||
|     { |     { | ||||||
|         slug: 'girlsway', |         slug: 'girlsway', | ||||||
|  | @ -2635,6 +2626,13 @@ const sites = [ | ||||||
|         url: 'https://www.manuelferrara.com', |         url: 'https://www.manuelferrara.com', | ||||||
|         network: 'julesjordan', |         network: 'julesjordan', | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |         slug: 'girlgirl', | ||||||
|  |         name: 'Girl Girl', | ||||||
|  |         url: 'https://www.girlgirl.com', | ||||||
|  |         tags: ['lesbian'], | ||||||
|  |         network: 'julesjordan', | ||||||
|  |     }, | ||||||
|     // KELLY MADISON MEDIA
 |     // KELLY MADISON MEDIA
 | ||||||
|     { |     { | ||||||
|         slug: 'teenfidelity', |         slug: 'teenfidelity', | ||||||
|  |  | ||||||
							
								
								
									
										61
									
								
								src/media.js
								
								
								
								
							
							
						
						
									
										61
									
								
								src/media.js
								
								
								
								
							|  | @ -1,7 +1,7 @@ | ||||||
| 'use strict'; | 'use strict'; | ||||||
| 
 | 
 | ||||||
| const config = require('config'); | const config = require('config'); | ||||||
| const util = require('util'); | // const util = require('util');
 | ||||||
| const Promise = require('bluebird'); | const Promise = require('bluebird'); | ||||||
| const fs = require('fs').promises; | const fs = require('fs').promises; | ||||||
| const path = require('path'); | const path = require('path'); | ||||||
|  | @ -177,10 +177,7 @@ async function findSourceDuplicates(baseMedias) { | ||||||
|     const existingSourceMediaByUrl = itemsByKey(existingSourceMedia, 'source'); |     const existingSourceMediaByUrl = itemsByKey(existingSourceMedia, 'source'); | ||||||
|     const existingExtractMediaByUrl = itemsByKey(existingExtractMedia, 'source_page'); |     const existingExtractMediaByUrl = itemsByKey(existingExtractMedia, 'source_page'); | ||||||
| 
 | 
 | ||||||
|     return { |     return [existingSourceMediaByUrl, existingExtractMediaByUrl]; | ||||||
|         existingSourceMediaByUrl, |  | ||||||
|         existingExtractMediaByUrl, |  | ||||||
|     }; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function findHashDuplicates(medias) { | async function findHashDuplicates(medias) { | ||||||
|  | @ -189,16 +186,37 @@ async function findHashDuplicates(medias) { | ||||||
|     const existingHashMediaEntries = await knex('media').whereIn('hash', hashes); |     const existingHashMediaEntries = await knex('media').whereIn('hash', hashes); | ||||||
|     const existingHashMediaEntriesByHash = itemsByKey(existingHashMediaEntries, 'hash'); |     const existingHashMediaEntriesByHash = itemsByKey(existingHashMediaEntries, 'hash'); | ||||||
| 
 | 
 | ||||||
|     const uniqueHashMedia = medias.filter(media => !media.entry && !existingHashMediaEntriesByHash[media.meta?.hash]); |     const uniqueHashMedias = medias.filter(media => !media.entry && !existingHashMediaEntriesByHash[media.meta?.hash]); | ||||||
| 
 | 
 | ||||||
|     const existingHashMedia = medias |     const { selfDuplicateMedias, selfUniqueMediasByHash } = uniqueHashMedias.reduce((acc, media) => { | ||||||
|  |         if (acc.selfUniqueMediasByHash[media.meta.hash]) { | ||||||
|  |             acc.selfDuplicateMedias.push({ | ||||||
|  |                 ...media, | ||||||
|  |                 use: acc.selfUniqueMediasByHash[media.meta.hash].id, | ||||||
|  |             }); | ||||||
|  | 
 | ||||||
|  |             return acc; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         acc.selfUniqueMediasByHash[media.meta.hash] = media; | ||||||
|  | 
 | ||||||
|  |         return acc; | ||||||
|  |     }, { | ||||||
|  |         selfDuplicateMedias: [], | ||||||
|  |         selfUniqueMediasByHash: {}, | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     const selfUniqueHashMedias = Object.values(selfUniqueMediasByHash); | ||||||
|  | 
 | ||||||
|  |     const existingHashMedias = medias | ||||||
|         .filter(media => existingHashMediaEntriesByHash[media.entry?.hash || media.meta?.hash]) |         .filter(media => existingHashMediaEntriesByHash[media.entry?.hash || media.meta?.hash]) | ||||||
|         .map(media => ({ |         .map(media => ({ | ||||||
|             ...media, |             ...media, | ||||||
|             entry: existingHashMediaEntriesByHash[media.entry?.hash || media.meta?.hash], |             entry: existingHashMediaEntriesByHash[media.entry?.hash || media.meta?.hash], | ||||||
|         })); |         })) | ||||||
|  |         .concat(selfDuplicateMedias); | ||||||
| 
 | 
 | ||||||
|     return { uniqueHashMedia, existingHashMedia }; |     return [selfUniqueHashMedias, existingHashMedias]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function extractSource(baseSource, { existingExtractMediaByUrl }) { | async function extractSource(baseSource, { existingExtractMediaByUrl }) { | ||||||
|  | @ -337,7 +355,7 @@ async function fetchSource(source) { | ||||||
|     return attempt(1); |     return attempt(1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function trySource(baseSource, existingMedias, baseMedia, baseSourceIndex) { | async function trySource(baseSource, existingMedias) { | ||||||
|     // catch error and try the next source
 |     // catch error and try the next source
 | ||||||
|     const extractedSource = await extractSource(baseSource, existingMedias); |     const extractedSource = await extractSource(baseSource, existingMedias); | ||||||
|     const existingSourceMedia = existingMedias.existingSourceMediaByUrl[extractedSource.src]; |     const existingSourceMedia = existingMedias.existingSourceMediaByUrl[extractedSource.src]; | ||||||
|  | @ -350,7 +368,7 @@ async function trySource(baseSource, existingMedias, baseMedia, baseSourceIndex) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (existingSourceMedia) { |     if (existingSourceMedia) { | ||||||
|         logger.silly(`Media source URL already in database, skipping ${baseSource.url}`); |         logger.silly(`Media source URL already in database, skipping ${baseSource.src}`); | ||||||
| 
 | 
 | ||||||
|         // media entry found by source URL, don't fetch
 |         // media entry found by source URL, don't fetch
 | ||||||
|         return { |         return { | ||||||
|  | @ -359,7 +377,7 @@ async function trySource(baseSource, existingMedias, baseMedia, baseSourceIndex) | ||||||
|         }; |         }; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     return fetchSource(extractedSource, baseMedia, baseSourceIndex, 1); |     return fetchSource(extractedSource); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function fetchMedia(baseMedia, existingMedias) { | async function fetchMedia(baseMedia, existingMedias) { | ||||||
|  | @ -420,21 +438,21 @@ function curateMediaEntry(media, index) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function storeMedias(baseMedias) { | async function storeMedias(baseMedias) { | ||||||
|     const { existingSourceMediaByUrl, existingExtractMediaByUrl } = await findSourceDuplicates(baseMedias); |     const [existingSourceMediaByUrl, existingExtractMediaByUrl] = await findSourceDuplicates(baseMedias); | ||||||
| 
 | 
 | ||||||
|     const savedMedias = await Promise.map( |     const savedMedias = await Promise.map( | ||||||
|         baseMedias, |         baseMedias, | ||||||
|         async baseMedia => fetchMedia(baseMedia, { existingSourceMediaByUrl, existingExtractMediaByUrl }), |         async baseMedia => fetchMedia(baseMedia, { existingSourceMediaByUrl, existingExtractMediaByUrl }), | ||||||
|     ); |     ); | ||||||
| 
 | 
 | ||||||
|     const { uniqueHashMedia, existingHashMedia } = await findHashDuplicates(savedMedias); |     const [uniqueHashMedias, existingHashMedias] = await findHashDuplicates(savedMedias); | ||||||
| 
 | 
 | ||||||
|     const newMediaWithEntries = uniqueHashMedia.map((media, index) => curateMediaEntry(media, index)); |     const newMediaWithEntries = uniqueHashMedias.map((media, index) => curateMediaEntry(media, index)); | ||||||
|     const newMediaEntries = newMediaWithEntries.filter(media => !media.newEntry).map(media => media.entry); |     const newMediaEntries = newMediaWithEntries.filter(media => media.newEntry).map(media => media.entry); | ||||||
| 
 | 
 | ||||||
|     await knex('media').insert(newMediaEntries); |     await knex('media').insert(newMediaEntries); | ||||||
| 
 | 
 | ||||||
|     return [...newMediaWithEntries, ...existingHashMedia]; |     return [...newMediaWithEntries, ...existingHashMedias]; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| async function associateReleaseMedia(releases) { | async function associateReleaseMedia(releases) { | ||||||
|  | @ -445,12 +463,13 @@ async function associateReleaseMedia(releases) { | ||||||
|     // TODO: internal duplicate filtering
 |     // TODO: internal duplicate filtering
 | ||||||
|     // TODO: media count limits
 |     // TODO: media count limits
 | ||||||
|     // TODO: catch errors
 |     // TODO: catch errors
 | ||||||
|  |     // TODO: stage by role
 | ||||||
| 
 | 
 | ||||||
|     const baseMediasByReleaseId = releases.reduce((acc, release) => ({ |     const baseMediasByReleaseId = releases.reduce((acc, release) => ({ | ||||||
|         ...acc, |         ...acc, | ||||||
|         [release.id]: [ |         [release.id]: [ | ||||||
|             ...(argv.images && argv.poster ? toBaseMedias([release.poster], 'posters') : []), |             ...(argv.images && argv.poster ? toBaseMedias([release.poster], 'posters') : []), | ||||||
|             ...(argv.images && argv.photos ? toBaseMedias(release.photos, 'photos').slice(0, 5) : []), |             ...(argv.images && argv.photos ? toBaseMedias(release.photos, 'photos') : []), | ||||||
|             ...(argv.videos && argv.trailer ? toBaseMedias([release.trailer], 'trailers') : []), |             ...(argv.videos && argv.trailer ? toBaseMedias([release.trailer], 'trailers') : []), | ||||||
|             ...(argv.videos && argv.teaser ? toBaseMedias([release.teaser], 'teasers') : []), |             ...(argv.videos && argv.teaser ? toBaseMedias([release.teaser], 'teasers') : []), | ||||||
|         ], |         ], | ||||||
|  | @ -473,17 +492,15 @@ async function associateReleaseMedia(releases) { | ||||||
| 
 | 
 | ||||||
|             acc[media.role].push({ |             acc[media.role].push({ | ||||||
|                 release_id: releaseId, |                 release_id: releaseId, | ||||||
|                 media_id: media.entry.id, |                 media_id: media.use || media.entry.id, | ||||||
|             }); |             }); | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         return acc; |         return acc; | ||||||
|     }, {}); |     }, {}); | ||||||
| 
 | 
 | ||||||
|     console.log(util.inspect(associationsByRole, null, null)); |  | ||||||
| 
 |  | ||||||
|     await Promise.all(Object.entries(associationsByRole) |     await Promise.all(Object.entries(associationsByRole) | ||||||
|         .map(async ([role, associations]) => knex(`releases_${role}`).insert(associations))); |         .map(async ([role, associations]) => knex.raw(`${knex(`releases_${role}`).insert(associations)} ON CONFLICT DO NOTHING`))); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| module.exports = { | module.exports = { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue