Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Sunday, 1 December 2019

Week in Review: Apple’s rebirth as a content company has a forgettable debut

Hey everyone. Thank you for welcoming me into you inboxes yet again.

Hope you all had a wonderful Thanksgiving. After dodging your inboxes for a couple weeks as I ventured off to China for a TechCrunch event in Shenzhen, I am rested up and ready to go.

If you’re reading this on the TechCrunch site, you can get this in your inbox here, and follow my tweets here.


The big story

When Apple announced details on their three new subscription products (Apple TV+, Apple Arcade and Apple News+ — all of which are now live) back in March, the headlines that followed all described accurately how Apple’s business was increasingly shifting away from hardware towards services and how the future of the company may lie in these subscription businesses.

I largely accepted those headlines as fact, but one thing I have been thinking an awful lot about this week is how much I have loved Disney+ since signing up for an account and just how little I have thought about Apple TV+ despite signing up for both at their launches.

It’s admittedly not the fairest of comparisons, Disney has decades of classic content behind them while Apple is pushing out weekly updates to a few mostly meh TV shows. But no one was begging Apple to get into television. The company’s desires to diversify and own subscriptions that consumers have on their Apple devices certainly make sense for them, but their strategy of making that play without the help of any beloved series before them seems to have been a big miscalculation.

At TechCrunch, we write an awful lot about acquisitions worth hundreds of million, if not billions, of dollars. Some of the acquisitions that have intrigued me the most have been in the content space. Streaming networks are plunking down historic sums on series like Seinfeld, Friends and The Big Bang Theory. The buyers have differed throughout these deals, but they have never been Apple.

That’s because Apple isn’t bidding on history, they’re trying to nab directors and actors creating the series that will be the next hits. And while that sounds very Apple, it also sounds like a product that’s an awfully big gamble to the average consumer looking to try out a new streaming service. Why pick the service that’s starting from a standstill? Apple has ordered plenty of series and I have few doubts that at least one of the shows they plan to introduce is going to be a hit, but there isn’t much in the way of an early favorite yet and for subscribers that haven’t found “the one” yet, there’s very little reason to stick around.

Apple tv plus tv app 091019

Other networks with a half-dozen major series can afford a few flops because there’s a library of classics that’s filling up the dead space. Apple’s strategy is bold but is going to lead to awfully high churn among consumers that won’t be as forgiving of bad bets. This is an issue that’s sure to become less pronounced over time, but I would bet there will be quite a few consumers unsubscribing in the mean time leaving those on freebie subscriptions responsible for gauging which new shows are top notch.

Apple has also made the weird move of not housing their content inside an app so much as the Apple TV’s alternative UI inside the TV app. One one hand, this makes the lack of content less visible, but it also pushes all of the original series to the back of your mind. If you’re a Netflix user who has been subconsciously trained never to use the TV app on your Apple TV because none of their content is housed there, you’re really left forgetting about TV+ shows entirely when using the traditional app layout.

We haven’t received any super early numbers on Apple News+, Apple Arcade or Apple TV+, but none of the three appears to have made the sizable cultural splashes in their debuts that were hoped for at launch. Apple’s biggest bet of the three was undoubtedly TV+ and while their first series haven’t seemed to drop any jaws, what’s more concerning is whether the fundamentals of the service have been arranged so that unsatisfied subscribers feel any need to stick around.

Send me feedback
on Twitter @lucasmtny or email
lucas@techcrunch.com

On to the rest of the week’s news.

Image via AMY OSBORNE/AFP/Getty Images

Trends of the week

Here are a few big news items from big companies, with green links to all the sweet, sweet added context:

  • Facebook buys a game studio building Light saber Fruit Ninja
    One of the things I wrote about this week was Facebook buying the game studio behind one of virtual reality’s most popular titles, Beat Saber. No details on a price tag for the deal, but the buy brings the hop IP underneath Facebook’s corporate umbrella which seems poised to be eying more VR content acquisitions.
  • Twitter plans for account memorials
    Almost any time Twitter decides to make a big product change, one gets the feeling it was either snuck through or brute-forced by the CEO or another exec. That’s because there often doesn’t seem to be a lot of consideration for caveats that users seem to collectively identify almost immediately. This week was time for another one of these situations, after Twitter announced it was planning to deactivate old unused Twitter accounts en masse, something users realized was just going to lead to deactivating deceased people’s accounts and erasing what they had ever tweeted. Twitter, to their credit, decided to pause and rethink things.

GAFA Gaffes

How did the top tech companies screw up this week? This clearly needs its own section, in order of badness:

  1. Google appears to bring the hammer down on activism:
    [Google employee activist says she has been fired]

Disrupt Berlin

DISRUPT SF 530X350 V2 berlin

It’s hard to believe it’s already that time of the year again, but we just announced the agenda for Disrupt Berlin and we’ve got some all-stars making their way to the stage. I’ll be there this year, get some tickets and come say hey!

Sign up for more newsletters in your inbox (including this one) here.



from TechCrunch https://ift.tt/2LaHGCM
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support