Web scraping WIP

This commit is contained in:
Brandon Thomas committed 2023-02-05 03:36:17 -05:00
1 parent d63a505b8b
commit 2f4fe2dabc
17 files changed
+402 -5

No files matched your search

+4
View File
@@ -34,6 +34,10 @@ _ignored_schema.rs
# AI Chat Sidecar has its own schema managed by diesel, but we don't care for diesel codegen.
crates/programs/aichatbot-sidecar/_ignored_schema.rs
# AI Chat sidecar's SQlite database shouldn't be checked in
crates/programs/aichatbot-sidecar/database.db
# Old Python virtual environments
models/Wav2Lip/python/
models/tacotron2/python/
Generated
+54
View File
@@ -763,10 +763,12 @@ dependencies = [
"log",
"path-absolutize",
"reqwest",
"rss",
"serde",
"serde_derive",
"serde_json",
"tokio 1.25.0",
"web_scrapers",
]
[[package]]
@@ -962,6 +964,19 @@ dependencies = [
"num-traits",
]
[[package]]
name = "atom_syndication"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91a85f2ee28cbd1ecf91288460f6dc74661fd99b4e9a559836a667ccf63aa38c"
dependencies = [
"chrono",
"derive_builder",
"diligent-date-parser",
"never",
"quick-xml",
]
[[package]]
name = "atomic_refcell"
version = "0.1.9"
@@ -2201,6 +2216,15 @@ dependencies = [
"subtle",
]
[[package]]
name = "diligent-date-parser"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6cf7fe294274a222363f84bcb63cdea762979a0443b4cf1f4f8fd17c86b1182"
dependencies = [
"chrono",
]
[[package]]
name = "dirs"
version = "4.0.0"
@@ -4332,6 +4356,12 @@ dependencies = [
"winapi 0.3.9",
]
[[package]]
name = "never"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91"
[[package]]
name = "new_debug_unreachable"
version = "1.0.4"
@@ -5120,6 +5150,16 @@ version = "1.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0"
[[package]]
name = "quick-xml"
version = "0.27.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffc053f057dd768a56f62cd7e434c42c831d296968997e9ac1f76ea7c2d14c41"
dependencies = [
"encoding_rs",
"memchr",
]
[[package]]
name = "quote"
version = "1.0.23"
@@ -5545,6 +5585,18 @@ dependencies = [
"zeroize",
]
[[package]]
name = "rss"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14816ec8b4e58b34a36adba66dcadd3e1e221dcb0fb2fd83e7c5129ea1a72458"
dependencies = [
"atom_syndication",
"derive_builder",
"never",
"quick-xml",
]
[[package]]
name = "rust-ini"
version = "0.18.0"
@@ -8038,6 +8090,8 @@ name = "web_scrapers"
version = "0.0.1"
dependencies = [
"errors",
"reqwest",
"rss",
"scraper",
]
+2 -1
View File
@@ -29,6 +29,7 @@ Install the following libraries, and see the notes further below about MySQL on
jq # for combining mysql codegen outputs
libmysqlclient-dev
mysql-server
libsqlite3-dev
pkgconf # if using openssl instead of rustls
```
@@ -52,7 +53,7 @@ so we can install the currently published version:
```
cargo install diesel_cli \
--no-default-features \
--features mysql
--features mysql,sqlite
```
If the modern version fails, try installing a cherry-picked version with a
+2
View File
@@ -18,6 +18,8 @@ path = "src/lib.rs"
errors = { path = "../../lib/errors" }
# External
reqwest = { version = "0.11", features = ["json"] } # HTTP Client
rss = "2.0.2"
scraper = "0.14.0"
[dev-dependencies]
@@ -0,0 +1,41 @@
use rss::Channel;
use errors::AnyhowResult;
const RSS_TOP_STORIES : &'static str = "http://rss.cnn.com/rss/cnn_topstories.rss";
const RSS_WORLD : &'static str = "http://rss.cnn.com/rss/cnn_world.rss";
const RSS_US : &'static str = "http://rss.cnn.com/rss/cnn_us.rss";
const RSS_TECH : &'static str = "http://rss.cnn.com/rss/cnn_tech.rss";
pub async fn cnn_scraper_test() -> AnyhowResult<()> {
let content = reqwest::get(RSS_TOP_STORIES)
.await?
.bytes()
.await?;
let channel = Channel::read_from(&content[..])?;
for item in channel.items {
println!("\n\nItem: {:?}", item);
let maybe_image_url = item.extensions.get("media")
.map(|media| media.get("group"))
.flatten()
.map(|group| group.get(0))
.flatten()
.map(|extension| extension.children.get("content"))
.flatten()
.map(|extensions| extensions.get(0)) // NB: First image is biggest
.flatten()
.map(|extension| extension.attrs.get("url"))
.flatten();
if let Some(image_url) = maybe_image_url {
println!("\n-{:?} ", image_url);
}
}
Ok(())
}
+4 -2
View File
@@ -19,6 +19,7 @@ actix_helpers = { path = "../../lib/actix_helpers" }
errors = { path = "../../lib/errors" }
files = { path = "../../lib/files" }
http_server_common = { path = "../../lib/http_server_common" }
web_scrapers = { path = "../../lib/web_scrapers" }
# External
clap = "2.34.0" # TODO: This is really out of date, but has conflicts when updated
@@ -30,8 +31,9 @@ path-absolutize = "3.0.14" # Absolute paths have not stabilized in Rust yet
# Async Runtime
tokio = { version = "1.6.0", features = ["macros"] }
# HTTP Client
reqwest = { version = "0.11", features = ["json"] }
# Content downloads
reqwest = { version = "0.11", features = ["json"] } # HTTP Client
rss = "2.0.2"
# Webserver
actix-cors = "0.6.0-beta.3"
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE web_scraping_targets;
@@ -0,0 +1,26 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- NB: These tables are designed for sqlite, not MySQL!
CREATE TABLE web_scraping_targets (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
-- Effectively an enum-like: CnnArticle, SlashdotArticle, HackerNewsThread, etc.
web_content_type TEXT NOT NULL,
-- Canonical URLs help us avoid aliases of the same content.
-- We'll need to figure this out for each site.
canonical_url TEXT NOT NULL UNIQUE,
-- Scraping status: "new", "failed", "permanently_failed", "success"
scraping_status TEXT DEFAULT "new" NOT NULL,
scrape_attempts INT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL,
fetched_at DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL
);
CREATE INDEX index_scraping_status ON web_scraping_targets(scraping_status);
@@ -0,0 +1 @@
-- This file should undo anything in `up.sql`
@@ -0,0 +1 @@
-- This file should undo anything in `up.sql`
Whitespace-only changes.
@@ -1,3 +1,4 @@
pub mod cnn;
pub mod hackernews;
pub mod reddit;
pub mod reuters;
+12 -2
View File
@@ -18,6 +18,7 @@ use async_openai::Client;
use clap::{App, Arg};
use crate::gui::launch_gui::launch_gui;
use crate::main_loop::main_loop;
use crate::persistence::save_directory::SaveDirectory;
use crate::shared_state::app_control_state::AppControlState;
use crate::startup_args::get_startup_args;
use crate::web_server::launch_web_server::{launch_web_server, LaunchWebServerArgs};
@@ -27,10 +28,19 @@ use std::sync::Arc;
use std::thread;
use std::time::Duration;
use tokio::runtime::Runtime;
use crate::persistence::save_directory::SaveDirectory;
use web_scrapers::sites::cnn::cnn_scraper::cnn_scraper_test;
#[tokio::main]
pub async fn main() -> AnyhowResult<()> {
cnn_scraper_test().await;
Ok(())
}
#[actix_web::main]
pub async fn main() -> AnyhowResult<()> {
pub async fn main2() -> AnyhowResult<()> {
easyenv::init_all_with_default_logging(Some("info"));
// NB: Do not check this secrets-containing dotenv file into VCS.
+1
View File
@@ -105,6 +105,7 @@ demo
firehose
guide
jobs
landing
leaderboard
login
moderation
@@ -0,0 +1,246 @@
<!DOCTYPE html>
<html lang="en-US" class="no-js">
<head>
<script type="text/javascript">
!function(){var n,o,i,e="renderMode=ie11";n=window.navigator.userAgent,o=n.indexOf("MSIE "),i=n.indexOf("Trident/"),(o>0||i>0)&&-1===window.location.href.indexOf(e)&&(window.location=window.location.href+("?"===document.location.search[0]?"&":"?")+e)}();
</script>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta name="viewport" content="width=device-width">
<meta name="viewport" content="initial-scale=1.0,width=device-width,user-scalable=no,minimum-scale=1.0,maximum-scale=1.0">
<link rel="profile" href="http://gmpg.org/xfn/11">
<link rel="pingback" href="https://techcrunch.com/xmlrpc.php">
<script type="application/javascript">
if ( ! window.isSSR ) {
!function(){var e,t,n,i,r={passive:!0,capture:!0},a=new Date,o=function(){i=[],t=-1,e=null,f(addEventListener);},c=function(i,r){e||(e=r,t=i,n=new Date,f(removeEventListener),u());},u=function(){if(t>=0&&t<n-a){var r={entryType:"first-input",name:e.type,target:e.target,cancelable:e.cancelable,startTime:e.timeStamp,processingStart:e.timeStamp+t};i.forEach((function(e){e(r);})),i=[];}},s=function(e){if(e.cancelable){var t=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){c(e,t),a();},i=function(){a();},a=function(){removeEventListener("pointerup",n,r),removeEventListener("pointercancel",i,r);};addEventListener("pointerup",n,r),addEventListener("pointercancel",i,r);}(t,e):c(t,e);}},f=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,s,r)}));},p="hidden"===document.visibilityState?0:1/0;addEventListener("visibilitychange",(function e(t){"hidden"===document.visibilityState&&(p=t.timeStamp,removeEventListener("visibilitychange",e,!0));}),!0);o(),self.webVitals={firstInputPolyfill:function(e){i.push(e),u();},resetFirstInputPolyfill:o,get firstHiddenTime(){return p}};}();
}
</script>
<script defer async src="https://s.yimg.com/aaq/pv/perf-vitals_2.0.0.js"></script> <script type="application/javascript">
!function(){var n="//"+window.location.hostname+"/wp-json/tc/v1/users/check_login";fetch(n,{method:"POST",headers:{"Content-Type":"application/json; charset=utf-8"},credentials:"include"}).then(function(n){window.tc_profile={resp:n}})}();
</script>
<meta name='robots' content='index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1' />
<!-- This site is optimized with the Yoast SEO Premium plugin v19.5 (Yoast SEO v19.11) - https://yoast.com/wordpress/plugins/seo/ -->
<title>&#039;Nothing, Forever,&#039; an AI &#039;Seinfeld&#039; spoof, is the next &#039;Twitch Plays Pokémon&#039; &bull; TechCrunch</title>
<meta name="description" content="The constant deluge of gimmicky AI art is exhausting, but &quot;Nothing, Forever&quot; is so absurd that it actually works." />
<link rel="canonical" href="https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/" />
<meta property="og:locale" content="en_US" />
<meta property="og:type" content="article" />
<meta property="og:title" content="&#039;Nothing, Forever,&#039; an AI &#039;Seinfeld&#039; spoof, is the next &#039;Twitch Plays Pokémon&#039;" />
<meta property="og:description" content="The constant deluge of gimmicky AI art is exhausting, but &quot;Nothing, Forever&quot; is so absurd that it actually works." />
<meta property="og:url" content="https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/" />
<meta property="og:site_name" content="TechCrunch" />
<meta property="article:publisher" content="https://www.facebook.com/techcrunch" />
<meta property="article:published_time" content="2023-02-03T14:52:19+00:00" />
<meta property="article:modified_time" content="2023-02-03T17:07:38+00:00" />
<meta property="og:image" content="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png?resize=1200,738" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="738" />
<meta property="og:image:type" content="image/png" />
<meta name="author" content="Amanda Silberling" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:creator" content="@TechCrunch" />
<meta name="twitter:site" content="@TechCrunch" />
<meta name="twitter:label1" content="Written by" />
<meta name="twitter:data1" content="Amanda Silberling" />
<meta name="twitter:label2" content="Est. reading time" />
<meta name="twitter:data2" content="7 minutes" />
<script type="application/ld+json" class="yoast-schema-graph">{"@context":"https://schema.org","@graph":[{"@type":"NewsArticle","@id":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/#article","isPartOf":{"@id":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/"},"author":[{"@type":"Person","name":"Amanda Silberling"}],"headline":"&#8216;Nothing, Forever,&#8217; an AI &#8216;Seinfeld&#8217; spoof, is the next &#8216;Twitch Plays Pokémon&#8217;","datePublished":"2023-02-03T14:52:19+00:00","dateModified":"2023-02-03T17:07:38+00:00","mainEntityOfPage":{"@id":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/","@type":"WebPage"},"wordCount":1324,"commentCount":0,"publisher":{"@type":"Organization","name":"TechCrunch","logo":{"@type":"imageObject","url":"https://techcrunch.com/wp-content/themes/techcrunch-2017/images/logo-json-ld.png","width":"600","height":"60"}},"image":{"@type":"ImageObject","url":"https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png?w=680","width":680,"height":418},"thumbnailUrl":"https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png","keywords":["ChatGPT","gpt-3","Open AI","Seinfeld","unity"],"articleSection":["Media &amp; Entertainment","Robotics &amp; AI"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/#respond"]}],"description":"&#8220;So, I was at the store the other day, and as I&#8217;m checking out, the cashier asks me if I have any coupons, and I say, &#8216;No coupon problem!&#039;&#8221; recalls a pixelated, barely three-dimensional figure that vaguely resembles Jerry Seinfeld. &#8220;So I&#8217;m walking down the street, and this guy comes up to me and says, [&hellip;]","speakable":{"@type":"SpeakableSpecification","cssSelector":[".alpha","#speakable-summary"]}},{"@type":"WebPage","@id":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/","url":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/","name":"'Nothing, Forever,' an AI 'Seinfeld' spoof, is the next 'Twitch Plays Pokémon' &bull; TechCrunch","isPartOf":{"@id":"https://techcrunch.com/#website"},"primaryImageOfPage":{"@id":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/#primaryimage"},"image":{"@id":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/#primaryimage"},"thumbnailUrl":"https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png","datePublished":"2023-02-03T14:52:19+00:00","dateModified":"2023-02-03T17:07:38+00:00","description":"The constant deluge of gimmicky AI art is exhausting, but \"Nothing, Forever\" is so absurd that it actually works.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/#primaryimage","url":"https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png","contentUrl":"https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png","width":1690,"height":1040,"caption":"illustration of NY apartment buildings"},{"@type":"WebSite","@id":"https://techcrunch.com/#website","url":"https://techcrunch.com/","name":"TechCrunch","description":"Startup and Technology News","publisher":{"@id":"https://techcrunch.com/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https://techcrunch.com/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https://techcrunch.com/#organization","name":"TechCrunch","url":"https://techcrunch.com/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://techcrunch.com/#/schema/logo/image/","url":"https://techcrunch.com/wp-content/uploads/2018/04/tc-logo-2018-square-reverse2x.png","contentUrl":"https://techcrunch.com/wp-content/uploads/2018/04/tc-logo-2018-square-reverse2x.png","width":2000,"height":2000,"caption":"TechCrunch"},"image":{"@id":"https://techcrunch.com/#/schema/logo/image/"},"sameAs":["https://www.linkedin.com/company/techcrunch/","https://www.reddit.com/r/techcrunch/","https://www.youtube.com/channel/UCCjyq_K1Xwfg8Lndy7lKMpA","https://www.facebook.com/techcrunch","https://twitter.com/TechCrunch"]},{"@type":"Person","@id":"https://techcrunch.com/#/schema/person/cfab5d6c16b528eca061f9c5d2fcd40b","name":"Amanda Silberling","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https://techcrunch.com/#/schema/person/image/","url":"https://secure.gravatar.com/avatar/92a3a03d2114889d0a09d1f9f34abLine truncated
<!-- / Yoast SEO Premium plugin. -->
<link rel='dns-prefetch' href='//cdn.parsely.com' />
<link rel='dns-prefetch' href='//s.yimg.com' />
<link rel='dns-prefetch' href='//consent.cmp.oath.com' />
<link rel='dns-prefetch' href='//use.typekit.net' />
<link rel='dns-prefetch' href='//cdn.vidible.tv' />
<link rel='preconnect' href='//googleads.g.doubleclick.net' />
<link rel='preconnect' href='//pagead2.googlesyndication.com' />
<link rel='preconnect' href='//use.typekit.net' />
<link rel='preconnect' href='//jac.yahoosandbox.com' />
<link rel='preconnect' href='//s.yimg.com' />
<link rel='preconnect' href='//api.parsely.com' />
<link rel='preconnect' href='//sp.analytics.yahoo.com' />
<link rel='preconnect' href='//connect.facebook.net' />
<link rel="alternate" type="application/rss+xml" title="TechCrunch &raquo; Feed" href="https://techcrunch.com/feed/" />
<link rel="alternate" type="application/rss+xml" title="TechCrunch &raquo; Comments Feed" href="https://techcrunch.com/comments/feed/" />
<link rel="alternate" type="application/rss+xml" title="TechCrunch &raquo; &#8216;Nothing, Forever,&#8217; an AI &#8216;Seinfeld&#8217; spoof, is the next &#8216;Twitch Plays Pokémon&#8217; Comments Feed" href="https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/feed/" />
<script type="text/javascript">
window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/14.0.0\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/techcrunch.com\/wp-includes\/js\/wp-emoji-release.min.js?ver=6.1.1"}};
/*! This file is auto-generated */
!function(e,a,t){var n,r,o,i=a.createElement("canvas"),p=i.getContext&&i.getContext("2d");function s(e,t){var a=String.fromCharCode,e=(p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,e),0,0),i.toDataURL());return p.clearRect(0,0,i.width,i.height),p.fillText(a.apply(this,t),0,0),e===i.toDataURL()}function c(e){var t=a.createElement("script");t.src=e,t.defer=t.type="text/javascript",a.getElementsByTagName("head")[0].appendChild(t)}for(o=Array("flag","emoji"),t.supports={everything:!0,everythingExceptFlag:!0},r=0;r<o.length;r++)t.supports[o[r]]=function(e){if(p&&p.fillText)switch(p.textBaseline="top",p.font="600 32px Arial",e){case"flag":return s([127987,65039,8205,9895,65039],[127987,65039,8203,9895,65039])?!1:!s([55356,56826,55356,56819],[55356,56826,8203,55356,56819])&&!s([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]);case"emoji":return!s([129777,127995,8205,129778,127999],[129777,127995,8203,129778,127999])}return!1}(o[r]),t.supports.everything=t.supports.everything&&t.supports[o[r]],"flag"!==o[r]&&(t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&t.supports[o[r]]);t.supports.everythingExceptFlag=t.supports.everythingExceptFlag&&!t.supports.flag,t.DOMReady=!1,t.readyCallback=function(){t.DOMReady=!0},t.supports.everything||(n=function(){t.readyCallback()},a.addEventListener?(a.addEventListener("DOMContentLoaded",n,!1),e.addEventListener("load",n,!1)):(e.attachEvent("onload",n),a.attachEvent("onreadystatechange",function(){"complete"===a.readyState&&t.readyCallback()})),(e=t.source||{}).concatemoji?c(e.concatemoji):e.wpemoji&&e.twemoji&&(c(e.twemoji),c(e.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
display: inline !important;
border: none !important;
box-shadow: none !important;
height: 1em !important;
width: 1em !important;
margin: 0 0.07em !important;
vertical-align: -0.1em !important;
background: none !important;
padding: 0 !important;
}
</style>
<link rel='stylesheet' id='all-css-0' href='https://techcrunch.com/_static/??-eJyNj9EOgjAMRX/I0aAJ6IPxW0bXwLSMZS0x+3sHRgOJDz7e9p72XnhG4wPy7EgARcB5Ueh4wodh3yWbMohmpmr0oSqGA2yJu8BIzltiGinoTkS2mZJh6i3m//Cy2+odhFPQ9cVsIs+9DwJCNuEAxFbUY0z0yb8USWWs5EycRMW8G61N5HeWhcFySTwaHcr/r+82XuumPZ6bU1tfXieLcfE=' type='text/css' media='all' />
<style id='global-styles-inline-css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--duotone--dark-grayscale: url('#wp-duotone-dark-grayscale');--wp--preset--duotone--grayscale: url('#wp-duotone-grayscale');--wp--preset--duotone--purple-yellow: url('#wp-duotone-purple-yellow');--wp--preset--duotone--blue-red: url('#wp-duotone-blue-red');--wp--preset--duotone--midnight: url('#wp-duotone-midnight');--wp--preset--duotone--magenta-yellow: url('#wp-duotone-magenta-yellow');--wp--preset--duotone--purple-green: url('#wp-duotone-purple-green');--wp--preset--duotone--blue-orange: url('#wp-duotone-blue-orange');--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;}:where(.is-layout-flex){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}Line truncated
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='all-css-2' href='https://techcrunch.com/wp-content/themes/techcrunch-2017/build/ec/css/main.css?m=1674715464g' type='text/css' media='all' />
<meta name="oath:guce:product-eu" content="false" />
<meta name="oath:guce:consent-host" content="guce.techcrunch.com" />
<meta name="oath:guce:inline-consent" content="true"/>
<script async src="//s.yimg.com/oa/consent.js?tc_ver=230204"></script>
<script src='https://s.yimg.com/ss/rapid3.js?ver=20230204' id='tc-rapid-analytics-js'></script>
<script src='https://consent.cmp.oath.com/cmpStub.min.js?ver=20230204' id='tc-gdpr-cmp-stub-js'></script>
<script src='https://s.yimg.com/cx/acookie/acookie.js?ver=20230204' id='tc-gdpr-acookie-js'></script>
<script src='https://s.yimg.com/pv/static/assistjs/desktop-v1.0.70.js?ver=20230204' id='tc-yahoo-assist-js'></script>
<script src='//cdn.vidible.tv/prod/player/js/latest/vidible-min.js?ver=20230204' id='tc-vidible-js-js'></script>
<link rel="https://api.w.org/" href="https://techcrunch.com/wp-json/" /><link rel="alternate" type="application/json" href="https://techcrunch.com/wp-json/wp/v2/posts/2479489" /><link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://techcrunch.com/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://techcrunch.com/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress 6.1.1" />
<link rel='shortlink' href='https://techcrunch.com/?p=2479489' />
<link rel="alternate" type="application/json+oembed" href="https://techcrunch.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ftechcrunch.com%2F2023%2F02%2F03%2Fnothing-forever-ai-generated-seinfeld-twitch%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://techcrunch.com/wp-json/oembed/1.0/embed?url=https%3A%2F%2Ftechcrunch.com%2F2023%2F02%2F03%2Fnothing-forever-ai-generated-seinfeld-twitch%2F&#038;format=xml" />
<!-- BEGIN Sailthru Horizon Meta Information -->
<meta name="sailthru.date" content="2023-02-03 06:52:19" />
<meta name="sailthru.title" content="&#8216;Nothing, Forever,&#8217; an AI &#8216;Seinfeld&#8217; spoof, is the next &#8216;Twitch Plays Pokémon&#8217;" />
<meta name="sailthru.tags" content="ChatGPT, gpt-3, Open AI, Seinfeld, unity" />
<meta name="sailthru.author" content="Amanda Silberling" />
<meta name="sailthru.description" content="&#8220;So, I was at the store the other day, and as I&#8217;m checking out, the cashier asks me if I have any coupons, and I say, &#8216;No coupon problem!&#039;&#8221; recalls a pixelated, barely three-dimensional figure that vaguely resembles Jerry Seinfeld. &#8220;So I&#8217;m walking down the street, and this guy comes up to me and says, [&hellip;]" />
<meta name="sailthru.image.full" content="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png" />
<meta name="sailthru.image.thumb" content="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png?w=50" />
<!-- END Sailthru Horizon Meta Information -->
<style>img#wpstats{display:none}</style>
<meta name="parsely-title" content="&#8216;Nothing, Forever,&#8217; an AI &#8216;Seinfeld&#8217; spoof, is the next &#8216;Twitch Plays Pokémon&#8217;" />
<meta name="parsely-link" content="https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/" />
<meta name="parsely-type" content="post" />
<meta name="parsely-pub-date" content="2023-02-03T14:52:19+00:00" />
<meta name="parsely-image-url" content="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png?w=680" />
<meta name="parsely-author" content="Amanda Silberling" />
<meta name="parsely-section" content="Media &amp; Entertainment" />
<meta name="parsely-tags" content="@post-id:2479489,robotics &amp; ai,chatgpt,gpt-3,open ai,seinfeld,unity" />
<meta name="parsely-metadata" content="{&quot;@type&quot;:&quot;NewsArticle&quot;,&quot;mainEntityOfPage&quot;:{&quot;@type&quot;:&quot;WebPage&quot;},&quot;dateModified&quot;:&quot;2023-02-03T17:07:38+00:00&quot;,&quot;description&quot;:&quot;&#8220;So, I was at the store the other day, and as I&#8217;m checking out, the cashier asks me if I have any coupons, and I say, &#8216;No coupon problem!&#039;&#8221; recalls a pixelated, barely three-dimensional figure that vaguely resembles Jerry Seinfeld. &#8220;So I&#8217;m walking down the street, and this guy comes up to me and says, [&hellip;]&quot;,&quot;speakable&quot;:{&quot;@type&quot;:&quot;SpeakableSpecification&quot;,&quot;cssSelector&quot;:[&quot;.alpha&quot;,&quot;#speakable-summary&quot;]},&quot;publisher&quot;:{&quot;@type&quot;:&quot;Organization&quot;,&quot;name&quot;:&quot;TechCrunch&quot;,&quot;logo&quot;:{&quot;@type&quot;:&quot;imageObject&quot;,&quot;url&quot;:&quot;https:\/\/techcrunch.com\/wp-content\/themes\/techcrunch-2017\/images\/logo-json-ld.png&quot;,&quot;width&quot;:&quot;600&quot;,&quot;height&quot;:&quot;60&quot;}}}" /> <script type="text/javascript">
function e(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],c=document.createElement("script");c.src=e,t?c.type="module":(c.async=!0,c.type="text/javascript",c.setAttribute("nomodule",""));var n=document.getElementsByTagName("script")[0];n.parentNode.insertBefore(c,n)}function t(t,c,n){var a,o,r;null!==(a=t.marfeel)&&void 0!==a||(t.marfeel={}),null!==(o=(r=t.marfeel).cmd)&&void 0!==o||(r.cmd=[]),t.marfeel.config=n,t.marfeel.config.accountId=c;var i="https://sdk.mrf.io/statics";e("".concat(i,"/marfeel-sdk.js?id=").concat(c),!0),e("".concat(i,"/marfeel-sdk.es5.js?id=").concat(c),!1)}!function(e,c){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};t(e,c,n)}(window,1860,{} /*config*/);
</script>
<meta name="cXenseParse:articleid" content="2479489" /><meta name="cXenseParse:title" content="&#039;Nothing, Forever,&#039; an AI &#039;Seinfeld&#039; spoof, is the next &#039;Twitch Plays Pokémon&#039;" /><meta name="cXenseParse:postType" content="post" /><meta name="cXenseParse:keywords" content="media &amp; entertainment,robotics &amp; ai,chatgpt,gpt-3,open ai,seinfeld,unity" /><meta name="cXenseParse:news_keywords" content="media &amp; entertainment,robotics &amp; ai,chatgpt,gpt-3,open ai,seinfeld,unity" /><meta property="cXenseParse:author" data-separator="," content="Amanda Silberling" /><meta name="cXenseParse:recs:publishtime" content="2023-02-03T14:52:19Z" /><meta name="cXenseParse:modified_time" content="2023-02-03T17:07:38Z" /><meta name="cXenseParse:pageClass" content="article" /><meta name="cXenseParse:description" content="&#8220;So, I was at the store the other day, and as I&#8217;m checking out, the cashier asks me if I have any coupons, and I say, &#8216;No coupon problem!&#039;&#8221; recalls a pixelated, barely three-dimensional figure that vaguely resembles Jerry Seinfeld. &#8220;So I&#8217;m walking down the street, and this guy comes up to me and says, [&hellip;]" /><meta name="cXenseParse:url" content="https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/" /><meta name="cXenseParse:image" content="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png?w=650" /> <meta property="fb:app_id" content="187288694643718" />
<meta property="fb:pages" content="8062627951" />
<meta property="fb:admins" content="8803025,726995222,1550970059,1661021707,1178144075,643979435,4700188" />
<meta property="article:publisher" content="https://www.facebook.com/techcrunch" />
<script async src="https://consent.cmp.oath.com/cmp.js" type="text/javascript" id="tc-gdpr-cmp"></script> <script data-ad-client="ca-pub-2508481855317367" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script type="text/javascript">var ajaxurl = "https://techcrunch.com/wp-admin/admin-ajax.php"</script><link rel="amphtml" href="https://techcrunch.com/2023/02/03/nothing-forever-ai-generated-seinfeld-twitch/amp/"><link rel="icon" href="https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=32" sizes="32x32" />
<link rel="icon" href="https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=192" sizes="192x192" />
<link rel="apple-touch-icon" href="https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=180" />
<meta name="msapplication-TileImage" content="https://techcrunch.com/wp-content/uploads/2015/02/cropped-cropped-favicon-gradient.png?w=270" />
<script type="text/javascript">
const desktopSpaceId = "1197802919";
const mobileSpaceId = "1197802920";
const mnPlacements = '{"amp_footer":{"alias":"93523784","sizes":["6x2"]},"amp_leaderboard":{"alias":"963912137","sizes":["6x2"]},"amp_midarticle":{"alias":"963923315","sizes":["6x2"]},"article_footer":{"alias":"963908972","sizes":"LB"},"leaderboard":{"alias":"93484975","sizes":"LB"},"midarticle1":{"alias":"963923871","sizes":["6x2"]},"midarticle2":{"alias":"963923883","sizes":["6x2"]},"mobile_footer":{"alias":"93484973","sizes":"MM"},"mobile_leaderboard":{"alias":"93484974","sizes":"MM"},"mobile_midarticle1":{"alias":"963923872","sizes":["6x2"]},"mobile_midarticle2":{"alias":"963923884","sizes":["6x2"]},"native_inriver":{"alias":"93501877","sizes":["6x2"]},"native_midarticle":{"alias":"963922183","sizes":["6x2"]},"native_mobile_footer":{"alias":"963923619","sizes":["6x2"]},"native_mobile_inriver":{"alias":"93501878","sizes":["6x2"]},"native_mobile_midarticle":{"alias":"963922184","sizes":["6x2"]},"native_rightrail1":{"alias":"963912090","sizes":["6x2"]},"native_rightrail2":{"alias":"963913332","sizes":["6x2"]},"rightrail1":{"alias":"93484976","sizes":"RR"},"rightrail2":{"alias":"963913913","sizes":"RR"},"xl_midarticle1":{"alias":"963923870","sizes":["6x2"]},"xl_midarticle2":{"alias":"963923882","sizes":["6x2"]}}';
!function(){const userAgent=window.navigator.userAgent;window.spaceId=desktopSpaceId,(/Android|webOS|iPhone|iPod|Blackberry|Mobile|mobile/i.test(userAgent)||/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(userAgent.substr(0,4)))&&(window.spaceId=mobileSpaceId),window.JAC_CONFIG={service:{adServer:{"1AS":{region:"US"}},site:{name:"TechCrunch",spaceId:window.spaceId},debug:!1,positions:JSON.parse(mnPlacements)},client:{onReady:function(){window.JAC&&(window.JAC_READY=!0,document.dispatchEvent(new CustomEvent("JACReady")),window.JAC.on("FETCH_ERROR",e=>{e.meta.positionNames.length>0&&e.meta.positionnames.forEach(e=>{document.dispatchEvent(new CustomEvent(`adEmpty-${e}`,{detail:{id:e}}))})}),window.JAC.on("FETCH_COMPLETE",e=>{let i="",t={width:0,height:0},o=0;if(e.meta.positionNames.length>0&&(i=e.meta.positionNames[0],t=e.meta.response.positions[i].content.size,o=e.meta.response.positions[i].status),null!==document.querySelector(`#tc-ad-${i}`)&&1===o){let e=t.width,o=t.height;i.includes("native")&&(t.width<10||t.height<10)&&(e=859,o=250),document.dispatchEvent(new CustomEvent(`adLoaded-${i}`,{detail:{id:i,width:e,height:o}})),window.JAC.render([i])}else document.dispatchEvent(new CustomEvent(`adEmpty-${i}`,{detail:{id:i}}))}),window.JAC.on("AD_SIZE_CHANGED",e=>{let{positionName:i,width:t,height:o}=e.meta;i.includes("native")&&(t<10||o<10)&&(t=859,o=250),document.dispatchEvent(new CustomEvent(`adLoaded-${i}`,{detail:{id:i,width:t,height:o}}))}))}}};}();
</script>
<script async src="https://jill.fc.yahoo.com/v1/client/js?site.name=TechCrunch"></script></head>
<body class="">
<div id="root">
<div><!-- duplicate React-root div for styling -->
<div class="content">
<article class="article-container article--post ">
<header class="article__header ">
<div class="article__title-wrapper">
<h1 class="article__title">&#8216;Nothing, Forever,&#8217; an AI &#8216;Seinfeld&#8217; spoof, is the next &#8216;Twitch Plays Pokémon&#8217;</h1>
</div>
<div class="article__byline-wrapper">
<div class="article__byline">
<a href="https://techcrunch.com/author/amanda-silberling/">
Amanda Silberling </a>
<span class="article__byline__meta">
22 hours </span>
</div>
</div>
<div class="article__featured-image-wrapper breakout">
<img src="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.55-PM.png?w=650" class="article__featured-image" />
</div>
</header>
<div class="article-content">
<p id="speakable-summary">&#8220;So, I was at the store the other day, and as I&#8217;m checking out, the cashier asks me if I have any coupons, and I say, &#8216;No coupon problem!'&#8221; recalls a pixelated, barely three-dimensional figure that vaguely resembles Jerry Seinfeld. &#8220;So I&#8217;m walking down the street, and this guy comes up to me and says, &#8216;Hey, how&#8217;s it going?&#8217; and I say, &#8216;It&#8217;s going coupon!'&#8221;</p>
<p>An automated laugh track plays, but the joke doesn&#8217;t make sense. Then again, it doesn&#8217;t have to make sense.</p>
<p>&#8220;<a href="https://www.twitch.tv/watchmeforever" target="_blank" rel="noopener">Nothing, Forever</a>&#8221; is a never-ending, AI-generated spoof of &#8220;Seinfeld,&#8221; the show about nothing. It&#8217;s been streaming on Twitch since December, and until a few days ago, the stream had an average of about four concurrent viewers. Now, at the moment I write this, there are 15,097 people watching a group of badly animated friends &#8212; Larry Feinberg, Fred Kastopolous, Yvonne Torres and Zoltan Kalker &#8212; cycling through infinite &#8220;Seinfeld&#8221;-like scenes with very little plot.</p>
<p>The show has been streaming almost non-stop on Twitch since December, but it only reached a wider audience this week, when its creators slowly started promoting the stream on Reddit. Now, &#8220;Nothing, Forever&#8221; has more than 98,000 followers on Twitch, and a Discord channel with about 6,000 members.</p>
<p>Behind the project are Skyler Hartle, a senior product manager at Microsoft, and Brian Habersberger, a polymer physicist. They call themselves Mismatch Media, though this venture remains a side project.</p>
<p>Aptly, the duo met online while playing &#8220;Team Fortress 2&#8221; and they kept in touch over time. Four years ago, they started working on creative projects together.</p>
<p><div id="attachment_2479650" style="width: 690px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2479650" decoding="async" class="size-large wp-image-2479650" src="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?w=680" alt="" width="680" height="371" srcset="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png 1718w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?resize=150,82 150w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?resize=300,164 300w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?resize=768,419 768w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?resize=680,371 680w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?resize=1536,839 1536w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?resize=1200,655 1200w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.46.41-PM.png?resize=50,27 50w" sizes="(max-width: 680px) 100vw, 680px" /><p id="caption-attachment-2479650" class="wp-caption-text"><strong>Image Credits:</strong> <a href="https://www.twitch.tv/watchmeforever" target="_blank" rel="noopener">Nothing, Forever <span class="screen-reader-text">(opens in a new window)</span></a></p></div></p><div class="piano-inline-promo"></div>
<p>&#8220;It kind of started its journey as a kind of art project that Brian approached me with, and we ended up collaborating and working on it together and iterating on it over the last four years,&#8221; Hartle told TechCrunch. &#8220;The show we&#8217;re creating is really cool, and scratches that creative itch as just a surreal, fun kind of project, but we saw the merit of generative technology as a tool for broad-scale content creation and generation.&#8221;</p>
<p>To make &#8220;Nothing, Forever,&#8221; Hartle and Habersberger use various AI models to generate text, speech and movements. The &#8220;script&#8221; of the show comes from an OpenAI <a href="https://techcrunch.com/2021/03/17/okay-the-gpt-3-hype-seems-pretty-reasonable/">GPT-3</a> model, Davinci. To voice the characters, they use the Microsoft Azure Cognitive Services speech API, and the visuals are made on the Unity game engine.</p>
<p>&#8220;The Unity engine just does a lot of interpretation to basically run the show and inherit all this content, and the voices, and all these kinds of other pieces of direction from what we call &#8216;the director&#8217; in the cloud,&#8221; Hartle said. &#8220;And the director dictates what happens on the show from a generative perspective.&#8221;</p>
<p>They set out to create a surrealist, never-ending television show, and it simply made sense to base it on &#8220;Seinfeld,&#8221; a show that has defined the structure of a sitcom.</p>
<p>&#8220;A sitcom has a laugh track and a sort of formulaic structure,&#8221; Habersberger told TechCrunch. &#8220;So when characters are saying things that don&#8217;t quite make sense, but the structure is one that you&#8217;re very familiar with, it really helps you to interpret and make sense of it, even though the sense isn&#8217;t there.&#8221;</p>
<p>AI dialogue can get repetitive. Characters are constantly referencing new restaurants and stores to the point that it&#8217;s become an in-joke. On a fan-made &#8220;Nothing, Forever&#8221; bingo generator, the free space is &#8220;New thing!&#8221;</p>
<p>Per the nascent <a href="https://nothingforever.fandom.com/wiki/Nothing,_Forever_Wiki" target="_blank" rel="noopener">wiki</a>, some <a href="https://nothingforever.fandom.com/wiki/New_Places" target="_blank" rel="noopener">new places</a> include a new type of bagel (it&#8217;s shaped like an octopus, and called the octobagel), a new shake shop (they serve pickles in their shakes), a new taco truck (they sell tacos <em>and</em> burgers) and a new all-you-can-eat buffet (nothing but pink flamingo wings!). One of the few interactive items in Larry&#8217;s apartment is a <a href="https://nothingforever.fandom.com/wiki/Microwave" target="_blank" rel="noopener">microwave</a>, a prop that characters frequently and inexplicably use in ways that have no bearing on the plot &#8212; the microwave has spurred a fandom of its own, custom Discord emojis and all.</p>
<p><div id="attachment_2479644" style="width: 683px" class="wp-caption aligncenter"><img aria-describedby="caption-attachment-2479644" decoding="async" loading="lazy" class="size-large wp-image-2479644" src="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?w=673" alt="" width="673" height="680" srcset="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png 1682w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=148,150 148w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=297,300 297w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=768,776 768w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=673,680 673w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=1520,1536 1520w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=1187,1200 1187w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=32,32 32w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=50,50 50w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=64,64 64w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=96,96 96w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-4.47.01-PM.png?resize=128,128 128w" sizes="(max-width: 673px) 100vw, 673px" /><p id="caption-attachment-2479644" class="wp-caption-text"><strong>Image Credits:</strong> <a href="https://bingobaker.com/#37fe38a38376743b" target="_blank" rel="noopener">Nothing, Forever bingo <span class="screen-reader-text">(opens in a new window)</span></a></p></div></p>
<p>&#8220;To take that idea even further, &#8216;Seinfeld&#8217; is famously the show about nothing. What could be more nothing than a robot, right?&#8221; said Habersberger. &#8220;And then even further with &#8216;Seinfeld,&#8217; there was a period of 15 years or so where you could just turn on the TV, and if you flip through the channels, there&#8217;s a good chance it&#8217;s on, because it was syndicated [&#8230;] So I was like, wait, now it can <em>really </em>be always on.&#8221;</p>
<p>We&#8217;ve all seen far too many AI-generated gimmicks, but the AI isn&#8217;t what&#8217;s most interesting about &#8220;Nothing, Forever.&#8221; It&#8217;s the community that&#8217;s gathered around the stream, making the project feel like this generation&#8217;s &#8220;<a href="https://techcrunch.com/2014/02/17/wtf-is-this/">Twitch Plays Pokémon.</a>&#8221; <img decoding="async" loading="lazy" class="size-large wp-image-2479652" style="font-size: 1rem; letter-spacing: -0.1px;" src="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?w=680" alt="" width="680" height="412" srcset="https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png 1708w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?resize=150,91 150w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?resize=300,182 300w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?resize=768,466 768w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?resize=680,412 680w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?resize=1536,932 1536w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?resize=1200,728 1200w, https://techcrunch.com/wp-content/uploads/2023/02/Screen-Shot-2023-02-02-at-1.43.32-PM.png?resize=50,30 50w" sizes="(max-width: 680px) 100vw, 680px" /></p>
<p><strong>Image Credits:</strong> <a href="https://www.twitch.tv/watchmeforever" target="_blank" rel="noopener">Nothing, Forever <span class="screen-reader-text">(opens in a new window)</span></a></p>
<p>In 2014, an anonymous Australian streamer set up a channel where fans could collaboratively play &#8220;Pokémon Red,&#8221; pressing buttons and moving the player character via Twitch chat commands. When enough players got involved, the stream turned into chaos. (The route through Rock Tunnel is confusing enough, but imagine navigating it with thousands of people clamoring to control the character&#8217;s movement.)</p>
<p>Yet over the two weeks it took to beat the game, fans built deep lore to explain why the character was behaving so erratically. No, we didn&#8217;t keep opening our bag to look at the Helix Fossil because of the chaotic button mashing in the chat; indeed, it was because our player character worshiped the Helix Fossil like a <a href="https://twitchplayswiki.fandom.com/wiki/Lord_Helix" target="_blank" rel="noopener">deity</a>.</p>
<p>In the same vein, &#8220;Nothing, Forever&#8221; fans try to parse dialogue to learn more about the universe of the show. On Discord, fans requested a new channel to keep track of new lore as it develops; one page on the wiki chronicles what we know from past mentions of <a href="https://nothingforever.fandom.com/wiki/Aliens" target="_blank" rel="noopener">aliens</a>. The community also keeps track of Larry&#8217;s recurring standup jokes, which are pretty bad (&#8220;What do you call a bear with no teeth? A gummy bear.&#8221;), but somehow get funnier the more they&#8217;re repeated.</p>
<p>&#8220;The way that the chat is engaging, they&#8217;re kind of creating their own memes and their own culture,&#8221; said Hartle. &#8220;We&#8217;ve had people who have reached out wanting to be community mods and have been watching the show for eight hours at a time.&#8221;</p>
<p>Like &#8220;Twitch Plays Pokémon,&#8221; the creators of &#8220;Nothing, Forever&#8221; hope to include audience participation features in the future. Hartle told TechCrunch that there are not currently any interactivity features embedded in the livestream, though some fans began theorizing that they were causing Larry to repeat his jokes by getting excited when he talked about gummy bears again.</p>
<p>Mismatch Media hopes they can repurpose the tech stack behind &#8220;Nothing, Forever&#8221; into an actual system for creating generative media projects. For now, Hartle and Habersberger are taking things slow with their newfound popularity. They&#8217;ve been able to make a bit of money from Patreon and Twitch subscriptions, but it&#8217;s still unclear how long it will take for the novelty of &#8220;Nothing, Forever&#8221; to wear off.</p>
<p>Sudden virality can&#8217;t last forever. &#8220;Twitch Plays Pokémon&#8221; became an ongoing series after the completion of the first game, but fan engagement dropped drastically once the excitement around the initial experiment died down. Now, we just fondly remember it as a time when the internet felt less hellish, capturing the same lightning in a bottle as projects like <a href="https://en.wikipedia.org/wiki/R/place" target="_blank" rel="noopener">r/Place</a>.</p>
<p>Similarly, it&#8217;s difficult to predict how long &#8220;Nothing, Forever&#8221; will retain its fanbase, and whether or not people would find more joy if the creators started other constant, AI-based sitcom spoofs.</p>
<p>For now, it&#8217;s a simple delight to just click off Twitter and watch Larry tell the same jokes over and over.</p>
<p>&#8220;What did the fish say when it swam into a wall?&#8221;</p>
<p>&#8220;Dam!&#8221;</p>
</div>
<footer class="article-footer">
<input title="Article Shortlink" class="shortlink" readOnly type="text" value="" />
</footer>
</article>
</div>
</div><!-- end React-root duplication div -->
</div><!--end #root-->
<script type="text/javascript">
// Configure the PARSELY window global to disable auto-tracking.
// Must load before the Parse.ly script itself.
window.PARSELY = {
autotrack: false,
onload: this.onload,
};
</script>
<script type="application/javascript">
if ( ! window.isSSR ) {
(function(w,d,t,r,u){w[u]=w[u]||[];w[u].push({'projectId':'10000','properties':{'pixelId':'428726','qstrings': { 'et': 'custom','ea': 'page view','product_id': window.location.pathname,'site': 'techcrunch' },}});var s=d.createElement(t);s.src=r;s.async=true;s.onload=s.onreadystatechange=function(){var y,rs=this.readyState,c=w[u];if(rs&&rs!="complete"&&rs!="loaded"){return}try{y=YAHOO.ywa.I13N.fireBeacon;w[u]=[];w[u].push=function(p){y([p])};y(c)}catch(e){}};var scr=d.getElementsByTagName(t)[0],par=scr.parentNode;par.insertBefore(s,scr)})(window,document,"script","https://s.yimg.com/wi/ytc.js","dotq");
}
</script>
<script id='wp-parsely-api-js-extra'>
var wpParsely = {"apikey":"techcrunch.com"};
</script>
<script type="text/javascript" src="https://techcrunch.com/_static/??-eJx9y00OAiEMQOELCQ1O/JmF8Sw41ElJKaQFzdzeiStXrt/34N0cycIjoUE2SGQdXiipKiiuKKixV3U6pFNBX0h8tgP82fbUKm9PYv7lS5WO0qEM13isJPaVUQ15c5MP8BjECUiou9ho/+7lFs6XU7jO83TMH5n5PgU=" ></script><script data-parsely-site="techcrunch.com" src='https://cdn.parsely.com/keys/techcrunch.com/p.js?ver=3.1.3' id="parsely-cfg"></script>
<script src='https://use.typekit.net/svv7knm.js?ver=20230204' id='tc-typekit-font-js'></script>
<script id='tc-typekit-font-js-after'>
try{Typekit.load({ async: true });}catch(e){}
</script>
<script id='tc-app-js-extra'>
var tc_app_data = {"ads":{"gemini_enabled":false,"gemini_codes":{"position_4":{"mobile":"ae64471c-14c2-4457-8e9b-a5190206eafd","desktop":"b2018d9e-dedc-4e85-8823-b06917beb892"},"position_8":{"mobile":"619392a1-b497-4aa9-b683-24aab7246c16","desktop":"05c0b21d-e742-494d-ac59-474e3feaa4b8"}},"mns":[{"name":"Homepage and its pagination","conditions":{"paths":["(^\/$)|(\/page\/\\d+)"]},"placements":{"native_inriver":"93484857","leaderboard":"93484945","rightrail1":"963923670","native_mobile_inriver":"93484858","mobile_footer":"93484942","mobile_leaderboard":"93484943","native_rightrail2":"963913331","rightrail2":"963913914","native_rightrail1":"963903172","rightrail_feature_island":"93484946","rightrail3":"963924360","rightrail4":"963924361","rightrail5":"963924362","rightrail6":"963924363"}},{"name":"Category - Fintech","conditions":{"taxonomy":"category","terms":["fintech"]},"placements":{"leaderboard":"963926297","rightrail1":"963926298","rightrail2":"963926299","article_footer":"963926296","mobile_leaderboard":"963926303","mobile_footer":"963926304","amp_leaderboard":"963926300","amp_footer":"963926301","amp_midarticle":"963926302","native_rightrail1":"963926303","native_rightrail2":"963926304","native_midarticle":"963922183","native_mobile_footer":"963923619","native_mobile_midarticle":"963922184"}},{"name":"Tag - Fintech","conditions":{"taxonomy":"post_tag","terms":["fintech"]},"placements":{"leaderboard":"963926297","rightrail1":"963926298","rightrail2":"963926299","article_footer":"963926296","mobile_leaderboard":"963926303","mobile_footer":"963926304","amp_leaderboard":"963926300","amp_footer":"963926301","amp_midarticle":"963926302","native_rightrail1":"963926303","native_rightrail2":"963926304","native_midarticle":"963922183","native_mobile_footer":"963923619","native_mobile_midarticle":"963922184"}},{"name":"URL - Fintech","conditions":{"paths":["\/tag\/fintech"]},"placements":{"leaderboard":"963926297","rightrail1":"963926298","rightrail2":"963926299","mobile_leaderboard":"963926303","mobile_footer":"963926304","native_inriver":"93501877","native_mobile_inriver":"93501878"}},{"name":"Tag - Startups","conditions":{"taxonomy":"post_tag","terms":["startups"]},"placements":{"mobile_footer":"93484986","mobile_leaderboard":"93484987","leaderboard":"93484988","amp_leaderboard":"963912138","rightrail1":"93484989","rightrail2":"963913915","article_footer":"963908973","amp_footer":"93523762","amp_midarticle":"963923317","native_midarticle":"963922183","native_rightrail1":"963912091","native_rightrail2":"963913330","native_mobile_midarticle":"963922184","native_mobile_footer":"963923619"}},{"name":"Category - Startups","conditions":{"taxonomy":"category","terms":["startups"]},"placements":{"mobile_footer":"93484986","mobile_leaderboard":"93484987","leaderboard":"93484988","amp_leaderboard":"963912138","rightrail1":"93484989","native_rightrail1":"963912091","article_footer":"963908973","amp_footer":"93523762","native_rightrail2":"963913330","rightrail2":"963913915","amp_midarticle":"963923317","native_midarticle":"963922183","native_mobile_midarticle":"963922184","native_mobile_footer":"963923619"}},{"name":"Tag - 5G","conditions":{"taxonomy":"post_tag","terms":["5g","5G"]},"placements":{"mobile_footer":"963898333","mobile_leaderboard":"963898334","amp_footer":"963898332","leaderboard":"963898335","amp_leaderboard":"963912139","rightrail1":"963898336","native_rightrail1":"963909550","article_footer":"963908970","native_rightrail2":"963913333","amp_midarticle":"963923310","native_midarticle":"963922183","rightrail2":"963913916","native_mobile_midarticle":"963922184","native_mobile_footer":"963923619","midarticle1":"963923874","xl_midarticle1":"963923873","midarticle2":"963923886","xl_midarticle2":"963923885","mobile_midarticle1":"963923875","mobile_midarticle2":"963923887"}},{"name":"URL - 5G","conditions":{"paths":["\/tag\/5g"]},"placements":{"leaderboard":"963898335","rightrail1":"963898336","rightrail2":"963913916","mobile_leaderboard":"963898334","mobile_footer":"963898333","native_inriver":"93501877","native_mobile_inriver":"93501878"}},{"name":"Tag - Disrupt","conditions":{"taxonomy":"post_tag","terms":["disrupt"]},"placements":{"mobile_footer":"93484895","mobile_leaderboard":"93484896","leaderboard":"93484897","amp_leaderboard":"963912142","rightrail1":"93484898","native_rightrail1":"963911273","amp_footer":"93523765","native_rightrail2":"963913336","amp_midarticle":"963923313","native_midarticle":"963922183","native_mobile_midarticle":"963922184","rightrail2":"963913919","article_footer":"963911272","native_mobile_footer":"963923619","midarticle1":"963923880","xl_midarticle1":"963923879","midarticle2":"963923892","xl_midarticle2":"963923891","mobile_midarticle1":"963923881","mobile_midarticle2":"963923893"}},{"name":"Tag - Holiday Gift Guide","conditions":{"taxonomy":"post_tag","terms":["gift-guide-2021"]},"placements":{"mobile_footer":"93484930","mobile_leaderboard":"93484931","leaderboard":"93484932",Line truncated
</script>
<script type="text/javascript" src="https://techcrunch.com/wp-content/themes/techcrunch-2017/build/ec/js/main.js?m=1674805994g" ></script> <script src='https://stats.wp.com/e-202305.js' defer></script>
<script>
_stq = window._stq || [];
_stq.push([ 'view', {v:'ext',blog:'136296444',post:'2479489',tz:'-8',srv:'techcrunch.com',hp:'vip',j:'1:11.7.1'} ]);
_stq.push([ 'clickTrackerInit', '136296444', '2479489' ]);
</script> <!-- Finished rendering TC markup -->
</body>
</html>