Added trailers. Improved scene page scaling.
This commit is contained in:
		
							parent
							
								
									8a32febb8a
								
							
						
					
					
						commit
						08e4146d91
					
				|  | @ -4,6 +4,7 @@ | ||||||
| @import 'forms'; | @import 'forms'; | ||||||
| @import 'markdown'; | @import 'markdown'; | ||||||
| @import 'tooltip'; | @import 'tooltip'; | ||||||
|  | @import 'video'; | ||||||
| 
 | 
 | ||||||
| html, | html, | ||||||
| body, | body, | ||||||
|  |  | ||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							|  | @ -65,8 +65,8 @@ | ||||||
| 
 | 
 | ||||||
| 						<option | 						<option | ||||||
| 							v-if="q" | 							v-if="q" | ||||||
| 							:selected="order === 'relevance.desc'" | 							:selected="order === 'results.desc'" | ||||||
| 							value="relevance.desc" | 							value="results.desc" | ||||||
| 						>Relevance</option> | 						>Relevance</option> | ||||||
| 
 | 
 | ||||||
| 						<option value="name.asc">Name</option> | 						<option value="name.asc">Name</option> | ||||||
|  | @ -172,10 +172,10 @@ async function search(options = {}) { | ||||||
| 
 | 
 | ||||||
| 	if (options.autoScope !== false) { | 	if (options.autoScope !== false) { | ||||||
| 		if (q.value) { | 		if (q.value) { | ||||||
| 			order.value = 'relevance.desc'; | 			order.value = 'results.desc'; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		if (!q.value && order.value.includes('relevance')) { | 		if (!q.value && order.value.includes('results')) { | ||||||
| 			order.value = 'likes.desc'; | 			order.value = 'likes.desc'; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -148,7 +148,6 @@ async function unstash() { | ||||||
| 	aspect-ratio: 2/3; | 	aspect-ratio: 2/3; | ||||||
| 	position: relative; | 	position: relative; | ||||||
| 	border-radius: .25rem; | 	border-radius: .25rem; | ||||||
| 	margin: .25rem; |  | ||||||
| 	box-shadow: 0 0 3px var(--shadow-weak-30); | 	box-shadow: 0 0 3px var(--shadow-weak-30); | ||||||
| 	overflow: hidden; | 	overflow: hidden; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -40,8 +40,8 @@ | ||||||
| 				<li class="nav-item"> | 				<li class="nav-item"> | ||||||
| 					<Link | 					<Link | ||||||
| 						class="link" | 						class="link" | ||||||
| 						:class="{ active: activePage === 'tags' }" | 						:class="{ active: activePage === 'cats' }" | ||||||
| 						href="/tags" | 						href="/cats" | ||||||
| 					>Tags</Link> | 					>Tags</Link> | ||||||
| 				</li> | 				</li> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -49,10 +49,10 @@ | ||||||
| 
 | 
 | ||||||
| 				<li | 				<li | ||||||
| 					class="menu-item" | 					class="menu-item" | ||||||
| 					:class="{ active: activePage === 'tags' }" | 					:class="{ active: activePage === 'cats' }" | ||||||
| 				> | 				> | ||||||
| 					<a | 					<a | ||||||
| 						href="/tags" | 						href="/cats" | ||||||
| 						class="menu-link nolink" | 						class="menu-link nolink" | ||||||
| 					>Tags</a> | 					>Tags</a> | ||||||
| 				</li> | 				</li> | ||||||
|  |  | ||||||
|  | @ -0,0 +1,275 @@ | ||||||
|  | <template> | ||||||
|  | 	<div | ||||||
|  | 		class="tile" | ||||||
|  | 		:class="{ | ||||||
|  | 			unstashed: !favorited && pageStash && user && pageStash.id === user.primaryStash?.id | ||||||
|  | 		}" | ||||||
|  | 	> | ||||||
|  | 		<span class="name">{{ actor.name }}</span> | ||||||
|  | 
 | ||||||
|  | 		<div class="avatar-container"> | ||||||
|  | 			<Link | ||||||
|  | 				:href="`/actor/${actor.id}/${actor.slug}`" | ||||||
|  | 				class="avatar-link no-link" | ||||||
|  | 			> | ||||||
|  | 				<img | ||||||
|  | 					v-if="actor.avatar" | ||||||
|  | 					:src="actor.avatar.isS3 ? `https://cdndev.traxxx.me/${actor.avatar.thumbnail}` : `/media/${actor.avatar.thumbnail}`" | ||||||
|  | 					:style="{ 'background-image': actor.avatar.isS3 ? `url(https://cdndev.traxxx.me/${actor.avatar.lazy})` : `url(/media/${actor.avatar.lazy})` }" | ||||||
|  | 					loading="lazy" | ||||||
|  | 					class="avatar" | ||||||
|  | 				> | ||||||
|  | 
 | ||||||
|  | 				<img | ||||||
|  | 					v-else | ||||||
|  | 					:src="`/img/avatars/${actor.gender || 'female'}.svg`" | ||||||
|  | 					loading="lazy" | ||||||
|  | 					class="fallback" | ||||||
|  | 				> | ||||||
|  | 			</Link> | ||||||
|  | 
 | ||||||
|  | 			<Icon | ||||||
|  | 				v-show="favorited" | ||||||
|  | 				icon="heart7" | ||||||
|  | 				class="heart favorited" | ||||||
|  | 				@click.native.stop="unstash" | ||||||
|  | 			/> | ||||||
|  | 
 | ||||||
|  | 			<Icon | ||||||
|  | 				v-show="!favorited && user" | ||||||
|  | 				icon="heart8" | ||||||
|  | 				class="heart" | ||||||
|  | 				@click.native.stop="stash" | ||||||
|  | 			/> | ||||||
|  | 		</div> | ||||||
|  | 
 | ||||||
|  | 		<div class="details"> | ||||||
|  | 			<span class="birth"> | ||||||
|  | 				<Gender :gender="actor.gender" /> | ||||||
|  | 
 | ||||||
|  | 				<span | ||||||
|  | 					v-if="actor.ageFromBirth" | ||||||
|  | 					:title="`Born ${formatDate(actor.dateOfBirth, 'MMMM d, yyyy')}`" | ||||||
|  | 					class="age" | ||||||
|  | 				>{{ actor.ageFromBirth }}</span> | ||||||
|  | 
 | ||||||
|  | 				<span | ||||||
|  | 					v-if="actor.ageThen && actor.ageThen < actor.ageFromBirth" | ||||||
|  | 					title="Age on date of release" | ||||||
|  | 					class="age age-then" | ||||||
|  | 				>{{ actor.ageThen }}</span> | ||||||
|  | 			</span> | ||||||
|  | 
 | ||||||
|  | 			<span | ||||||
|  | 				v-if="actor.origin?.country" | ||||||
|  | 				:title="`Born in ${actor.origin.country.name}`" | ||||||
|  | 				class="country" | ||||||
|  | 			> | ||||||
|  | 				{{ actor.origin.country.alpha2 }} | ||||||
|  | 				<img | ||||||
|  | 					:src="`/img/flags/${actor.origin.country.alpha2.toLowerCase()}.svg`" | ||||||
|  | 					class="flag" | ||||||
|  | 				> | ||||||
|  | 			</span> | ||||||
|  | 		</div> | ||||||
|  | 	</div> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { ref, inject } from 'vue'; | ||||||
|  | 
 | ||||||
|  | import { formatDate } from '#/utils/format.js'; | ||||||
|  | import { post, del } from '#/src/api.js'; | ||||||
|  | import events from '#/src/events.js'; | ||||||
|  | 
 | ||||||
|  | import Gender from './gender.vue'; | ||||||
|  | 
 | ||||||
|  | const props = defineProps({ | ||||||
|  | 	actor: { | ||||||
|  | 		type: Object, | ||||||
|  | 		default: null, | ||||||
|  | 	}, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const pageContext = inject('pageContext'); | ||||||
|  | const { user } = pageContext; | ||||||
|  | const pageStash = pageContext.pageProps.stash; | ||||||
|  | 
 | ||||||
|  | // console.log(props.actor); | ||||||
|  | 
 | ||||||
|  | const favorited = ref(props.actor.stashes?.some((sceneStash) => sceneStash.primary) || false); | ||||||
|  | 
 | ||||||
|  | async function stash() { | ||||||
|  | 	try { | ||||||
|  | 		favorited.value = true; | ||||||
|  | 		await post(`/stashes/${user.primaryStash.id}/actors`, { actorId: props.actor.id }); | ||||||
|  | 
 | ||||||
|  | 		events.emit('feedback', { | ||||||
|  | 			type: 'success', | ||||||
|  | 			message: `${props.actor.name} stashed to ${user.primaryStash.name}`, | ||||||
|  | 		}); | ||||||
|  | 	} catch (error) { | ||||||
|  | 		favorited.value = false; | ||||||
|  | 
 | ||||||
|  | 		events.emit('feedback', { | ||||||
|  | 			type: 'error', | ||||||
|  | 			message: `Failed to stash ${props.actor.name} to ${user.primaryStash.name}`, | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | async function unstash() { | ||||||
|  | 	try { | ||||||
|  | 		favorited.value = false; | ||||||
|  | 		await del(`/stashes/${user.primaryStash.id}/actors/${props.actor.id}`); | ||||||
|  | 
 | ||||||
|  | 		events.emit('feedback', { | ||||||
|  | 			type: 'remove', | ||||||
|  | 			message: `${props.actor.name} unstashed from ${user.primaryStash.name}`, | ||||||
|  | 		}); | ||||||
|  | 	} catch (error) { | ||||||
|  | 		favorited.value = true; | ||||||
|  | 
 | ||||||
|  | 		console.error(error); | ||||||
|  | 
 | ||||||
|  | 		events.emit('feedback', { | ||||||
|  | 			type: 'error', | ||||||
|  | 			message: `Failed to unstash ${props.actor.name} from ${user.primaryStash.name}`, | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped> | ||||||
|  | .tile { | ||||||
|  | 	display: flex; | ||||||
|  | 	flex-direction: column; | ||||||
|  | 	width: 100%; | ||||||
|  | 	aspect-ratio: 2/3; | ||||||
|  | 	position: relative; | ||||||
|  | 	border-radius: .25rem; | ||||||
|  | 	margin: .25rem; | ||||||
|  | 	box-shadow: 0 0 3px var(--shadow-weak-30); | ||||||
|  | 	overflow: hidden; | ||||||
|  | 
 | ||||||
|  | 	&:hover { | ||||||
|  | 		box-shadow: 0 0 3px var(--shadow-weak-20); | ||||||
|  | 
 | ||||||
|  | 		.name { | ||||||
|  | 			color: var(--primary); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&.unstashed { | ||||||
|  | 		opacity: .5; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .name { | ||||||
|  | 	flex-shrink: 0; | ||||||
|  | 	padding: .25rem .5rem; | ||||||
|  | 	font-weight: bold; | ||||||
|  | 	font-size: .9rem; | ||||||
|  | 	white-space: nowrap; | ||||||
|  | 	overflow: hidden; | ||||||
|  | 	text-overflow: ellipsis; | ||||||
|  | 	user-select: all; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .avatar-container { | ||||||
|  | 	position: relative; | ||||||
|  | 	flex-grow: 1; | ||||||
|  | 	overflow: hidden; | ||||||
|  | 	background: var(--grey-dark-40); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .avatar-link { | ||||||
|  | 	height: 100%; | ||||||
|  | 	display: block; | ||||||
|  | 	overflow: hidden; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .avatar { | ||||||
|  | 	height: 100%; | ||||||
|  | 	width: 100%; | ||||||
|  | 	object-fit: cover; | ||||||
|  | 	object-position: center 0; | ||||||
|  | 	background-size: cover; | ||||||
|  | 	background-position: center 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .fallback { | ||||||
|  | 	height: 100%; | ||||||
|  | 	width: 100%; | ||||||
|  | 	display: block; | ||||||
|  | 	object-fit: contain; | ||||||
|  | 	opacity: .1; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .icon.heart { | ||||||
|  | 	width: 2rem; | ||||||
|  | 	height: 1.5rem; | ||||||
|  | 	position: absolute; | ||||||
|  | 	top: 0; | ||||||
|  | 	right: 0; | ||||||
|  | 	padding: .5rem .5rem 1rem 1rem; | ||||||
|  | 	fill: var(--highlight-strong-10); | ||||||
|  | 	filter: drop-shadow(0 0 3px var(--shadow)); | ||||||
|  | 
 | ||||||
|  | 	&:hover { | ||||||
|  | 		cursor: pointer; | ||||||
|  | 		fill: var(--primary); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&.favorited { | ||||||
|  | 		fill: var(--primary); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .details { | ||||||
|  | 	width: 100%; | ||||||
|  | 	height: 1.5rem; | ||||||
|  | 	display: flex; | ||||||
|  | 	justify-content: space-between; | ||||||
|  | 	align-items: center; | ||||||
|  | 	position: absolute; | ||||||
|  | 	bottom: 0; | ||||||
|  | 	box-sizing: border-box; | ||||||
|  | 	padding: 0 .5rem; | ||||||
|  | 	color: var(--text-light); | ||||||
|  | 	background: var(--shadow); | ||||||
|  | 	font-size: .9rem; | ||||||
|  | 	font-weight: bold; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .gender { | ||||||
|  | 	display: inline-block; | ||||||
|  | 	padding: .25rem 0; | ||||||
|  | 	margin-right: .25rem; | ||||||
|  | 	transform: translateY(1px); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .birth { | ||||||
|  | 	display: flex; | ||||||
|  | 	align-items: center; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .age { | ||||||
|  | 	margin-right: .25rem; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .age-then { | ||||||
|  | 	color: var(--grey-light-20); | ||||||
|  | 	font-weight: normal; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .country { | ||||||
|  | 	display: flex; | ||||||
|  | 	align-items: center; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .flag { | ||||||
|  | 	height: .75rem; | ||||||
|  | 	margin-left: .25rem; | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,39 @@ | ||||||
|  | <template> | ||||||
|  | 	<span | ||||||
|  | 		v-if="gender" | ||||||
|  | 		class="gender" | ||||||
|  | 		:class="{ [gender]: true }" | ||||||
|  | 	> | ||||||
|  | 		<Icon :icon="gender" /> | ||||||
|  | 	</span> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | defineProps({ | ||||||
|  | 	gender: { | ||||||
|  | 		type: String, | ||||||
|  | 		default: null, | ||||||
|  | 	}, | ||||||
|  | }); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style scoped> | ||||||
|  | .gender { | ||||||
|  |     &.female .icon { | ||||||
|  |         fill: var(--female); | ||||||
|  |         filter: drop-shadow(0 0 1px var(--shadow-weak-20)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     &.male .icon { | ||||||
|  |         fill: var(--male); | ||||||
|  |         filter: drop-shadow(0 0 1px var(--shadow-weak-20)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     &.transsexual .icon { | ||||||
|  |         fill: var(--text-light); | ||||||
|  |         filter: drop-shadow(1px 0 0 var(--female)) drop-shadow(-1px 0 0 var(--female)) drop-shadow(0 1px 0 var(--female)) drop-shadow(0 -1px 0 var(--female)) | ||||||
|  |             drop-shadow(1px 0 0 var(--male)) drop-shadow(-1px 0 0 var(--male)) drop-shadow(0 1px 0 var(--male)) drop-shadow(0 -1px 0 var(--male)) | ||||||
|  |             drop-shadow(0 0 1px var(--shadow-weak-20)) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | @ -0,0 +1,148 @@ | ||||||
|  | <template> | ||||||
|  | 	<video | ||||||
|  | 		ref="player" | ||||||
|  | 		:poster="poster" | ||||||
|  | 		crossorigin="anonymous" | ||||||
|  | 		class="player video-js vjs-big-play-centered" | ||||||
|  | 		@playing="emit('play')" | ||||||
|  | 		@pause="emit('pause')" | ||||||
|  | 	/> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script setup> | ||||||
|  | import { ref, watch, onMounted } from 'vue'; | ||||||
|  | import videoJs from 'video.js'; | ||||||
|  | // import 'videojs-vr/dist/videojs-vr.min'; | ||||||
|  | 
 | ||||||
|  | import getPath from '#/src/get-path.js'; | ||||||
|  | 
 | ||||||
|  | const props = defineProps({ | ||||||
|  | 	video: { | ||||||
|  | 		type: Object, | ||||||
|  | 		default: null, | ||||||
|  | 	}, | ||||||
|  | 	poster: { | ||||||
|  | 		type: String, | ||||||
|  | 		default: null, | ||||||
|  | 	}, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | const emit = defineEmits(['play', 'pause']); | ||||||
|  | 
 | ||||||
|  | const player = ref(null); | ||||||
|  | 
 | ||||||
|  | function updatePlayer() { | ||||||
|  | 	player.value.src(getPath(props.video)); | ||||||
|  | 	player.value.poster(props.poster); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function initPlayer() { | ||||||
|  | 	player.value = videoJs(player.value, { | ||||||
|  | 		controls: true, | ||||||
|  | 		inactivityTimeout: 1000, | ||||||
|  | 		controlBar: { | ||||||
|  | 			pictureInPictureToggle: false, | ||||||
|  | 			volumePanel: { | ||||||
|  | 				inline: false, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 	}, () => { | ||||||
|  | 		player.value.src(getPath(props.video)); | ||||||
|  | 
 | ||||||
|  | 		if (props.video.isVr) { | ||||||
|  | 			player.value.vr({ projection: '180' }); | ||||||
|  | 		} | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | onMounted(() => { | ||||||
|  | 	if (typeof window !== 'undefined') { | ||||||
|  | 		window.HELP_IMPROVE_VIDEOJS = false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	initPlayer(); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | watch(() => props.video, () => updatePlayer()); | ||||||
|  | watch(() => props.poster, () => updatePlayer()); | ||||||
|  | </script> | ||||||
|  | 
 | ||||||
|  | <style> | ||||||
|  | .player.video-js { | ||||||
|  | 	.vjs-poster { | ||||||
|  | 		background-size: cover; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-control-bar { | ||||||
|  | 		background-color: var(--shadow); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-slider { | ||||||
|  | 		background-color: var(--shadow-weak-10); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-play-progress { | ||||||
|  | 		background-color: var(--primary); | ||||||
|  | 
 | ||||||
|  | 		.vjs-time-tooltip { | ||||||
|  | 			color: var(--shadow-strong-10); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-load-progress { | ||||||
|  | 		background-color: var(--highlight-weak-10); | ||||||
|  | 
 | ||||||
|  | 		div { | ||||||
|  | 			background-color: var(--shadow-weak-10); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-mouse-display .vjs-time-tooltip { | ||||||
|  | 		background-color: var(--shadow-strong-10); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-remaining-time { | ||||||
|  | 		line-height: 2rem; | ||||||
|  | 		font-size: .75rem; | ||||||
|  | 		font-weight: bold; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-big-play-button { | ||||||
|  | 		background-color: var(--shadow); | ||||||
|  | 		width: 4rem; | ||||||
|  | 		height: 4rem; | ||||||
|  | 		margin: -2rem 0 0 -2rem; | ||||||
|  | 		border: none; | ||||||
|  | 		border-radius: 50%; | ||||||
|  | 
 | ||||||
|  | 		.vjs-icon-placeholder { | ||||||
|  | 			font-size: 2.5rem; | ||||||
|  | 			line-height: 4rem; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		&:hover { | ||||||
|  | 			background-color: var(--primary); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-control:focus::before, | ||||||
|  | 	.vjs-control:hover::before, | ||||||
|  | 	.vjs-control:focus { | ||||||
|  | 		text-shadow: 0 0 .5rem var(--highlight-strong-10); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-error-display { | ||||||
|  | 		overflow: hidden; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.vjs-modal-dialog-content { | ||||||
|  | 		white-space: normal; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	&:hover { | ||||||
|  | 		.vjs-big-play-button { | ||||||
|  | 			background-color: var(--primary); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | @ -53,20 +53,11 @@ module.exports = { | ||||||
| 		username: null, | 		username: null, | ||||||
| 		password: null, | 		password: null, | ||||||
| 	}, | 	}, | ||||||
| 	location: { |  | ||||||
| 		userAgent: 'contact via https://traxxx.me/', |  | ||||||
| 	}, |  | ||||||
| 	analytics: { | 	analytics: { | ||||||
| 		enabled: false, | 		enabled: false, | ||||||
| 		address: 'http://localhost:3000/script.js', | 		address: 'http://localhost:3000/script.js', | ||||||
| 		siteId: '1b28ac3b-d229-43bf-aec9-75cf0a72a466', | 		siteId: '1b28ac3b-d229-43bf-aec9-75cf0a72a466', | ||||||
| 	}, | 	}, | ||||||
| 	s3: { |  | ||||||
| 		enabled: false, |  | ||||||
| 		bucket: 'traxxx', |  | ||||||
| 		accessKey: 'ABCDEFGHIJ1234567890', |  | ||||||
| 		secretKey: 'abcdefghijklmnopqrstuvwxyz1234567890ABCD', |  | ||||||
| 	}, |  | ||||||
| 	auth: { | 	auth: { | ||||||
| 		login: true, | 		login: true, | ||||||
| 		signup: true, | 		signup: true, | ||||||
|  | @ -76,330 +67,10 @@ module.exports = { | ||||||
| 	stashes: { | 	stashes: { | ||||||
| 		viewRefreshCooldown: 60, // minutes
 | 		viewRefreshCooldown: 60, // minutes
 | ||||||
| 	}, | 	}, | ||||||
| 	exclude: { |  | ||||||
| 		channels: [ |  | ||||||
| 			// 21sextreme, no longer updated
 |  | ||||||
| 			'mightymistress', |  | ||||||
| 			'dominatedgirls', |  | ||||||
| 			'homepornreality', |  | ||||||
| 			'peeandblow', |  | ||||||
| 			'cummingmatures', |  | ||||||
| 			'mandyiskinky', |  | ||||||
| 			'speculumplays', |  | ||||||
| 			'creampiereality', |  | ||||||
| 			// aziani
 |  | ||||||
| 			'amberathome', |  | ||||||
| 			'marycarey', |  | ||||||
| 			'racqueldevonshire', |  | ||||||
| 			'aziani', |  | ||||||
| 			// blowpass
 |  | ||||||
| 			'sunlustxxx', |  | ||||||
| 			// ddfnetwork
 |  | ||||||
| 			'fuckinhd', |  | ||||||
| 			'bustylover', |  | ||||||
| 			// famedigital
 |  | ||||||
| 			'daringsex', |  | ||||||
| 			'lowartfilms', |  | ||||||
| 			// freeones
 |  | ||||||
| 			'freeones', |  | ||||||
| 			// new sesations
 |  | ||||||
| 			'tabutales', |  | ||||||
| 			'talesfromtheedge', |  | ||||||
| 			'shanedieselsbangingbabes', |  | ||||||
| 			// pornpros
 |  | ||||||
| 			'milfhumiliation', |  | ||||||
| 			'humiliated', |  | ||||||
| 			'amateurviolations', |  | ||||||
| 			'cumdisgrace', |  | ||||||
| 			'webcamhackers', |  | ||||||
| 			'collegeteens', |  | ||||||
| 			// score
 |  | ||||||
| 			'bigboobbundle', |  | ||||||
| 			'milfbundle', |  | ||||||
| 			'pornmegaload', |  | ||||||
| 			'scorelandtv', |  | ||||||
| 			'scoretv', |  | ||||||
| 			// spizoo
 |  | ||||||
| 			'intimatelesbians', |  | ||||||
| 			'porngoespro', |  | ||||||
| 			'pornstartease', |  | ||||||
| 			'thestripperexperience', |  | ||||||
| 			// teenscoreclub
 |  | ||||||
| 			'maiko', |  | ||||||
| 			'ncuksinners', |  | ||||||
| 			'ncversocinema', |  | ||||||
| 			'pussybabes', |  | ||||||
| 			'uksinners', |  | ||||||
| 			// mindgeek
 |  | ||||||
| 			'pornhub', |  | ||||||
| 			// insex
 |  | ||||||
| 			'paintoy', |  | ||||||
| 			'aganmedon', |  | ||||||
| 			'sensualpain', |  | ||||||
| 		], |  | ||||||
| 		networks: [ |  | ||||||
| 			// dummy network for testing
 |  | ||||||
| 			'traxxx', |  | ||||||
| 			// porn doe
 |  | ||||||
| 			'forbondage', |  | ||||||
| 			'score', |  | ||||||
| 		], |  | ||||||
| 	}, |  | ||||||
| 	profiles: [ |  | ||||||
| 		[ |  | ||||||
| 			'evilangel', |  | ||||||
| 			'famedigital', |  | ||||||
| 			'devilsfilm', |  | ||||||
| 			'roccosiffredi', |  | ||||||
| 		], |  | ||||||
| 		[ |  | ||||||
| 			// Gamma; Evil Angel + Devil's Film, Pure Taboo (unavailable), (sometimes) Burning Angel and Wicked have their own assets
 |  | ||||||
| 			'xempire', |  | ||||||
| 			'blowpass', |  | ||||||
| 		], |  | ||||||
| 		[ |  | ||||||
| 			// MindGeek; Mile High Media has its own assets
 |  | ||||||
| 			'brazzers', |  | ||||||
| 			'realitykings', |  | ||||||
| 			'mofos', |  | ||||||
| 			'digitalplayground', |  | ||||||
| 			'twistys', |  | ||||||
| 			'babes', |  | ||||||
| 			'fakehub', |  | ||||||
| 			'sexyhub', |  | ||||||
| 			'metrohd', |  | ||||||
| 			'iconmale', |  | ||||||
| 			'men', |  | ||||||
| 			'transangels', |  | ||||||
| 		], |  | ||||||
| 		'wicked', |  | ||||||
| 		'burningangel', |  | ||||||
| 		'milehighmedia', |  | ||||||
| 		[ |  | ||||||
| 			'vixen', |  | ||||||
| 			'tushy', |  | ||||||
| 			'blacked', |  | ||||||
| 			'tushyraw', |  | ||||||
| 			'blackedraw', |  | ||||||
| 			'deeper', |  | ||||||
| 		], |  | ||||||
| 		[ |  | ||||||
| 			// Nubiles
 |  | ||||||
| 			'nubiles', |  | ||||||
| 			'nubilesporn', |  | ||||||
| 			'deeplush', |  | ||||||
| 			'brattysis', |  | ||||||
| 			'nfbusty', |  | ||||||
| 			'anilos', |  | ||||||
| 			'hotcrazymess', |  | ||||||
| 			'thatsitcomshow', |  | ||||||
| 		], |  | ||||||
| 		[ |  | ||||||
| 			// Adult DVD Empire
 |  | ||||||
| 			'elegantangel', |  | ||||||
| 			'westcoastproductions', |  | ||||||
| 		], |  | ||||||
| 		'21sextury', |  | ||||||
| 		'julesjordan', |  | ||||||
| 		'dorcelclub', |  | ||||||
| 		'bang', |  | ||||||
| 		'pervcity', |  | ||||||
| 		'kink', |  | ||||||
| 		'peternorth', |  | ||||||
| 		'naughtyamerica', |  | ||||||
| 		'cherrypimps', |  | ||||||
| 		'pimpxxx', |  | ||||||
| 		'18vr', |  | ||||||
| 		'babevr', |  | ||||||
| 		'badoinkvr', |  | ||||||
| 		'realvr', |  | ||||||
| 		'vrcosplayx', |  | ||||||
| 		'teamskeet', |  | ||||||
| 		'mylf', |  | ||||||
| 		[ |  | ||||||
| 			'letsdoeit', |  | ||||||
| 			'mamacitaz', |  | ||||||
| 			'forbondage', |  | ||||||
| 			'amateureuro', |  | ||||||
| 			'vipsexvault', |  | ||||||
| 			'transbella', |  | ||||||
| 		], |  | ||||||
| 		[ |  | ||||||
| 			'hussiepass', |  | ||||||
| 			'hushpass', |  | ||||||
| 			'interracialpass', |  | ||||||
| 			'interracialpovs', |  | ||||||
| 			'povpornstars', |  | ||||||
| 			'seehimfuck', |  | ||||||
| 			'eyeontheguy', |  | ||||||
| 		], |  | ||||||
| 		[ |  | ||||||
| 			// Full Porn Network
 |  | ||||||
| 			'analized', |  | ||||||
| 			'hergape', |  | ||||||
| 			'jamesdeen', |  | ||||||
| 			'dtfsluts', |  | ||||||
| 			'analbbc', |  | ||||||
| 			'analviolation', |  | ||||||
| 			'baddaddypov', |  | ||||||
| 			'girlfaction', |  | ||||||
| 			'homemadeanalwhores', |  | ||||||
| 			'mugfucked', |  | ||||||
| 			'onlyprince', |  | ||||||
| 			'pervertgallery', |  | ||||||
| 			'povperverts', |  | ||||||
| 		], |  | ||||||
| 		'wankzvr', |  | ||||||
| 		'milfvr', |  | ||||||
| 		'tranzvr', |  | ||||||
| 		'topwebmodels', |  | ||||||
| 		'pascalssubsluts', |  | ||||||
| 		'kellymadison', |  | ||||||
| 		'private', |  | ||||||
| 		'ddfnetwork', |  | ||||||
| 		'bangbros', |  | ||||||
| 		'hitzefrei', |  | ||||||
| 		'porncz', |  | ||||||
| 		'czechav', |  | ||||||
| 		'littlecapricedreams', |  | ||||||
| 		'gangbangcreampie', |  | ||||||
| 		'gloryholesecrets', |  | ||||||
| 		'aziani', |  | ||||||
| 		[ |  | ||||||
| 			'firstanalquest', |  | ||||||
| 			'doubleviewcasting', |  | ||||||
| 		], |  | ||||||
| 		[ |  | ||||||
| 			'silverstonedvd', |  | ||||||
| 			'silviasaint', |  | ||||||
| 		], |  | ||||||
| 		'legalporno', |  | ||||||
| 		'pierrewoodman', |  | ||||||
| 		'score', |  | ||||||
| 		'boobpedia', |  | ||||||
| 		'pornhub', |  | ||||||
| 		'freeones', |  | ||||||
| 	], |  | ||||||
| 	options: { |  | ||||||
| 		traxxx: { |  | ||||||
| 			// source: 'http://nsfw.unknown.name/random',
 |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	proxy: { |  | ||||||
| 		enable: false, |  | ||||||
| 		host: '', |  | ||||||
| 		port: 8888, |  | ||||||
| 		hostnames: [ |  | ||||||
| 			'www.vixen.com', |  | ||||||
| 			'www.blacked.com', |  | ||||||
| 			'www.blackedraw.com', |  | ||||||
| 			'www.tushy.com', |  | ||||||
| 			'www.tushyraw.com', |  | ||||||
| 			'www.deeper.com', |  | ||||||
| 			'www.slayed.com', |  | ||||||
| 			'www.milfy.com', |  | ||||||
| 			'sthw-trailer-vixen.ssl-cdn.com', |  | ||||||
| 			'sthw-trailer-tushy.ssl-cdn.com', |  | ||||||
| 			'sthw-trailer-tushyraw.ssl-cdn.com', |  | ||||||
| 			'sthw-trailer-blacked.ssl-cdn.com', |  | ||||||
| 			'sthw-trailer-blackedraw.ssl-cdn.com', |  | ||||||
| 			'sthw-trailer-deeper.ssl-cdn.com', |  | ||||||
| 			'sthw-trailer-milfy.ssl-cdn.com', |  | ||||||
| 			'streamhw-trailer-vixen.ssl-cdn.com', |  | ||||||
| 			'streamhw-trailer-tushy.ssl-cdn.com', |  | ||||||
| 			'streamhw-trailer-tushyraw.ssl-cdn.com', |  | ||||||
| 			'streamhw-trailer-blacked.ssl-cdn.com', |  | ||||||
| 			'streamhw-trailer-blackedraw.ssl-cdn.com', |  | ||||||
| 			'streamhw-trailer-deeper.ssl-cdn.com', |  | ||||||
| 			'streamhw-trailer-milfy.ssl-cdn.com', |  | ||||||
| 			'cdn.vixen.com', |  | ||||||
| 			'cdn.tushy.com', |  | ||||||
| 			'cdn.blacked.com', |  | ||||||
| 			'cdn.deeper.com', |  | ||||||
| 			'cdn.blackedraw.com', |  | ||||||
| 			'cdn.tushyraw.com', |  | ||||||
| 			'cdn.slayed.com', |  | ||||||
| 			'cdn.milfy.com', |  | ||||||
| 			'www.vogov.com', |  | ||||||
| 			'www.vogov.com', |  | ||||||
| 			'www.nubiles.net', |  | ||||||
| 			'www.brattysis.com', |  | ||||||
| 			'www.deeplush.com', |  | ||||||
| 			'www.detentiongirls.com', |  | ||||||
| 			'www.daddyslilangel.com', |  | ||||||
| 			'www.myfamilypies.com', |  | ||||||
| 			'www.bountyhunterporn.com', |  | ||||||
| 			'www.anilos.com', |  | ||||||
| 			'www.thatsitcomshow.com', |  | ||||||
| 			'www.nubileset.com', |  | ||||||
| 			'www.nubilesunscripted.com', |  | ||||||
| 			'www.nubilefilms.com', |  | ||||||
| 			'www.badteenspunished.com', |  | ||||||
| 			'www.cumlouder.com', |  | ||||||
| 			'im0.imgcm.com', |  | ||||||
| 		], |  | ||||||
| 	}, |  | ||||||
| 	bypass: { |  | ||||||
| 		browser: { |  | ||||||
| 			enable: false, |  | ||||||
| 			hostnames: [ // these can run in the same browser session
 |  | ||||||
| 				'www.kink.com', |  | ||||||
| 				'store2.psmcdn.net', // Team Skeet API
 |  | ||||||
| 			], |  | ||||||
| 		}, |  | ||||||
| 		cloudflare: { |  | ||||||
| 			enable: false, |  | ||||||
| 			auto: true, // try bypass when CF challenge is detected
 |  | ||||||
| 			path: 'http://localhost:8191/v1', |  | ||||||
| 			sharedHostnames: [ // these can run in the same browser session
 |  | ||||||
| 				'store2.psmcdn.net', // Team Skeet API
 |  | ||||||
| 			], |  | ||||||
| 			independentHostnames: [], // these must run in their own browser session
 |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	limits: { |  | ||||||
| 		default: { |  | ||||||
| 			interval: 50, |  | ||||||
| 			concurrency: 20, |  | ||||||
| 		}, |  | ||||||
| 		'www.deeper.com': { |  | ||||||
| 			enable: false, // can be omitted to enable
 |  | ||||||
| 			interval: 1000, |  | ||||||
| 			concurrency: 1, |  | ||||||
| 		}, |  | ||||||
| 		'westcoastproductions.com': { |  | ||||||
| 			interval: 100, |  | ||||||
| 			concurrency: 1, |  | ||||||
| 		}, |  | ||||||
| 		'images.mylfcdn.net': { |  | ||||||
| 			interval: 50, |  | ||||||
| 			concurrency: 1, |  | ||||||
| 		}, |  | ||||||
| 	}, |  | ||||||
| 	fetchAfter: [1, 'week'], |  | ||||||
| 	missingDateLimit: 3, |  | ||||||
| 	memorySampling: { |  | ||||||
| 		enabled: false, |  | ||||||
| 		sampleDuration: 300000, // 5 minutes
 |  | ||||||
| 		snapshotIntervals: [], |  | ||||||
| 	}, |  | ||||||
| 	media: { | 	media: { | ||||||
| 		path: './media', | 		path: './media', | ||||||
| 		transferSources: { | 		assetPath: '/img', | ||||||
| 			local: 'http://localhost:5000/media', | 		mediaPath: '/media', | ||||||
| 			s3: 'https://cdn.traxxx.me', | 		s3Path: 'https://s3.wasabisys.com', | ||||||
| 		}, |  | ||||||
| 		maxSize: 1000, |  | ||||||
| 		quality: 80, |  | ||||||
| 		thumbnailSize: 320, // width for 16:9 will be exactly 576px
 |  | ||||||
| 		thumbnailQuality: 100, |  | ||||||
| 		lazySize: 90, |  | ||||||
| 		lazyQuality: 90, |  | ||||||
| 		trailerQuality: [540, 720, 480, 360, 960, 1080, 320, 1440, 1600, 1920, 2160, 270, 240, 180], |  | ||||||
| 		limit: 25, // max number of photos per release
 |  | ||||||
| 		attempts: 2, |  | ||||||
| 		fetchStreams: true, |  | ||||||
| 		streamConcurrency: 2, // max number of video streams (m3u8 etc.) to fetch and process at once
 |  | ||||||
| 	}, | 	}, | ||||||
| 	titleSlugLength: 50, |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ | ||||||
|         "redis": "^4.6.12", |         "redis": "^4.6.12", | ||||||
|         "sharp": "^0.32.6", |         "sharp": "^0.32.6", | ||||||
|         "sirv": "^2.0.3", |         "sirv": "^2.0.3", | ||||||
|  |         "video.js": "^8.10.0", | ||||||
|         "vike": "^0.4.150", |         "vike": "^0.4.150", | ||||||
|         "vite": "^4.5.1", |         "vite": "^4.5.1", | ||||||
|         "vue": "^3.3.10", |         "vue": "^3.3.10", | ||||||
|  | @ -3490,6 +3491,68 @@ | ||||||
|       "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", |       "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@videojs/http-streaming": { | ||||||
|  |       "version": "3.10.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.10.0.tgz", | ||||||
|  |       "integrity": "sha512-Lf1rmhTalV4Gw0bJqHmH4lfk/FlepUDs9smuMtorblAYnqDlE2tbUOb7sBXVYoXGdbWbdTW8jH2cnS+6HWYJ4Q==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "4.0.0", | ||||||
|  |         "aes-decrypter": "4.0.1", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "m3u8-parser": "^7.1.0", | ||||||
|  |         "mpd-parser": "^1.3.0", | ||||||
|  |         "mux.js": "7.0.2", | ||||||
|  |         "video.js": "^7 || ^8" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=8", | ||||||
|  |         "npm": ">=5" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "video.js": "^7 || ^8" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@videojs/http-streaming/node_modules/mux.js": { | ||||||
|  |       "version": "7.0.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.2.tgz", | ||||||
|  |       "integrity": "sha512-CM6+QuyDbc0qW1OfEjkd2+jVKzTXF+z5VOKH0eZxtZtnrG/ilkW/U7l7IXGtBNLASF9sKZMcK1u669cq50Qq0A==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.11.2", | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       }, | ||||||
|  |       "bin": { | ||||||
|  |         "muxjs-transmux": "bin/transmux.js" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=8", | ||||||
|  |         "npm": ">=5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@videojs/vhs-utils": { | ||||||
|  |       "version": "4.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", | ||||||
|  |       "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "url-toolkit": "^2.2.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=8", | ||||||
|  |         "npm": ">=5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@videojs/xhr": { | ||||||
|  |       "version": "2.6.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.6.0.tgz", | ||||||
|  |       "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.5.5", | ||||||
|  |         "global": "~4.4.0", | ||||||
|  |         "is-function": "^1.0.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/@vitejs/plugin-vue": { |     "node_modules/@vitejs/plugin-vue": { | ||||||
|       "version": "4.5.2", |       "version": "4.5.2", | ||||||
|       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz", |       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz", | ||||||
|  | @ -3722,6 +3785,14 @@ | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@xmldom/xmldom": { | ||||||
|  |       "version": "0.8.10", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", | ||||||
|  |       "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=10.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/accepts": { |     "node_modules/accepts": { | ||||||
|       "version": "1.3.8", |       "version": "1.3.8", | ||||||
|       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", |       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", | ||||||
|  | @ -3754,6 +3825,31 @@ | ||||||
|         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" |         "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/aes-decrypter": { | ||||||
|  |       "version": "4.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.1.tgz", | ||||||
|  |       "integrity": "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "^3.0.5", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "pkcs7": "^1.0.4" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/aes-decrypter/node_modules/@videojs/vhs-utils": { | ||||||
|  |       "version": "3.0.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", | ||||||
|  |       "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "url-toolkit": "^2.2.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=8", | ||||||
|  |         "npm": ">=5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/ajv": { |     "node_modules/ajv": { | ||||||
|       "version": "6.12.6", |       "version": "6.12.6", | ||||||
|       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", |       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", | ||||||
|  | @ -4732,6 +4828,11 @@ | ||||||
|         "node": ">=6.0.0" |         "node": ">=6.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/dom-walk": { | ||||||
|  |       "version": "0.1.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", | ||||||
|  |       "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" | ||||||
|  |     }, | ||||||
|     "node_modules/eastasianwidth": { |     "node_modules/eastasianwidth": { | ||||||
|       "version": "0.2.0", |       "version": "0.2.0", | ||||||
|       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", |       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", | ||||||
|  | @ -6086,6 +6187,15 @@ | ||||||
|         "node": ">= 6" |         "node": ">= 6" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/global": { | ||||||
|  |       "version": "4.4.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", | ||||||
|  |       "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "min-document": "^2.19.0", | ||||||
|  |         "process": "^0.11.10" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/globals": { |     "node_modules/globals": { | ||||||
|       "version": "11.12.0", |       "version": "11.12.0", | ||||||
|       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", |       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", | ||||||
|  | @ -6292,6 +6402,11 @@ | ||||||
|         "node": ">=0.8.19" |         "node": ">=0.8.19" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/individual": { | ||||||
|  |       "version": "2.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz", | ||||||
|  |       "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==" | ||||||
|  |     }, | ||||||
|     "node_modules/inflight": { |     "node_modules/inflight": { | ||||||
|       "version": "1.0.6", |       "version": "1.0.6", | ||||||
|       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | ||||||
|  | @ -6490,6 +6605,11 @@ | ||||||
|         "node": ">=8" |         "node": ">=8" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/is-function": { | ||||||
|  |       "version": "1.0.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", | ||||||
|  |       "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" | ||||||
|  |     }, | ||||||
|     "node_modules/is-glob": { |     "node_modules/is-glob": { | ||||||
|       "version": "4.0.3", |       "version": "4.0.3", | ||||||
|       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", |       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", | ||||||
|  | @ -6762,6 +6882,11 @@ | ||||||
|         "node": ">=6" |         "node": ">=6" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/keycode": { | ||||||
|  |       "version": "2.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", | ||||||
|  |       "integrity": "sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A==" | ||||||
|  |     }, | ||||||
|     "node_modules/keyv": { |     "node_modules/keyv": { | ||||||
|       "version": "4.5.4", |       "version": "4.5.4", | ||||||
|       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", |       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", | ||||||
|  | @ -6935,6 +7060,30 @@ | ||||||
|         "yallist": "^3.0.2" |         "yallist": "^3.0.2" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/m3u8-parser": { | ||||||
|  |       "version": "7.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz", | ||||||
|  |       "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "^3.0.5", | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/m3u8-parser/node_modules/@videojs/vhs-utils": { | ||||||
|  |       "version": "3.0.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", | ||||||
|  |       "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "url-toolkit": "^2.2.1" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=8", | ||||||
|  |         "npm": ">=5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/magic-string": { |     "node_modules/magic-string": { | ||||||
|       "version": "0.30.5", |       "version": "0.30.5", | ||||||
|       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", |       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", | ||||||
|  | @ -7101,6 +7250,14 @@ | ||||||
|         "url": "https://github.com/sponsors/sindresorhus" |         "url": "https://github.com/sponsors/sindresorhus" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/min-document": { | ||||||
|  |       "version": "2.19.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", | ||||||
|  |       "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "dom-walk": "^0.1.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/minimatch": { |     "node_modules/minimatch": { | ||||||
|       "version": "3.1.2", |       "version": "3.1.2", | ||||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", |       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", | ||||||
|  | @ -7147,6 +7304,20 @@ | ||||||
|         "node": "*" |         "node": "*" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/mpd-parser": { | ||||||
|  |       "version": "1.3.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.0.tgz", | ||||||
|  |       "integrity": "sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "^4.0.0", | ||||||
|  |         "@xmldom/xmldom": "^0.8.3", | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       }, | ||||||
|  |       "bin": { | ||||||
|  |         "mpd-to-m3u8-json": "bin/parse.js" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/mrmime": { |     "node_modules/mrmime": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", | ||||||
|  | @ -7160,6 +7331,22 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||||
|       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" |       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/mux.js": { | ||||||
|  |       "version": "7.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.3.tgz", | ||||||
|  |       "integrity": "sha512-gzlzJVEGFYPtl2vvEiJneSWAWD4nfYRHD5XgxmB2gWvXraMPOYk+sxfvexmNfjQUFpmk6hwLR5C6iSFmuwCHdQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.11.2", | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       }, | ||||||
|  |       "bin": { | ||||||
|  |         "muxjs-transmux": "bin/transmux.js" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=8", | ||||||
|  |         "npm": ">=5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/mysql": { |     "node_modules/mysql": { | ||||||
|       "version": "2.18.1", |       "version": "2.18.1", | ||||||
|       "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", |       "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", | ||||||
|  | @ -7702,6 +7889,17 @@ | ||||||
|         "node": ">=6" |         "node": ">=6" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/pkcs7": { | ||||||
|  |       "version": "1.0.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz", | ||||||
|  |       "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.5.5" | ||||||
|  |       }, | ||||||
|  |       "bin": { | ||||||
|  |         "pkcs7": "bin/cli.js" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/postcss": { |     "node_modules/postcss": { | ||||||
|       "version": "8.4.32", |       "version": "8.4.32", | ||||||
|       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", |       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", | ||||||
|  | @ -7908,6 +8106,14 @@ | ||||||
|         "node": ">= 0.8.0" |         "node": ">= 0.8.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/process": { | ||||||
|  |       "version": "0.11.10", | ||||||
|  |       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", | ||||||
|  |       "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 0.6.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/process-nextick-args": { |     "node_modules/process-nextick-args": { | ||||||
|       "version": "2.0.1", |       "version": "2.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", |       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | ||||||
|  | @ -8279,6 +8485,14 @@ | ||||||
|         "queue-microtask": "^1.2.2" |         "queue-microtask": "^1.2.2" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/rust-result": { | ||||||
|  |       "version": "1.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz", | ||||||
|  |       "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "individual": "^2.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/safe-array-concat": { |     "node_modules/safe-array-concat": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", | ||||||
|  | @ -8302,6 +8516,14 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||||
|       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/safe-json-parse": { | ||||||
|  |       "version": "4.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz", | ||||||
|  |       "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "rust-result": "^1.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/safe-regex-test": { |     "node_modules/safe-regex-test": { | ||||||
|       "version": "1.0.0", |       "version": "1.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", |       "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", | ||||||
|  | @ -9355,6 +9577,11 @@ | ||||||
|         "punycode": "^2.1.0" |         "punycode": "^2.1.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/url-toolkit": { | ||||||
|  |       "version": "2.2.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", | ||||||
|  |       "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" | ||||||
|  |     }, | ||||||
|     "node_modules/util-deprecate": { |     "node_modules/util-deprecate": { | ||||||
|       "version": "1.0.2", |       "version": "1.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | ||||||
|  | @ -9376,6 +9603,55 @@ | ||||||
|         "node": ">= 0.8" |         "node": ">= 0.8" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/video.js": { | ||||||
|  |       "version": "8.10.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.10.0.tgz", | ||||||
|  |       "integrity": "sha512-7UeG/flj/pp8tNGW8WKPP1VJb3x2FgLoqUWzpZqkoq5YIyf6MNzmIrKtxprl438T5RVkcj+OzV8IX4jYSAn4Sw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/http-streaming": "3.10.0", | ||||||
|  |         "@videojs/vhs-utils": "^4.0.0", | ||||||
|  |         "@videojs/xhr": "2.6.0", | ||||||
|  |         "aes-decrypter": "^4.0.1", | ||||||
|  |         "global": "4.4.0", | ||||||
|  |         "keycode": "2.2.0", | ||||||
|  |         "m3u8-parser": "^7.1.0", | ||||||
|  |         "mpd-parser": "^1.2.2", | ||||||
|  |         "mux.js": "^7.0.1", | ||||||
|  |         "safe-json-parse": "4.0.0", | ||||||
|  |         "videojs-contrib-quality-levels": "4.0.0", | ||||||
|  |         "videojs-font": "4.1.0", | ||||||
|  |         "videojs-vtt.js": "0.15.5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/videojs-contrib-quality-levels": { | ||||||
|  |       "version": "4.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.0.0.tgz", | ||||||
|  |       "integrity": "sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=14", | ||||||
|  |         "npm": ">=6" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "video.js": "^8" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/videojs-font": { | ||||||
|  |       "version": "4.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.1.0.tgz", | ||||||
|  |       "integrity": "sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w==" | ||||||
|  |     }, | ||||||
|  |     "node_modules/videojs-vtt.js": { | ||||||
|  |       "version": "0.15.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", | ||||||
|  |       "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "global": "^4.3.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/vike": { |     "node_modules/vike": { | ||||||
|       "version": "0.4.150", |       "version": "0.4.150", | ||||||
|       "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.150.tgz", |       "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.150.tgz", | ||||||
|  | @ -12419,6 +12695,52 @@ | ||||||
|       "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", |       "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "@videojs/http-streaming": { | ||||||
|  |       "version": "3.10.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/http-streaming/-/http-streaming-3.10.0.tgz", | ||||||
|  |       "integrity": "sha512-Lf1rmhTalV4Gw0bJqHmH4lfk/FlepUDs9smuMtorblAYnqDlE2tbUOb7sBXVYoXGdbWbdTW8jH2cnS+6HWYJ4Q==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "4.0.0", | ||||||
|  |         "aes-decrypter": "4.0.1", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "m3u8-parser": "^7.1.0", | ||||||
|  |         "mpd-parser": "^1.3.0", | ||||||
|  |         "mux.js": "7.0.2", | ||||||
|  |         "video.js": "^7 || ^8" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "mux.js": { | ||||||
|  |           "version": "7.0.2", | ||||||
|  |           "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.2.tgz", | ||||||
|  |           "integrity": "sha512-CM6+QuyDbc0qW1OfEjkd2+jVKzTXF+z5VOKH0eZxtZtnrG/ilkW/U7l7IXGtBNLASF9sKZMcK1u669cq50Qq0A==", | ||||||
|  |           "requires": { | ||||||
|  |             "@babel/runtime": "^7.11.2", | ||||||
|  |             "global": "^4.4.0" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "@videojs/vhs-utils": { | ||||||
|  |       "version": "4.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-4.0.0.tgz", | ||||||
|  |       "integrity": "sha512-xJp7Yd4jMLwje2vHCUmi8MOUU76nxiwII3z4Eg3Ucb+6rrkFVGosrXlMgGnaLjq724j3wzNElRZ71D/CKrTtxg==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "url-toolkit": "^2.2.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "@videojs/xhr": { | ||||||
|  |       "version": "2.6.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@videojs/xhr/-/xhr-2.6.0.tgz", | ||||||
|  |       "integrity": "sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.5.5", | ||||||
|  |         "global": "~4.4.0", | ||||||
|  |         "is-function": "^1.0.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "@vitejs/plugin-vue": { |     "@vitejs/plugin-vue": { | ||||||
|       "version": "4.5.2", |       "version": "4.5.2", | ||||||
|       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz", |       "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.2.tgz", | ||||||
|  | @ -12582,6 +12904,11 @@ | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "@xmldom/xmldom": { | ||||||
|  |       "version": "0.8.10", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", | ||||||
|  |       "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==" | ||||||
|  |     }, | ||||||
|     "accepts": { |     "accepts": { | ||||||
|       "version": "1.3.8", |       "version": "1.3.8", | ||||||
|       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", |       "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", | ||||||
|  | @ -12603,6 +12930,29 @@ | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "requires": {} |       "requires": {} | ||||||
|     }, |     }, | ||||||
|  |     "aes-decrypter": { | ||||||
|  |       "version": "4.0.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/aes-decrypter/-/aes-decrypter-4.0.1.tgz", | ||||||
|  |       "integrity": "sha512-H1nh/P9VZXUf17AA5NQfJML88CFjVBDuGkp5zDHa7oEhYN9TTpNLJknRY1ie0iSKWlDf6JRnJKaZVDSQdPy6Cg==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "^3.0.5", | ||||||
|  |         "global": "^4.4.0", | ||||||
|  |         "pkcs7": "^1.0.4" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "@videojs/vhs-utils": { | ||||||
|  |           "version": "3.0.5", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", | ||||||
|  |           "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", | ||||||
|  |           "requires": { | ||||||
|  |             "@babel/runtime": "^7.12.5", | ||||||
|  |             "global": "^4.4.0", | ||||||
|  |             "url-toolkit": "^2.2.1" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "ajv": { |     "ajv": { | ||||||
|       "version": "6.12.6", |       "version": "6.12.6", | ||||||
|       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", |       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", | ||||||
|  | @ -13298,6 +13648,11 @@ | ||||||
|         "esutils": "^2.0.2" |         "esutils": "^2.0.2" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "dom-walk": { | ||||||
|  |       "version": "0.1.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", | ||||||
|  |       "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" | ||||||
|  |     }, | ||||||
|     "eastasianwidth": { |     "eastasianwidth": { | ||||||
|       "version": "0.2.0", |       "version": "0.2.0", | ||||||
|       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", |       "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", | ||||||
|  | @ -14326,6 +14681,15 @@ | ||||||
|         "is-glob": "^4.0.1" |         "is-glob": "^4.0.1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "global": { | ||||||
|  |       "version": "4.4.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", | ||||||
|  |       "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", | ||||||
|  |       "requires": { | ||||||
|  |         "min-document": "^2.19.0", | ||||||
|  |         "process": "^0.11.10" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "globals": { |     "globals": { | ||||||
|       "version": "11.12.0", |       "version": "11.12.0", | ||||||
|       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", |       "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", | ||||||
|  | @ -14457,6 +14821,11 @@ | ||||||
|       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", |       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "individual": { | ||||||
|  |       "version": "2.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/individual/-/individual-2.0.0.tgz", | ||||||
|  |       "integrity": "sha512-pWt8hBCqJsUWI/HtcfWod7+N9SgAqyPEaF7JQjwzjn5vGrpg6aQ5qeAFQ7dx//UH4J1O+7xqew+gCeeFt6xN/g==" | ||||||
|  |     }, | ||||||
|     "inflight": { |     "inflight": { | ||||||
|       "version": "1.0.6", |       "version": "1.0.6", | ||||||
|       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", |       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", | ||||||
|  | @ -14601,6 +14970,11 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", |       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", | ||||||
|       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" |       "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" | ||||||
|     }, |     }, | ||||||
|  |     "is-function": { | ||||||
|  |       "version": "1.0.2", | ||||||
|  |       "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", | ||||||
|  |       "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" | ||||||
|  |     }, | ||||||
|     "is-glob": { |     "is-glob": { | ||||||
|       "version": "4.0.3", |       "version": "4.0.3", | ||||||
|       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", |       "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", | ||||||
|  | @ -14787,6 +15161,11 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", |       "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", | ||||||
|       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" |       "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" | ||||||
|     }, |     }, | ||||||
|  |     "keycode": { | ||||||
|  |       "version": "2.2.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/keycode/-/keycode-2.2.0.tgz", | ||||||
|  |       "integrity": "sha512-ps3I9jAdNtRpJrbBvQjpzyFbss/skHqzS+eu4RxKLaEAtFqkjZaB6TZMSivPbLxf4K7VI4SjR0P5mRCX5+Q25A==" | ||||||
|  |     }, | ||||||
|     "keyv": { |     "keyv": { | ||||||
|       "version": "4.5.4", |       "version": "4.5.4", | ||||||
|       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", |       "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", | ||||||
|  | @ -14915,6 +15294,28 @@ | ||||||
|         "yallist": "^3.0.2" |         "yallist": "^3.0.2" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "m3u8-parser": { | ||||||
|  |       "version": "7.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/m3u8-parser/-/m3u8-parser-7.1.0.tgz", | ||||||
|  |       "integrity": "sha512-7N+pk79EH4oLKPEYdgRXgAsKDyA/VCo0qCHlUwacttQA0WqsjZQYmNfywMvjlY9MpEBVZEt0jKFd73Kv15EBYQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "^3.0.5", | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "@videojs/vhs-utils": { | ||||||
|  |           "version": "3.0.5", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@videojs/vhs-utils/-/vhs-utils-3.0.5.tgz", | ||||||
|  |           "integrity": "sha512-PKVgdo8/GReqdx512F+ombhS+Bzogiofy1LgAj4tN8PfdBx3HSS7V5WfJotKTqtOWGwVfSWsrYN/t09/DSryrw==", | ||||||
|  |           "requires": { | ||||||
|  |             "@babel/runtime": "^7.12.5", | ||||||
|  |             "global": "^4.4.0", | ||||||
|  |             "url-toolkit": "^2.2.1" | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "magic-string": { |     "magic-string": { | ||||||
|       "version": "0.30.5", |       "version": "0.30.5", | ||||||
|       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", |       "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", | ||||||
|  | @ -15035,6 +15436,14 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", |       "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", | ||||||
|       "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" |       "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" | ||||||
|     }, |     }, | ||||||
|  |     "min-document": { | ||||||
|  |       "version": "2.19.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", | ||||||
|  |       "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "dom-walk": "^0.1.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "minimatch": { |     "minimatch": { | ||||||
|       "version": "3.1.2", |       "version": "3.1.2", | ||||||
|       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", |       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", | ||||||
|  | @ -15069,6 +15478,17 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", |       "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", | ||||||
|       "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" |       "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" | ||||||
|     }, |     }, | ||||||
|  |     "mpd-parser": { | ||||||
|  |       "version": "1.3.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mpd-parser/-/mpd-parser-1.3.0.tgz", | ||||||
|  |       "integrity": "sha512-WgeIwxAqkmb9uTn4ClicXpEQYCEduDqRKfmUdp4X8vmghKfBNXZLYpREn9eqrDx/Tf5LhzRcJLSpi4ohfV742Q==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/vhs-utils": "^4.0.0", | ||||||
|  |         "@xmldom/xmldom": "^0.8.3", | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "mrmime": { |     "mrmime": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", | ||||||
|  | @ -15079,6 +15499,15 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", | ||||||
|       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" |       "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" | ||||||
|     }, |     }, | ||||||
|  |     "mux.js": { | ||||||
|  |       "version": "7.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/mux.js/-/mux.js-7.0.3.tgz", | ||||||
|  |       "integrity": "sha512-gzlzJVEGFYPtl2vvEiJneSWAWD4nfYRHD5XgxmB2gWvXraMPOYk+sxfvexmNfjQUFpmk6hwLR5C6iSFmuwCHdQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.11.2", | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "mysql": { |     "mysql": { | ||||||
|       "version": "2.18.1", |       "version": "2.18.1", | ||||||
|       "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", |       "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", | ||||||
|  | @ -15483,6 +15912,14 @@ | ||||||
|       "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", |       "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "pkcs7": { | ||||||
|  |       "version": "1.0.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/pkcs7/-/pkcs7-1.0.4.tgz", | ||||||
|  |       "integrity": "sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.5.5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "postcss": { |     "postcss": { | ||||||
|       "version": "8.4.32", |       "version": "8.4.32", | ||||||
|       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", |       "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", | ||||||
|  | @ -15605,6 +16042,11 @@ | ||||||
|       "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", |       "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "process": { | ||||||
|  |       "version": "0.11.10", | ||||||
|  |       "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", | ||||||
|  |       "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==" | ||||||
|  |     }, | ||||||
|     "process-nextick-args": { |     "process-nextick-args": { | ||||||
|       "version": "2.0.1", |       "version": "2.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", |       "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", | ||||||
|  | @ -15865,6 +16307,14 @@ | ||||||
|         "queue-microtask": "^1.2.2" |         "queue-microtask": "^1.2.2" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "rust-result": { | ||||||
|  |       "version": "1.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/rust-result/-/rust-result-1.0.0.tgz", | ||||||
|  |       "integrity": "sha512-6cJzSBU+J/RJCF063onnQf0cDUOHs9uZI1oroSGnHOph+CQTIJ5Pp2hK5kEQq1+7yE/EEWfulSNXAQ2jikPthA==", | ||||||
|  |       "requires": { | ||||||
|  |         "individual": "^2.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "safe-array-concat": { |     "safe-array-concat": { | ||||||
|       "version": "1.0.1", |       "version": "1.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", |       "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", | ||||||
|  | @ -15882,6 +16332,14 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", | ||||||
|       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |       "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" | ||||||
|     }, |     }, | ||||||
|  |     "safe-json-parse": { | ||||||
|  |       "version": "4.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-4.0.0.tgz", | ||||||
|  |       "integrity": "sha512-RjZPPHugjK0TOzFrLZ8inw44s9bKox99/0AZW9o/BEQVrJfhI+fIHMErnPyRa89/yRXUUr93q+tiN6zhoVV4wQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "rust-result": "^1.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "safe-regex-test": { |     "safe-regex-test": { | ||||||
|       "version": "1.0.0", |       "version": "1.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", |       "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", | ||||||
|  | @ -16629,6 +17087,11 @@ | ||||||
|         "punycode": "^2.1.0" |         "punycode": "^2.1.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "url-toolkit": { | ||||||
|  |       "version": "2.2.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/url-toolkit/-/url-toolkit-2.2.5.tgz", | ||||||
|  |       "integrity": "sha512-mtN6xk+Nac+oyJ/PrI7tzfmomRVNFIWKUbG8jdYFt52hxbiReFAXIjYskvu64/dvuW71IcB7lV8l0HvZMac6Jg==" | ||||||
|  |     }, | ||||||
|     "util-deprecate": { |     "util-deprecate": { | ||||||
|       "version": "1.0.2", |       "version": "1.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", |       "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", | ||||||
|  | @ -16644,6 +17107,48 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", |       "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", | ||||||
|       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" |       "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" | ||||||
|     }, |     }, | ||||||
|  |     "video.js": { | ||||||
|  |       "version": "8.10.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/video.js/-/video.js-8.10.0.tgz", | ||||||
|  |       "integrity": "sha512-7UeG/flj/pp8tNGW8WKPP1VJb3x2FgLoqUWzpZqkoq5YIyf6MNzmIrKtxprl438T5RVkcj+OzV8IX4jYSAn4Sw==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.12.5", | ||||||
|  |         "@videojs/http-streaming": "3.10.0", | ||||||
|  |         "@videojs/vhs-utils": "^4.0.0", | ||||||
|  |         "@videojs/xhr": "2.6.0", | ||||||
|  |         "aes-decrypter": "^4.0.1", | ||||||
|  |         "global": "4.4.0", | ||||||
|  |         "keycode": "2.2.0", | ||||||
|  |         "m3u8-parser": "^7.1.0", | ||||||
|  |         "mpd-parser": "^1.2.2", | ||||||
|  |         "mux.js": "^7.0.1", | ||||||
|  |         "safe-json-parse": "4.0.0", | ||||||
|  |         "videojs-contrib-quality-levels": "4.0.0", | ||||||
|  |         "videojs-font": "4.1.0", | ||||||
|  |         "videojs-vtt.js": "0.15.5" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "videojs-contrib-quality-levels": { | ||||||
|  |       "version": "4.0.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-4.0.0.tgz", | ||||||
|  |       "integrity": "sha512-u5rmd8BjLwANp7XwuQ0Q/me34bMe6zg9PQdHfTS7aXgiVRbNTb4djcmfG7aeSrkpZjg+XCLezFNenlJaCjBHKw==", | ||||||
|  |       "requires": { | ||||||
|  |         "global": "^4.4.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "videojs-font": { | ||||||
|  |       "version": "4.1.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/videojs-font/-/videojs-font-4.1.0.tgz", | ||||||
|  |       "integrity": "sha512-X1LuPfLZPisPLrANIAKCknZbZu5obVM/ylfd1CN+SsCmPZQ3UMDPcvLTpPBJxcBuTpHQq2MO1QCFt7p8spnZ/w==" | ||||||
|  |     }, | ||||||
|  |     "videojs-vtt.js": { | ||||||
|  |       "version": "0.15.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/videojs-vtt.js/-/videojs-vtt.js-0.15.5.tgz", | ||||||
|  |       "integrity": "sha512-yZbBxvA7QMYn15Lr/ZfhhLPrNpI/RmCSCqgIff57GC2gIrV5YfyzLfLyZMj0NnZSAz8syB4N0nHXpZg9MyrMOQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "global": "^4.3.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "vike": { |     "vike": { | ||||||
|       "version": "0.4.150", |       "version": "0.4.150", | ||||||
|       "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.150.tgz", |       "resolved": "https://registry.npmjs.org/vike/-/vike-0.4.150.tgz", | ||||||
|  |  | ||||||
|  | @ -46,6 +46,7 @@ | ||||||
|     "redis": "^4.6.12", |     "redis": "^4.6.12", | ||||||
|     "sharp": "^0.32.6", |     "sharp": "^0.32.6", | ||||||
|     "sirv": "^2.0.3", |     "sirv": "^2.0.3", | ||||||
|  |     "video.js": "^8.10.0", | ||||||
|     "vike": "^0.4.150", |     "vike": "^0.4.150", | ||||||
|     "vite": "^4.5.1", |     "vite": "^4.5.1", | ||||||
|     "vue": "^3.3.10", |     "vue": "^3.3.10", | ||||||
|  |  | ||||||
|  | @ -6,16 +6,32 @@ | ||||||
| 				:style="{ 'background-image': scene.poster.isS3 ? `url('https://cdndev.traxxx.me/${scene.poster.thumbnail}')` : `url('/media/${scene.poster.thumbnail}')` }" | 				:style="{ 'background-image': scene.poster.isS3 ? `url('https://cdndev.traxxx.me/${scene.poster.thumbnail}')` : `url('/media/${scene.poster.thumbnail}')` }" | ||||||
| 			> | 			> | ||||||
| 				<div class="banner"> | 				<div class="banner"> | ||||||
| 					<div class="poster-container"> | 					<div | ||||||
|  | 						v-if="scene.trailer" | ||||||
|  | 						class="trailer" | ||||||
|  | 					> | ||||||
|  | 						<Player | ||||||
|  | 							:video="scene.trailer" | ||||||
|  | 							:poster="poster" | ||||||
|  | 							class="item" | ||||||
|  | 							:class="{ playing }" | ||||||
|  | 							@play="playing = true; paused = false;" | ||||||
|  | 							@pause="playing = false; paused = true;" | ||||||
|  | 						/> | ||||||
|  | 					</div> | ||||||
|  | 
 | ||||||
|  | 					<div | ||||||
|  | 						v-else-if="scene.poster" | ||||||
|  | 						class="poster-container" | ||||||
|  | 					> | ||||||
| 						<a | 						<a | ||||||
| 							:href="scene.poster.isS3 ? `https://cdndev.traxxx.me/${scene.poster.path}` : `/media/${scene.poster.path}`" | 							:href="getPath(scene.poster)" | ||||||
| 							target="_blank" | 							target="_blank" | ||||||
| 							class="poster-link" | 							class="poster-link" | ||||||
| 						> | 						> | ||||||
| 							<img | 							<img | ||||||
| 								v-if="scene.poster" | 								:src="getPath(scene.poster, 'thumbnail')" | ||||||
| 								:src="scene.poster.isS3 ? `https://cdndev.traxxx.me/${scene.poster.thumbnail}` : `/media/${scene.poster.thumbnail}`" | 								:style="{ 'background-image': getPath(scene.poster, 'lazy') }" | ||||||
| 								:style="{ 'background-image': scene.poster.isS3 ? `url(https://cdndev.traxxx.me/${scene.poster.lazy})` : `url(/media/${scene.poster.lazy})` }" |  | ||||||
| 								:width="scene.poster.width" | 								:width="scene.poster.width" | ||||||
| 								:height="scene.poster.height" | 								:height="scene.poster.height" | ||||||
| 								class="poster" | 								class="poster" | ||||||
|  | @ -34,13 +50,13 @@ | ||||||
| 							class="photo-container" | 							class="photo-container" | ||||||
| 						> | 						> | ||||||
| 							<a | 							<a | ||||||
| 								:href="photo.isS3 ? `https://cdndev.traxxx.me/${photo.path}` : `/media/${photo.path}`" | 								:href="getPath(photo)" | ||||||
| 								target="_blank" | 								target="_blank" | ||||||
| 								class="photo-link" | 								class="photo-link" | ||||||
| 							> | 							> | ||||||
| 								<img | 								<img | ||||||
| 									:src="photo.isS3 ? `https://cdndev.traxxx.me/${photo.thumbnail}` : `/media/${photo.thumbnail}`" | 									:src="getPath(photo, 'thumbnail')" | ||||||
| 									:style="{ 'background-image': photo.isS3 ? `url(https://cdndev.traxxx.me/${photo.lazy})` : `url(/media/${photo.lazy})` }" | 									:style="{ 'background-image': getPath(photo, 'lazy') }" | ||||||
| 									:width="photo.width" | 									:width="photo.width" | ||||||
| 									:height="photo.height" | 									:height="photo.height" | ||||||
| 									class="photo" | 									class="photo" | ||||||
|  | @ -65,7 +81,10 @@ | ||||||
| 						> | 						> | ||||||
| 					</Link> | 					</Link> | ||||||
| 
 | 
 | ||||||
| 					<template v-if="!scene.channel.isIndependent && scene.network"> | 					<span | ||||||
|  | 						v-if="!scene.channel.isIndependent && scene.network" | ||||||
|  | 						class="network-container" | ||||||
|  | 					> | ||||||
| 						by | 						by | ||||||
| 						<Link | 						<Link | ||||||
| 							:href="`/${scene.network.type}/${scene.network.slug}`" | 							:href="`/${scene.network.type}/${scene.network.slug}`" | ||||||
|  | @ -77,21 +96,32 @@ | ||||||
| 								class="network-logo entity-logo" | 								class="network-logo entity-logo" | ||||||
| 							> | 							> | ||||||
| 						</Link> | 						</Link> | ||||||
| 					</template> | 					</span> | ||||||
| 				</div> | 				</div> | ||||||
| 
 | 
 | ||||||
| 				<time | 				<time | ||||||
| 					:datetime="scene.effectiveDate.toISOString()" | 					:datetime="scene.effectiveDate.toISOString()" | ||||||
| 					class="date" | 					class="date ellipsis" | ||||||
| 				>{{ formatDate(scene.effectiveDate, 'MMMM d, y') }}</time> | 				>{{ formatDate(scene.effectiveDate, 'MMMM d, y') }}</time> | ||||||
| 			</div> | 			</div> | ||||||
| 
 | 
 | ||||||
| 			<div class="header"> | 			<div class="header"> | ||||||
| 				<h2 | 				<h2 | ||||||
|  | 					v-if="scene.title" | ||||||
| 					:title="scene.title" | 					:title="scene.title" | ||||||
| 					class="title" | 					class="title" | ||||||
| 				>{{ scene.title }}</h2> | 				>{{ scene.title }}</h2> | ||||||
| 
 | 
 | ||||||
|  | 				<h2 | ||||||
|  | 					v-else-if="scene.actors.length > 0" | ||||||
|  | 					class="title notitle" | ||||||
|  | 				>Scene featuring {{ scene.actors.map((actor) => actor.name).join(', ') }}</h2> | ||||||
|  | 
 | ||||||
|  | 				<h2 | ||||||
|  | 					v-else | ||||||
|  | 					class="title notitle" | ||||||
|  | 				>No title</h2> | ||||||
|  | 
 | ||||||
| 				<div class="actions"> | 				<div class="actions"> | ||||||
| 					<div | 					<div | ||||||
| 						v-if="user" | 						v-if="user" | ||||||
|  | @ -178,6 +208,14 @@ | ||||||
| 						<h3 class="heading">Director</h3> | 						<h3 class="heading">Director</h3> | ||||||
| 						{{ scene.directors.map((director) => director.name).join(', ') }} | 						{{ scene.directors.map((director) => director.name).join(', ') }} | ||||||
| 					</div> | 					</div> | ||||||
|  | 
 | ||||||
|  | 					<div | ||||||
|  | 						v-if="scene.shootId" | ||||||
|  | 						class="detail" | ||||||
|  | 					> | ||||||
|  | 						<h3 class="heading">Shoot</h3> | ||||||
|  | 						{{ scene.shootId }} | ||||||
|  | 					</div> | ||||||
| 				</div> | 				</div> | ||||||
| 
 | 
 | ||||||
| 				<div class="section details"> | 				<div class="section details"> | ||||||
|  | @ -204,19 +242,40 @@ | ||||||
| </template> | </template> | ||||||
| 
 | 
 | ||||||
| <script setup> | <script setup> | ||||||
| import { ref, inject } from 'vue'; | import { ref, computed, inject } from 'vue'; | ||||||
| 
 | 
 | ||||||
| import { post, del } from '#/src/api.js'; | import { post, del } from '#/src/api.js'; | ||||||
| import { formatDate, formatDuration } from '#/utils/format.js'; | import { formatDate, formatDuration } from '#/utils/format.js'; | ||||||
|  | import getPath from '#/src/get-path.js'; | ||||||
| 
 | 
 | ||||||
| import Icon from '../../components/icon/icon.vue'; | import Icon from '#/components/icon/icon.vue'; | ||||||
| import ActorTile from '../../components/actors/tile.vue'; | import ActorTile from '#/components/actors/tile.vue'; | ||||||
|  | import Player from '#/components/video/player.vue'; | ||||||
| 
 | 
 | ||||||
| const { pageProps, user } = inject('pageContext'); | const { pageProps, user } = inject('pageContext'); | ||||||
| const { scene } = pageProps; | const { scene } = pageProps; | ||||||
| 
 | 
 | ||||||
| const favorited = ref(scene.stashes.some((sceneStash) => sceneStash.primary)); | const favorited = ref(scene.stashes.some((sceneStash) => sceneStash.primary)); | ||||||
| 
 | 
 | ||||||
|  | const playing = ref(false); | ||||||
|  | const paused = ref(false); | ||||||
|  | 
 | ||||||
|  | const poster = computed(() => { | ||||||
|  | 	if (scene.poster) { | ||||||
|  | 		return getPath(scene.poster, 'thumbnail'); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (scene.covers?.length > 0) { | ||||||
|  | 		return getPath(scene.covers[0], 'thumbnail'); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (scene.photos?.length > 0) { | ||||||
|  | 		return getPath(scene.photos[0], 'thumbnail'); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return null; | ||||||
|  | }); | ||||||
|  | 
 | ||||||
| async function stash() { | async function stash() { | ||||||
| 	try { | 	try { | ||||||
| 		favorited.value = true; | 		favorited.value = true; | ||||||
|  | @ -247,6 +306,7 @@ async function unstash() { | ||||||
| .content { | .content { | ||||||
| 	width: 100%; | 	width: 100%; | ||||||
| 	max-width: 1200px; | 	max-width: 1200px; | ||||||
|  | 	margin: 0 .5rem; | ||||||
| 	display: flex; | 	display: flex; | ||||||
| 	flex-direction: column; | 	flex-direction: column; | ||||||
| } | } | ||||||
|  | @ -287,6 +347,28 @@ async function unstash() { | ||||||
| 	box-shadow: 0 0 3px var(--shadow-weak-10); | 	box-shadow: 0 0 3px var(--shadow-weak-10); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .trailer { | ||||||
|  | 	max-width: 100%; | ||||||
|  | 	width: calc(21/9 * 16rem); | ||||||
|  | 	margin-right: .5rem; | ||||||
|  | 	flex-shrink: 0; | ||||||
|  | 	aspect-ratio: 16/9; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | :deep(.player) { | ||||||
|  | 	width: 100%; | ||||||
|  | 	height: 100%; | ||||||
|  | 	flex-shrink: 0; | ||||||
|  | 
 | ||||||
|  | 	&:not(.playing) { | ||||||
|  | 		&[poster], | ||||||
|  | 		.vjs-tech[poster], | ||||||
|  | 		.vjs-poster img { | ||||||
|  | 			object-fit: cover; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .album { | .album { | ||||||
| 	height: auto; | 	height: auto; | ||||||
| 	flex-grow: 1; | 	flex-grow: 1; | ||||||
|  | @ -346,7 +428,14 @@ async function unstash() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .entity-logo { | .entity-logo { | ||||||
| 	height: 1.5rem; | 	width: 10rem; | ||||||
|  | 	max-height: 100%; | ||||||
|  | 	object-fit: contain; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .network-container { | ||||||
|  | 	display: flex; | ||||||
|  | 	align-items: center; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .date { | .date { | ||||||
|  | @ -356,23 +445,32 @@ async function unstash() { | ||||||
| 
 | 
 | ||||||
| .info, | .info, | ||||||
| .header { | .header { | ||||||
| 	border: solid 1px var(--shadow-weak-40); |  | ||||||
| 	border-top: none; | 	border-top: none; | ||||||
| 	border-bottom: none; | 	border-bottom: none; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | .info { | ||||||
|  | 	padding: 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| .header { | .header { | ||||||
| 	display: flex; | 	display: flex; | ||||||
| 	align-items: center; | 	align-items: flex-start; | ||||||
| 	justify-content: space-between; | 	justify-content: space-between; | ||||||
| 	padding: 1rem 1rem 0.5rem 1rem; | 	padding: 1rem .5rem .5rem .5rem; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .title { | .title { | ||||||
| 	margin: 0 .5rem 0 0; | 	margin: 0 .5rem 0 0; | ||||||
| 	white-space: nowrap; | 	line-height: 1.25; | ||||||
|  | 	display: -webkit-box; | ||||||
|  | 	-webkit-box-orient: vertical; | ||||||
|  | 	-webkit-line-clamp: 2; | ||||||
| 	overflow: hidden; | 	overflow: hidden; | ||||||
| 	text-overflow: ellipsis; | } | ||||||
|  | 
 | ||||||
|  | .notitle { | ||||||
|  | 	color: var(--grey-dark-10); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .actions { | .actions { | ||||||
|  | @ -390,6 +488,9 @@ async function unstash() { | ||||||
| 	.button { | 	.button { | ||||||
| 		flex-shrink: 0; | 		flex-shrink: 0; | ||||||
| 		padding: .75rem; | 		padding: .75rem; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.button:not(:last-child) { | ||||||
| 		margin-right: .5rem; | 		margin-right: .5rem; | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -418,10 +519,6 @@ async function unstash() { | ||||||
| 	color: var(--text-light); | 	color: var(--text-light); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .info { |  | ||||||
| 	padding: 0 1rem; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .actors, | .actors, | ||||||
| .tags { | .tags { | ||||||
| 	margin-bottom: 1rem; | 	margin-bottom: 1rem; | ||||||
|  | @ -475,19 +572,62 @@ async function unstash() { | ||||||
| 	margin-left: .25rem; | 	margin-left: .25rem; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @media(--small-10) { | @media(--small) { | ||||||
|  | 	.content { | ||||||
|  | 		margin: 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.info { | ||||||
|  | 		margin: 0 .5rem; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	.banner-container { | 	.banner-container { | ||||||
| 		border-radius: 0; | 		border-radius: 0; | ||||||
| 		margin-top: 0; | 		margin-top: 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	.network-container { | ||||||
|  | 		display: none; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.header { | ||||||
|  | 		flex-direction: column-reverse; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.actions { | ||||||
|  | 		width: 100%; | ||||||
|  | 		justify-content: space-between; | ||||||
|  | 		margin-bottom: 1.5rem; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.title { | ||||||
|  | 		width: 100%; | ||||||
|  | 		margin-left: .5rem; | ||||||
|  | 		white-space: wrap; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.meta { | ||||||
|  | 		border-radius: 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.entity-logo { | ||||||
|  | 		width: 7.5rem; | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | @media(--small-10) { | ||||||
| 	.banner { | 	.banner { | ||||||
| 		justify-content: center; | 		justify-content: center; | ||||||
|  | 		border-radius: 0; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	.poster-container { | 	.poster-container { | ||||||
| 		padding: 0; | 		margin: 0; | ||||||
| 		border-radius: 0; | 		flex-shrink: 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	.trailer { | ||||||
|  | 		margin: 0; | ||||||
| 		flex-shrink: 1; | 		flex-shrink: 1; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -506,27 +646,15 @@ async function unstash() { | ||||||
| 	.info { | 	.info { | ||||||
| 		padding: 0 .5rem; | 		padding: 0 .5rem; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	.actors { | ||||||
|  | 		grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr)); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @media (--small) { | @media(--small-60) { | ||||||
| 	.header { | 	.actors { | ||||||
| 		flex-direction: column-reverse; | 		grid-template-columns: repeat(auto-fill, minmax(6.5rem, 1fr)); | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	.actions { |  | ||||||
| 		width: 100%; |  | ||||||
| 		justify-content: space-between; |  | ||||||
| 		margin-bottom: 1.5rem; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	.title { |  | ||||||
| 		width: 100%; |  | ||||||
| 		margin-left: 1rem; |  | ||||||
| 		white-space: wrap; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	.meta { |  | ||||||
| 		border-radius: 0; |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| </style> | </style> | ||||||
|  |  | ||||||
|  | @ -6,5 +6,5 @@ | ||||||
| 
 | 
 | ||||||
| <script setup> | <script setup> | ||||||
| import Stash from '#/components/stashes/stash.vue'; | import Stash from '#/components/stashes/stash.vue'; | ||||||
| import Actors from '#/components/actors/actors.vue'; | import Actors from '#/components/actor/actors.vue'; | ||||||
| </script> | </script> | ||||||
|  |  | ||||||
|  | @ -0,0 +1 @@ | ||||||
|  | export default '/cats'; | ||||||
|  | @ -95,18 +95,6 @@ onMounted(() => { | ||||||
| </script> | </script> | ||||||
| 
 | 
 | ||||||
| <style> | <style> | ||||||
| .scroller { |  | ||||||
| 	height: 30rem; |  | ||||||
| 	overflow-y: auto; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .item { |  | ||||||
| 	height: 32px; |  | ||||||
| 	padding: 0 12px; |  | ||||||
| 	display: flex; |  | ||||||
| 	align-items: center; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .slide-enter-active, | .slide-enter-active, | ||||||
| .slide-leave-active { | .slide-leave-active { | ||||||
| 	&.sidebar-container { | 	&.sidebar-container { | ||||||
|  |  | ||||||
|  | @ -4,12 +4,20 @@ | ||||||
| import { inject } from 'vue'; | import { inject } from 'vue'; | ||||||
| 
 | 
 | ||||||
| const key = Symbol(); // eslint-disable-line symbol-description
 | const key = Symbol(); // eslint-disable-line symbol-description
 | ||||||
|  | let localPageContext = null; // eslint-disable-line import/no-mutable-exports
 | ||||||
| 
 | 
 | ||||||
| export function usePageContext() { | export function usePageContext() { | ||||||
| 	const pageContext = inject(key); | 	const pageContext = inject(key); | ||||||
| 	return pageContext; | 	return pageContext; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | export function getPageContext() { | ||||||
|  | 	return localPageContext; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| export function setPageContext(app, pageContext) { | export function setPageContext(app, pageContext) { | ||||||
|  | 	localPageContext = pageContext; | ||||||
| 	app.provide(key, pageContext); | 	app.provide(key, pageContext); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | export { localPageContext as pageContext }; | ||||||
|  |  | ||||||
|  | @ -71,7 +71,7 @@ export function sortActorsByGender(actors, context = {}) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	const alphaActors = actors.sort((actorA, actorB) => actorA.name.localeCompare(actorB.name, 'en')); | 	const alphaActors = actors.sort((actorA, actorB) => actorA.name.localeCompare(actorB.name, 'en')); | ||||||
| 	const genderActors = ['transsexual', 'female', 'male', undefined, null, 'male'].flatMap((gender) => alphaActors.filter((actor) => actor.gender === gender)); | 	const genderActors = ['transsexual', 'female', undefined, null, 'male'].flatMap((gender) => alphaActors.filter((actor) => actor.gender === gender)); | ||||||
| 
 | 
 | ||||||
| 	const titleSlug = slugify(context.title); | 	const titleSlug = slugify(context.title); | ||||||
| 	const titleActors = titleSlug ? genderActors.sort((actorA, actorB) => { | 	const titleActors = titleSlug ? genderActors.sort((actorA, actorB) => { | ||||||
|  | @ -344,7 +344,7 @@ async function queryManticoreSql(filters, options, _reqUser) { | ||||||
| 						actors.gender as gender, | 						actors.gender as gender, | ||||||
| 						actors.country as country, | 						actors.country as country, | ||||||
| 						actors.height as height, | 						actors.height as height, | ||||||
| 						actors.weight as weight, | 						actors.mass as mass, | ||||||
| 						actors.cup as cup, | 						actors.cup as cup, | ||||||
| 						actors.natural_boobs as natural_boobs, | 						actors.natural_boobs as natural_boobs, | ||||||
| 						actors.date_of_birth as date_of_birth, | 						actors.date_of_birth as date_of_birth, | ||||||
|  | @ -352,16 +352,15 @@ async function queryManticoreSql(filters, options, _reqUser) { | ||||||
| 						actors.scenes as scenes, | 						actors.scenes as scenes, | ||||||
| 						actors.stashed as stashed, | 						actors.stashed as stashed, | ||||||
| 						created_at as stashed_at, | 						created_at as stashed_at, | ||||||
| 						if(actors.date_of_birth, floor((now() - actors.date_of_birth) / 31556952), 0) as age | 						if(actors.date_of_birth, floor((now() - actors.date_of_birth) / 31556952), 0) as age, | ||||||
|  | 						weight() as _score | ||||||
| 					`));
 | 					`));
 | ||||||
| 					// weight() as _score
 |  | ||||||
| 
 | 
 | ||||||
| 					builder | 					builder | ||||||
| 						.innerJoin('actors', 'actors.id', 'actors_stashed.actor_id') | 						.innerJoin('actors', 'actors.id', 'actors_stashed.actor_id') | ||||||
| 						.where('stash_id', filters.stashId); | 						.where('stash_id', filters.stashId); | ||||||
| 				} else { | 				} else { | ||||||
| 					// builder.select(knex.raw('*, weight() as _score'));
 | 					builder.select(knex.raw('*, weight() as _score')); | ||||||
| 					builder.select(knex.raw('*')); |  | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				if (filters.query) { | 				if (filters.query) { | ||||||
|  | @ -374,7 +373,7 @@ async function queryManticoreSql(filters, options, _reqUser) { | ||||||
| 					} | 					} | ||||||
| 				}); | 				}); | ||||||
| 
 | 
 | ||||||
| 				['age', 'height', 'weight'].forEach((attribute) => { | 				['age', 'height'].forEach((attribute) => { | ||||||
| 					if (filters[attribute]) { | 					if (filters[attribute]) { | ||||||
| 						builder | 						builder | ||||||
| 							.where(attribute, '>=', filters[attribute][0]) | 							.where(attribute, '>=', filters[attribute][0]) | ||||||
|  | @ -382,6 +381,13 @@ async function queryManticoreSql(filters, options, _reqUser) { | ||||||
| 					} | 					} | ||||||
| 				}); | 				}); | ||||||
| 
 | 
 | ||||||
|  | 				if (filters.weight) { | ||||||
|  | 					// weight is a reserved keyword in manticore
 | ||||||
|  | 					builder | ||||||
|  | 						.where('mass', '>=', filters.weight[0]) | ||||||
|  | 						.where('mass', '<=', filters.weight[1]); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
| 				if (filters.dateOfBirth && filters.dobType === 'dateOfBirth') { | 				if (filters.dateOfBirth && filters.dobType === 'dateOfBirth') { | ||||||
| 					builder.where('date_of_birth', Math.floor(filters.dateOfBirth.getTime() / 1000)); | 					builder.where('date_of_birth', Math.floor(filters.dateOfBirth.getTime() / 1000)); | ||||||
| 				} | 				} | ||||||
|  | @ -420,6 +426,11 @@ async function queryManticoreSql(filters, options, _reqUser) { | ||||||
| 						{ column: 'actors.scenes', order: options.order[1] }, | 						{ column: 'actors.scenes', order: options.order[1] }, | ||||||
| 						{ column: 'actors.slug', order: 'asc' }, | 						{ column: 'actors.slug', order: 'asc' }, | ||||||
| 					]); | 					]); | ||||||
|  | 				} else if (options.order?.[0] === 'results') { | ||||||
|  | 					builder.orderBy([ | ||||||
|  | 						{ column: 'actors._score', order: options.order[1] }, | ||||||
|  | 						{ column: 'actors.slug', order: 'asc' }, | ||||||
|  | 					]); | ||||||
| 				} else if (options.order?.[0] === 'stashed' && filters.stashId) { | 				} else if (options.order?.[0] === 'stashed' && filters.stashId) { | ||||||
| 					builder.orderBy([ | 					builder.orderBy([ | ||||||
| 						{ column: 'stashed_at', order: options.order[1] }, | 						{ column: 'stashed_at', order: options.order[1] }, | ||||||
|  |  | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | // import config from 'config';
 | ||||||
|  | import { pageContext } from '../renderer/usePageContext.js'; | ||||||
|  | 
 | ||||||
|  | function getBasePath(media, type, options) { | ||||||
|  | 	/* | ||||||
|  | 	if (store.state.ui.sfw) { | ||||||
|  | 		return config.media.assetPath; | ||||||
|  | 	} | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
|  | 	if (media.isS3) { | ||||||
|  | 		return options.s3Path; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (options?.local) { | ||||||
|  | 		return options.assetPath; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return options.mediaPath; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function getFilename(media, type, options) { | ||||||
|  | 	/* | ||||||
|  | 	if (store.state.ui.sfw && type && !options?.original) { | ||||||
|  | 		return media.sfw[type]; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if (store.state.ui.sfw) { | ||||||
|  | 		return media.sfw.path; | ||||||
|  | 	} | ||||||
|  | 	*/ | ||||||
|  | 
 | ||||||
|  | 	if (type && !options?.original) { | ||||||
|  | 		return media[type]; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return media.path; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export default function getPath(media, type, options) { | ||||||
|  | 	if (!media) { | ||||||
|  | 		return null; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	const path = getBasePath(media, type, { ...pageContext.env.media, ...options }); | ||||||
|  | 	const filename = getFilename(media, type, { ...pageContext.env.media, ...options }); | ||||||
|  | 
 | ||||||
|  | 	return `${path}/${filename}`; | ||||||
|  | } | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| import config from 'config'; | import config from 'config'; | ||||||
| import util from 'util'; /* eslint-disable-line no-unused-vars */ | import util from 'util'; /* eslint-disable-line no-unused-vars */ | ||||||
| 
 | 
 | ||||||
| import { knexOwner as knex, knexManticore } from './knex.js'; | import { knexQuery as knex, knexOwner, knexManticore } from './knex.js'; | ||||||
| import { utilsApi } from './manticore.js'; | import { utilsApi } from './manticore.js'; | ||||||
| import { HttpError } from './errors.js'; | import { HttpError } from './errors.js'; | ||||||
| import { fetchActorsById, curateActor, sortActorsByGender } from './actors.js'; | import { fetchActorsById, curateActor, sortActorsByGender } from './actors.js'; | ||||||
|  | @ -20,6 +20,7 @@ function curateMedia(media) { | ||||||
| 		path: media.path, | 		path: media.path, | ||||||
| 		thumbnail: media.thumbnail, | 		thumbnail: media.thumbnail, | ||||||
| 		lazy: media.lazy, | 		lazy: media.lazy, | ||||||
|  | 		hash: media.hash, | ||||||
| 		isS3: media.is_s3, | 		isS3: media.is_s3, | ||||||
| 		width: media.width, | 		width: media.width, | ||||||
| 		height: media.height, | 		height: media.height, | ||||||
|  | @ -41,6 +42,7 @@ function curateScene(rawScene, assets) { | ||||||
| 		effectiveDate: rawScene.effective_date, | 		effectiveDate: rawScene.effective_date, | ||||||
| 		description: rawScene.description, | 		description: rawScene.description, | ||||||
| 		duration: rawScene.duration, | 		duration: rawScene.duration, | ||||||
|  | 		shootId: rawScene.shoot_id, | ||||||
| 		channel: { | 		channel: { | ||||||
| 			id: assets.channel.id, | 			id: assets.channel.id, | ||||||
| 			slug: assets.channel.slug, | 			slug: assets.channel.slug, | ||||||
|  | @ -71,6 +73,8 @@ function curateScene(rawScene, assets) { | ||||||
| 			name: tag.name, | 			name: tag.name, | ||||||
| 		})), | 		})), | ||||||
| 		poster: curateMedia(assets.poster), | 		poster: curateMedia(assets.poster), | ||||||
|  | 		trailer: curateMedia(assets.trailer), | ||||||
|  | 		teaser: curateMedia(assets.teaser), | ||||||
| 		photos: assets.photos.map((photo) => curateMedia(photo)), | 		photos: assets.photos.map((photo) => curateMedia(photo)), | ||||||
| 		stashes: assets.stashes?.map((stash) => curateStash(stash)) || [], | 		stashes: assets.stashes?.map((stash) => curateStash(stash)) || [], | ||||||
| 		createdBatchId: rawScene.created_batch_id, | 		createdBatchId: rawScene.created_batch_id, | ||||||
|  | @ -88,6 +92,8 @@ export async function fetchScenesById(sceneIds, { reqUser, ...context } = {}) { | ||||||
| 		tags, | 		tags, | ||||||
| 		posters, | 		posters, | ||||||
| 		photos, | 		photos, | ||||||
|  | 		trailers, | ||||||
|  | 		teasers, | ||||||
| 		stashes, | 		stashes, | ||||||
| 		lastBatch: { id: lastBatchId }, | 		lastBatch: { id: lastBatchId }, | ||||||
| 	} = await promiseProps({ | 	} = await promiseProps({ | ||||||
|  | @ -119,16 +125,40 @@ export async function fetchScenesById(sceneIds, { reqUser, ...context } = {}) { | ||||||
| 		posters: knex('releases_posters') | 		posters: knex('releases_posters') | ||||||
| 			.whereIn('release_id', sceneIds) | 			.whereIn('release_id', sceneIds) | ||||||
| 			.leftJoin('media', 'media.id', 'releases_posters.media_id'), | 			.leftJoin('media', 'media.id', 'releases_posters.media_id'), | ||||||
| 		photos: knex('releases_photos') | 		photos: knex.transaction(async (trx) => { | ||||||
| 			.whereIn('release_id', sceneIds) | 			if (reqUser) { | ||||||
| 			.leftJoin('media', 'media.id', 'releases_photos.media_id'), | 				await trx.select(knex.raw('set_config(\'user.id\', :userId, true)', { userId: reqUser.id })); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			return trx('releases_photos') | ||||||
|  | 				.whereIn('release_id', sceneIds) | ||||||
|  | 				.leftJoin('media', 'media.id', 'releases_photos.media_id'); | ||||||
|  | 		}), | ||||||
|  | 		trailers: knex.transaction(async (trx) => { | ||||||
|  | 			if (reqUser) { | ||||||
|  | 				await trx.select(knex.raw('set_config(\'user.id\', :userId, true)', { userId: reqUser.id })); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			return trx('releases_trailers') | ||||||
|  | 				.whereIn('release_id', sceneIds) | ||||||
|  | 				.leftJoin('media', 'media.id', 'releases_trailers.media_id'); | ||||||
|  | 		}), | ||||||
|  | 		teasers: knex.transaction(async (trx) => { | ||||||
|  | 			if (reqUser) { | ||||||
|  | 				await trx.select(knex.raw('set_config(\'user.id\', :userId, true)', { userId: reqUser.id })); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			return trx('releases_teasers') | ||||||
|  | 				.whereIn('release_id', sceneIds) | ||||||
|  | 				.leftJoin('media', 'media.id', 'releases_teasers.media_id'); | ||||||
|  | 		}), | ||||||
| 		lastBatch: knex('batches') | 		lastBatch: knex('batches') | ||||||
| 			.select('id') | 			.select('id') | ||||||
| 			.where('showcased', true) | 			.where('showcased', true) | ||||||
| 			.orderBy('created_at', 'desc') | 			.orderBy('created_at', 'desc') | ||||||
| 			.first(), | 			.first(), | ||||||
| 		stashes: reqUser | 		stashes: reqUser | ||||||
| 			? knex('stashes_scenes') | 			? knexOwner('stashes_scenes') | ||||||
| 				.leftJoin('stashes', 'stashes.id', 'stashes_scenes.stash_id') | 				.leftJoin('stashes', 'stashes.id', 'stashes_scenes.stash_id') | ||||||
| 				.where('stashes.user_id', reqUser.id) | 				.where('stashes.user_id', reqUser.id) | ||||||
| 				.whereIn('stashes_scenes.scene_id', sceneIds) | 				.whereIn('stashes_scenes.scene_id', sceneIds) | ||||||
|  | @ -155,9 +185,13 @@ export async function fetchScenesById(sceneIds, { reqUser, ...context } = {}) { | ||||||
| 		const sceneTags = tags.filter((tag) => tag.release_id === sceneId); | 		const sceneTags = tags.filter((tag) => tag.release_id === sceneId); | ||||||
| 		const scenePoster = posters.find((poster) => poster.release_id === sceneId); | 		const scenePoster = posters.find((poster) => poster.release_id === sceneId); | ||||||
| 		const scenePhotos = photos.filter((photo) => photo.release_id === sceneId); | 		const scenePhotos = photos.filter((photo) => photo.release_id === sceneId); | ||||||
|  | 		const sceneTrailers = trailers.find((trailer) => trailer.release_id === sceneId); | ||||||
|  | 		const sceneTeasers = teasers.find((teaser) => teaser.release_id === sceneId); | ||||||
| 		const sceneStashes = stashes.filter((stash) => stash.scene_id === sceneId); | 		const sceneStashes = stashes.filter((stash) => stash.scene_id === sceneId); | ||||||
| 		const sceneActorStashes = sceneActors.map((actor) => actorStashes.find((stash) => stash.actor_id === actor.id)).filter(Boolean); | 		const sceneActorStashes = sceneActors.map((actor) => actorStashes.find((stash) => stash.actor_id === actor.id)).filter(Boolean); | ||||||
| 
 | 
 | ||||||
|  | 		console.log(sceneActors); | ||||||
|  | 
 | ||||||
| 		return curateScene(scene, { | 		return curateScene(scene, { | ||||||
| 			channel: sceneChannel, | 			channel: sceneChannel, | ||||||
| 			actors: sceneActors, | 			actors: sceneActors, | ||||||
|  | @ -165,6 +199,8 @@ export async function fetchScenesById(sceneIds, { reqUser, ...context } = {}) { | ||||||
| 			tags: sceneTags, | 			tags: sceneTags, | ||||||
| 			poster: scenePoster, | 			poster: scenePoster, | ||||||
| 			photos: scenePhotos, | 			photos: scenePhotos, | ||||||
|  | 			trailer: sceneTrailers, | ||||||
|  | 			teaser: sceneTeasers, | ||||||
| 			stashes: sceneStashes, | 			stashes: sceneStashes, | ||||||
| 			actorStashes: sceneActorStashes, | 			actorStashes: sceneActorStashes, | ||||||
| 			lastBatchId, | 			lastBatchId, | ||||||
|  |  | ||||||
|  | @ -137,6 +137,7 @@ export default async function initServer() { | ||||||
| 				allowSignup: config.auth.signup, | 				allowSignup: config.auth.signup, | ||||||
| 				maxMatches: config.database.manticore.maxMatches, | 				maxMatches: config.database.manticore.maxMatches, | ||||||
| 				maxAggregateSize: config.database.manticore.maxAggregateSize, | 				maxAggregateSize: config.database.manticore.maxAggregateSize, | ||||||
|  | 				media: config.media, | ||||||
| 			}, | 			}, | ||||||
| 		}; | 		}; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -19,7 +19,7 @@ export default { | ||||||
| 			redirects: { | 			redirects: { | ||||||
| 				'/': '/updates', | 				'/': '/updates', | ||||||
| 			}, | 			}, | ||||||
| 			trailingSlash: true, // for some reason /tags breaks without this
 | 			trailingSlash: false, // for some reason /tags breaks without this, ERR_TOO_MANY_REDIRECTS
 | ||||||
| 		}), | 		}), | ||||||
| 	], | 	], | ||||||
| 	css: { | 	css: { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue