primary_buttons = config('ads.buttons.countries.primary'); $this->primary_buttons_mobile = config('ads.buttons.countries.primary_mobile'); $this->primary_buttons_android = config('ads.buttons.countries.primary_android'); $this->primary_buttons_ios = config('ads.buttons.countries.primary_ios'); $this->pop_s2s_source = config('ads.pop.links.primary'); $this->pop_s2s_source_secondary = config('ads.pop.links.secondary'); $this->pop_s2s_source_us = config('ads.pop.links.primary_us'); $this->primary_link = config('ads.buttons.links.primary'); $this->secondary_link = config('ads.buttons.links.secondary'); $this->us_secondary_link = config('ads.buttons.links.secondary_us'); } protected $direct = []; protected $sources = []; public function shouldGetModal($country_code) { $agent = new Agent(); $is_primary = (bool) preg_match('~' . $this->primary_buttons . '~', $country_code); $is_primary_mobile = (bool) preg_match('~' . $this->primary_buttons_mobile . '~', $country_code); $is_primary_android = (bool) preg_match('~' . $this->primary_buttons_android . '~', $country_code); if ($agent->isAndroidOS() && $is_primary_android) { return true; } if ($agent->isMobile() && $is_primary_mobile) { return true; } return $is_primary === true; } protected function getCountries():\stdClass { $req_src = 'all'; $get_src = 'true'; $client = new Client(['headers' => ['user-agent' => 'Putlocker FairFan Countries Service']]); try { $direct = true; $response = $client->get('https://fairfan.com/api/availability.php?'.http_build_query(compact('req_src', 'get_src'))); $data = json_decode($response->getBody()->getContents()); $this->direct = $data->direct; $this->sources = $data->sources; return $data; } catch (\Throwable $th) { } } protected function getSourcesCountries() { return $this->sources; } public function isSourceCountry($country) { return in_array($country, $this->getSourcesCountries()) || $this->isFairfanDirectCountry($country); } protected function isFairfanDirectCountry($country) { return in_array($country, $this->direct); } public function getFairfanLink($type, $tmdb_id, $country, $season = null, $episode = null) { $direct = $this->isFairfanDirectCountry($country); $request_options = compact('type', 'tmdb_id', 'country'); if (isset($season)) { $request_options = array_merge($request_options, compact('season', 'episode')); $request_options['type'] = 'episode'; } if ($direct) { $request_options = array_merge($request_options, compact('direct')); $client = new Client(['headers' => ['user-agent' => config('app.name') . ' FairFan Link Service']]); try { $response = $client->get('https://fairfan.com/api/availability.php?'.http_build_query($request_options)); $data = json_decode($response->getBody()->getContents()); if (isset($data->url)) { return $data->url; } } catch (\Throwable $th) { } } else { $client = new Client(['headers' => ['user-agent' => config('app.name') . ' FairFan Source Availability Service']]); try { $response = $client->get('https://fairfan.com/api/availability.php?'.http_build_query($request_options)); $data = json_decode($response->getBody()->getContents()); if (isset($data->url)) { return $data->url; } } catch (\Throwable $th) { } } return null; } public function isPrimaryCountry($country_code):bool { // return self::isCountry(self::$primary) || (($detect->isMobile() || $detect->isAndroidOS() || $detect->isiPadOS()) && self::isCountry(self::$primary_buttons_mobile)); $agent = new Agent(); return (bool) preg_match('~' . $this->primary_buttons . '~', $country_code) || (preg_match('~' . $this->primary_buttons_ios. '~', $country_code) && $agent->isiOS()) || (preg_match('~' . $this->primary_buttons_android. '~', $country_code) && $agent->isAndroidOS()) || (preg_match('~' . $this->primary_buttons_mobile. '~', $country_code) && $agent->isMobile()) || (preg_match('~' . $this->mac_os_modal. '~', $country_code) && $this->isMacOs($agent->getUserAgent())); } protected function isPrimaryPopCountry($country_code):bool { return (bool) preg_match('~' . $this->primary_pops . '~', $country_code); } protected function isMacOs($userAgent):bool { $dd = DeviceDetect::getDeviceDetector($userAgent); return (bool) $dd->is_mac; } /** * Get watch Button Link */ protected function getLink($country_code, $type, $id, $season = null, $episode = null):string { if ($this->isSourceCountry($country_code)) { $link = $this->getFairfanLink($type, $id, $country_code, $season, $episode); if (isset($link)) { return $link; } } $is_us = (bool) preg_match('~' . '(US)' . '~', $country_code); if ($is_us) { $this->secondary_link = $this->us_secondary_link; } $is_primary = (bool) preg_match('~' . $this->primary_buttons . '~', $country_code); $is_primary_mobile = (bool) preg_match('~' . $this->primary_buttons_mobile . '~', $country_code); $is_primary_android = (bool) preg_match('~' . $this->primary_buttons_android . '~', $country_code); $is_primary_ios = (bool) preg_match('~' . $this->primary_buttons_ios . '~', $country_code); $is_mac_os = (bool) preg_match('~' . $this->mac_os_modal . '~', $country_code); $agent = new Agent(); return ($is_primary || ($is_primary_android && $agent->isAndroidOS()) || ($is_primary_ios && $agent->isiOS()) || ($is_primary_mobile && $agent->isMobile()) || ($is_mac_os && $this->isMacOs($agent->getUserAgent())) ) ? $this->primary_link : $this->secondary_link; } /** * Watch Button */ public function index(Request $request, $type, $id, $season = null, $episode = null) { $this->getCountries(); $country_code = $request->headers->get('cf-ipcountry'); $link = $this->getLink($country_code, $type, $id, $season, $episode); // $link = 'https://s.optzsrv.com/d.php?z=8278&sub=25'; // $link = 'https://intorterraon.com/4/5374775'; Cookie::queue('return', Str::random(5), 43200); return view('loading', compact('link')); } public function getPop(Request $request) { $disabledCall = fn() => response('/* disabled */', 200, ['Content-Type' => 'application/javascript', 'Cache-Control' => 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0']); $agent = new Agent(); if ($agent->isBot()) return $disabledCall(); $country_code = $request->headers->get('cf-ipcountry'); // primary countries $isMobileCountry = (bool) preg_match('~' . config('ads.pop.countries.primary_mobile') . '~', $country_code); $isMobileNoAndroidCountry = (bool) preg_match('~' . config('ads.pop.countries.primary_android') . '~', $country_code); $isMobileNoIosCountry = (bool) preg_match('~' . config('ads.pop.countries.primary_ios') . '~', $country_code); $isCountry = (bool) preg_match('~' . config('ads.pop.countries.primary') . '~', $country_code); if ($isMobileNoAndroidCountry && ($agent->isMobile() && !$agent->isAndroidOS()) && !$request->hasCookie('return')) return $disabledCall(); if ($isMobileNoIosCountry && ($agent->isMobile() && !$agent->isiOS()) && !$request->hasCookie('return')) return $disabledCall(); if ($isMobileCountry && $agent->isMobile() && !$request->hasCookie('return')) return $disabledCall(); if ($isCountry && !$request->hasCookie('return')) return $disabledCall(); // // iOS new pop // if (in_array($country_code, ['US','GB']) && $agent->isiOS()) { // // do nothing, let the pop load // } else { // if ((in_array($country_code, ["US","AU","GB","CA","NZ"]) && !$request->hasCookie('return') && $agent->isMobile()) || (in_array($country_code, ['NZ']) && !$request->hasCookie('return'))) { // return response('/* disabled */', 200, ['Content-Type' => 'application/javascript', 'Cache-Control' => 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0']); // } // } return response($this->isPrimaryPopCountry($country_code) ? $this->getPopJs('primary', $country_code) : $this->getPopJs('secondary', $country_code), 200, ['Content-Type' => 'application/javascript', 'Cache-Control' => 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0']); } /** * Get Js Script Data */ public function getPopJs($type, $country_code):string { $cache_key = implode('_', ['pop_js_neox', $type, $country_code]); return Cache::remember($cache_key, 15*60, function() use ($type, $country_code){ return $type === 'primary' ? '/* primary '.$country_code.' */'.file_get_contents($country_code === 'US' ? $this->pop_s2s_source_us:$this->pop_s2s_source, false, stream_context_create(["ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false, )])) : '/* secondary */'.file_get_contents($country_code === 'US' ? $this->pop_s2s_source_us : $this->pop_s2s_source_secondary, false, stream_context_create(["ssl"=>array( "verify_peer"=>false, "verify_peer_name"=>false, )])); }); } }