กระปู๋', 'หมอนวดสาว', 'นวดนาบ'], 'massage oil' => ['นวดน้ำมัน', 'สายนวดกระปู๋', 'บอดี้มาสสาจ'], 'amateur' => ['มือสมัครเล่น', 'คลิปหลุดทางบ้าน'], 'gal' => ['สาวแกล', 'สาวผิวแทน'], 'gyaru' => ['สาวแกล', 'สก๊อยญี่ปุ่น'], 'pantyhose' => ['ถุงน่อง', 'สาวถุงน่อง', 'ถุงน่องดำ'], 'toys' => ['ของเล่นเซ็กส์', 'ใช้เครื่องสั่น', 'ไข่สั่น'], 'handjob' => ['ชักว่าว', 'ใช้มือ'], 'titjob' => ['ใช้ร่องอก', 'หนีบควย'], 'paizuri' => ['หนีบนม', 'เอาหน้าอกถู'], 'footjob' => ['ใช้เท้าเหยียบ', 'นวดควยด้วยเท้า', 'ส้นสูงยั่วๆ'], 'squirting' => ['ผู้หญิงน้ำแตก', 'น้ำกระฉูด'], 'orgasm' => ['ถึงจุดสุดยอด', 'เสียวจนเสร็จ', 'น้ำแตก'], 'multiple orgasms' => ['เสร็จหลายน้ำ', 'ฟินรัวๆ', 'กระตุกรัวๆ'], 'fingering' => ['ใช้นิ้ว', 'แหย่หอย', 'เขี่ยเม็ดแตด'], 'cunnilingus' => ['เลียหอย', 'ทำออรัลให้ผู้หญิง', 'เลียร่องเสียว'], 'anal' => ['ทางทวาร', 'เสียบตูด', 'รูตูด'], '69' => ['ท่า 69', 'ผลัดกันอม', 'ซิกตี้ไนน์'], 'cowgirl' => ['ท่าขย่ม', 'หญิงเป็นฝ่ายรุก', 'ท่าคาวเกิร์ล'], 'doggy style' => ['ท่าหมา', 'ด็อกกี้สไตล์', 'อัดถั่วดำ'], 'missionary' => ['ท่าเบสิค', 'ท่ามิชชันนารี'], 'fisting' => ['ยัดกำปั้น', 'ยัดทั้งมือ', 'ยัดของใหญ่'], 'group sex' => ['สวิงกิ้ง', 'เซ็กส์หมู่'], 'threesome' => ['จัดสามคน', '3P'], 'foursome' => ['จัดสี่คน', '4P'], 'gangbang' => ['โดนรุมโทรม', 'โดนรุม', 'รุมเย็ด'], 'swapping' => ['สวิงกิ้ง', 'แลกคู่', 'แลกเมีย'], 'bdsm' => ['โซ่แส้กุญแจมือ', 'เซ็กส์ซาดิสม์', 'BDSM'], 'bondage' => ['มัดเชือก', 'โดนพันธนาการ'], 'sm' => ['ซาดิสม์', 'มาโซคิสม์', 'SM'], 'spitting' => ['ถ่มน้ำลาย', 'โดนถุยน้ำลายใส่'], 'shaved' => ['โกนขน', 'หอยไร้ขน', 'หีไร้ขน', 'แคมสวย'], 'hairy' => ['ขนดก', 'หอยขนดก', 'ดงหญ้าดก'], 'pregnant' => ['คนท้อง', 'สาวตั้งครรภ์', 'คนท้องน้ำเดิน'], 'pov' => ['มุมมองแทนสายตา', 'สมจริง'], 'vr' => ['ดูแบบ VR', 'สามมิติเสมือนจริง'], 'prostitute' => ['สาวบริการ', 'เด็กเสี่ย', 'เด็กอ่าง'], 'slut' => ['สาวร่าน', 'ล่านผู้ชาย', 'แพศยา'], 'documentary' => ['สารคดี', 'แอบถ่ายสมจริง'], 'voyeur' => ['กล้องซ่อน', 'มุมลับ'], 'outdoors' => ['เอาท์ดอร์', 'จัดกันนอกสถานที่', 'เซ็กส์กลางแจ้ง'], 'public' => ['ที่สาธารณะ', 'เสียวกลางแจ้ง', 'โชว์หวิว'], 'car' => ['บนรถ', 'คาร์เซ็กส์', 'แอบเอาในรถ'], 'train' => ['รถไฟ', 'รถไฟแออัด'], 'bus' => ['บนรถบัส', 'รถทัวร์เสียว'], 'hospital' => ['โรงพยาบาล', 'แอบทำในห้องพยาบาล'], 'hot spring' => ['บ่อน้ำพุร้อน', 'ออนเซ็น', 'จัดกันในน้ำพุร้อน'], 'pool' => ['สระว่ายน้ำ', 'ริมสระ'], 'beach' => ['ทะเล', 'ชายหาด', 'ชุดเกาะอกริมหาด'], 'restroom' => ['ห้องน้ำ', 'แอบทำในห้องน้ำ'], 'bath' => ['ห้องอาบน้ำ', 'อาบน้ำด้วยกัน'], 'single work' => ['ผลงานเดี่ยว', 'แสดงคนเดียว'], 'debut' => ['ผลงานแรก', 'แสดงครั้งแรก', 'เพิ่งเข้าวงการ'],];// Extract Genres (max 2 genres) and translate/rotate them for Title, and also build full list for Body$raw_class = !empty($obj['vod_class']) ? trim($obj['vod_class']) : '';$class_part = '';$display_class = $raw_class; // Default for body if no mappingif (!empty($raw_class)) { $classes_array = array_filter(array_map('trim', explode(',', $raw_class))); $mapped_classes = []; $all_body_classes = []; $seed = abs(crc32($raw_code)); foreach ($classes_array as $class) { $key = strtolower($class); if (isset($genre_mapping[$key])) { $options = $genre_mapping[$key]; // Deterministic choice so URL sharing looks consistent, but varies wildly across videos $choice_idx = ($seed + crc32($key)) % count($options); $mapped_classes[] = $options[$choice_idx]; $all_body_classes[] = $options[$choice_idx]; // Accumulate all for body } else { $all_body_classes[] = $class; // Keep original if no translation } } // Only use Thai-mapped genres for SEO Title. Discard any English genres that didn't match. if (!empty($mapped_classes)) { $mapped_slice = array_slice(array_unique($mapped_classes), 0, 2); $class_part = implode(' ', $mapped_slice); } // For Body display (replace English with Thai where possible) if (!empty($all_body_classes)) { $display_class = implode(',', array_unique($all_body_classes)); // We do NOT override $obj['vod_class'] because it breaks the URL slug in mac_url_create. } // Build Custom category links replacing ONLY the display text with Thai $custom_class_links = mac_url_create($obj['vod_class'], 'class'); $raw_classes_exp = array_filter(array_map('trim', explode(',', $raw_class))); foreach($raw_classes_exp as $idx => $r_class) { $eng_text = $r_class; $thai_text = isset($all_body_classes[$idx]) ? $all_body_classes[$idx] : $eng_text; // Replace the >English< part of the anchor tag $custom_class_links = preg_replace('/>' . preg_quote($eng_text, '/') . '<\/a>/i', '>' . $thai_text . '', $custom_class_links); }}// Detect censored vs uncensored from class/remarks (avoid false UNCENSORED titles)$is_censored = (bool) preg_match('/\bcensored\b/i', (string)$raw_class) && !preg_match('/uncensored|no\s*mosaic|leak/i', (string)$raw_class . ' ' . (string)$remarks);$is_uncensored = (bool) preg_match('/uncensored|no\s*mosaic|\bleak\b|ไม่เซ็นเซอร์|ถอดเซ็น/i', (string)$raw_class . ' ' . (string)$remarks);if ($is_uncensored) { $is_censored = false; }$status_th = $is_censored ? 'เซ็นเซอร์' : 'ไม่เซ็นเซอร์';$status_en = $is_censored ? 'CENSORED' : 'UNCENSORED';// Clean up Remarks for H1 so it doesn't duplicate Raw Code$display_remarks = trim(str_ireplace($raw_code, '', $remarks));$display_remarks = preg_replace('/^(FC2|JAV)?\s*[-:]\s*/i', '', ltrim($display_remarks, ' -:'));// Normalize wrong default uncensored wording when actually censoredif ($is_censored) { $display_remarks = preg_replace('/ไม่เซ็นเซอร์|UNCENSORED|UNCENS\.?/iu', '', $display_remarks); $display_remarks = trim(preg_replace('/\s+/u', ' ', $display_remarks));}if ($display_remarks === '' || preg_match('/^(UNCENSORED|CENSORED)$/i', $display_remarks)) { $display_remarks = $status_th . ' ' . $status_en;}// Title stays clean: actor + status. Genres go to meta description only.$class_one = '';if (!empty($class_part)) { $cp = preg_split('/\s+/u', trim($class_part)); $class_one = $cp ? $cp[0] : '';}$injected_parts = trim($actor_part);if (!empty($injected_parts)) { if (preg_match('/UNCENSORED|CENSORED/i', $display_remarks)) { $display_remarks = preg_replace('/\b(UNCENSORED|CENSORED)\b/i', $injected_parts . ' $1', $display_remarks, 1); } else { $display_remarks = trim($display_remarks . ' ' . $injected_parts . ' ' . $status_en); }}// Build SEO Title to exactly match H1$seo_title = trim($raw_code . ' ' . $display_remarks);$seo_title = trim(preg_replace('/\s+/u', ' ', $seo_title));// Title strategy: video title is primary, brand is optional suffix// Google SERP shows ~60 chars. Prefer full video title; only append brand if room.// Brand is hardcoded to bypass keyword-stuffed site_name in DB.$MAX_TOTAL = 60;$brand_full = 'N-JAV';$brand_short = 'n-jav.com';if (mb_strlen($seo_title, 'UTF-8') >= $MAX_TOTAL) { // Video title alone already fills/exceeds — show it, drop brand entirely if (mb_strlen($seo_title, 'UTF-8') > $MAX_TOTAL) { $cut_title = rtrim(mb_substr($seo_title, 0, $MAX_TOTAL - 1, 'UTF-8')); $last_space = mb_strrpos($cut_title, ' ', 0, 'UTF-8'); if ($last_space !== false && $last_space >= 40) $cut_title = rtrim(mb_substr($cut_title, 0, $last_space, 'UTF-8')); $seo_title = $cut_title . html_entity_decode('…', ENT_QUOTES, 'UTF-8'); } $page_title_full = $seo_title;} elseif (mb_strlen($seo_title, 'UTF-8') + 3 + mb_strlen($brand_full, 'UTF-8') <= $MAX_TOTAL) { // Everything fits with full brand $page_title_full = $seo_title . ' - ' . $brand_full;} elseif (mb_strlen($seo_title, 'UTF-8') + 3 + mb_strlen($brand_short, 'UTF-8') <= $MAX_TOTAL) { // Fallback to short brand (domain) $page_title_full = $seo_title . ' - ' . $brand_short;} else { // Video title takes priority, drop brand $page_title_full = $seo_title;}// Build meta description: Thai-first, useful for SERP (not English tag dump)$thai_genres = [];$skip_crude = ['เลียหอย','สาวร่าน','แตกใส่หน้า','น้ำว่าว','น้ำกาม','อมควย','เย็ด','หี','ควย','นมใหญ่จัง','หลั่งในคาหี'];if (!empty($all_body_classes) && is_array($all_body_classes)) { foreach ($all_body_classes as $tg) { $tg = trim($tg); if ($tg === '' || !preg_match('/[ก-๙]/u', $tg)) continue; $bad = false; foreach ($skip_crude as $badw) { if (mb_strpos($tg, $badw, 0, 'UTF-8') !== false) { $bad = true; break; } } if ($bad) continue; $thai_genres[] = $tg; if (count($thai_genres) >= 3) break; }}// fallback: first non-crude mapped word, else emptyif (!$thai_genres && $class_one !== '') { $ok = true; foreach ($skip_crude as $badw) { if (mb_strpos($class_one, $badw, 0, 'UTF-8') !== false) { $ok = false; break; } } if ($ok) $thai_genres[] = $class_one;}$genre_th = $thai_genres ? implode(' · ', array_unique($thai_genres)) : '';$actor_desc = $actor_part !== '' ? $actor_part : '';if (!empty($obj['vod_content']) && preg_match('/[ก-๙]/u', $obj['vod_content'])) { $meta_desc = trim(mb_substr(strip_tags($obj['vod_content']), 0, 155, 'UTF-8'));} else { $meta_desc = 'ดู ' . $raw_code; if ($actor_desc !== '') { $meta_desc .= ' ' . $actor_desc; } $meta_desc .= ' ' . $status_th; if ($genre_th !== '') { $meta_desc .= ' แนว ' . $genre_th; } $meta_desc .= ' คุณภาพ Full HD อัปเดตที่ N-JAV'; $meta_desc = trim(preg_replace('/\s+/u', ' ', $meta_desc)); $meta_desc = mb_substr($meta_desc, 0, 155, 'UTF-8');}$raw_year = !empty($obj['vod_year']) ? $obj['vod_year'] : date('Y');// Schema.org JSON-LD preparations$schema_actors = [];if (!empty($raw_actor)) { $actors_arr = array_filter(array_map('trim', explode(',', $raw_actor))); foreach ($actors_arr as $act) { $schema_actors[] = ["@type" =>"Person","name" => $act ]; }}$schema_actors_json = !empty($schema_actors) ? json_encode($schema_actors, JSON_UNESCAPED_UNICODE) : '[]';$schema_genres = [];if (!empty($raw_class)) { $genres_arr = array_filter(array_map('trim', explode(',', $raw_class))); $schema_genres = array_values($genres_arr);}$schema_genres_json = !empty($schema_genres) ? json_encode($schema_genres, JSON_UNESCAPED_UNICODE) : '[]';$page_title_attr = htmlspecialchars($page_title_full, ENT_QUOTES, 'UTF-8');$meta_desc_attr = htmlspecialchars($meta_desc, ENT_QUOTES, 'UTF-8');$detail_url = rtrim($maccms['site_url'], '/') . mac_url_vod_detail($obj);$thumb_url = mac_url_img($obj['vod_pic']);if ($thumb_url !== '' && !preg_match('~^https?://~i', $thumb_url)) $thumb_url = rtrim($maccms['site_url'], '/') . '/' . ltrim($thumb_url, '/');$duration_iso = null;$duration_raw = trim((string)($obj['vod_duration'] ?? ''));if ($duration_raw !== '') { if (ctype_digit($duration_raw) && intval($duration_raw) > 0) { $duration_iso = 'PT' . intval($duration_raw) . 'M'; } elseif (preg_match('/^(?:(\d{1,3}):)?(\d{1,2}):(\d{1,2})$/', $duration_raw, $dm)) { $hours = count($dm) === 4 ? intval($dm[1]) : 0; $minutes = count($dm) === 4 ? intval($dm[2]) : intval($dm[1]); $seconds = count($dm) === 4 ? intval($dm[3]) : intval($dm[2]); $duration_iso = 'PT' . ($hours > 0 ? $hours . 'H' : '') . ($minutes > 0 ? $minutes . 'M' : '') . ($seconds > 0 ? $seconds . 'S' : ''); }}$video_schema = [ '@context'=>'https://schema.org','@type'=>'VideoObject','name'=>$seo_title,'description'=>$meta_desc, 'thumbnailUrl'=>[$thumb_url],'uploadDate'=>date('c', intval($obj['vod_time'])),'datePublished'=>date('c', intval($obj['vod_time'])), 'embedUrl'=>$iframe_url,'isAccessibleForFree'=>true,'requiresSubscription'=>false,'isFamilyFriendly'=>false,'contentRating'=>'18+', 'keywords'=>implode(', ', array_filter([$raw_code,$raw_actor,'JAV',$raw_class])), 'publisher'=>['@type'=>'Organization','name'=>'N-JAV','logo'=>['@type'=>'ImageObject','url'=>rtrim($maccms['site_url'],'/').'/template/zu/statics/img/logo_m.png']], 'mainEntityOfPage'=>['@type'=>'WebPage','@id'=>$detail_url.'#webpage','url'=>$detail_url], 'actor'=>$schema_actors,'genre'=>$schema_genres, 'interactionStatistic'=>['@type'=>'InteractionCounter','interactionType'=>['@type'=>'WatchAction'],'userInteractionCount'=>max(1,intval($obj['vod_hits']))]];if ($duration_iso !== null && $duration_iso !== 'PT') $video_schema['duration'] = $duration_iso;if (!empty($obj['vod_director'])) $video_schema['productionCompany'] = ['@type'=>'Organization','name'=>$obj['vod_director']];$video_schema_json = json_encode($video_schema, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); ?>
KFC1688S&P888Boston777SAGame1688Hydra888Sexy365Mahagame66
UfagoolUfazaHuayhit168

ข้อมูลเรื่อง

ดารา/ไอดอล:Amatsuki Azu 

ผู้ผลิต/จำหน่าย:ไม่ระบุ

หมวดหมู่:

ปีที่ออก:2024  

คลิปที่เกี่ยวข้อง