add (client-side only) pornhub video streaming (WIP)
This commit is contained in:
parent
b1dc47d461
commit
f5908b9a5d
|
@ -24,9 +24,7 @@ export default async function VideoPage({ params }: { params: { platform: Platfo
|
|||
|
||||
const [data, related] = await new VideoAgent(platform).getVideo(decodedId)
|
||||
|
||||
//const [data, related] = await fetchVideoData(decodedId)
|
||||
|
||||
if (!data.lowResUrl) {
|
||||
if (!data.lowResUrl && (!data.srcSet || data.srcSet.length == 0)) {
|
||||
redirect(`/${locale}/404`)
|
||||
}
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@ const Player: React.FC<Props> = (props) => {
|
|||
controls: true,
|
||||
responsive: true,
|
||||
fluid: true,
|
||||
sources: [{
|
||||
sources: data.srcSet ?? [{
|
||||
src: videoSrc,
|
||||
type: videoType
|
||||
}]
|
||||
|
|
|
@ -12,15 +12,17 @@ export interface GalleryData {
|
|||
platform: Platforms
|
||||
}
|
||||
|
||||
export interface VideoSrcSet {
|
||||
|
||||
export interface VideoSourceItem {
|
||||
type: string,
|
||||
src: string,
|
||||
label: string
|
||||
}
|
||||
|
||||
export interface VideoData {
|
||||
lowResUrl?: string,
|
||||
hiResUrl?: string,
|
||||
hlsUrl?: string
|
||||
srcSet?: VideoSrcSet
|
||||
srcSet?: VideoSourceItem[]
|
||||
}
|
||||
|
||||
export interface VideoAgent {
|
||||
|
|
|
@ -1,4 +1,12 @@
|
|||
import { PORNHUB_BASE_URL } from "@/constants/urls"
|
||||
import axios, { AxiosHeaders } from "axios"
|
||||
import { getHeadersWithCookie } from "../common/headers"
|
||||
import { VideoSourceItem } from "@/meta/data"
|
||||
|
||||
interface PornHubVideoSrcElem {
|
||||
videoUrl: string
|
||||
quality: string
|
||||
}
|
||||
|
||||
export const getPornHubQueryUrl = async (query?: string): Promise<string> => {
|
||||
if (query) {
|
||||
|
@ -6,4 +14,33 @@ export const getPornHubQueryUrl = async (query?: string): Promise<string> => {
|
|||
}
|
||||
|
||||
return PORNHUB_BASE_URL
|
||||
}
|
||||
|
||||
export const getPornHubMediaUrlList = async (url: string, sessionCookie: string): Promise<VideoSourceItem[]> => {
|
||||
|
||||
const headersWithCookie = getHeadersWithCookie(PORNHUB_BASE_URL, sessionCookie)
|
||||
|
||||
let videos: VideoSourceItem[] = []
|
||||
|
||||
await axios.get(url, headersWithCookie)
|
||||
.then(async response => {
|
||||
|
||||
if (response.data) {
|
||||
|
||||
videos = await response.data.map((elem: PornHubVideoSrcElem) => ({
|
||||
src: elem?.videoUrl,
|
||||
type: 'video/mp4',
|
||||
label: elem?.quality
|
||||
})) as VideoSourceItem[]
|
||||
|
||||
return videos
|
||||
|
||||
} else {
|
||||
return []
|
||||
}
|
||||
|
||||
})
|
||||
.catch(error => console.log(error))
|
||||
|
||||
return videos
|
||||
}
|
|
@ -1,5 +1,5 @@
|
|||
import { PORNHUB_BASE_URL, PORNHUB_BASE_URL_VIDEO } from "@/constants/urls";
|
||||
import { FetchParams, GalleryData, VideoData } from "@/meta/data";
|
||||
import { FetchParams, GalleryData, VideoData, VideoSourceItem } from "@/meta/data";
|
||||
import { getHeaders, getHeadersWithCookie } from "../common/headers";
|
||||
import { getDataFromRedis, storeDataIntoRedis } from "@/redis/client";
|
||||
import { DEFAULT_PORNHUB_VIDEO_EXPIRY, DEFAULT_RELATED_VIDEO_KEY_PATH } from "@/constants/redis";
|
||||
|
@ -8,15 +8,19 @@ import * as cheerio from "cheerio";
|
|||
|
||||
import axios, { AxiosError } from "axios";
|
||||
import { createSessionCookie, findGetMediaUrlInTagblock } from "../common/mindgeek";
|
||||
import { getPornHubMediaUrlList } from "./url";
|
||||
|
||||
export const fetchPornHubVideoData = async (videoId: string, params?: FetchParams): Promise<[VideoData, GalleryData[]]> => {
|
||||
|
||||
let data: VideoData = {
|
||||
lowResUrl: ''
|
||||
lowResUrl: '',
|
||||
srcSet: []
|
||||
}
|
||||
|
||||
let related: GalleryData[] = [];
|
||||
|
||||
let mediaUrl, sessionCookie, convertedData: VideoSourceItem[]
|
||||
|
||||
let reqHeaders = getHeaders(PORNHUB_BASE_URL)
|
||||
|
||||
const queryUrl = `${PORNHUB_BASE_URL_VIDEO}${videoId.replace(/\//g, '')}`
|
||||
|
@ -28,11 +32,11 @@ export const fetchPornHubVideoData = async (videoId: string, params?: FetchParam
|
|||
return [cachedVideoData as VideoData, cachedRelatedData as GalleryData[] ?? []]
|
||||
}
|
||||
|
||||
await axios.get(queryUrl, reqHeaders)
|
||||
await axios.get(queryUrl, reqHeaders)
|
||||
|
||||
.then(async response => {
|
||||
|
||||
const sessionCookie = response?.headers["set-cookie"] ? createSessionCookie(response?.headers["set-cookie"]) : '';
|
||||
sessionCookie = response?.headers["set-cookie"] ? createSessionCookie(response?.headers["set-cookie"]) : '';
|
||||
|
||||
const html = response.data;
|
||||
|
||||
|
@ -40,45 +44,35 @@ export const fetchPornHubVideoData = async (videoId: string, params?: FetchParam
|
|||
|
||||
const scriptTags = $("script");
|
||||
|
||||
// populate video data object
|
||||
scriptTags.map(async (idx, elem) => {
|
||||
const getMediaUrl = findGetMediaUrlInTagblock($(elem).toString())
|
||||
scriptTags.map((idx, elem) => {
|
||||
const getMediaUrl = findGetMediaUrlInTagblock($(elem).toString()) ?? null
|
||||
|
||||
if (getMediaUrl) {
|
||||
|
||||
const headersWithCookie = getHeadersWithCookie(PORNHUB_BASE_URL, sessionCookie)
|
||||
|
||||
await axios.get(getMediaUrl, headersWithCookie)
|
||||
|
||||
.then(response => {
|
||||
|
||||
console.log(response.data)
|
||||
|
||||
// magic goes here
|
||||
|
||||
})
|
||||
|
||||
.catch(error => console.log(error))
|
||||
mediaUrl = getMediaUrl
|
||||
}
|
||||
|
||||
// // populate related gallery
|
||||
// scriptTags.map((idx, elem) => {
|
||||
|
||||
// // magic goes here
|
||||
|
||||
// })
|
||||
|
||||
// await storeDataIntoRedis(queryUrl + DEFAULT_RELATED_VIDEO_KEY_PATH, related, DEFAULT_PORNHUB_VIDEO_EXPIRY);
|
||||
})
|
||||
|
||||
await storeDataIntoRedis(queryUrl, data, DEFAULT_PORNHUB_VIDEO_EXPIRY);
|
||||
|
||||
// populate related gallery
|
||||
scriptTags.map((idx, elem) => {
|
||||
|
||||
// magic goes here
|
||||
|
||||
})
|
||||
|
||||
await storeDataIntoRedis(queryUrl + DEFAULT_RELATED_VIDEO_KEY_PATH, related, DEFAULT_PORNHUB_VIDEO_EXPIRY);
|
||||
|
||||
}).catch((error: AxiosError) => {
|
||||
console.log(queryUrl)
|
||||
console.log(error.message)
|
||||
// error handling goes here
|
||||
});
|
||||
|
||||
return [ { lowResUrl: 'https://www.w3schools.com/html/mov_bbb.mp4' } ,[]]
|
||||
if (sessionCookie && mediaUrl) {
|
||||
convertedData = await getPornHubMediaUrlList(mediaUrl, sessionCookie)
|
||||
await storeDataIntoRedis(queryUrl, convertedData, DEFAULT_PORNHUB_VIDEO_EXPIRY);
|
||||
|
||||
data.srcSet = convertedData.reverse()
|
||||
}
|
||||
|
||||
|
||||
return [ data, []]
|
||||
// return [ { lowResUrl: 'https://www.w3schools.com/html/mov_bbb.mp4' } ,[]]
|
||||
}
|
|
@ -8,12 +8,13 @@ import { Platforms } from '@/meta/settings';
|
|||
|
||||
import { getDataFromRedis, storeDataIntoRedis } from '@/redis/client';
|
||||
import { DEFAULT_XVIDEOS_CONTENT_EXPIRY } from '@/constants/redis';
|
||||
import { XVIDEOS_BASE_URL } from '@/constants/urls';
|
||||
|
||||
export const fetchXVideosGalleryData = async (params?: FetchParams): Promise<GalleryData[]> => {
|
||||
|
||||
let data: GalleryData[] = [];
|
||||
|
||||
const reqHeaders = getHeaders()
|
||||
const reqHeaders = getHeaders(XVIDEOS_BASE_URL)
|
||||
|
||||
const queryUrl = await getXVideosQueryUrl(params?.query)
|
||||
|
||||
|
|
Loading…
Reference in New Issue