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();

Thursday 30 January 2020

Snapchat launches Bitmoji TV: zany 4-min cartoons of your avatar

If you were the star of every show, would you watch more mobile television? Snapchat is betting that narcissism drives resonance for its new weekly videos that put your and your friends’ customizable Bitmoji avatars into a flurry of silly animated situations. Bitmoji TV premieres on Saturday morning, and it’s remarkably funny, exciting, and addictive. Think cartoon SNL watched on fast-forward with you playing a secret agent, a zombie president, or a Moonlympics athlete.

It’s a style of content only Snapchat could pull off that relies on ubiquitous personalized avatars only Snapchat owns. Snapchat says 70% of its daily active users, or 147 million of its 210 million, have made themselves a Bitmoji. Snapchat bought Bitmoji’s parent company Bitstripsacqu in 2016 for a steal at $62.5 million, and it’s paying off. Amidst a sea premium video and haphazard Stories that blur together across streaming services and social apps, Snapchat finally found something Facebook can’t copy.

“We really believe that we have invented a new category of entertainment. It’s scripted but it’s personalized. You could take that in a million directions” says Bitmoji co-founder and CEO Ba Blackstock who wrote and directed Bitmoji TV. “First and foremost, I hope that everyone who watches this has kind of a mind blowing experience that they’ve never had before.”

Bitmoji TV, which TechCrunch was first to report Snapchat was building last month, will have its own Snapchat Show page where users can subscribe to get notifications and see new episodes on the Discover Page.

They’re designed to be PG-13 with some bleeped out swearing and a little bloody violence. The shows are made out of Bitmoji’s Toronto office and are based on North American TV, film, and advertising. Each episode cuts away and back to a main story, with the first two centered around an America’s Best Bitmoji game show and a Mime Cops hostage negotiation. Interspersed are ‘channel flips’ between shorter single-gag clips that take your avatar into sit-coms, soap operas, action movies, and informercials.

But you’re not alone it Bitmoji TV. Your co-star in these segments is the Bitmoji of whichever person you last interacted with on Snapchat. That lets you control whether you want your best friend, your significant other, or some rando alongside you. That decision will change the way you interpret the jokes and scenes.

Getting philosophical, Blackstock explains that “When you say words to me, it’s not just your words in a vacuum. They’re coming from you. You’re the medium . . . In any narrative fiction you learn about the characters, they have back story, they have relationships that exist under the story that color it.” Who you make your supporting actor lends personal subtext that enriches each story. That’s one reason you can’t download or easily share clips of your version of Bitmoji TV, and Snap instead just lets you share a link to watch the real thing. Blackstock says it just doesn’t have the same effect if you’re not in the spotlight.

One thing you won’t find in Bitmoji TV, at least at first, are advertisements. The initial 10 episode season won’t have them. But that does seem to be the plan. When I asked Blackstock about monetizing the show, he said “You can imagine. Discover has a business model of showing ads.” Snapchat would get to keep that ad money since it makes Bitmoji TV rather than paying it out with revenue shares or by buying content. Just as we’ve seen music and video streaming apps move to cut royalty expenses by creating content in-house, Snap seems to have the same idea.

Snapchat has yet to monetize Bitmoji directly beyond its merchandise store where you can get yours on t-shirts and mugs. Surprisingly, it doesn’t sell premium or branded clothes and looks for Bitmoji, nor allow brands to pay to have their apparel featured. Snap did recently start letting people mix-and-match clothes for their Bitmoji, and when asked if that could foreshadow a revenue opportunity, Blackstock said “You gotta build the store before you start selling the clothes . . . this was a foundational evolution designed to not only improve the experience for users but to set the stage for things to come.”

Having watched the first three episodes, I’m pretty certain Bitmoji TV is going to be a hit. The show embodies the whimsy of Snapchat and the youth culture of the community who uses it. It’s rare to see something so premium but so unabashedly weird. It’s remininscent of the Rick & Morty ‘Interdimensional Cable’ episodes that similarly features rapid-fire snippets of fake and absurd TV shows.

Yet “the idea for Bitmoji TV actually precedes Bitmoji. It’s something I’ve been thinking about since those days [before Snapchat acquired it.] In a way it preceding Bitstrips. I’ve been making comics and cartoons since I was a little kid” Blackstock tells me. “That’s how I met two of the co-fodners of Bitstrips was passing them comics in class. Even after school when we had jobs I would draw comics of my co-founder that were very compromising and I would fax them to his office to try to get him fired” he recalls with a hearty laugh. Now he has the budget to make them TV-worthy but meant for your phone.

Snapchat has a good hunch it’s going to work because it’s been testing a comic-stripped down version called Bitmoji Stories. These still or lightly-animated slide shows use the same idea of starring the avatars of you and your friends, but without full-motion video or constant audio. 130 million people have watched Bitmoji Stories since they launched in late 2018.

Blackstock tells me “They were easier to make at a high volume and release ongoingly, which we could put out as a prelude to get our audience ready for personalized content — but also for us to learn from and see how people responded and figure out our own processes in terms of production.” Snapchat had animators and engineers work hand in hand to build a rendering system for Bitmoji Stories and TV. That helps it rapidly produce the personalizable content than can flex to accomodate any shaped avatar without them clipping into their surroundings.

Tonight, Bitmoji TV will receive an in-person ‘silent disco-style’ premiere at Los Angeles’ Soho House. Guests will scan a code on the big screen, don headphones, and each watch on their own phone with themselves as the star.

Snapchat’s head of original content Sean Mills tells me that “New technology will unlock new kinds of storytelling” citing “the power of bringing a user into the experience with their best friends.” Bitmoji TV has certainly found a way to turn vanity into engagement.

If the modern era of visual communication began with the selfie, Snap honed it into a messaging tool. A few words were more interesting with a friend’s face behind it. The original Bitmoji chat stickers let your face say whatever you wanted even without having to get on camera. Snapchat’s new Cameo feature grafts that face into GIFs to express even more complex feelings. And now with Bitmoji TV, an animated version of your face can live out your wildest fantasies or weirdest dreams. That’s something worth tuning into.



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

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support