cli + tui to publish to leaflet (wip) & manage tasks, notes & watch/read lists ๐Ÿƒ
charm leaflet readability golang

refactor: replace additional lists feat: movie service module

+15491 -2754
+6
CHANGELOG.md
··· 8 8 9 9 ### Added 10 10 11 + #### 2025-09-07 12 + 13 + - Task `context` field with list command (static) 14 + - General data table & data list abstraction on top of bubbles (basically, more consistent UI) 15 + - Media queue service with `colly` (v2), tested with sample files 16 + 11 17 #### 2025-08-23 12 18 13 19 - CLI with cobra and fang integration
+20 -6
go.mod
··· 11 11 12 12 require ( 13 13 github.com/charmbracelet/bubbletea v1.3.4 14 - github.com/charmbracelet/huh v0.7.0 15 14 github.com/google/uuid v1.6.0 16 15 golang.org/x/time v0.12.0 17 16 ) 18 17 19 18 require ( 19 + github.com/PuerkitoBio/goquery v1.10.3 20 + github.com/andybalholm/cascadia v1.3.3 // indirect 21 + github.com/antchfx/htmlquery v1.3.4 // indirect 22 + github.com/antchfx/xmlquery v1.4.4 // indirect 23 + github.com/antchfx/xpath v1.3.3 // indirect 24 + github.com/bits-and-blooms/bitset v1.22.0 // indirect 25 + github.com/gobwas/glob v0.2.3 // indirect 26 + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect 27 + github.com/golang/protobuf v1.5.4 // indirect 28 + github.com/kennygrant/sanitize v1.2.4 // indirect 29 + github.com/nlnwa/whatwg-url v0.6.1 // indirect 30 + github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d // indirect 31 + github.com/temoto/robotstxt v1.1.2 // indirect 32 + google.golang.org/appengine v1.6.8 // indirect 33 + google.golang.org/protobuf v1.36.6 // indirect 34 + ) 35 + 36 + require ( 20 37 github.com/alecthomas/chroma/v2 v2.14.0 // indirect 21 38 github.com/atotto/clipboard v0.1.4 // indirect 22 39 github.com/aymerick/douceur v0.2.0 // indirect 23 - github.com/catppuccin/go v0.3.0 // indirect 24 40 github.com/charmbracelet/glamour v0.10.0 25 41 github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf // indirect 26 - github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 // indirect 27 42 github.com/dlclark/regexp2 v1.11.0 // indirect 28 - github.com/dustin/go-humanize v1.0.1 // indirect 29 43 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // indirect 30 44 github.com/gorilla/css v1.0.1 // indirect 31 45 github.com/mattn/go-localereader v0.0.1 // indirect 32 46 github.com/microcosm-cc/bluemonday v1.0.27 // indirect 33 - github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect 34 47 github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect 35 48 github.com/muesli/reflow v0.3.0 // indirect 36 49 github.com/yuin/goldmark v1.7.8 // indirect 37 50 github.com/yuin/goldmark-emoji v1.0.5 // indirect 38 - golang.org/x/net v0.33.0 // indirect 51 + golang.org/x/net v0.39.0 // indirect 39 52 golang.org/x/sync v0.16.0 // indirect 40 53 golang.org/x/term v0.31.0 // indirect 41 54 ) ··· 52 65 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444 // indirect 53 66 github.com/charmbracelet/x/term v0.2.1 // indirect 54 67 github.com/go-logfmt/logfmt v0.6.0 // indirect 68 + github.com/gocolly/colly/v2 v2.2.0 55 69 github.com/inconshreveable/mousetrap v1.1.0 // indirect 56 70 github.com/lucasb-eyer/go-colorful v1.2.0 57 71 github.com/mattn/go-isatty v0.0.20 // indirect
+115 -23
go.sum
··· 1 1 github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= 2 2 github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= 3 - github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ= 4 - github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE= 3 + github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo= 4 + github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y= 5 5 github.com/alecthomas/assert/v2 v2.7.0 h1:QtqSACNS3tF7oasA8CU6A6sXZSBDqnm7RfpLl9bZqbE= 6 6 github.com/alecthomas/assert/v2 v2.7.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= 7 7 github.com/alecthomas/chroma/v2 v2.14.0 h1:R3+wzpnUArGcQz7fCETQBzO5n9IMNi13iIs46aU4V9E= 8 8 github.com/alecthomas/chroma/v2 v2.14.0/go.mod h1:QolEbTfmUHIMVpBqxeDnNBj2uoeI4EbYP4i6n68SG4I= 9 9 github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc= 10 10 github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= 11 + github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= 12 + github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= 13 + github.com/antchfx/htmlquery v1.3.4 h1:Isd0srPkni2iNTWCwVj/72t7uCphFeor5Q8nCzj1jdQ= 14 + github.com/antchfx/htmlquery v1.3.4/go.mod h1:K9os0BwIEmLAvTqaNSua8tXLWRWZpocZIH73OzWQbwM= 15 + github.com/antchfx/xmlquery v1.4.4 h1:mxMEkdYP3pjKSftxss4nUHfjBhnMk4imGoR96FRY2dg= 16 + github.com/antchfx/xmlquery v1.4.4/go.mod h1:AEPEEPYE9GnA2mj5Ur2L5Q5/2PycJ0N9Fusrx9b12fc= 17 + github.com/antchfx/xpath v1.3.3 h1:tmuPQa1Uye0Ym1Zn65vxPgfltWb/Lxu2jeqIGteJSRs= 18 + github.com/antchfx/xpath v1.3.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= 11 19 github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= 12 20 github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= 13 21 github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= ··· 16 24 github.com/aymanbagabas/go-udiff v0.2.0/go.mod h1:RE4Ex0qsGkTAJoQdQQCA0uG+nAzJO/pI/QwceO5fgrA= 17 25 github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= 18 26 github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= 19 - github.com/catppuccin/go v0.3.0 h1:d+0/YicIq+hSTo5oPuRi5kOpqkVA5tAsU6dNhvRu+aY= 20 - github.com/catppuccin/go v0.3.0/go.mod h1:8IHJuMGaUUjQM82qBrGNBv7LFq6JI3NnQCF6MOlZjpc= 27 + github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= 28 + github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4= 29 + github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= 21 30 github.com/charmbracelet/bubbles v0.21.0 h1:9TdC97SdRVg/1aaXNVWfFH3nnLAwOXr8Fn6u6mfQdFs= 22 31 github.com/charmbracelet/bubbles v0.21.0/go.mod h1:HF+v6QUR4HkEpz62dx7ym2xc71/KBHg+zKwJtMw+qtg= 23 32 github.com/charmbracelet/bubbletea v1.3.4 h1:kCg7B+jSCFPLYRA52SDZjr51kG/fMUEoPoZrkaDHyoI= ··· 28 37 github.com/charmbracelet/fang v0.3.0/go.mod h1:b0ZfEXZeBds0I27/wnTfnv2UVigFDXHhrFNwQztfA0M= 29 38 github.com/charmbracelet/glamour v0.10.0 h1:MtZvfwsYCx8jEPFJm3rIBFIMZUfUJ765oX8V6kXldcY= 30 39 github.com/charmbracelet/glamour v0.10.0/go.mod h1:f+uf+I/ChNmqo087elLnVdCiVgjSKWuXa/l6NU2ndYk= 31 - github.com/charmbracelet/huh v0.7.0 h1:W8S1uyGETgj9Tuda3/JdVkc3x7DBLZYPZc4c+/rnRdc= 32 - github.com/charmbracelet/huh v0.7.0/go.mod h1:UGC3DZHlgOKHvHC07a5vHag41zzhpPFj34U92sOmyuk= 33 40 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834 h1:ZR7e0ro+SZZiIZD7msJyA+NjkCNNavuiPBLgerbOziE= 34 41 github.com/charmbracelet/lipgloss v1.1.1-0.20250404203927-76690c660834/go.mod h1:aKC/t2arECF6rNOnaKaVU6y4t4ZeHQzqfxedE/VkVhA= 35 42 github.com/charmbracelet/lipgloss/v2 v2.0.0-beta1 h1:SOylT6+BQzPHEjn15TIzawBPVD0QmhKXbcb3jY0ZIKU= ··· 40 47 github.com/charmbracelet/x/ansi v0.9.3/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE= 41 48 github.com/charmbracelet/x/cellbuf v0.0.13 h1:/KBBKHuVRbq1lYx5BzEHBAFBP8VcQzJejZ/IA3iR28k= 42 49 github.com/charmbracelet/x/cellbuf v0.0.13/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs= 43 - github.com/charmbracelet/x/conpty v0.1.0 h1:4zc8KaIcbiL4mghEON8D72agYtSeIgq8FSThSPQIb+U= 44 - github.com/charmbracelet/x/conpty v0.1.0/go.mod h1:rMFsDJoDwVmiYM10aD4bH2XiRgwI7NYJtQgl5yskjEQ= 45 - github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86 h1:JSt3B+U9iqk37QUU2Rvb6DSBYRLtWqFqfxf8l5hOZUA= 46 - github.com/charmbracelet/x/errors v0.0.0-20240508181413-e8d8b6e2de86/go.mod h1:2P0UgXMEa6TsToMSuFqKFQR+fZTO9CNGUNokkPatT/0= 47 50 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444 h1:IJDiTgVE56gkAGfq0lBEloWgkXMk4hl/bmuPoicI4R0= 48 51 github.com/charmbracelet/x/exp/charmtone v0.0.0-20250603201427-c31516f43444/go.mod h1:T9jr8CzFpjhFVHjNjKwbAD7KwBNyFnj2pntAO7F2zw0= 49 52 github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91 h1:payRxjMjKgx2PaCWLZ4p3ro9y97+TVLZNaRZgJwSVDQ= 50 53 github.com/charmbracelet/x/exp/golden v0.0.0-20241011142426-46044092ad91/go.mod h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U= 51 54 github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf h1:rLG0Yb6MQSDKdB52aGX55JT1oi0P0Kuaj7wi1bLUpnI= 52 55 github.com/charmbracelet/x/exp/slice v0.0.0-20250327172914-2fdc97757edf/go.mod h1:B3UgsnsBZS/eX42BlaNiJkD1pPOUa+oF1IYC6Yd2CEU= 53 - github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0 h1:qko3AQ4gK1MTS/de7F5hPGx6/k1u0w4TeYmBFwzYVP4= 54 - github.com/charmbracelet/x/exp/strings v0.0.0-20240722160745-212f7b056ed0/go.mod h1:pBhA0ybfXv6hDjQUZ7hk1lVxBiUbupdw5R31yPUViVQ= 55 56 github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ= 56 57 github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg= 57 - github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= 58 - github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= 59 - github.com/charmbracelet/x/xpty v0.1.2 h1:Pqmu4TEJ8KeA9uSkISKMU3f+C1F6OGBn8ABuGlqCbtI= 60 - github.com/charmbracelet/x/xpty v0.1.2/go.mod h1:XK2Z0id5rtLWcpeNiMYBccNNBrP2IJnzHI0Lq13Xzq4= 61 58 github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= 62 - github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= 63 - github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= 59 + github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 64 60 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 65 61 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 66 62 github.com/dlclark/regexp2 v1.11.0 h1:G/nrcoOa7ZXlpoa/91N3X7mM3r8eIlMBBJZvsz/mxKI= 67 63 github.com/dlclark/regexp2 v1.11.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= 68 - github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= 69 - github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= 70 64 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4= 71 65 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM= 72 66 github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= 73 67 github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= 68 + github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= 69 + github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= 70 + github.com/gocolly/colly/v2 v2.2.0 h1:FQGxcqvTdFAvOpMRhk52o20Qsf6KtRU5HSf0bITS38I= 71 + github.com/gocolly/colly/v2 v2.2.0/go.mod h1:YOQwv1ofoQOzJiELnkThDd6ObOfl6odUk2i6Czbx3Ws= 72 + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= 73 + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= 74 + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= 75 + github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 76 + github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 77 + github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= 78 + github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= 79 + github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 80 + github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= 81 + github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= 74 82 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 75 83 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 76 84 github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= ··· 79 87 github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= 80 88 github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= 81 89 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= 90 + github.com/kennygrant/sanitize v1.2.4 h1:gN25/otpP5vAsO2djbMhF/LQX6R7+O1TB4yv8NzpJ3o= 91 + github.com/kennygrant/sanitize v1.2.4/go.mod h1:LGsjYYtgxbetdg5owWB2mpgUL6e2nfw2eObZ0u0qvak= 82 92 github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= 83 93 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= 84 94 github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= ··· 92 102 github.com/mattn/go-sqlite3 v1.14.32/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= 93 103 github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= 94 104 github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= 95 - github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= 96 - github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= 97 105 github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= 98 106 github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= 99 107 github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= ··· 110 118 github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= 111 119 github.com/muesli/termenv v0.16.0 h1:S5AlUN9dENB57rsbnkPyfdGuWIlkmzJjbFf0Tf5FWUc= 112 120 github.com/muesli/termenv v0.16.0/go.mod h1:ZRfOIKPFDYQoDFF4Olj7/QJbW60Ol/kL1pU3VfY/Cnk= 121 + github.com/nlnwa/whatwg-url v0.6.1 h1:Zlefa3aglQFHF/jku45VxbEJwPicDnOz64Ra3F7npqQ= 122 + github.com/nlnwa/whatwg-url v0.6.1/go.mod h1:x0FPXJzzOEieQtsBT/AKvbiBbQ46YlL6Xa7m02M1ECk= 113 123 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 114 124 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 115 125 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= ··· 117 127 github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= 118 128 github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 119 129 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= 130 + github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d h1:hrujxIzL1woJ7AwssoOcM/tq5JjjG2yYOc8odClEiXA= 131 + github.com/saintfish/chardet v0.0.0-20230101081208-5e3ef4b5456d/go.mod h1:uugorj2VCxiV1x+LzaIdVa9b4S4qGAcH6cbhh4qVxOU= 120 132 github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= 121 133 github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= 122 134 github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= 123 135 github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= 136 + github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 137 + github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= 124 138 github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= 125 139 github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 140 + github.com/temoto/robotstxt v1.1.2 h1:W2pOjSJ6SWvldyEuiFXNxz3xZ8aiWX5LbfDiOFd7Fxg= 141 + github.com/temoto/robotstxt v1.1.2/go.mod h1:+1AmkuG3IYkh1kv0d2qEB9Le88ehNO0zwOr3ujewlOo= 126 142 github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= 127 143 github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= 144 + github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= 128 145 github.com/yuin/goldmark v1.7.1/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= 129 146 github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= 130 147 github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= 131 148 github.com/yuin/goldmark-emoji v1.0.5 h1:EMVWyCGPlXJfUXBXpuMu+ii3TIaxbVBnEX9uaDC4cIk= 132 149 github.com/yuin/goldmark-emoji v1.0.5/go.mod h1:tTkZEbwu5wkPmgTcitqddVxY9osFZiavD+r4AzQrh1U= 150 + golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 151 + golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= 152 + golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= 153 + golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= 154 + golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= 155 + golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= 156 + golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= 133 157 golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI= 134 158 golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo= 135 - golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= 159 + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= 160 + golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 161 + golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 162 + golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 163 + golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 164 + golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 165 + golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= 166 + golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= 167 + golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 168 + golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= 169 + golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= 170 + golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= 171 + golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 136 172 golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= 173 + golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= 174 + golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= 175 + golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= 176 + golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 177 + golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 178 + golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 179 + golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= 180 + golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 181 + golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 182 + golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= 137 183 golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= 138 184 golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= 185 + golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 186 + golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 187 + golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 139 188 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 189 + golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 190 + golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 191 + golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 140 192 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 193 + golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 194 + golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 195 + golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 196 + golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 197 + golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 198 + golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 141 199 golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= 142 200 golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= 201 + golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= 202 + golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 203 + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= 204 + golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= 205 + golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= 206 + golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= 207 + golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= 208 + golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 209 + golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= 210 + golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= 143 211 golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= 144 212 golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= 213 + golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 214 + golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 215 + golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= 216 + golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= 217 + golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= 218 + golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= 219 + golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= 220 + golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 221 + golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 222 + golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= 145 223 golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= 146 224 golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= 147 225 golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE= 148 226 golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= 227 + golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 228 + golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 229 + golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= 230 + golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= 231 + golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 232 + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 233 + golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 234 + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 235 + google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= 236 + google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= 237 + google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 238 + google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 239 + google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= 240 + google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= 149 241 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 150 242 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 151 243 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+2 -7
internal/handlers/books.go
··· 114 114 } 115 115 116 116 if interactive { 117 - bookList := ui.NewBookList(h.service, h.repos.Books, ui.BookListOptions{ 118 - Output: os.Stdout, 119 - Input: os.Stdin, 120 - Static: false, 121 - }) 122 - return bookList.SearchAndSelect(ctx, query) 117 + bookList := ui.NewBookListFromList(h.repos.Books, os.Stdout, os.Stdin, false, "") 118 + return bookList.Browse(ctx) 123 119 } 124 120 125 121 fmt.Printf("Searching for books: %s\n", query) ··· 173 169 return fmt.Errorf("invalid choice: %d", choice) 174 170 } 175 171 176 - // Add selected book 177 172 selectedBook, ok := (*results[choice-1]).(*models.Book) 178 173 if !ok { 179 174 return fmt.Errorf("error processing selected book")
+1 -9
internal/handlers/notes.go
··· 363 363 364 364 // List opens either an interactive TUI browser for navigating and viewing notes or a static list 365 365 func (h *NoteHandler) List(ctx context.Context, static, showArchived bool, tags []string) error { 366 - opts := ui.NoteListOptions{ 367 - Output: os.Stdout, 368 - Input: os.Stdin, 369 - Static: static, 370 - ShowArchived: showArchived, 371 - Tags: tags, 372 - } 373 - 374 - noteList := ui.NewNoteList(h.repos.Notes, opts) 366 + noteList := ui.NewNoteListFromList(h.repos.Notes, os.Stdout, os.Stdin, static, showArchived, tags) 375 367 return noteList.Browse(ctx) 376 368 } 377 369
+3 -10
internal/handlers/tasks.go
··· 4 4 "context" 5 5 "encoding/json" 6 6 "fmt" 7 + "os" 7 8 "slices" 8 9 "strconv" 9 10 "strings" ··· 143 144 } 144 145 145 146 func (h *TaskHandler) listTasksInteractive(ctx context.Context, showAll bool, status, priority, project, context string) error { 146 - taskList := ui.NewTaskList(h.repos.Tasks, ui.TaskListOptions{ 147 - ShowAll: showAll, 148 - Status: status, 149 - Priority: priority, 150 - Project: project, 151 - Context: context, 152 - Static: false, 153 - }) 154 - 155 - return taskList.Browse(ctx) 147 + taskTable := ui.NewTaskListFromTable(h.repos.Tasks, os.Stdout, os.Stdin, false, showAll, status, priority, project) 148 + return taskTable.Browse(ctx) 156 149 } 157 150 158 151 // Update updates a task using parsed flag values
+274
internal/services/media.go
··· 1 + package services 2 + 3 + import ( 4 + "encoding/json" 5 + "fmt" 6 + "io" 7 + "net/url" 8 + "strconv" 9 + "strings" 10 + 11 + "github.com/PuerkitoBio/goquery" 12 + "github.com/gocolly/colly/v2" 13 + ) 14 + 15 + type Media struct { 16 + Title string 17 + Link string 18 + // "movie" or "tv" 19 + Type string 20 + CriticScore string 21 + CertifiedFresh bool 22 + } 23 + 24 + // ParseSearch parses Rotten Tomatoes search results HTML into Media entries. 25 + func ParseSearch(r io.Reader) ([]Media, error) { 26 + doc, err := goquery.NewDocumentFromReader(r) 27 + if err != nil { 28 + return nil, err 29 + } 30 + 31 + var results []Media 32 + doc.Find("a.score-list-item").Each(func(i int, e *goquery.Selection) { 33 + title := e.Find("span").Text() 34 + link, _ := e.Attr("href") 35 + if link == "" { 36 + return 37 + } 38 + fullLink := "https://www.rottentomatoes.com" + link 39 + 40 + mediaType := "unknown" 41 + if strings.HasPrefix(link, "/m/") { 42 + mediaType = "movie" 43 + } else if strings.HasPrefix(link, "/tv/") { 44 + mediaType = "tv" 45 + } 46 + 47 + score := e.Find("rt-text.critics-score").Text() 48 + if score == "" { 49 + score = "--" 50 + } 51 + 52 + certified := false 53 + if v, ok := e.Find("score-icon-critics").Attr("certified"); ok && v == "true" { 54 + certified = true 55 + } 56 + 57 + results = append(results, Media{ 58 + Title: title, 59 + Link: fullLink, 60 + Type: mediaType, 61 + CriticScore: score, 62 + CertifiedFresh: certified, 63 + }) 64 + }) 65 + return results, nil 66 + } 67 + 68 + // SearchRottenTomatoes fetches live search results for a query. 69 + func SearchRottenTomatoes(q string) ([]Media, error) { 70 + searchURL := "https://www.rottentomatoes.com/search?search=" + url.QueryEscape(q) 71 + html, err := FetchHTML(searchURL) 72 + if err != nil { 73 + return nil, err 74 + } 75 + return ParseSearch(strings.NewReader(html)) 76 + } 77 + 78 + type Person struct { 79 + Name string `json:"name"` 80 + SameAs string `json:"sameAs"` 81 + Image string `json:"image"` 82 + } 83 + 84 + type AggregateRating struct { 85 + RatingValue string `json:"ratingValue"` 86 + RatingCount int `json:"ratingCount"` 87 + ReviewCount int `json:"reviewCount"` 88 + } 89 + 90 + type Season struct { 91 + Name string `json:"name"` 92 + URL string `json:"url"` 93 + } 94 + 95 + type TVSeries struct { 96 + Context string `json:"@context"` 97 + Type string `json:"@type"` 98 + Name string `json:"name"` 99 + URL string `json:"url"` 100 + Description string `json:"description"` 101 + Image string `json:"image"` 102 + Genre []string `json:"genre"` 103 + ContentRating string `json:"contentRating"` 104 + DateCreated string `json:"dateCreated"` 105 + NumberOfSeasons int `json:"numberOfSeasons"` 106 + Actors []Person `json:"actor"` 107 + Producers []Person `json:"producer"` 108 + AggregateRating AggregateRating `json:"aggregateRating"` 109 + Seasons []Season `json:"containsSeason"` 110 + } 111 + 112 + type Movie struct { 113 + Context string `json:"@context"` 114 + Type string `json:"@type"` 115 + Name string `json:"name"` 116 + URL string `json:"url"` 117 + Description string `json:"description"` 118 + Image string `json:"image"` 119 + Genre []string `json:"genre"` 120 + ContentRating string `json:"contentRating"` 121 + DateCreated string `json:"dateCreated"` 122 + Actors []Person `json:"actor"` 123 + Directors []Person `json:"director"` 124 + Producers []Person `json:"producer"` 125 + AggregateRating AggregateRating `json:"aggregateRating"` 126 + } 127 + 128 + type TVSeason struct { 129 + Context string `json:"@context"` 130 + Type string `json:"@type"` 131 + Name string `json:"name"` 132 + URL string `json:"url"` 133 + Description string `json:"description"` 134 + Image string `json:"image"` 135 + SeasonNumber int `json:"seasonNumber"` 136 + DatePublished string `json:"datePublished"` 137 + PartOfSeries struct { 138 + Name string `json:"name"` 139 + URL string `json:"url"` 140 + } `json:"partOfSeries"` 141 + AggregateRating AggregateRating `json:"aggregateRating"` 142 + } 143 + 144 + func ExtractTVSeriesMetadata(r io.Reader) (*TVSeries, error) { 145 + doc, err := goquery.NewDocumentFromReader(r) 146 + if err != nil { 147 + return nil, err 148 + } 149 + var series TVSeries 150 + found := false 151 + doc.Find("script[type='application/ld+json']").Each(func(i int, s *goquery.Selection) { 152 + var tmp map[string]interface{} 153 + if err := json.Unmarshal([]byte(s.Text()), &tmp); err == nil { 154 + if t, ok := tmp["@type"].(string); ok && t == "TVSeries" { 155 + if err := json.Unmarshal([]byte(s.Text()), &series); err == nil { 156 + found = true 157 + } 158 + } 159 + } 160 + }) 161 + if !found { 162 + return nil, fmt.Errorf("no TVSeries JSON-LD found") 163 + } 164 + return &series, nil 165 + } 166 + 167 + func ExtractMovieMetadata(r io.Reader) (*Movie, error) { 168 + doc, err := goquery.NewDocumentFromReader(r) 169 + if err != nil { 170 + return nil, err 171 + } 172 + var movie Movie 173 + found := false 174 + doc.Find("script[type='application/ld+json']").Each(func(i int, s *goquery.Selection) { 175 + var tmp map[string]interface{} 176 + if err := json.Unmarshal([]byte(s.Text()), &tmp); err == nil { 177 + if t, ok := tmp["@type"].(string); ok && t == "Movie" { 178 + if err := json.Unmarshal([]byte(s.Text()), &movie); err == nil { 179 + found = true 180 + } 181 + } 182 + } 183 + }) 184 + if !found { 185 + return nil, fmt.Errorf("no Movie JSON-LD found") 186 + } 187 + return &movie, nil 188 + } 189 + 190 + func ExtractTVSeasonMetadata(r io.Reader) (*TVSeason, error) { 191 + doc, err := goquery.NewDocumentFromReader(r) 192 + if err != nil { 193 + return nil, err 194 + } 195 + var season TVSeason 196 + found := false 197 + doc.Find("script[type='application/ld+json']").Each(func(i int, s *goquery.Selection) { 198 + var tmp map[string]any 199 + if err := json.Unmarshal([]byte(s.Text()), &tmp); err == nil { 200 + if t, ok := tmp["@type"].(string); ok && t == "TVSeason" { 201 + if err := json.Unmarshal([]byte(s.Text()), &season); err == nil { 202 + found = true 203 + } 204 + } 205 + } 206 + }) 207 + if !found { 208 + return nil, fmt.Errorf("no TVSeason JSON-LD found") 209 + } 210 + 211 + if season.SeasonNumber == 0 { 212 + if season.URL != "" { 213 + parts := strings.SplitSeq(season.URL, "/") 214 + for part := range parts { 215 + if strings.HasPrefix(part, "s") && len(part) > 1 { 216 + if num, err := strconv.Atoi(part[1:]); err == nil { 217 + season.SeasonNumber = num 218 + break 219 + } 220 + } 221 + } 222 + } 223 + 224 + if season.SeasonNumber == 0 && season.Name != "" { 225 + parts := strings.Fields(season.Name) 226 + for i, part := range parts { 227 + if strings.ToLower(part) == "season" && i+1 < len(parts) { 228 + if num, err := strconv.Atoi(parts[i+1]); err == nil { 229 + season.SeasonNumber = num 230 + break 231 + } 232 + } 233 + } 234 + } 235 + } 236 + 237 + return &season, nil 238 + } 239 + 240 + func FetchHTML(url string) (string, error) { 241 + var html string 242 + c := colly.NewCollector( 243 + colly.AllowedDomains("www.rottentomatoes.com", "rottentomatoes.com"), 244 + ) 245 + c.OnResponse(func(r *colly.Response) { html = string(r.Body) }) 246 + if err := c.Visit(url); err != nil { 247 + return "", err 248 + } 249 + return html, nil 250 + } 251 + 252 + func FetchTVSeries(url string) (*TVSeries, error) { 253 + html, err := FetchHTML(url) 254 + if err != nil { 255 + return nil, err 256 + } 257 + return ExtractTVSeriesMetadata(strings.NewReader(html)) 258 + } 259 + 260 + func FetchMovie(url string) (*Movie, error) { 261 + html, err := FetchHTML(url) 262 + if err != nil { 263 + return nil, err 264 + } 265 + return ExtractMovieMetadata(strings.NewReader(html)) 266 + } 267 + 268 + func FetchTVSeason(url string) (*TVSeason, error) { 269 + html, err := FetchHTML(url) 270 + if err != nil { 271 + return nil, err 272 + } 273 + return ExtractTVSeasonMetadata(strings.NewReader(html)) 274 + }
+146
internal/services/media_test.go
··· 1 + package services 2 + 3 + import ( 4 + "bytes" 5 + _ "embed" 6 + "strings" 7 + "testing" 8 + ) 9 + 10 + // From: https://www.rottentomatoes.com/m/the_fantastic_four_first_steps 11 + // 12 + //go:embed samples/movie.html 13 + var MovieSample []byte 14 + 15 + // From: https://www.rottentomatoes.com/search?search=peacemaker 16 + // 17 + //go:embed samples/search.html 18 + var SearchSample []byte 19 + 20 + // From: https://www.rottentomatoes.com/tv/peacemaker_2022 21 + // 22 + //go:embed samples/series_overview.html 23 + var SeriesSample []byte 24 + 25 + // From: https://www.rottentomatoes.com/tv/peacemaker_2022/s02 26 + // 27 + //go:embed samples/series_season.html 28 + var SeasonSample []byte 29 + 30 + func TestMediaService(t *testing.T) { 31 + t.Run("Parse Search results", func(t *testing.T) { 32 + results, err := ParseSearch(bytes.NewReader(SearchSample)) 33 + if err != nil { 34 + t.Fatalf("ParseSearch failed: %v", err) 35 + } 36 + if len(results) == 0 { 37 + t.Fatal("expected non-empty search results") 38 + } 39 + }) 40 + 41 + t.Run("Parse Search error", func(t *testing.T) { 42 + results, err := ParseSearch(strings.NewReader("\x00bad html")) 43 + if err != nil { 44 + t.Fatalf("unexpected error for malformed HTML: %v", err) 45 + } 46 + if len(results) != 0 { 47 + t.Errorf("expected 0 results for malformed HTML, got %d", len(results)) 48 + } 49 + 50 + html := `<a class="score-list-item"><span>Test</span></a>` 51 + results, err = ParseSearch(strings.NewReader(html)) 52 + if err != nil { 53 + t.Fatalf("unexpected error: %v", err) 54 + } 55 + if len(results) != 0 { 56 + t.Errorf("expected 0 results, got %d", len(results)) 57 + } 58 + }) 59 + 60 + t.Run("Extract Metadata", func(t *testing.T) { 61 + movie, err := ExtractMovieMetadata(bytes.NewReader(MovieSample)) 62 + if err != nil { 63 + t.Fatalf("ExtractMovieMetadata failed: %v", err) 64 + } 65 + if movie.Type != "Movie" { 66 + t.Errorf("expected Type=Movie, got %s", movie.Type) 67 + } 68 + if movie.Name == "" { 69 + t.Error("expected non-empty Name") 70 + } 71 + }) 72 + 73 + t.Run("Extract Metadata Errors", func(t *testing.T) { 74 + if _, err := ExtractMovieMetadata(strings.NewReader("not html")); err == nil { 75 + t.Error("expected error for invalid HTML") 76 + } 77 + 78 + html := `<script type="application/ld+json">{"@type":"Other"}</script>` 79 + if _, err := ExtractMovieMetadata(strings.NewReader(html)); err == nil || !strings.Contains(err.Error(), "no Movie JSON-LD") { 80 + t.Errorf("expected 'no Movie JSON-LD', got %v", err) 81 + } 82 + 83 + html = `<script type="application/ld+json">{oops}</script>` 84 + if _, err := ExtractMovieMetadata(strings.NewReader(html)); err == nil { 85 + t.Error("expected error for invalid JSON") 86 + } 87 + }) 88 + 89 + t.Run("Extract TV Series Metadata", func(t *testing.T) { 90 + series, err := ExtractTVSeriesMetadata(bytes.NewReader(SeriesSample)) 91 + if err != nil { 92 + t.Fatalf("ExtractTVSeriesMetadata failed: %v", err) 93 + } 94 + if series.Type != "TVSeries" { 95 + t.Errorf("expected Type=TVSeries, got %s", series.Type) 96 + } 97 + if series.NumberOfSeasons <= 0 { 98 + t.Error("expected NumberOfSeasons > 0") 99 + } 100 + }) 101 + 102 + t.Run("Extract TV Series Metadata Errors", func(t *testing.T) { 103 + if _, err := ExtractTVSeriesMetadata(strings.NewReader("not html")); err == nil { 104 + t.Error("expected error for invalid HTML") 105 + } 106 + 107 + html := `<script type="application/ld+json">{"@type":"Other"}</script>` 108 + if _, err := ExtractTVSeriesMetadata(strings.NewReader(html)); err == nil || !strings.Contains(err.Error(), "no TVSeries JSON-LD") { 109 + t.Errorf("expected 'no TVSeries JSON-LD', got %v", err) 110 + } 111 + }) 112 + 113 + t.Run("Extract TV Series Season metadata", func(t *testing.T) { 114 + season, err := ExtractTVSeasonMetadata(bytes.NewReader(SeasonSample)) 115 + if err != nil { 116 + t.Fatalf("ExtractTVSeasonMetadata failed: %v", err) 117 + } 118 + if season.Type != "TVSeason" { 119 + t.Errorf("expected Type=TVSeason, got %s", season.Type) 120 + } 121 + if season.SeasonNumber <= 0 { 122 + t.Error("expected SeasonNumber > 0") 123 + } 124 + if season.PartOfSeries.Name != "Peacemaker" { 125 + t.Errorf("expected PartOfSeries.Name=Peacemaker, got %s", season.PartOfSeries.Name) 126 + } 127 + }) 128 + 129 + t.Run("Extract TV Series Season errors", func(t *testing.T) { 130 + if _, err := ExtractTVSeasonMetadata(strings.NewReader("not html")); err == nil { 131 + t.Error("expected error for invalid HTML") 132 + } 133 + 134 + html := `<script type="application/ld+json">{"@type":"Other"}</script>` 135 + if _, err := ExtractTVSeasonMetadata(strings.NewReader(html)); err == nil || !strings.Contains(err.Error(), "no TVSeason JSON-LD") { 136 + t.Errorf("expected 'no TVSeason JSON-LD', got %v", err) 137 + } 138 + }) 139 + 140 + t.Run("Fetch HTML errors", func(t *testing.T) { 141 + if _, err := FetchHTML("://bad-url"); err == nil { 142 + t.Error("expected error for invalid URL") 143 + } 144 + }) 145 + 146 + }
+3832
internal/services/samples/movie.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" 3 + prefix="fb: http://www.facebook.com/2008/fbml og: http://opengraphprotocol.org/schema/"> 4 + 5 + <head prefix="og: http://ogp.me/ns# flixstertomatoes: http://ogp.me/ns/apps/flixstertomatoes#"> 6 + 7 + 8 + 9 + 10 + <script charset="UTF-8" crossorigin="anonymous" data-domain-script="7e979733-6841-4fce-9182-515fac69187f" 11 + integrity="sha384-TKdmlzVmoD70HzftTw4WtOzIBL5mNx8mXSRzEvwrWjpIJ7FZ/EuX758yMDWXtRUN" 12 + src="https://cdn.cookielaw.org/consent/7e979733-6841-4fce-9182-515fac69187f/otSDKStub.js" type="text/javascript"> 13 + </script> 14 + <script type="text/javascript"> 15 + function OptanonWrapper() { 16 + if (OnetrustActiveGroups.includes('7')) { 17 + document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); 18 + } 19 + } 20 + </script> 21 + 22 + 23 + 24 + <script ccpa-opt-out-ids="USP" ccpa-opt-out-geo="US" ccpa-opt-out-lspa="false" charset="UTF-8" 25 + src="https://cdn.cookielaw.org/opt-out/otCCPAiab.js" type="text/javascript"> 26 + </script> 27 + 28 + 29 + 30 + 31 + 32 + 33 + <script src="/assets/pizza-pie/javascripts/bundles/roma/rt-common.js?single"></script> 34 + 35 + 36 + 37 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 38 + <meta http-equiv="x-ua-compatible" content="ie=edge"> 39 + <meta name="viewport" content="width=device-width, initial-scale=1"> 40 + 41 + <link rel="shortcut icon" sizes="76x76" type="image/x-icon" 42 + href="https://www.rottentomatoes.com/assets/pizza-pie/images/favicon.ico" /> 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + <title>The Fantastic Four: First Steps | Rotten Tomatoes</title> 51 + 52 + 53 + <meta name="description" 54 + content="Discover reviews, ratings, and trailers for The Fantastic Four: First Steps on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 55 + 56 + <meta name="twitter:card" content="summary" /> 57 + 58 + <meta name="twitter:image" 59 + content="https://resizing.flixster.com/GRRDF-MY6_iS5Em5vNBg-Jd-uL0=/206x305/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=" /> 60 + 61 + <meta name="twitter:title" content="The Fantastic Four: First Steps | Rotten Tomatoes" /> 62 + 63 + <meta name="twitter:text:title" content="The Fantastic Four: First Steps | Rotten Tomatoes" /> 64 + 65 + <meta name="twitter:description" 66 + content="Discover reviews, ratings, and trailers for The Fantastic Four: First Steps on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 67 + 68 + 69 + 70 + <meta property="og:site_name" content="Rotten Tomatoes" /> 71 + 72 + <meta property="og:title" content="The Fantastic Four: First Steps | Rotten Tomatoes" /> 73 + 74 + <meta property="og:description" 75 + content="Discover reviews, ratings, and trailers for The Fantastic Four: First Steps on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 76 + 77 + <meta property="og:type" content="video.movie" /> 78 + 79 + <meta property="og:url" content="https://www.rottentomatoes.com/m/the_fantastic_four_first_steps" /> 80 + 81 + <meta property="og:image" 82 + content="https://resizing.flixster.com/GRRDF-MY6_iS5Em5vNBg-Jd-uL0=/206x305/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=" /> 83 + 84 + <meta property="og:locale" content="en_US" /> 85 + 86 + 87 + 88 + <link rel="canonical" href="https://www.rottentomatoes.com/m/the_fantastic_four_first_steps" /> 89 + 90 + 91 + <script> 92 + var dataLayer = dataLayer || []; 93 + var RottenTomatoes = RottenTomatoes || {}; 94 + RottenTomatoes.dtmData = { "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "db64beee-683b-39ce-9617-94f6b67aa997", "lifeCycleWindow": "IN_THEATERS", "pageName": "rt | movies | overview | The Fantastic Four: First Steps", "titleGenre": "Action", "titleId": "db64beee-683b-39ce-9617-94f6b67aa997", "titleName": "The Fantastic Four: First Steps", "titleType": "Movie" }; 95 + dataLayer.push({ "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "db64beee-683b-39ce-9617-94f6b67aa997", "lifeCycleWindow": "IN_THEATERS", "pageName": "rt | movies | overview | The Fantastic Four: First Steps", "titleGenre": "Action", "titleId": "db64beee-683b-39ce-9617-94f6b67aa997", "titleName": "The Fantastic Four: First Steps", "titleType": "Movie" }); 96 + </script> 97 + 98 + 99 + 100 + <script id="mps-page-integration"> 101 + window.mpscall = { "cag[certified_fresh]": "0", "cag[fresh_rotten]": "rotten", "cag[genre]": "Action|Adventure|Sci-Fi|Fantasy", "cag[movieshow]": "The Fantastic Four: First Steps", "cag[rating]": "PG-13", "cag[release]": "Jul 25, 2025", "cag[score]": "null", "cag[urlid]": "/the_fantastic_four_first_steps", "cat": "movie|movie_page", "field[env]": "production", "field[rtid]": "db64beee-683b-39ce-9617-94f6b67aa997", "title": "The Fantastic Four: First Steps", "type": "movie_page", "site": "rottentomatoes-web" }; 102 + var mpsopts = { 'host': 'mps.nbcuni.com', 'updatecorrelator': 1 }; 103 + var mps = mps || {}; mps._ext = mps._ext || {}; mps._adsheld = []; mps._queue = mps._queue || {}; mps._queue.mpsloaded = mps._queue.mpsloaded || []; mps._queue.mpsinit = mps._queue.mpsinit || []; mps._queue.gptloaded = mps._queue.gptloaded || []; mps._queue.adload = mps._queue.adload || []; mps._queue.adclone = mps._queue.adclone || []; mps._queue.adview = mps._queue.adview || []; mps._queue.refreshads = mps._queue.refreshads || []; mps.__timer = Date.now || function () { return +new Date }; mps.__intcode = "v2"; if (typeof mps.getAd != "function") mps.getAd = function (adunit) { if (typeof adunit != "string") return false; var slotid = "mps-getad-" + adunit.replace(/\W/g, ""); if (!mps._ext || !mps._ext.loaded) { mps._queue.gptloaded.push(function () { typeof mps._gptfirst == "function" && mps._gptfirst(adunit, slotid); mps.insertAd("#" + slotid, adunit) }); mps._adsheld.push(adunit) } return '<div id="' + slotid + '" class="mps-wrapper" data-mps-fill-slot="' + adunit + '"></div>' }; 104 + </script> 105 + <script src="//mps.nbcuni.com/fetch/ext/load-rottentomatoes-web.js?nowrite=2" id="mps-load"></script> 106 + 107 + 108 + 109 + <script 110 + type="application/ld+json">{"@context":"http://schema.org","@type":"Movie","actor":[{"@type":"Person","name":"Pedro Pascal","sameAs":"https://www.rottentomatoes.com/celebrity/pedro_pascal","image":"https://resizing.flixster.com/gHGci208eTBBe6s555qqrVvMAlg=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/494807_v9_bd.jpg"},{"@type":"Person","name":"Vanessa Kirby","sameAs":"https://www.rottentomatoes.com/celebrity/vanessa_kirby","image":"https://resizing.flixster.com/hYfFokzVjtDj7QBvMrYIJ5uAhmY=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/631337_v9_bb.jpg"},{"@type":"Person","name":"Ebon Moss-Bachrach","sameAs":"https://www.rottentomatoes.com/celebrity/ebon_moss_bachrach","image":"https://resizing.flixster.com/cEb3kX_Yn_L4trv76D6rNON5nLA=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/252022_v9_bc.jpg"},{"@type":"Person","name":"Joseph Quinn","sameAs":"https://www.rottentomatoes.com/celebrity/joseph_quinn","image":"https://resizing.flixster.com/mwGK9WCbDyzD9FKvC81OyaWTfjc=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/1102755_v9_bb.jpg"},{"@type":"Person","name":"Ralph Ineson","sameAs":"https://www.rottentomatoes.com/celebrity/ralph-ineson","image":"https://resizing.flixster.com/-UyEiZ3UKHhGzdQU4wDV10Z6wO0=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/268419_v9_bc.jpg"}],"aggregateRating":{"@type":"AggregateRating","bestRating":"100","description":"The Tomatometer rating โ€“ based on the published opinions of hundreds of film and television critics โ€“ is a trusted measurement of movie and TV programming quality for millions of moviegoers. It represents the percentage of professional critic reviews that are positive for a given film or television show.","name":"Tomatometer","ratingCount":390,"ratingValue":"87","reviewCount":390,"worstRating":"0"},"contentRating":"PG-13","dateCreated":"2025-07-25","director":[{"@type":"Person","name":"Matt Shakman","sameAs":"https://www.rottentomatoes.com/celebrity/matt-shakman","image":"https://images.fandango.com/cms/assets/b0cefeb0-b6a8-11ed-81d8-51a487a38835--poster-default-thumbnail.jpg"}],"description":"Discover reviews, ratings, and trailers for The Fantastic Four: First Steps on Rotten Tomatoes. Stay updated with critic and audience scores today!","genre":["Action","Adventure","Sci-Fi","Fantasy"],"image":"https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=","name":"The Fantastic Four: First Steps","url":"https://www.rottentomatoes.com/m/the_fantastic_four_first_steps","video":{"@type":"VideoObject","thumbnailUrl":"https://statcdn.fandango.com/MPX/image/NBCU_Fandango/663/931/thumb_4ca6d6c5-6a62-11f0-94b5-022bbbb30d69.jpg","name":"The Fantastic Four: First Steps: 4 Us All","duration":"0:59","sourceOrganization":"MPX","uploadDate":"2025-07-26T20:55:44","description":"","contentUrl":"https://www.rottentomatoes.com/m/the_fantastic_four_first_steps/videos/BBgYzBvAIQDN"}}</script> 111 + 112 + 113 + <link rel="manifest" href="https://www.rottentomatoes.com/assets/pizza-pie/manifest/manifest.json" /> 114 + 115 + <link rel="apple-touch-icon" 116 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-60.jpg" /> 117 + <link rel="apple-touch-icon" sizes="152x152" 118 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-152.jpg" /> 119 + <link rel="apple-touch-icon" sizes="167x167" 120 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-167.jpg" /> 121 + <link rel="apple-touch-icon" sizes="180x180" 122 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-180.jpg" /> 123 + 124 + 125 + <!-- iOS Smart Banner --> 126 + <meta name="apple-itunes-app" content="app-id=6673916573, app-argument=https://www.rottentomatoes.com/"> 127 + 128 + 129 + 130 + 131 + 132 + 133 + <meta name="google-site-verification" content="VPPXtECgUUeuATBacnqnCm4ydGO99reF-xgNklSbNbc" /> 134 + 135 + 136 + <meta name="msvalidate.01" content="034F16304017CA7DCF45D43850915323" /> 137 + <meta name="theme-color" content="#FA320A"> 138 + 139 + <!-- DNS prefetch --> 140 + <meta http-equiv="x-dns-prefetch-control" content="on"> 141 + 142 + <link rel="dns-prefetch" href="//www.rottentomatoes.com" /> 143 + 144 + 145 + <link rel="preconnect" href="//www.rottentomatoes.com" /> 146 + 147 + 148 + 149 + 150 + <link rel="stylesheet" href="/assets/pizza-pie/stylesheets/bundles/layouts/default.b6077682d41.css" /> 151 + 152 + 153 + 154 + 155 + <link rel="preload" href="/assets/pizza-pie/stylesheets/bundles/pages/movie.802363b9d93.css" as="style" 156 + onload="this.onload=null;this.rel='stylesheet'" /> 157 + 158 + 159 + <script> 160 + window.RottenTomatoes = {}; 161 + window.RTLocals = {}; 162 + window.nunjucksPrecompiled = {}; 163 + window.__RT__ = {}; 164 + </script> 165 + 166 + 167 + 168 + <script src="https://cdn.jwplayer.com/libraries/U8MHzHHR.js"></script> 169 + <script src="https://sb.scorecardresearch.com/c2/plugins/streamingtag_plugin_jwplayer.js"></script> 170 + 171 + 172 + 173 + 174 + 175 + <script>!function (e) { var n = "https://s.go-mpulse.net/boomerang/"; if ("False" == "True") e.BOOMR_config = e.BOOMR_config || {}, e.BOOMR_config.PageParams = e.BOOMR_config.PageParams || {}, e.BOOMR_config.PageParams.pci = !0, n = "https://s2.go-mpulse.net/boomerang/"; if (window.BOOMR_API_key = "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9", function () { function e() { if (!o) { var e = document.createElement("script"); e.id = "boomr-scr-as", e.src = window.BOOMR.url, e.async = !0, i.parentNode.appendChild(e), o = !0 } } function t(e) { o = !0; var n, t, a, r, d = document, O = window; if (window.BOOMR.snippetMethod = e ? "if" : "i", t = function (e, n) { var t = d.createElement("script"); t.id = n || "boomr-if-as", t.src = window.BOOMR.url, BOOMR_lstart = (new Date).getTime(), e = e || d.body, e.appendChild(t) }, !window.addEventListener && window.attachEvent && navigator.userAgent.match(/MSIE [67]\./)) return window.BOOMR.snippetMethod = "s", void t(i.parentNode, "boomr-async"); a = document.createElement("IFRAME"), a.src = "about:blank", a.title = "", a.role = "presentation", a.loading = "eager", r = (a.frameElement || a).style, r.width = 0, r.height = 0, r.border = 0, r.display = "none", i.parentNode.appendChild(a); try { O = a.contentWindow, d = O.document.open() } catch (_) { n = document.domain, a.src = "javascript:var d=document.open();d.domain='" + n + "';void(0);", O = a.contentWindow, d = O.document.open() } if (n) d._boomrl = function () { this.domain = n, t() }, d.write("<bo" + "dy onload='document._boomrl();'>"); else if (O._boomrl = function () { t() }, O.addEventListener) O.addEventListener("load", O._boomrl, !1); else if (O.attachEvent) O.attachEvent("onload", O._boomrl); d.close() } function a(e) { window.BOOMR_onload = e && e.timeStamp || (new Date).getTime() } if (!window.BOOMR || !window.BOOMR.version && !window.BOOMR.snippetExecuted) { window.BOOMR = window.BOOMR || {}, window.BOOMR.snippetStart = (new Date).getTime(), window.BOOMR.snippetExecuted = !0, window.BOOMR.snippetVersion = 12, window.BOOMR.url = n + "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9"; var i = document.currentScript || document.getElementsByTagName("script")[0], o = !1, r = document.createElement("link"); if (r.relList && "function" == typeof r.relList.supports && r.relList.supports("preload") && "as" in r) window.BOOMR.snippetMethod = "p", r.href = window.BOOMR.url, r.rel = "preload", r.as = "script", r.addEventListener("load", e), r.addEventListener("error", function () { t(!0) }), setTimeout(function () { if (!o) t(!0) }, 3e3), BOOMR_lstart = (new Date).getTime(), i.parentNode.appendChild(r); else t(!1); if (window.addEventListener) window.addEventListener("load", a, !1); else if (window.attachEvent) window.attachEvent("onload", a) } }(), "".length > 0) if (e && "performance" in e && e.performance && "function" == typeof e.performance.setResourceTimingBufferSize) e.performance.setResourceTimingBufferSize(); !function () { if (BOOMR = e.BOOMR || {}, BOOMR.plugins = BOOMR.plugins || {}, !BOOMR.plugins.AK) { var n = "" == "true" ? 1 : 0, t = "", a = "eyd6zaauaeceajqacqcoyaaafful3mml-f-5c35fc32a-clienttons-s.akamaihd.net", i = "false" == "true" ? 2 : 1, o = { "ak.v": "39", "ak.cp": "1839344", "ak.ai": parseInt("1226367", 10), "ak.ol": "0", "ak.cr": 18, "ak.ipv": 6, "ak.proto": "h2", "ak.rid": "1bdfb774", "ak.r": 43883, "ak.a2": n, "ak.m": "", "ak.n": "essl", "ak.bpcip": "2607:ec80:1401:440::", "ak.cport": 63434, "ak.gh": "23.205.103.141", "ak.quicv": "", "ak.tlsv": "tls1.3", "ak.0rtt": "", "ak.0rtt.ed": "", "ak.csrc": "-", "ak.acc": "", "ak.t": "1757262219", "ak.ak": "hOBiQwZUYzCg5VSAfCLimQ==CKkYzF1l8fCYAQDO3Ka6MQjEJqqg+HMg9vMLYhzlSa+AgTCzDOkKjEMkU7+MkMRwJYAGkOLlLS+jnjLsXEZsaUvIxS8WR/6oulucAmT5EAp/gQxgkVlyn7CkRoTR1qngs9nfWRHFap8G/kos+Xn2LaKq6rHdrS0emZBD0M+6AwFkRkVNOeqCVAxEgKGTIimmHJVcLgr7d4Wa0fDhrGbN5kU1qjpubofpGYnQ9YOoFzyWknnn/I++11yvnp8VSq5PxT5slvOiDYd8WjunbJMe2vTEwzj9TZgPYz0EFHqOnmZka3snkbsTEMw0tF7X1vboLEVOPIZccve4Wx6QJK92m8GR3ZcVQD5M1W7VXT8TJzEYsfGhLmyFSFwJLxglNwKb0mqAzlOuTnMp0hzMU2Cl3lpF+GXLOxdS40tXPD8j1kg=", "ak.pv": "3", "ak.dpoabenc": "", "ak.tf": i }; if ("" !== t) o["ak.ruds"] = t; var r = { i: !1, av: function (n) { var t = "http.initiator"; if (n && (!n[t] || "spa_hard" === n[t])) o["ak.feo"] = void 0 !== e.aFeoApplied ? 1 : 0, BOOMR.addVar(o) }, rv: function () { var e = ["ak.bpcip", "ak.cport", "ak.cr", "ak.csrc", "ak.gh", "ak.ipv", "ak.m", "ak.n", "ak.ol", "ak.proto", "ak.quicv", "ak.tlsv", "ak.0rtt", "ak.0rtt.ed", "ak.r", "ak.acc", "ak.t", "ak.tf"]; BOOMR.removeVar(e) } }; BOOMR.plugins.AK = { akVars: o, akDNSPreFetchDomain: a, init: function () { if (!r.i) { var e = BOOMR.subscribe; e("before_beacon", r.av, null, null), e("onbeacon", r.rv, null, null), r.i = !0 } return this }, is_complete: function () { return !0 } } } }() }(window);</script> 176 + </head> 177 + 178 + <body class="body no-touch js-mptd-layout" data-AdsGlobalSkinTakeoverManager="body" data-SearchResultsNavManager="body"> 179 + <cookie-manager></cookie-manager> 180 + <device-inspection-manager 181 + endpoint="https://www.rottentomatoes.com/napi/device/inspection"></device-inspection-manager> 182 + 183 + <user-activity-manager profiles-features-enabled="false"></user-activity-manager> 184 + <user-identity-manager profiles-features-enabled="false"></user-identity-manager> 185 + <ad-unit-manager></ad-unit-manager> 186 + 187 + <auth-initiate-manager profiles-username-enabled="false" data-ArtiManager="authInitiateManager" 188 + data-WatchlistButtonManager="authInitiateManager:createAccount"> 189 + </auth-initiate-manager> 190 + <auth-profile-manager data-AuthInitiateManager="authProfileManager"></auth-profile-manager> 191 + <auth-validation-manager data-AuthInitiateManager="authValidation"></auth-validation-manager> 192 + <overlay-base data-AuthInitiateManager="overlayBase:close" data-PagePollsIndexManager="authOverlay:close" hidden> 193 + <overlay-flows data-AuthInitiateManager="overlayFlows" slot="content"> 194 + <action-icon slot="close" class="auth-overlay__icon-button auth-overlay__icon-button--close" aria-label="Close" 195 + data-qa="close-overlay-btn" icon="close"></action-icon> 196 + 197 + </overlay-flows> 198 + </overlay-base> 199 + 200 + <notification-alert data-AuthInitiateManager="authSuccess" animate hidden> 201 + <rt-icon icon="check-circled"></rt-icon> 202 + <span>Signed in</span> 203 + </notification-alert> 204 + 205 + <div id="auth-templates" data-AuthInitiateManager="authTemplates"> 206 + <template slot="screens" id="account-create-username-screen"> 207 + <account-create-username-screen data-qa="account-create-username-screen"> 208 + <input-label slot="input-username" state="default" data-qa="username-input-label"> 209 + <label slot="label" for="create-username-input">Username</label> 210 + <input slot="input" id="create-username-input" type="text" placeholder="Username" data-qa="username-input" /> 211 + </input-label> 212 + <rt-button disabled slot="btn-continue" shape="pill" data-qa="continue-btn">Continue</rt-button> 213 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 214 + By joining, you agree to the <rt-link href="/policies/terms-and-policies" target="_blank" 215 + data-qa="terms-policies-link">Terms and Policies</rt-link> and 216 + the <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 217 + data-qa="privacy-policy-link">Privacy Policy</rt-link> and to receive email from 218 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 219 + Brands</rt-link>. 220 + </rt-text> 221 + </account-create-username-screen> 222 + </template> 223 + 224 + <template slot="screens" id="account-email-change-screen"> 225 + <account-email-change-screen data-qa="account-email-change-screen" email="user@email.com"> 226 + <input-label class="new-email-input" state="default" slot="new-email-input" data-qa="email-input-label"> 227 + <label slot="label" for="newEmail">Enter new email</label> 228 + <input slot="input" name="newEmail" type="text" placeholder="Enter new email" autocomplete="off" 229 + data-qa="email-input"></input> 230 + </input-label> 231 + <rt-button slot="submit-button" disabled shape="pill" data-qa="submit-btn">Submit</rt-button> 232 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 233 + By joining, you agree to the 234 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link">Terms and 235 + Policies</rt-link> 236 + and <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 237 + data-qa="privacy-policy-link">Privacy Policy</rt-link> 238 + and to receive email from the 239 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 240 + Brands</rt-link>. 241 + </rt-text> 242 + </account-email-change-screen> 243 + </template> 244 + 245 + <template slot="screens" id="account-email-change-success-screen"> 246 + <account-email-change-success-screen data-qa="login-create-success-screen"> 247 + <rt-text slot="message" size="1.5" style="--fontWeight: var(--franklinGothicDemi);">Email change 248 + successful</rt-text> 249 + <rt-text slot="submessage">You are signed out for your security. </br> Please sign in again.</rt-text> 250 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 251 + height="105" /> 252 + </account-email-change-success-screen> 253 + </template> 254 + 255 + <template slot="screens" id="account-password-change-screen"> 256 + <account-password-change-screen data-qa="account-password-change-screen"> 257 + <input-label state="default" slot="input-password-existing"> 258 + <label slot="label" for="password-existing">Existing password</label> 259 + <input slot="input" name="password-existing" type="password" placeholder="Enter existing password" 260 + autocomplete="off"></input> 261 + </input-label> 262 + <input-label state="default" slot="input-password-new"> 263 + <label slot="label" for="password-new">New password</label> 264 + <input slot="input" name="password-new" type="password" placeholder="Enter new password" 265 + autocomplete="off"></input> 266 + </input-label> 267 + <rt-button disabled shape="pill" slot="submit-button">Submit</rt-button> 268 + </account-password-change-screen> 269 + </template> 270 + 271 + <template slot="screens" id="account-password-change-updating-screen"> 272 + <login-success-screen data-qa="account-password-change-updating-screen" hidebanner> 273 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 274 + Updating your password... 275 + </rt-text> 276 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 277 + height="105" /> 278 + </login-success-screen> 279 + </template> 280 + <template slot="screens" id="account-password-change-success-screen"> 281 + <login-success-screen data-qa="account-password-change-success-screen" hidebanner> 282 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 283 + Success! 284 + </rt-text> 285 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 286 + height="105" /> 287 + </login-success-screen> 288 + </template> 289 + <template slot="screens" id="account-verifying-email-screen"> 290 + <account-verifying-email-screen data-qa="account-verifying-email-screen"> 291 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-auth-verify.e74a69e9a77.svg" alt="email" /> 292 + <rt-text slot="status"> Verifying your email... </rt-text> 293 + <rt-button type="cta-large" href="/?authFlowScreen=loginStartScreen" slot="retryLink" size="0.875" 294 + style="--fontWeight: var(--franklinGothicMedium);" data-qa="retry-link"> 295 + Retry 296 + </rt-button> 297 + </account-verifying-email-screen> 298 + </template> 299 + <template slot="screens" id="cognito-loading"> 300 + <div> 301 + <loading-spinner id="cognito-auth-loading-spinner"></loading-spinner> 302 + <style> 303 + #cognito-auth-loading-spinner { 304 + font-size: 2rem; 305 + transform: translate(calc(100% - 1em), 250px); 306 + width: 50%; 307 + } 308 + </style> 309 + </div> 310 + </template> 311 + 312 + <template slot="screens" id="login-check-email-screen"> 313 + <login-check-email-screen data-qa="login-check-email-screen" email="user@email.com"> 314 + <rt-text class="note-text" size="1" slot="noteText"> 315 + Please open the email link from the same browser you initiated the change email process from. 316 + </rt-text> 317 + <rt-text slot="gotEmailMessage" size="0.875"> 318 + Didn't you get the email? 319 + </rt-text> 320 + <rt-button slot="resendEmailLink" size="0.875" type="cta-large" data-qa="resend-email-link"> 321 + Resend email 322 + </rt-button> 323 + <rt-link context="label" slot="troubleLoginLink" size="0.875" href="/reset-client" data-qa="reset-link">Having 324 + trouble logging in?</rt-link> 325 + 326 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 327 + By continuing, you agree to the 328 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 329 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 330 + and the 331 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 332 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 333 + and to receive email from 334 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 335 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 336 + </rt-text> 337 + </login-check-email-screen> 338 + </template> 339 + 340 + <template slot="screens" id="login-error-screen"> 341 + <login-error-screen data-qa="login-error"> 342 + <rt-text slot="header" size="1.5" context="heading" data-qa="header"> 343 + Something went wrong... 344 + </rt-text> 345 + <rt-text slot="description1" size="1" context="label" data-qa="description1"> 346 + Please try again. 347 + </rt-text> 348 + <img slot="image" src="/assets/pizza-pie/images/icons/cognito-error.c55e509a7fd.svg" /> 349 + <rt-text hidden slot="description2" size="1" context="label" data-qa="description2"></rt-text> 350 + <rt-link slot="ctaLink" hidden context="label" size="0.875" data-qa="retry-link">Retry</rt-link> 351 + </login-error-screen> 352 + </template> 353 + 354 + <template slot="screens" id="login-enter-password-screen"> 355 + <login-enter-password-screen data-qa="login-enter-password-screen"> 356 + <rt-text slot="title" size="1.5" style="--fontWeight: var(--franklinGothicMedium);"> 357 + Welcome back! 358 + </rt-text> 359 + <rt-text slot="username" data-qa="user-email"> 360 + username@email.com 361 + </rt-text> 362 + <input-label slot="inputPassword" state="default" data-qa="password-input-label"> 363 + <label slot="label" for="pass">Password</label> 364 + <input slot="input" id="pass" type="password" placeholder="Password" autocomplete="off" 365 + data-qa="password-input"></input> 366 + </input-label> 367 + <rt-button disabled slot="continueButton" type="cta-large" data-qa="continue-btn"> 368 + Continue 369 + </rt-button> 370 + <rt-button slot="emailLoginButton" theme="light" shape="pill" data-qa="send-email-btn"> 371 + Send email to verify 372 + </rt-button> 373 + <rt-link slot="forgotPasswordLink" theme="light" data-qa="forgot-password-link">Forgot password</rt-link> 374 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 375 + By continuing, you agree to the 376 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 377 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 378 + and the 379 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 380 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 381 + and to receive email from 382 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 383 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 384 + </rt-text> 385 + </login-enter-password-screen> 386 + </template> 387 + 388 + <template slot="screens" id="login-start-screen"> 389 + <login-start-screen data-qa="login-start-screen"> 390 + <input-label slot="inputEmail" state="default" data-qa="email-input-label"> 391 + <label slot="label" for="login-email-input">Email address</label> 392 + <input slot="input" autocomplete="username" id="login-email-input" placeholder="Email address" type="text" 393 + data-qa="email-input" /> 394 + </input-label> 395 + <rt-button disabled slot="emailLoginButton" type="cta-large" data-qa="continue-btn"> 396 + Continue 397 + </rt-button> 398 + <rt-button slot="googleLoginButton" shape="pill" theme="light" 399 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="google-login-btn" data-type="google"> 400 + <div class="social-login-btn-content"> 401 + <img height="16px" width="16px" src="/assets/pizza-pie/images/vendor/google/google_logo.28d9eb28faa.svg" /> 402 + Continue with Google 403 + </div> 404 + </rt-button> 405 + 406 + <rt-button slot="appleLoginButton" shape="pill" theme="light" 407 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="apple-login-btn" data-type="apple"> 408 + <div class="social-login-btn-content"> 409 + <rt-icon size="1" icon="apple"></rt-icon> 410 + Continue with apple 411 + </div> 412 + </rt-button> 413 + 414 + <rt-link slot="resetLink" class="reset-link" context="label" size="0.875" href="/reset-client" 415 + data-qa="reset-link"> 416 + Having trouble logging in? 417 + </rt-link> 418 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 419 + By continuing, you agree to the 420 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 421 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 422 + and the 423 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 424 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 425 + and to receive email from 426 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 427 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 428 + </rt-text> 429 + </login-start-screen> 430 + </template> 431 + 432 + <template slot="screens" id="login-success-screen"> 433 + <login-success-screen data-qa="login-success-screen"> 434 + <rt-text slot="status" size="1.5"> 435 + Login successful! 436 + </rt-text> 437 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 438 + height="105" /> 439 + </login-success-screen> 440 + </template> 441 + <template slot="screens" id="cognito-opt-in-us"> 442 + <auth-optin-screen data-qa="auth-opt-in-screen"> 443 + <div slot="newsletter-text"> 444 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 445 + </div> 446 + <img slot="image" class="image" 447 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 448 + alt="Rotten Tomatoes Newsletter">> 449 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 450 + </h2> 451 + <ul slot="options"> 452 + <li class="icon-item">Upcoming Movies and TV shows</li> 453 + <li class="icon-item">Rotten Tomatoes Podcast</li> 454 + <li class="icon-item">Media News + More</li> 455 + </ul> 456 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 457 + Sign me up 458 + </rt-button> 459 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 460 + No thanks 461 + </rt-button> 462 + <p slot="foot-note"> 463 + By clicking "Sign Me Up," you are agreeing to receive occasional emails and communications from Fandango Media 464 + (Fandango, Vudu, and Rotten Tomatoes) and consenting to Fandango's 465 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" class="optin-link" target="_blank" 466 + rel="noopener" data-qa="auth-name-screen-privacy-policy-link">Privacy Policy</a> 467 + and 468 + <a href="/policies/terms-and-policies" class="optin-link" target="_blank" rel="noopener" 469 + data-qa="auth-name-screen-privacy-policy-link">Terms and Policies</a>. 470 + Please allow 10 business days for your account to reflect your preferences. 471 + </p> 472 + </auth-optin-screen> 473 + </template> 474 + <template slot="screens" id="cognito-opt-in-foreign"> 475 + <auth-optin-screen data-qa="auth-opt-in-screen"> 476 + <div slot="newsletter-text"> 477 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 478 + </div> 479 + <img slot="image" class="image" 480 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 481 + alt="Rotten Tomatoes Newsletter">> 482 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 483 + </h2> 484 + <ul slot="options"> 485 + <li class="icon-item">Upcoming Movies and TV shows</li> 486 + <li class="icon-item">Rotten Tomatoes Podcast</li> 487 + <li class="icon-item">Media News + More</li> 488 + </ul> 489 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 490 + Sign me up 491 + </rt-button> 492 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 493 + No thanks 494 + </rt-button> 495 + </auth-optin-screen> 496 + </template> 497 + <template slot="screens" id="cognito-opt-in-success"> 498 + <auth-verify-screen> 499 + <rt-icon icon="check-circled" slot="icon"></rt-icon> 500 + <p class="h3" slot="status">OK, got it!</p> 501 + </auth-verify-screen> 502 + </template> 503 + 504 + </div> 505 + 506 + 507 + <div id="emptyPlaceholder"></div> 508 + 509 + 510 + 511 + <script ASYNC src="//assets.adobedtm.com/launch-EN549327edc13e414a9beb5d61bfd9aac6.min.js"></script> 512 + 513 + 514 + 515 + <div id="main" class="container rt-layout__body"> 516 + <a href="#main-page-content" class="skip-link">Skip to Main Content</a> 517 + 518 + 519 + 520 + <div id="header_and_leaderboard"> 521 + <div id="top_leaderboard_wrapper" class="leaderboard_wrapper "> 522 + <ad-unit hidden unit-display="desktop" unit-type="topbanner" adjust-height> 523 + <div slot="ad-inject"></div> 524 + </ad-unit> 525 + 526 + <ad-unit hidden unit-display="mobile" unit-type="mbanner"> 527 + <div slot="ad-inject"></div> 528 + </ad-unit> 529 + </div> 530 + </div> 531 + 532 + 533 + <rt-header-manager></rt-header-manager> 534 + 535 + <rt-header aria-label="navigation bar" class="navbar" data-qa="header-nav-bar" 536 + data-AdsGlobalNavTakeoverManager="header" id="header-main" skeleton="panel"> 537 + 538 + 539 + <button aria-label="Open aRTi" class="arti-mobile" data-ArtiManager="btnArti:click" slot="arti-mobile"> 540 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 541 + </button> 542 + 543 + 544 + <div slot="mobile-header-nav"> 545 + <rt-button id="mobile-header-nav-btn" data-RtHeaderManager="mobileHeaderNavBtn:click" size="1.6" 546 + style="--backgroundColor: transparent; --backgroundColorHover: transparent; --buttonPadding: 0 10px 4px;"> 547 + &#9776; 548 + </rt-button> 549 + <mobile-header-nav id="mobile-header-nav" data-RtHeaderManager="mobileHeaderNav"> 550 + <rt-img slot="logoImage" alt="Rotten Tomatoes" fetchpriority="high" 551 + src="/assets/pizza-pie/images/rt-tomato-logo.20c3bdbc97b.svg"></rt-img> 552 + <div slot="menusCss"></div> 553 + <div slot="menus"></div> 554 + </mobile-header-nav> 555 + </div> 556 + 557 + <a class="logo-wrap" data-AdsGlobalNavTakeoverManager="logoLink" data-SearchResultsNavManager="rtNavLogo" href="/" 558 + id="navbar" slot="logo"> 559 + <img alt="Rotten Tomatoes" data-qa="header-logo" data-AdsGlobalNavTakeoverManager="logo" 560 + src="/assets/pizza-pie/images/rtlogo.9b892cff3fd.png" fetchpriority="high" /> 561 + 562 + <div class="hide"> 563 + <ad-unit hidden unit-display="desktop,mobile" unit-type="logorepeat" unit-targeting="ploc=rtlogo;"> 564 + <div slot="ad-inject"></div> 565 + </ad-unit> 566 + </div> 567 + </a> 568 + 569 + <search-results-nav-manager></search-results-nav-manager> 570 + 571 + <search-results-nav data-adobe-id="global-nav-search" data-SearchResultsNavManager="search" slot="search" 572 + skeleton="chip"> 573 + <search-results-controls data-SearchResultsNavManager="searchControls" slot="controls"> 574 + <input aria-label="Search" data-AdsGlobalNavTakeoverManager="searchInput" 575 + data-SearchResultsNavManager="inputText:click,input,keydown" data-qa="search-input" placeholder="Search" 576 + slot="search-input" type="text" /> 577 + <rt-button class="search-clear" data-qa="search-clear" data-AdsGlobalNavTakeoverManager="searchClearBtn" 578 + data-SearchResultsNavManager="clearBtn:click" size="0.875" slot="search-clear" theme="transparent"> 579 + <rt-icon icon="close"></rt-icon> 580 + </rt-button> 581 + <rt-link class="search-submit" aria-label="Submit search" data-qa="search-submit" 582 + data-AdsGlobalNavTakeoverManager="searchSubmitBtn" data-SearchResultsNavManager="submitBtn:click" 583 + href="/search" size="0.875" slot="search-submit"> 584 + <rt-icon icon="search"></rt-icon> 585 + </rt-link> 586 + <rt-button class="search-cancel" data-qa="search-cancel" data-AdsGlobalNavTakeoverManager="searchCancelBtn" 587 + data-SearchResultsNavManager="cancelBtn:click" size="0.875" slot="search-cancel" theme="transparent"> 588 + Cancel 589 + </rt-button> 590 + </search-results-controls> 591 + 592 + <search-results aria-expanded="false" class="hide" data-SearchResultsNavManager="searchResults" slot="results"> 593 + </search-results> 594 + </search-results-nav> 595 + 596 + <ul slot="nav-links"> 597 + <li> 598 + <a href="/about" data-qa="header:link-whats-tmeter" data-AdsGlobalNavTakeoverManager="text"> 599 + About Rotten Tomatoes&reg; 600 + </a> 601 + </li> 602 + <li> 603 + <a href="/critics" data-qa="header:link-critics-home" data-AdsGlobalNavTakeoverManager="text"> 604 + Critics 605 + </a> 606 + </li> 607 + <li data-RtHeaderManager="loginLink"> 608 + <ul> 609 + <li> 610 + <button id="masthead-show-login-btn" class="js-cognito-signin button--link" 611 + data-AuthInitiateManager="btnSignIn:click" data-qa="header:login-btn" 612 + data-AdsGlobalNavTakeoverManager="text"> 613 + Login/signup 614 + </button> 615 + </li> 616 + </ul> 617 + </li> 618 + <li class="hide" data-RtHeaderManager="userItem:keydown,keyup,mouseenter" data-qa="header:user"> 619 + <a class="masthead-user-link" data-RtHeaderManager="navUserlink:focus" rel="nofollow" 620 + data-qa="user-profile-link"> 621 + <img data-RtHeaderManager="navUserImg" data-qa="user-profile-thumb"> 622 + <p data-AdsGlobalNavTakeoverManager="text" data-RtHeaderManager="navUserFirstName" 623 + data-qa="user-profile-name"></p> 624 + <rt-icon data-AdsGlobalNavTakeoverManager="text" icon="down-dir" image> 625 + </rt-icon> 626 + </a> 627 + <rt-header-user-info class="hide" data-RtHeaderManager="userInfo:focusout,mouseleave"> 628 + <a data-qa="user-stats-profile-pic" href="" rel="nofollow" slot="imageExpanded" tabindex="-1"> 629 + <img src="" width="40" alt=""> 630 + </a> 631 + <a slot="fullName" rel="nofollow" href="" class="username" data-qa="user-stats-name"></a> 632 + <a slot="wts" rel="nofollow" href="" class="wts-count-block" data-qa="user-stats-wts"> 633 + <rt-icon icon="plus" data-qa="user-stats-ratings-count"></rt-icon> 634 + <span class="count" data-qa="user-stats-wts-count"></span> 635 + &nbsp;Wants to See 636 + </a> 637 + <a slot="rating" rel="nofollow" href="" class="rating-count-block" data-qa="user-stats-ratings"> 638 + <rt-icon icon="star" data-qa="user-stats-ratings-count"></rt-icon> 639 + <span class="count"></span> 640 + &nbsp;Ratings 641 + </a> 642 + 643 + <a slot="profileLink" rel="nofollow" class="dropdown-link" href="" 644 + data-qa="user-stats-profile-link">Profile</a> 645 + <a slot="accountLink" rel="nofollow" class="dropdown-link" href="/user/account" 646 + data-qa="user-stats-account-link">Account</a> 647 + <a slot="logoutLink" class="dropdown-link" data-RtHeaderManager="logoutLink:click" href="#logout" 648 + data-qa="user-stats-logout-link">Log Out</a> 649 + </rt-header-user-info> 650 + </li> 651 + </ul> 652 + 653 + <rt-header-nav slot="nav-dropdowns"> 654 + 655 + <button aria-label="Open aRTi" class="arti-desktop" data-ArtiManager="btnArti:click" slot="arti-desktop"> 656 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 657 + </button> 658 + 659 + <rt-header-nav-item slot="movies" data-qa="masthead:movies-dvds"> 660 + <a class="unset" slot="link" href="/browse/movies_in_theaters/sort:popular" 661 + data-qa="masthead:movies-dvds-link" data-AdsGlobalNavTakeoverManager="text"> 662 + Movies 663 + </a> 664 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="movies-menu"> 665 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-in-theaters"> 666 + <p slot="title" class="h4" data-qa="movies-in-theaters-main-link"><a class="unset" 667 + href="/browse/movies_in_theaters/sort:popular">Movies in theaters</a></p> 668 + <ul slot="links"> 669 + <li data-qa="in-theaters-item"> 670 + <a href="/browse/movies_in_theaters/sort:newest" data-qa="opening-this-week-link">Opening This 671 + Week</a> 672 + </li> 673 + <li data-qa="in-theaters-item"> 674 + <a href="/browse/movies_in_theaters/sort:top_box_office" data-qa="top-box-office-link">Top Box 675 + Office</a> 676 + </li> 677 + <li data-qa="in-theaters-item"> 678 + <a href="/browse/movies_coming_soon/" data-qa="coming-soon-link">Coming Soon to Theaters</a> 679 + </li> 680 + <li data-qa="in-theaters-item"> 681 + <a href="/browse/movies_in_theaters/critics:certified_fresh~sort:popular" 682 + data-qa="certified-fresh-link">Certified Fresh Movies</a> 683 + </li> 684 + </ul> 685 + </rt-header-nav-item-dropdown-list> 686 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-on-dvd-streaming"> 687 + <p slot="title" class="h4" data-qa="dvd-streaming-main-link"><a class="unset" 688 + href="/browse/movies_at_home">Movies at Home</a></p> 689 + <ul slot="links"> 690 + 691 + <li data-qa="movies-at-home-item"> 692 + <a href="/browse/movies_at_home/affiliates:fandango-at-home" data-qa="fandango-at-home-link">Fandango 693 + at Home</a> 694 + </li> 695 + 696 + <li data-qa="movies-at-home-item"> 697 + <a href="/browse/movies_at_home/affiliates:peacock" data-qa="peacock-link">Peacock</a> 698 + </li> 699 + 700 + <li data-qa="movies-at-home-item"> 701 + <a href="/browse/movies_at_home/affiliates:netflix" data-qa="netflix-link">Netflix</a> 702 + </li> 703 + 704 + <li data-qa="movies-at-home-item"> 705 + <a href="/browse/movies_at_home/affiliates:apple-tv-plus" data-qa="apple-tv-link">Apple TV+</a> 706 + </li> 707 + 708 + <li data-qa="movies-at-home-item"> 709 + <a href="/browse/movies_at_home/affiliates:prime-video" data-qa="prime-video-link">Prime Video</a> 710 + </li> 711 + 712 + <li data-qa="movies-at-home-item"> 713 + <a href="/browse/movies_at_home/sort:popular" data-qa="most-popular-streaming-movies-link">Most 714 + Popular Streaming movies</a> 715 + </li> 716 + 717 + <li data-qa="movies-at-home-item"> 718 + <a href="/browse/movies_at_home/critics:certified_fresh" 719 + data-qa="certified-fresh-movies-link">Certified Fresh movies</a> 720 + </li> 721 + 722 + <li data-qa="movies-at-home-item"> 723 + <a href="/browse/movies_at_home" data-qa="browse-all-link">Browse all</a> 724 + </li> 725 + 726 + </ul> 727 + </rt-header-nav-item-dropdown-list> 728 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-more"> 729 + <p slot="title" class="h4">More</p> 730 + <ul slot="links"> 731 + <li data-qa="what-to-watch-item"> 732 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch" class="what-to-watch" 733 + data-qa="what-to-watch-link">What to Watch<rt-badge>New</rt-badge></a> 734 + </li> 735 + </ul> 736 + </rt-header-nav-item-dropdown-list> 737 + 738 + <rt-header-nav-item-dropdown-list slot="column" cfp> 739 + <p slot="title" class="h4">Certified fresh picks</p> 740 + <ul slot="links" class="cfp-wrap" data-qa="header-certified-fresh-picks" 741 + data-curation="rt-nav-list-cf-picks"> 742 + 743 + <li data-qa="cert-fresh-item"> 744 + 745 + <a class="cfp-tile" href="/m/twinless" data-qa="cert-fresh-link"> 746 + <tile-dynamic data-qa="tile"> 747 + <rt-img alt="Twinless poster image" slot="image" 748 + src="https://resizing.flixster.com/j7lw2KeY9_XyfZQdqRZGku7_9C8=/206x305/v2/https://resizing.flixster.com/uxoeWz7uWmeYIV94_SzEV_osqe4=/fit-in/180x240/v2/https://resizing.flixster.com/VlylB3xT2RIYmRivMx37O3yD76Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" 749 + loading="lazy"></rt-img> 750 + <div slot="caption" data-track="scores"> 751 + <div class="score-wrap"> 752 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 753 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 754 + </div> 755 + <span class="p--small">Twinless</span> 756 + <span class="sr-only">Link to Twinless</span> 757 + </div> 758 + </tile-dynamic> 759 + </a> 760 + </li> 761 + 762 + 763 + <li data-qa="cert-fresh-item"> 764 + 765 + <a class="cfp-tile" href="/m/hamilton_2020" data-qa="cert-fresh-link"> 766 + <tile-dynamic data-qa="tile"> 767 + <rt-img alt="Hamilton poster image" slot="image" 768 + src="https://resizing.flixster.com/1woquJmQfEhWCZtm7GcH0NMHsYA=/206x305/v2/https://resizing.flixster.com/PeAJ5ZpF5qB98ZiX6ixNDCgW2P0=/fit-in/180x240/v2/https://resizing.flixster.com/VmBvlTk8-z7pQvDZXTgSdj93WDE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" 769 + loading="lazy"></rt-img> 770 + <div slot="caption" data-track="scores"> 771 + <div class="score-wrap"> 772 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 773 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 774 + </div> 775 + <span class="p--small">Hamilton</span> 776 + <span class="sr-only">Link to Hamilton</span> 777 + </div> 778 + </tile-dynamic> 779 + </a> 780 + </li> 781 + 782 + 783 + <li data-qa="cert-fresh-item"> 784 + 785 + <a class="cfp-tile" href="/m/the_thursday_murder_club" data-qa="cert-fresh-link"> 786 + <tile-dynamic data-qa="tile"> 787 + <rt-img alt="The Thursday Murder Club poster image" slot="image" 788 + src="https://resizing.flixster.com/jeeldFGcfSMgG09ey5VB7TCFiek=/206x305/v2/https://resizing.flixster.com/9LXDkCzIBBNEiPURkB9t6VefF5Q=/fit-in/180x240/v2/https://resizing.flixster.com/rwdeR5xIiN0k7SWr6yXdnmb6zP8=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" 789 + loading="lazy"></rt-img> 790 + <div slot="caption" data-track="scores"> 791 + <div class="score-wrap"> 792 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 793 + <rt-text class="critics-score" size="1" context="label">76%</rt-text> 794 + </div> 795 + <span class="p--small">The Thursday Murder Club</span> 796 + <span class="sr-only">Link to The Thursday Murder Club</span> 797 + </div> 798 + </tile-dynamic> 799 + </a> 800 + </li> 801 + 802 + </ul> 803 + </rt-header-nav-item-dropdown-list> 804 + 805 + </rt-header-nav-item-dropdown> 806 + </rt-header-nav-item> 807 + 808 + <rt-header-nav-item slot="tv" data-qa="masthead:tv"> 809 + <a class="unset" slot="link" href="/browse/tv_series_browse/sort:popular" data-qa="masthead:tv-link" 810 + data-AdsGlobalNavTakeoverManager="text"> 811 + Tv shows 812 + </a> 813 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="tv-menu"> 814 + 815 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list1"> 816 + <p slot="title" class="h4" data-curation="rt-hp-text-list-3"> 817 + New TV Tonight 818 + </p> 819 + <ul slot="links" class="score-list-wrap"> 820 + 821 + <li data-qa="list-item"> 822 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 823 + <div class="score-wrap"> 824 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 825 + 826 + <rt-text class="critics-score" context="label" size="1" 827 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 828 + 829 + </div> 830 + <span> 831 + 832 + Task: Season 1 833 + 834 + </span> 835 + </a> 836 + </li> 837 + 838 + <li data-qa="list-item"> 839 + <a class="score-list-item" href="/tv/the_walking_dead_daryl_dixon/s03" data-qa="list-item-link"> 840 + <div class="score-wrap"> 841 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 842 + 843 + <rt-text class="critics-score" context="label" size="1" 844 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 845 + 846 + </div> 847 + <span> 848 + 849 + The Walking Dead: Daryl Dixon: Season 3 850 + 851 + </span> 852 + </a> 853 + </li> 854 + 855 + <li data-qa="list-item"> 856 + <a class="score-list-item" href="/tv/the_crow_girl/s01" data-qa="list-item-link"> 857 + <div class="score-wrap"> 858 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 859 + 860 + <rt-text class="critics-score" context="label" size="1" 861 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 862 + 863 + </div> 864 + <span> 865 + 866 + The Crow Girl: Season 1 867 + 868 + </span> 869 + </a> 870 + </li> 871 + 872 + <li data-qa="list-item"> 873 + <a class="score-list-item" href="/tv/only_murders_in_the_building/s05" data-qa="list-item-link"> 874 + <div class="score-wrap"> 875 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 876 + 877 + <rt-text class="critics-score-empty" context="label" size="1" 878 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 879 + 880 + </div> 881 + <span> 882 + 883 + Only Murders in the Building: Season 5 884 + 885 + </span> 886 + </a> 887 + </li> 888 + 889 + <li data-qa="list-item"> 890 + <a class="score-list-item" href="/tv/the_girlfriend/s01" data-qa="list-item-link"> 891 + <div class="score-wrap"> 892 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 893 + 894 + <rt-text class="critics-score-empty" context="label" size="1" 895 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 896 + 897 + </div> 898 + <span> 899 + 900 + The Girlfriend: Season 1 901 + 902 + </span> 903 + </a> 904 + </li> 905 + 906 + <li data-qa="list-item"> 907 + <a class="score-list-item" href="/tv/aka_charlie_sheen/s01" data-qa="list-item-link"> 908 + <div class="score-wrap"> 909 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 910 + 911 + <rt-text class="critics-score-empty" context="label" size="1" 912 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 913 + 914 + </div> 915 + <span> 916 + 917 + aka Charlie Sheen: Season 1 918 + 919 + </span> 920 + </a> 921 + </li> 922 + 923 + <li data-qa="list-item"> 924 + <a class="score-list-item" href="/tv/wizards_beyond_waverly_place/s02" data-qa="list-item-link"> 925 + <div class="score-wrap"> 926 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 927 + 928 + <rt-text class="critics-score-empty" context="label" size="1" 929 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 930 + 931 + </div> 932 + <span> 933 + 934 + Wizards Beyond Waverly Place: Season 2 935 + 936 + </span> 937 + </a> 938 + </li> 939 + 940 + <li data-qa="list-item"> 941 + <a class="score-list-item" href="/tv/seen_and_heard_the_history_of_black_television/s01" 942 + data-qa="list-item-link"> 943 + <div class="score-wrap"> 944 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 945 + 946 + <rt-text class="critics-score-empty" context="label" size="1" 947 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 948 + 949 + </div> 950 + <span> 951 + 952 + Seen &amp; Heard: the History of Black Television: Season 1 953 + 954 + </span> 955 + </a> 956 + </li> 957 + 958 + <li data-qa="list-item"> 959 + <a class="score-list-item" href="/tv/the_fragrant_flower_blooms_with_dignity/s01" 960 + data-qa="list-item-link"> 961 + <div class="score-wrap"> 962 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 963 + 964 + <rt-text class="critics-score-empty" context="label" size="1" 965 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 966 + 967 + </div> 968 + <span> 969 + 970 + The Fragrant Flower Blooms With Dignity: Season 1 971 + 972 + </span> 973 + </a> 974 + </li> 975 + 976 + <li data-qa="list-item"> 977 + <a class="score-list-item" href="/tv/guts_and_glory/s01" data-qa="list-item-link"> 978 + <div class="score-wrap"> 979 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 980 + 981 + <rt-text class="critics-score-empty" context="label" size="1" 982 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 983 + 984 + </div> 985 + <span> 986 + 987 + Guts &amp; Glory: Season 1 988 + 989 + </span> 990 + </a> 991 + </li> 992 + 993 + </ul> 994 + <a class="a--short" data-qa="tv-list1-view-all-link" href="/browse/tv_series_browse/sort:newest" 995 + slot="view-all-link"> 996 + View All 997 + </a> 998 + </rt-header-nav-item-dropdown-list> 999 + 1000 + 1001 + 1002 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list2"> 1003 + <p slot="title" class="h4" data-curation="rt-hp-text-list-2"> 1004 + Most Popular TV on RT 1005 + </p> 1006 + <ul slot="links" class="score-list-wrap"> 1007 + 1008 + <li data-qa="list-item"> 1009 + <a class="score-list-item" href="/tv/the_paper_2025/s01" data-qa="list-item-link"> 1010 + <div class="score-wrap"> 1011 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1012 + 1013 + <rt-text class="critics-score" context="label" size="1" 1014 + style="--lineHeight: 1; --letterSpacing: 0.016em;">83%</rt-text> 1015 + 1016 + </div> 1017 + <span> 1018 + 1019 + The Paper: Season 1 1020 + 1021 + </span> 1022 + </a> 1023 + </li> 1024 + 1025 + <li data-qa="list-item"> 1026 + <a class="score-list-item" href="/tv/dexter_resurrection/s01" data-qa="list-item-link"> 1027 + <div class="score-wrap"> 1028 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1029 + 1030 + <rt-text class="critics-score" context="label" size="1" 1031 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1032 + 1033 + </div> 1034 + <span> 1035 + 1036 + Dexter: Resurrection: Season 1 1037 + 1038 + </span> 1039 + </a> 1040 + </li> 1041 + 1042 + <li data-qa="list-item"> 1043 + <a class="score-list-item" href="/tv/alien_earth/s01" data-qa="list-item-link"> 1044 + <div class="score-wrap"> 1045 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1046 + 1047 + <rt-text class="critics-score" context="label" size="1" 1048 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1049 + 1050 + </div> 1051 + <span> 1052 + 1053 + Alien: Earth: Season 1 1054 + 1055 + </span> 1056 + </a> 1057 + </li> 1058 + 1059 + <li data-qa="list-item"> 1060 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 1061 + <div class="score-wrap"> 1062 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1063 + 1064 + <rt-text class="critics-score" context="label" size="1" 1065 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 1066 + 1067 + </div> 1068 + <span> 1069 + 1070 + Task: Season 1 1071 + 1072 + </span> 1073 + </a> 1074 + </li> 1075 + 1076 + <li data-qa="list-item"> 1077 + <a class="score-list-item" href="/tv/wednesday/s02" data-qa="list-item-link"> 1078 + <div class="score-wrap"> 1079 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1080 + 1081 + <rt-text class="critics-score" context="label" size="1" 1082 + style="--lineHeight: 1; --letterSpacing: 0.016em;">87%</rt-text> 1083 + 1084 + </div> 1085 + <span> 1086 + 1087 + Wednesday: Season 2 1088 + 1089 + </span> 1090 + </a> 1091 + </li> 1092 + 1093 + <li data-qa="list-item"> 1094 + <a class="score-list-item" href="/tv/peacemaker_2022/s02" data-qa="list-item-link"> 1095 + <div class="score-wrap"> 1096 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1097 + 1098 + <rt-text class="critics-score" context="label" size="1" 1099 + style="--lineHeight: 1; --letterSpacing: 0.016em;">99%</rt-text> 1100 + 1101 + </div> 1102 + <span> 1103 + 1104 + Peacemaker: Season 2 1105 + 1106 + </span> 1107 + </a> 1108 + </li> 1109 + 1110 + <li data-qa="list-item"> 1111 + <a class="score-list-item" href="/tv/the_terminal_list_dark_wolf/s01" data-qa="list-item-link"> 1112 + <div class="score-wrap"> 1113 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1114 + 1115 + <rt-text class="critics-score" context="label" size="1" 1116 + style="--lineHeight: 1; --letterSpacing: 0.016em;">73%</rt-text> 1117 + 1118 + </div> 1119 + <span> 1120 + 1121 + The Terminal List: Dark Wolf: Season 1 1122 + 1123 + </span> 1124 + </a> 1125 + </li> 1126 + 1127 + <li data-qa="list-item"> 1128 + <a class="score-list-item" href="/tv/hostage_2025/s01" data-qa="list-item-link"> 1129 + <div class="score-wrap"> 1130 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1131 + 1132 + <rt-text class="critics-score" context="label" size="1" 1133 + style="--lineHeight: 1; --letterSpacing: 0.016em;">82%</rt-text> 1134 + 1135 + </div> 1136 + <span> 1137 + 1138 + Hostage: Season 1 1139 + 1140 + </span> 1141 + </a> 1142 + </li> 1143 + 1144 + <li data-qa="list-item"> 1145 + <a class="score-list-item" href="/tv/chief_of_war/s01" data-qa="list-item-link"> 1146 + <div class="score-wrap"> 1147 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1148 + 1149 + <rt-text class="critics-score" context="label" size="1" 1150 + style="--lineHeight: 1; --letterSpacing: 0.016em;">93%</rt-text> 1151 + 1152 + </div> 1153 + <span> 1154 + 1155 + Chief of War: Season 1 1156 + 1157 + </span> 1158 + </a> 1159 + </li> 1160 + 1161 + <li data-qa="list-item"> 1162 + <a class="score-list-item" href="/tv/irish_blood/s01" data-qa="list-item-link"> 1163 + <div class="score-wrap"> 1164 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1165 + 1166 + <rt-text class="critics-score" context="label" size="1" 1167 + style="--lineHeight: 1; --letterSpacing: 0.016em;">100%</rt-text> 1168 + 1169 + </div> 1170 + <span> 1171 + 1172 + Irish Blood: Season 1 1173 + 1174 + </span> 1175 + </a> 1176 + </li> 1177 + 1178 + </ul> 1179 + <a class="a--short" data-qa="tv-list2-view-all-link" href="/browse/tv_series_browse/sort:popular?" 1180 + slot="view-all-link"> 1181 + View All 1182 + </a> 1183 + </rt-header-nav-item-dropdown-list> 1184 + 1185 + 1186 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-more"> 1187 + <p slot="title" class="h4">More</p> 1188 + <ul slot="links"> 1189 + <li> 1190 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" class="what-to-watch" 1191 + data-qa="what-to-watch-link-tv"> 1192 + What to Watch<rt-badge>New</rt-badge> 1193 + </a> 1194 + </li> 1195 + <li> 1196 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-best-link"> 1197 + <span>Best TV Shows</span> 1198 + </a> 1199 + </li> 1200 + <li> 1201 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-popular-link"> 1202 + <span>Most Popular TV</span> 1203 + </a> 1204 + </li> 1205 + <li> 1206 + <a href="/browse/tv_series_browse/affiliates:fandango-at-home" data-qa="tv-fandango-at-home-link"> 1207 + <span>Fandango at Home</span> 1208 + </a> 1209 + </li> 1210 + <li> 1211 + <a href="/browse/tv_series_browse/affiliates:peacock" data-qa="tv-peacock-link"> 1212 + <span>Peacock</span> 1213 + </a> 1214 + </li> 1215 + <li> 1216 + <a href="/browse/tv_series_browse/affiliates:paramount-plus" data-qa="tv-paramount-link"> 1217 + <span>Paramount+</span> 1218 + </a> 1219 + </li> 1220 + <li> 1221 + <a href="/browse/tv_series_browse/affiliates:netflix" data-qa="tv-netflix-link"> 1222 + <span>Netflix</span> 1223 + </a> 1224 + </li> 1225 + <li> 1226 + <a href="/browse/tv_series_browse/affiliates:prime-video" data-qa="tv-prime-video-link"> 1227 + <span>Prime Video</span> 1228 + </a> 1229 + </li> 1230 + <li> 1231 + <a href="/browse/tv_series_browse/affiliates:apple-tv-plus" data-qa="tv-apple-tv-plus-link"> 1232 + <span>Apple TV+</span> 1233 + </a> 1234 + </li> 1235 + </ul> 1236 + </rt-header-nav-item-dropdown-list> 1237 + 1238 + 1239 + <rt-header-nav-item-dropdown-list slot="column" cfp data-qa="header-certified-fresh-pick"> 1240 + <p slot="title" class="h4"> 1241 + Certified fresh pick 1242 + </p> 1243 + <ul slot="links" class="cfp-wrap" data-curation="rt-nav-list-cf-picks"> 1244 + <li> 1245 + 1246 + <a class="cfp-tile" href="/tv/the_paper_2025/s01" data-qa="cert-fresh-link"> 1247 + <tile-dynamic data-qa="tile"> 1248 + <rt-img alt="The Paper: Season 1 poster image" slot="image" 1249 + src="https://resizing.flixster.com/yFijQcjPYUWUelgmiZLHgkXU7hw=/206x305/v2/https://resizing.flixster.com/DFkkHf5pEVX_apKtIQZcoEvI6RU=/fit-in/180x240/v2/https://resizing.flixster.com/texEZJLAG-KcVpfCdkT2R1t4cmE=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" 1250 + loading="lazy"></rt-img> 1251 + <div slot="caption" data-track="scores"> 1252 + <div class="score-wrap"> 1253 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 1254 + <rt-text class="critics-score" size="1" context="label">83%</rt-text> 1255 + </div> 1256 + <span class="p--small">The Paper: Season 1</span> 1257 + <span class="sr-only">Link to The Paper: Season 1</span> 1258 + </div> 1259 + </tile-dynamic> 1260 + </a> 1261 + </li> 1262 + </ul> 1263 + </rt-header-nav-item-dropdown-list> 1264 + 1265 + </rt-header-nav-item-dropdown> 1266 + </rt-header-nav-item> 1267 + 1268 + <rt-header-nav-item slot="shop"> 1269 + <a class="unset" id="appLink" slot="link" href="https://editorial.rottentomatoes.com/article/app/" 1270 + target="_blank" data-qa="masthead:app-link" data-AdsGlobalNavTakeoverManager="text"> 1271 + RT App 1272 + <temporary-display slot="temporary-display" key="app" element="#appLink" event="click"> 1273 + <rt-badge hidden>New</rt-badge> 1274 + </temporary-display> 1275 + </a> 1276 + </rt-header-nav-item> 1277 + 1278 + <rt-header-nav-item slot="news" data-qa="masthead:news"> 1279 + <a class="unset" slot="link" href="https://editorial.rottentomatoes.com/" data-qa="masthead:news-link" 1280 + data-AdsGlobalNavTakeoverManager="text"> 1281 + News 1282 + </a> 1283 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="news-menu"> 1284 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-columns"> 1285 + <p slot="title" class="h4">Columns</p> 1286 + <ul slot="links"> 1287 + <li data-qa="column-item"> 1288 + <a href="https://editorial.rottentomatoes.com/all-time-lists/" data-pageheader="All-Time Lists" 1289 + data-qa="column-link"> 1290 + All-Time Lists 1291 + </a> 1292 + </li> 1293 + <li data-qa="column-item"> 1294 + <a href="https://editorial.rottentomatoes.com/binge-guide/" data-pageheader="Binge Guide" 1295 + data-qa="column-link"> 1296 + Binge Guide 1297 + </a> 1298 + </li> 1299 + <li data-qa="column-item"> 1300 + <a href="https://editorial.rottentomatoes.com/comics-on-tv/" data-pageheader="Comics on TV" 1301 + data-qa="column-link"> 1302 + Comics on TV 1303 + </a> 1304 + </li> 1305 + <li data-qa="column-item"> 1306 + <a href="https://editorial.rottentomatoes.com/countdown/" data-pageheader="Countdown" 1307 + data-qa="column-link"> 1308 + Countdown 1309 + </a> 1310 + </li> 1311 + <li data-qa="column-item"> 1312 + <a href="https://editorial.rottentomatoes.com/five-favorite-films/" 1313 + data-pageheader="Five Favorite Films" data-qa="column-link"> 1314 + Five Favorite Films 1315 + </a> 1316 + </li> 1317 + <li data-qa="column-item"> 1318 + <a href="https://editorial.rottentomatoes.com/video-interviews/" data-pageheader="Video Interviews" 1319 + data-qa="column-link"> 1320 + Video Interviews 1321 + </a> 1322 + </li> 1323 + <li data-qa="column-item"> 1324 + <a href="https://editorial.rottentomatoes.com/weekend-box-office/" 1325 + data-pageheader="Weekend Box Office" data-qa="column-link">Weekend Box Office 1326 + </a> 1327 + </li> 1328 + <li data-qa="column-item"> 1329 + <a href="https://editorial.rottentomatoes.com/weekly-ketchup/" data-pageheader="Weekly Ketchup" 1330 + data-qa="column-link"> 1331 + Weekly Ketchup 1332 + </a> 1333 + </li> 1334 + <li data-qa="column-item"> 1335 + <a href="https://editorial.rottentomatoes.com/what-to-watch/" data-pageheader="What to Watch" 1336 + data-qa="column-link"> 1337 + What to Watch 1338 + </a> 1339 + </li> 1340 + </ul> 1341 + </rt-header-nav-item-dropdown-list> 1342 + 1343 + 1344 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-guides"> 1345 + <p slot="title" class="h4">Guides</p> 1346 + <ul slot="links" class="news-wrap"> 1347 + 1348 + <li data-qa="guides-item"> 1349 + <a class="news-tile" href="https://editorial.rottentomatoes.com/guide/best-football-movies/" 1350 + data-qa="news-link"> 1351 + <tile-dynamic data-qa="tile" orientation="landscape"> 1352 + <rt-img alt="59 Best Football Movies, Ranked by Tomatometer poster image" slot="image" 1353 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/09/600EssentialFootballMovies.png" 1354 + loading="lazy"></rt-img> 1355 + <div slot="caption"> 1356 + <p>59 Best Football Movies, Ranked by Tomatometer</p> 1357 + <span class="sr-only">Link to 59 Best Football Movies, Ranked by Tomatometer</span> 1358 + </div> 1359 + </tile-dynamic> 1360 + </a> 1361 + </li> 1362 + 1363 + <li data-qa="guides-item"> 1364 + <a class="news-tile" 1365 + href="https://editorial.rottentomatoes.com/guide/best-new-rom-coms-romance-movies/" 1366 + data-qa="news-link"> 1367 + <tile-dynamic data-qa="tile" orientation="landscape"> 1368 + <rt-img alt="50 Best New Rom-Coms and Romance Movies poster image" slot="image" 1369 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Best_New_Romcoms600.jpg" 1370 + loading="lazy"></rt-img> 1371 + <div slot="caption"> 1372 + <p>50 Best New Rom-Coms and Romance Movies</p> 1373 + <span class="sr-only">Link to 50 Best New Rom-Coms and Romance Movies</span> 1374 + </div> 1375 + </tile-dynamic> 1376 + </a> 1377 + </li> 1378 + 1379 + </ul> 1380 + <a class="a--short" data-qa="guides-view-all-link" href="https://editorial.rottentomatoes.com/countdown/" 1381 + slot="view-all-link"> 1382 + View All 1383 + </a> 1384 + </rt-header-nav-item-dropdown-list> 1385 + 1386 + 1387 + 1388 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-hubs"> 1389 + <p slot="title" class="h4">Hubs</p> 1390 + <ul slot="links" class="news-wrap"> 1391 + 1392 + <li data-qa="hubs-item"> 1393 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" 1394 + data-qa="news-link"> 1395 + <tile-dynamic data-qa="tile" orientation="landscape"> 1396 + <rt-img alt="What to Watch: In Theaters and On Streaming poster image" slot="image" 1397 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/05/RT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" 1398 + loading="lazy"></rt-img> 1399 + <div slot="caption"> 1400 + <p>What to Watch: In Theaters and On Streaming</p> 1401 + <span class="sr-only">Link to What to Watch: In Theaters and On Streaming</span> 1402 + </div> 1403 + </tile-dynamic> 1404 + </a> 1405 + </li> 1406 + 1407 + <li data-qa="hubs-item"> 1408 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/awards-tour/" 1409 + data-qa="news-link"> 1410 + <tile-dynamic data-qa="tile" orientation="landscape"> 1411 + <rt-img alt="Awards Tour poster image" slot="image" 1412 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/02/RT_AwardsTour_Thumbnail_600x314.jpg" 1413 + loading="lazy"></rt-img> 1414 + <div slot="caption"> 1415 + <p>Awards Tour</p> 1416 + <span class="sr-only">Link to Awards Tour</span> 1417 + </div> 1418 + </tile-dynamic> 1419 + </a> 1420 + </li> 1421 + 1422 + </ul> 1423 + <a class="a--short" data-qa="hubs-view-all-link" href="https://editorial.rottentomatoes.com/rt-hubs/" 1424 + slot="view-all-link"> 1425 + View All 1426 + </a> 1427 + </rt-header-nav-item-dropdown-list> 1428 + 1429 + 1430 + 1431 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-rt-news"> 1432 + <p slot="title" class="h4">RT News</p> 1433 + <ul slot="links" class="news-wrap"> 1434 + 1435 + <li data-qa="rt-news-item"> 1436 + <a class="news-tile" 1437 + href="https://editorial.rottentomatoes.com/article/new-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more/" 1438 + data-qa="news-link"> 1439 + <tile-dynamic data-qa="tile" orientation="landscape"> 1440 + <rt-img 1441 + alt="New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More poster image" 1442 + slot="image" 1443 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/New_Streaming_September_2025-Rep.jpg" 1444 + loading="lazy"></rt-img> 1445 + <div slot="caption"> 1446 + <p>New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, 1447 + Disney+ and More</p> 1448 + <span class="sr-only">Link to New Movies and Shows Streaming in September: What to watch on 1449 + Netflix, Prime Video, HBO Max, Disney+ and More</span> 1450 + </div> 1451 + </tile-dynamic> 1452 + </a> 1453 + </li> 1454 + 1455 + <li data-qa="rt-news-item"> 1456 + <a class="news-tile" 1457 + href="https://editorial.rottentomatoes.com/article/the-conjuring-last-rites-first-reviews/" 1458 + data-qa="news-link"> 1459 + <tile-dynamic data-qa="tile" orientation="landscape"> 1460 + <rt-img 1461 + alt="<em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off poster image" 1462 + slot="image" 1463 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/09/Conjuring_Last_Rites_Reviews-Rep.jpg" 1464 + loading="lazy"></rt-img> 1465 + <div slot="caption"> 1466 + <p><em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off</p> 1467 + <span class="sr-only">Link to <em>The Conjuring: Last Rites</em> First Reviews: A Frightful, 1468 + Fitting Send-off</span> 1469 + </div> 1470 + </tile-dynamic> 1471 + </a> 1472 + </li> 1473 + 1474 + </ul> 1475 + <a class="a--short" data-qa="rt-news-view-all-link" href="https://editorial.rottentomatoes.com/news/" 1476 + slot="view-all-link"> 1477 + View All 1478 + </a> 1479 + </rt-header-nav-item-dropdown-list> 1480 + 1481 + </rt-header-nav-item-dropdown> 1482 + </rt-header-nav-item> 1483 + 1484 + <rt-header-nav-item slot="showtimes"> 1485 + <a class="unset" slot="link" href="https://www.fandango.com/movies-in-theaters?a=13036" target="_blank" 1486 + rel="noopener" data-qa="masthead:tickets-showtimes-link" data-AdsGlobalNavTakeoverManager="text"> 1487 + Showtimes 1488 + </a> 1489 + </rt-header-nav-item> 1490 + </rt-header-nav> 1491 + 1492 + </rt-header> 1493 + 1494 + <ads-global-nav-takeover-manager></ads-global-nav-takeover-manager> 1495 + <section class="trending-bar"> 1496 + 1497 + 1498 + <ad-unit hidden id="trending_bar_ad" unit-display="desktop" unit-type="trendinggraphic"> 1499 + <div slot="ad-inject"></div> 1500 + </ad-unit> 1501 + <div id="trending-bar-start" class="trending-list-wrap" data-qa="trending-bar"> 1502 + <ul class="list-inline trending-bar__list" data-curation="rt-nav-trending" data-qa="trending-bar-list"> 1503 + <li class="trending-bar__header">Trending on RT</li> 1504 + 1505 + <li><a class="trending-bar__link" 1506 + href="https://editorial.rottentomatoes.com/article/2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores/" 1507 + data-qa="trending-bar-item"> Emmy Noms </a></li> 1508 + 1509 + <li><a class="trending-bar__link" 1510 + href="https://editorial.rottentomatoes.com/article/movie-re-releases-calendar/" 1511 + data-qa="trending-bar-item"> Re-Release Calendar </a></li> 1512 + 1513 + <li><a class="trending-bar__link" 1514 + href="https://editorial.rottentomatoes.com/article/renewed-and-cancelled-tv-shows-2025/" 1515 + data-qa="trending-bar-item"> Renewed and Cancelled TV </a></li> 1516 + 1517 + <li><a class="trending-bar__link" href="https://editorial.rottentomatoes.com/article/app/" 1518 + data-qa="trending-bar-item"> The Rotten Tomatoes App </a></li> 1519 + 1520 + </ul> 1521 + <div class="trending-bar__social" data-qa="trending-bar-social-list"> 1522 + <social-media-icons theme="light" size="14"></social-media-icons> 1523 + </div> 1524 + </div> 1525 + </section> 1526 + 1527 + 1528 + 1529 + 1530 + <main id="main_container" class="container rt-layout__content"> 1531 + <div id="main-page-content"> 1532 + 1533 + 1534 + 1535 + 1536 + <div id="movie-overview" data-HeroModulesManager="overviewWrap"> 1537 + <watchlist-button-manager></watchlist-button-manager> 1538 + 1539 + <div id="hero-wrap" data-AdUnitManager="heroWrap" data-AdsMediaScorecardManager="heroWrap" 1540 + data-HeroModulesManager="heroWrap"> 1541 + 1542 + <div aria-labelledby="media-hero-label" class="media-hero-wrap" skeleton="panel" data-adobe-id="media-hero" 1543 + data-qa="section:media-hero" data-HeroModulesManager="mediaHeroWrap"> 1544 + <h1 class="unset" id="media-hero-label"> 1545 + <sr-text> The Fantastic Four: First Steps </sr-text> 1546 + </h1> 1547 + 1548 + <media-hero averagecolor="30,10,15" mediatype="Movie" scrolly="0" scrollystart="0" 1549 + data-AdsMediaScorecardManager="mediaHero" data-HeroModulesManager="mediaHero:collapse"> 1550 + <rt-button slot="iconicVideoCta" theme="transparent" data-content-type="PROMO" 1551 + data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" data-mpx-id="2441310275805" 1552 + data-public-id="BBgYzBvAIQDN" data-title="The Fantastic Four: First Steps" data-type="Movie" 1553 + data-VideoPlayerOverlayManager="btnVideo:click"><sr-text>Play trailer</sr-text></rt-button> 1554 + 1555 + <rt-text slot="iconicVideoRuntime" size="0.75">0:59</rt-text> 1556 + 1557 + <rt-img slot="iconic" alt="Main image for The Fantastic Four: First Steps" fallbacktheme="iconic" 1558 + fetchpriority="high" 1559 + src="https://resizing.flixster.com/buY_bX63TK2bMR31-aeM1FU9NUI=/375x210/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/663/931/thumb_4ca6d6c5-6a62-11f0-94b5-022bbbb30d69.jpg,https://resizing.flixster.com/9mw5ksRy6QUjRmIL1o2jk7tcV2o=/620x336/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/663/931/thumb_4ca6d6c5-6a62-11f0-94b5-022bbbb30d69.jpg"></rt-img> 1560 + 1561 + 1562 + <img slot="poster" alt="Poster for " fetchpriority="high" 1563 + src="https://resizing.flixster.com/-im_GEu4fu_y_2eZvk0DmD-JWQI=/68x102/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=" /> 1564 + 1565 + 1566 + <rt-text slot="title" size="1.25,1.75" context="heading">The Fantastic Four: First Steps</rt-text> 1567 + <rt-text slot="episodeTitle" size="1,1.5" context="label"></rt-text> 1568 + 1569 + 1570 + <rt-text slot="metadataProp" context="label" size="0.875">PG-13</rt-text> 1571 + 1572 + <rt-text slot="metadataProp" context="label" size="0.875">Now Playing</rt-text> 1573 + 1574 + <rt-text slot="metadataProp" context="label" size="0.875">1h 54m</rt-text> 1575 + 1576 + 1577 + 1578 + <rt-text slot="metadataGenre" size="0.875">Action</rt-text> 1579 + 1580 + <rt-text slot="metadataGenre" size="0.875">Adventure</rt-text> 1581 + 1582 + <rt-text slot="metadataGenre" size="0.875">Sci-Fi</rt-text> 1583 + 1584 + <rt-text slot="metadataGenre" size="0.875">Fantasy</rt-text> 1585 + 1586 + 1587 + <rt-button slot="trailerCta" shape="pill" theme="light" data-content-type="PROMO" 1588 + data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" data-mpx-id="2441310275805" 1589 + data-public-id="BBgYzBvAIQDN" data-title="The Fantastic Four: First Steps" data-type="Movie" 1590 + data-VideoPlayerOverlayManager="btnVideo:click"><rt-icon icon="play"></rt-icon> 1591 + <sr-text>Play</sr-text> Trailer </rt-button> 1592 + 1593 + <watchlist-button slot="watchlistCta" emsid="db64beee-683b-39ce-9617-94f6b67aa997" mediatype="Movie" 1594 + mediatitle="The Fantastic Four: First Steps" state="unchecked" theme="transparent-lighttext" 1595 + data-HeroModulesManager="mediaHeroWatchlistBtn" data-WatchlistButtonManager="watchlistButton:click"> 1596 + <span slot="text">Watchlist</span> 1597 + </watchlist-button> 1598 + 1599 + <watchlist-button slot="mobileWatchlistCta" emsid="db64beee-683b-39ce-9617-94f6b67aa997" 1600 + mediatype="Movie" mediatitle="The Fantastic Four: First Steps" state="unchecked" 1601 + data-HeroModulesManager="mediaHeroWatchlistBtn" 1602 + data-WatchlistButtonManager="watchlistButton:click"></watchlist-button> 1603 + 1604 + <div slot="desktopVideos" data-HeroModulesManager="mediaHeroVideos"></div> 1605 + 1606 + <rt-button slot="collapsedPrimaryCta" hidden shape="pill" theme="simplified" 1607 + data-AdsMediaScorecardManager="collapsedPrimaryCta" 1608 + data-HeroModulesManager="mediaHeroCta:click"></rt-button> 1609 + 1610 + <watchlist-button slot="collapsedWatchlistCta" emsid="db64beee-683b-39ce-9617-94f6b67aa997" 1611 + mediatype="Movie" mediatitle="The Fantastic Four: First Steps" state="unchecked" 1612 + theme="transparent-lighttext" data-HeroModulesManager="mediaHeroWatchlistBtn" 1613 + data-WatchlistButtonManager="watchlistButton:click"> 1614 + <span slot="text">Watchlist</span> 1615 + </watchlist-button> 1616 + 1617 + <score-icon-critics slot="collapsedCriticsIcon" size="2.5"></score-icon-critics> 1618 + <rt-text slot="collapsedCriticsScore" context="label" size="1.375"></rt-text> 1619 + <rt-link slot="collapsedCriticsLink" size="0.75"></rt-link> 1620 + <rt-text slot="collapsedCriticsLabel" size="0.75">Tomatometer</rt-text> 1621 + 1622 + <score-icon-audience slot="collapsedAudienceIcon" size="2.5"></score-icon-audience> 1623 + <rt-text slot="collapsedAudienceScore" context="label" size="1.375"></rt-text> 1624 + <rt-link slot="collapsedAudienceLink" size="0.75"></rt-link> 1625 + <rt-text slot="collapsedAudienceLabel" size="0.75">Popcornmeter</rt-text> 1626 + </media-hero> 1627 + 1628 + <script id="media-hero-json" data-json="mediaHero" type="application/json"> 1629 + {"averageColorHsl":"30,10,15","iconic":{"srcDesktop":"https://resizing.flixster.com/9mw5ksRy6QUjRmIL1o2jk7tcV2o=/620x336/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/663/931/thumb_4ca6d6c5-6a62-11f0-94b5-022bbbb30d69.jpg","srcMobile":"https://resizing.flixster.com/buY_bX63TK2bMR31-aeM1FU9NUI=/375x210/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/663/931/thumb_4ca6d6c5-6a62-11f0-94b5-022bbbb30d69.jpg"},"content":{"episodeTitle":"","metadataGenres":["Action","Adventure","Sci-Fi","Fantasy"],"metadataProps":["PG-13","Now Playing","1h 54m"],"posterSrc":"https://resizing.flixster.com/-im_GEu4fu_y_2eZvk0DmD-JWQI=/68x102/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=","title":"The Fantastic Four: First Steps","primaryVideo":{"contentType":"PROMO","durationInSeconds":"59.977","mpxId":"2441310275805","publicId":"BBgYzBvAIQDN","thumbnail":{"url":"https://statcdn.fandango.com/MPX/image/NBCU_Fandango/663/931/thumb_4ca6d6c5-6a62-11f0-94b5-022bbbb30d69.jpg"},"title":"The Fantastic Four: First Steps: 4 Us All","runtime":"0:59"}}} 1630 + </script> 1631 + </div> 1632 + 1633 + 1634 + 1635 + <hero-modules-manager> 1636 + <script data-json="vanity" 1637 + type="application/json">{"emsId":"db64beee-683b-39ce-9617-94f6b67aa997","href":"/m/the_fantastic_four_first_steps","lifecycleWindow":{"date":"2025-07-25","lifecycle":"IN_THEATERS"},"title":"The Fantastic Four: First Steps","type":"movie","value":"the_fantastic_four_first_steps","parents":[],"mediaType":"Movie"}</script> 1638 + </hero-modules-manager> 1639 + </div> 1640 + 1641 + <div id="main-wrap"> 1642 + <div id="modules-wrap" data-curation="drawer"> 1643 + 1644 + <div class="media-scorecard no-border" data-adobe-id="media-scorecard" data-qa="section:media-scorecard"> 1645 + <media-scorecard hideaudiencescore="false" skeleton="panel" 1646 + data-AdsMediaScorecardManager="mediaScorecard" data-HeroModulesManager="mediaScorecard"> 1647 + <rt-img alt="poster image" loading="lazy" slot="posterImage" 1648 + src="https://resizing.flixster.com/GRRDF-MY6_iS5Em5vNBg-Jd-uL0=/206x305/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc="></rt-img> 1649 + <rt-button slot="criticsScoreIcon" data-MediaScorecardManager="overlayOpen:click" theme="transparent"> 1650 + <score-icon-critics certified="true" sentiment="POSITIVE" size="2.5"></score-icon-critics> 1651 + </rt-button> 1652 + <rt-text slot="criticsScore" context="label" role="button" size="1.375" 1653 + data-MediaScorecardManager="overlayOpen:click">87%</rt-text> 1654 + <rt-text slot="criticsScoreType" class="critics-score-type" role="button" size="0.75" 1655 + data-MediaScorecardManager="overlayOpen:click">Tomatometer</rt-text> 1656 + <rt-link slot="criticsReviews" size="0.75" href="/m/the_fantastic_four_first_steps/reviews"> 1657 + 390 Reviews 1658 + </rt-link> 1659 + 1660 + <rt-button slot="audienceScoreIcon" data-MediaScorecardManager="overlayOpen:click" 1661 + theme="transparent"> 1662 + <score-icon-audience certified="true" size="2.5" sentiment="POSITIVE"></score-icon-audience> 1663 + </rt-button> 1664 + <rt-text slot="audienceScore" context="label" role="button" size="1.375" 1665 + data-MediaScorecardManager="overlayOpen:click">91%</rt-text> 1666 + <rt-text slot="audienceScoreType" class="audience-score-type" role="button" size="0.75" 1667 + data-MediaScorecardManager="overlayOpen:click">Popcornmeter</rt-text> 1668 + <rt-link slot="audienceReviews" size="0.75" 1669 + href="/m/the_fantastic_four_first_steps/reviews?type=user"> 1670 + 10,000+ Verified Ratings 1671 + </rt-link> 1672 + 1673 + <div slot="description" data-AdsMediaScorecardManager="description"> 1674 + <drawer-more maxlines="2" skeleton="panel" status="closed" style="--display: flex; gap: 4px;"> 1675 + <rt-text slot="content" size="1"> 1676 + Set against the vibrant backdrop of a 1960s-inspired, retro-futuristic world, Marvel 1677 + Studios&#39; &quot;The Fantastic Four: First Steps&quot; introduces Marvel&#39;s First 1678 + Family--Reed Richards/Mister Fantastic (Pedro Pascal), Sue Storm/Invisible Woman (Vanessa 1679 + Kirby), Johnny Storm/Human Torch (Joseph Quinn) and Ben Grimm/The Thing (Ebon Moss-Bachrach) as 1680 + they face their most daunting challenge yet. Forced to balance their roles as heroes with the 1681 + strength of their family bond, they must defend Earth from a ravenous space god called Galactus 1682 + (Ralph Ineson) and his enigmatic Herald, Silver Surfer (Julia Garner). And if Galactus&#39; plan 1683 + to devour the entire planet and everyone on it weren&#39;t bad enough, it suddenly gets very 1684 + personal. 1685 + </rt-text> 1686 + <rt-link slot="ctaOpen"> 1687 + <rt-icon icon="down-open"></rt-icon> 1688 + </rt-link> 1689 + <rt-link slot="ctaClose"> 1690 + <rt-icon icon="up-open"></rt-icon> 1691 + </rt-link> 1692 + </drawer-more> 1693 + </div> 1694 + 1695 + 1696 + <affiliate-icon data-AdsMediaScorecardManager="affiliateIcon" icon="fandango" 1697 + slot="affiliateIcon"></affiliate-icon> 1698 + <!-- --> 1699 + <rt-img data-AdsMediaScorecardManager="affiliateIconCustom" slot="affiliateIconCustom" hidden> 1700 + </rt-img> 1701 + <rt-text context="label" data-AdsMediaScorecardManager="affiliatePrimaryText" size="1" 1702 + slot="affiliatePrimaryText">Now in Theaters</rt-text> 1703 + <rt-text data-AdsMediaScorecardManager="affiliateSecondaryText" size="0.75" 1704 + slot="affiliateSecondaryText">Now Playing</rt-text> 1705 + <rt-button arialabel="Buy tickets for The Fantastic Four: First Steps" 1706 + href="https://www.fandango.com/the-fantastic-four-first-steps-2025-236967/movie-overview?cmp=rt_leaderboard&amp;a=13036" 1707 + rel="noopener" shape="pill" slot="affiliateCtaBtn" 1708 + style="--backgroundColor: #3478C1; --textColor: #FFFFFF;" target="_blank" theme="simplified" 1709 + data-AdsMediaScorecardManager="affiliateCtaBtn" data-HeroModulesManager="mediaScorecardCta:click"> 1710 + Buy Tickets 1711 + </rt-button> 1712 + <div slot="adImpressions"></div> 1713 + 1714 + </media-scorecard> 1715 + 1716 + <media-scorecard-manager> 1717 + <script id="media-scorecard-json" data-json="mediaScorecard" type="application/json"> 1718 + {"audienceScore":{"certifiedFresh":"certified","averageRating":"4.4","bandedRatingCount":"10,000+ Verified Ratings","likedCount":19671,"notLikedCount":1994,"reviewCount":5804,"score":"91","scoreType":"VERIFIED","sentiment":"POSITIVE","certified":true,"reviewsPageUrl":"/m/the_fantastic_four_first_steps/reviews?type=user","scorePercent":"91%","title":"Popcornmeter"},"criticsScore":{"averageRating":"7.20","certified":true,"likedCount":338,"notLikedCount":52,"ratingCount":390,"reviewCount":390,"score":"87","sentiment":"POSITIVE","reviewsPageUrl":"/m/the_fantastic_four_first_steps/reviews","scorePercent":"87%","title":"Tomatometer"},"criticReviewHref":"/critics/self-submission/movie/db64beee-683b-39ce-9617-94f6b67aa997","cta":{"buttonText":"Buy Tickets","buttonAnnouncement":"Buy tickets for The Fantastic Four: First Steps","windowText":"Now in Theaters","affiliate":"fandango","buttonStyle":{"backgroundColor":"#3478C1","textColor":"#FFFFFF"},"buttonUrl":"https://www.fandango.com/the-fantastic-four-first-steps-2025-236967/movie-overview?cmp=rt_leaderboard&a=13036","icon":"fandango","windowDate":"Now Playing"},"description":"Set against the vibrant backdrop of a 1960s-inspired, retro-futuristic world, Marvel Studios' \"The Fantastic Four: First Steps\" introduces Marvel's First Family--Reed Richards/Mister Fantastic (Pedro Pascal), Sue Storm/Invisible Woman (Vanessa Kirby), Johnny Storm/Human Torch (Joseph Quinn) and Ben Grimm/The Thing (Ebon Moss-Bachrach) as they face their most daunting challenge yet. Forced to balance their roles as heroes with the strength of their family bond, they must defend Earth from a ravenous space god called Galactus (Ralph Ineson) and his enigmatic Herald, Silver Surfer (Julia Garner). And if Galactus' plan to devour the entire planet and everyone on it weren't bad enough, it suddenly gets very personal.","hideAudienceScore":false,"overlay":{"audienceAll":{"certifiedFresh":"certified","averageRating":"4.3","bandedRatingCount":"25,000+ Ratings","likedCount":32334,"notLikedCount":4839,"reviewCount":11639,"score":"87","scoreType":"ALL","sentiment":"POSITIVE","certified":true,"reviewsPageUrl":"/m/the_fantastic_four_first_steps/reviews?type=user","scorePercent":"87%","title":"Popcornmeter","scoreLinkUrl":"/m/the_fantastic_four_first_steps/reviews?type=user"},"audienceTitle":"Popcornmeter","audienceVerified":{"certifiedFresh":"certified","averageRating":"4.4","bandedRatingCount":"10,000+ Verified Ratings","likedCount":19671,"notLikedCount":1994,"reviewCount":5804,"score":"91","scoreType":"VERIFIED","sentiment":"POSITIVE","certified":true,"reviewsPageUrl":"/m/the_fantastic_four_first_steps/reviews?type=user","scorePercent":"91%","title":"Popcornmeter","scoreLinkUrl":"/m/the_fantastic_four_first_steps/reviews?type=verified_audience"},"criticsAll":{"averageRating":"7.20","certified":true,"likedCount":338,"notLikedCount":52,"ratingCount":390,"reviewCount":390,"score":"87","sentiment":"POSITIVE","reviewsPageUrl":"/m/the_fantastic_four_first_steps/reviews","scorePercent":"87%","title":"Tomatometer","scoreLinkUrl":"/m/the_fantastic_four_first_steps/reviews","scoreLinkText":"390 Reviews"},"criticsTitle":"Tomatometer","criticsTop":{"averageRating":"6.70","certified":true,"likedCount":51,"notLikedCount":13,"ratingCount":64,"reviewCount":64,"score":"80","sentiment":"POSITIVE","reviewsPageUrl":"/m/the_fantastic_four_first_steps/reviews","scorePercent":"80%","title":"Tomatometer","scoreLinkUrl":"/m/the_fantastic_four_first_steps/reviews?type=top_critics","scoreLinkText":"64 Top Critic Reviews"},"hasAudienceAll":true,"hasAudienceVerified":true,"hasCriticsAll":true,"hasCriticsTop":true,"mediaType":"Movie","showScoreDetailsAudience":true,"learnMoreUrl":"https://editorial.rottentomatoes.com/article/introducing-verified-audience-score/"},"primaryImageUrl":"https://resizing.flixster.com/GRRDF-MY6_iS5Em5vNBg-Jd-uL0=/206x305/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc="} 1719 + </script> 1720 + </media-scorecard-manager> 1721 + </div> 1722 + 1723 + 1724 + <section class="modules-nav" data-ModulesNavigationManager="navWrap"> 1725 + <modules-navigation-manager></modules-navigation-manager> 1726 + 1727 + <nav> 1728 + <modules-navigation-carousel skeleton="panel" tilewidth="auto" 1729 + data-ModulesNavigationManager="navCarousel"> 1730 + 1731 + 1732 + 1733 + 1734 + 1735 + 1736 + <a slot="tile" href="#what-to-know"> 1737 + <rt-tab data-ModulesNavigationManager="navTab">What to Know</rt-tab> 1738 + </a> 1739 + 1740 + 1741 + 1742 + 1743 + 1744 + 1745 + 1746 + <a slot="tile" href="#critics-reviews"> 1747 + <rt-tab data-ModulesNavigationManager="navTab">Reviews</rt-tab> 1748 + </a> 1749 + 1750 + 1751 + 1752 + 1753 + 1754 + 1755 + 1756 + <a slot="tile" href="#cast-and-crew"> 1757 + <rt-tab data-ModulesNavigationManager="navTab">Cast &amp; Crew</rt-tab> 1758 + </a> 1759 + 1760 + 1761 + 1762 + <a slot="tile" href="#movie-clips"> 1763 + <rt-tab data-ModulesNavigationManager="navTab">Movie Clips</rt-tab> 1764 + </a> 1765 + 1766 + 1767 + 1768 + <a slot="tile" href="#more-like-this"> 1769 + <rt-tab data-ModulesNavigationManager="navTab">More Like This</rt-tab> 1770 + </a> 1771 + 1772 + 1773 + 1774 + <a slot="tile" href="#news-and-guides"> 1775 + <rt-tab data-ModulesNavigationManager="navTab">Related News</rt-tab> 1776 + </a> 1777 + 1778 + 1779 + 1780 + <a slot="tile" href="#videos"> 1781 + <rt-tab data-ModulesNavigationManager="navTab">Videos</rt-tab> 1782 + </a> 1783 + 1784 + 1785 + 1786 + <a slot="tile" href="#photos"> 1787 + <rt-tab data-ModulesNavigationManager="navTab">Photos</rt-tab> 1788 + </a> 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + <a slot="tile" href="#media-info"> 1797 + <rt-tab data-ModulesNavigationManager="navTab">Media Info</rt-tab> 1798 + </a> 1799 + 1800 + 1801 + </modules-navigation-carousel> 1802 + </nav> 1803 + </section> 1804 + 1805 + 1806 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1807 + 1808 + <div id="what-to-know" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1809 + 1810 + 1811 + 1812 + <section aria-labelledby="what-to-know-label" class="what-to-know" data-adobe-id="what-to-know" 1813 + data-qa="section:what-to-know"> 1814 + <div class="header-wrap"> 1815 + <rt-text context="heading" size="0.75" 1816 + style="--textColor: var(--grayDark4); --letterSpacing: 1px;--textTransform: capitalize;"> 1817 + The Fantastic Four: First Steps 1818 + </rt-text> 1819 + <h2 class="unset" id="what-to-know-label"> 1820 + <rt-text context="heading" size="1.25" style="--textTransform: capitalize;">What to Know</rt-text> 1821 + </h2> 1822 + </div> 1823 + 1824 + <div class="content"> 1825 + 1826 + 1827 + 1828 + 1829 + <div id="critics-consensus" class="consensus"> 1830 + <rt-text context="heading"> 1831 + <score-icon-critics certified="true" sentiment="POSITIVE" size="1"></score-icon-critics> 1832 + Critics Consensus 1833 + </rt-text> 1834 + <p>Benefitting from rock-solid cast chemistry and clad in appealingly retro 1960s design, this 1835 + crack at <em>The Fantastic Four</em> does Marvel's First Family justice.</p> 1836 + <a href="/m/the_fantastic_four_first_steps/reviews">Read Critics Reviews</a> 1837 + </div> 1838 + 1839 + 1840 + 1841 + <hr /> 1842 + 1843 + 1844 + 1845 + <div id="audience-consensus" class="consensus"> 1846 + <rt-text context="heading"> 1847 + <score-icon-audience certified="true" size="1" sentiment="POSITIVE"></score-icon-audience> 1848 + Audience Says 1849 + </rt-text> 1850 + <p><em>The Fantastic Four</em> takes the world by Storm, Thing, Reed, Johnny and baby, forging a 1851 + new path for this bespoke family that, with these <em>First Steps</em>, leaps into cosmic action 1852 + with retro-futuristic verve.</p> 1853 + <a href="/m/the_fantastic_four_first_steps/reviews?type=user">Read Audience Reviews</a> 1854 + </div> 1855 + 1856 + </div> 1857 + </section> 1858 + 1859 + </div> 1860 + 1861 + 1862 + <ad-unit hidden unit-display="mobile" unit-type="interscroller" no-retry 1863 + data-AdUnitManager="adUnit:interscrollerinstantiated"> 1864 + <aside slot="ad-inject" class="center mobile-interscroller"></aside> 1865 + </ad-unit> 1866 + 1867 + 1868 + <ad-unit hidden unit-display="desktop" unit-type="opbannerone"> 1869 + <div slot="ad-inject" class="banner-ad"></div> 1870 + </ad-unit> 1871 + 1872 + 1873 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1874 + 1875 + <div id="critics-reviews" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1876 + 1877 + 1878 + 1879 + <section aria-labelledby="critics-reviews-label" class="critics-reviews" data-adobe-id="critics-reviews" 1880 + data-qa="section:critics-reviews"> 1881 + <div class="header-wrap"> 1882 + <h2 class="unset" id="critics-reviews-label"> 1883 + <rt-text size="1.25" context="heading" data-qa="title">Critics Reviews</rt-text> 1884 + </h2> 1885 + <rt-button arialabel="Critics Reviews" data-qa="view-all-link" 1886 + href="/m/the_fantastic_four_first_steps/reviews" shape="pill" size="0.875" 1887 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 1888 + theme="light"> 1889 + View More (390) 1890 + </rt-button> 1891 + </div> 1892 + 1893 + <div class="content-wrap"> 1894 + <carousel-slider tile-width="80%,45%" skeleton="panel" data-qa="carousel"> 1895 + 1896 + 1897 + <media-review-card-critic slot="tile" istopreview="true" data-qa="critic-review-tile"> 1898 + <rt-link aria-hidden="true" href="/critics/dwight-brown" slot="displayImage" 1899 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 1900 + <img 1901 + src="https://resizing.flixster.com/n0vfm-A2s3Lwn9jGErs2wZJHwO0=/fit-in/128x128/v2/https://resizing.flixster.com/0ooK8MI8eZdyMLDFWIkNrt-1VPw=/128x128/v1.YzszODUxO2o7MjAzNDA7MjA0ODszMDA7MzAw" 1902 + alt="Critic's profile" /> 1903 + </rt-link> 1904 + <rt-link href="/critics/dwight-brown" slot="displayName" style="--textColor: var(--grayDark2)" 1905 + data-qa="critic-link"> 1906 + <rt-text context="label" size="0.875" 1907 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 1908 + Dwight Brown 1909 + </rt-text> 1910 + </rt-link> 1911 + <rt-link href="/critics/source/100009621" slot="publicationName" 1912 + style="--textColor: var(--grayDark2)" data-qa="source-link"> 1913 + <rt-text size="0.75"> 1914 + DwightBrownInk.com 1915 + </rt-text> 1916 + </rt-link> 1917 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 1918 + <rt-text size="0.875" slot="content" data-qa="review-text"> 1919 + Audiences shouldnโ€™t have to sacrifice eye-catching stunts and imagery for great writing and 1920 + acting. They should have it all. Should but wonโ€™t in this case. 1921 + </rt-text> 1922 + </drawer-more> 1923 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 1924 + </score-icon-critics> 1925 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 1926 + <span>Rated: 2.5/4</span> 1927 + </rt-text> 1928 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 1929 + <span> Aug 18, 2025 </span> 1930 + </rt-text> 1931 + <rt-link href="https://dwightbrownink.com/the-fantastic-four-first-steps/" slot="editorialUrl" 1932 + size="0.875" target="_blank" data-qa="full-review-link">Full Review</rt-link> 1933 + </media-review-card-critic> 1934 + 1935 + <media-review-card-critic slot="tile" istopreview="true" data-qa="critic-review-tile"> 1936 + <rt-link aria-hidden="true" href="/critics/sergio-burstein" slot="displayImage" 1937 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 1938 + <img 1939 + src="https://images.fandango.com/cms/assets/5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png" 1940 + alt="Critic's profile" /> 1941 + </rt-link> 1942 + <rt-link href="/critics/sergio-burstein" slot="displayName" 1943 + style="--textColor: var(--grayDark2)" data-qa="critic-link"> 1944 + <rt-text context="label" size="0.875" 1945 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 1946 + Sergio Burstein 1947 + </rt-text> 1948 + </rt-link> 1949 + <rt-link href="/critics/source/268" slot="publicationName" style="--textColor: var(--grayDark2)" 1950 + data-qa="source-link"> 1951 + <rt-text size="0.75"> 1952 + Los Angeles Times 1953 + </rt-text> 1954 + </rt-link> 1955 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 1956 + <rt-text size="0.875" slot="content" data-qa="review-text"> 1957 + For now, let&#39;s enjoy what this efficient commercial product has to offer, which 1958 + surprisingly lasts less than two hours... [Full review in Spanish] 1959 + </rt-text> 1960 + </drawer-more> 1961 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 1962 + </score-icon-critics> 1963 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 1964 + <span></span> 1965 + </rt-text> 1966 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 1967 + <span> Aug 11, 2025 </span> 1968 + </rt-text> 1969 + <rt-link 1970 + href="https://www.latimes.com/espanol/entretenimiento/articulo/2025-07-24/criticas-unos-superheroes-del-pasado-un-vendedor-angustiado-y-otros-estrenos-de-cine" 1971 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 1972 + Review</rt-link> 1973 + </media-review-card-critic> 1974 + 1975 + <media-review-card-critic slot="tile" istopreview="true" data-qa="critic-review-tile"> 1976 + <rt-link aria-hidden="true" href="/critics/mark-kermode" slot="displayImage" 1977 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 1978 + <img 1979 + src="https://images.fandango.com/cms/assets/5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png" 1980 + alt="Critic's profile" /> 1981 + </rt-link> 1982 + <rt-link href="/critics/mark-kermode" slot="displayName" style="--textColor: var(--grayDark2)" 1983 + data-qa="critic-link"> 1984 + <rt-text context="label" size="0.875" 1985 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 1986 + Mark Kermode 1987 + </rt-text> 1988 + </rt-link> 1989 + <rt-link href="/critics/source/100009998" slot="publicationName" 1990 + style="--textColor: var(--grayDark2)" data-qa="source-link"> 1991 + <rt-text size="0.75"> 1992 + Kermode and Mayo&#39;s Take (YouTube) 1993 + </rt-text> 1994 + </rt-link> 1995 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 1996 + <rt-text size="0.875" slot="content" data-qa="review-text"> 1997 + Even if you don&#39;t like the film, it is absolutely worth it for the furniture. 1998 + </rt-text> 1999 + </drawer-more> 2000 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2001 + </score-icon-critics> 2002 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2003 + <span></span> 2004 + </rt-text> 2005 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2006 + <span> Aug 6, 2025 </span> 2007 + </rt-text> 2008 + <rt-link href="https://www.youtube.com/watch?v=h1XYtl3vPX0" slot="editorialUrl" size="0.875" 2009 + target="_blank" data-qa="full-review-link">Full Review</rt-link> 2010 + </media-review-card-critic> 2011 + 2012 + <media-review-card-critic slot="tile" istopreview="false" data-qa="critic-review-tile"> 2013 + <rt-link aria-hidden="true" href="/critics/kevin-carr" slot="displayImage" 2014 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2015 + <img 2016 + src="https://resizing.flixster.com/0xcuvWu096RfySTVdXcZEFkAhAE=/fit-in/128x128/v2/https://resizing.flixster.com/UIrCTMQj3SyoFwW4g1XfMss1JkM=/38x54/v1.YzsxNzQ3O2o7MjAzNDA7MjA0ODszODs1NA" 2017 + alt="Critic's profile" /> 2018 + </rt-link> 2019 + <rt-link href="/critics/kevin-carr" slot="displayName" style="--textColor: var(--grayDark2)" 2020 + data-qa="critic-link"> 2021 + <rt-text context="label" size="0.875" 2022 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2023 + Kevin Carr 2024 + </rt-text> 2025 + </rt-link> 2026 + <rt-link href="/critics/source/2722" slot="publicationName" 2027 + style="--textColor: var(--grayDark2)" data-qa="source-link"> 2028 + <rt-text size="0.75"> 2029 + Fat Guys at the Movies 2030 + </rt-text> 2031 + </rt-link> 2032 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2033 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2034 + Itโ€™s still a superhero movie, and it connects to the next phase of Marvel crossover films. 2035 + However, it taps into some real human elements. 2036 + </rt-text> 2037 + </drawer-more> 2038 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2039 + </score-icon-critics> 2040 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2041 + <span>Rated: 4/5</span> 2042 + </rt-text> 2043 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2044 + <span> Sep 4, 2025 </span> 2045 + </rt-text> 2046 + <rt-link href="https://www.fatguysatthemovies.com/the-fantastic-4-first-steps-movie-review/" 2047 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2048 + Review</rt-link> 2049 + </media-review-card-critic> 2050 + 2051 + <media-review-card-critic slot="tile" istopreview="false" data-qa="critic-review-tile"> 2052 + <rt-link aria-hidden="true" href="/critics/niall-mccloskey" slot="displayImage" 2053 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2054 + <img 2055 + src="https://images.fandango.com/cms/assets/5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png" 2056 + alt="Critic's profile" /> 2057 + </rt-link> 2058 + <rt-link href="/critics/niall-mccloskey" slot="displayName" 2059 + style="--textColor: var(--grayDark2)" data-qa="critic-link"> 2060 + <rt-text context="label" size="0.875" 2061 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2062 + Niall McCloskey 2063 + </rt-text> 2064 + </rt-link> 2065 + <rt-link href="/critics/source/170" slot="publicationName" style="--textColor: var(--grayDark2)" 2066 + data-qa="source-link"> 2067 + <rt-text size="0.75"> 2068 + Film Ireland Magazine 2069 + </rt-text> 2070 + </rt-link> 2071 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2072 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2073 + If youโ€™re looking for an electric superhero thrilling ride filled with compelling 2074 + performances, great action and that classic comic flair, this may be four you. 2075 + </rt-text> 2076 + </drawer-more> 2077 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2078 + </score-icon-critics> 2079 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2080 + <span></span> 2081 + </rt-text> 2082 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2083 + <span> Sep 3, 2025 </span> 2084 + </rt-text> 2085 + <rt-link href="https://www.filmireland.net/review-the-fantastic-four-first-steps/" 2086 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2087 + Review</rt-link> 2088 + </media-review-card-critic> 2089 + 2090 + <media-review-card-critic slot="tile" istopreview="false" data-qa="critic-review-tile"> 2091 + <rt-link aria-hidden="true" href="/critics/troy-ribeiro" slot="displayImage" 2092 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2093 + <img 2094 + src="https://resizing.flixster.com/hHWLBKUXqnNcIkcmP7YZiIBgeNc=/fit-in/128x128/v2/https://resizing.flixster.com/7Xxi64GEHd8sLpnSgyT6sPDGXKk=/128x128/v1.YzsxMDAwMDAzMjI2O2o7MjAzOTQ7MjA0ODsyMjcyOzE3MDQ" 2095 + alt="Critic's profile" /> 2096 + </rt-link> 2097 + <rt-link href="/critics/troy-ribeiro" slot="displayName" style="--textColor: var(--grayDark2)" 2098 + data-qa="critic-link"> 2099 + <rt-text context="label" size="0.875" 2100 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2101 + Troy Ribeiro 2102 + </rt-text> 2103 + </rt-link> 2104 + <rt-link href="/critics/source/100010114" slot="publicationName" 2105 + style="--textColor: var(--grayDark2)" data-qa="source-link"> 2106 + <rt-text size="0.75"> 2107 + Free Press Journal (India) 2108 + </rt-text> 2109 + </rt-link> 2110 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2111 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2112 + In The Fantastic Four: First Steps, Marvel returns to the drawing boardโ€”this time armed with 2113 + chalk, retro optimism, and the ever-dependable Pedro Pascal 2114 + </rt-text> 2115 + </drawer-more> 2116 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2117 + </score-icon-critics> 2118 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2119 + <span>Rated: 2.5/5</span> 2120 + </rt-text> 2121 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2122 + <span> Aug 30, 2025 </span> 2123 + </rt-text> 2124 + <rt-link 2125 + href="https://www.freepressjournal.in/entertainment/the-fantastic-four-first-steps-review-pedro-pascal-vanessa-kirby-ebon-moss-bachrach-joseph-quinn-and-julia-garner-take-first-steps-make-a-giant-stumble" 2126 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2127 + Review</rt-link> 2128 + </media-review-card-critic> 2129 + 2130 + <tile-view-more aspect="fill" background="mediaHero" slot="tile"> 2131 + <rt-button href="/m/the_fantastic_four_first_steps/reviews" shape="pill" 2132 + theme="transparent-lighttext"> 2133 + Read all reviews 2134 + </rt-button> 2135 + </tile-view-more> 2136 + </carousel-slider> 2137 + </div> 2138 + </section> 2139 + 2140 + </div> 2141 + 2142 + 2143 + 2144 + 2145 + <section aria-labelledby="audience-reviews-label" class="audience-reviews" 2146 + data-adobe-id="audience-reviews" data-qa="section:audience-reviews"> 2147 + <div class="header-wrap"> 2148 + <h2 class="unset" id="audience-reviews-label"> 2149 + <rt-text size="1.25" context="heading" data-qa="title">Audience Reviews</rt-text> 2150 + </h2> 2151 + <rt-button arialabel="Audience Reviews" class="" data-qa="view-all-link" 2152 + href="/m/the_fantastic_four_first_steps/reviews?type=user" shape="pill" size="0.875" 2153 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2154 + theme="light"> 2155 + View More (1000+) 2156 + </rt-button> 2157 + </div> 2158 + 2159 + <div class="content-wrap"> 2160 + <carousel-slider tile-width="80%,45%" skeleton="panel" data-qa="carousel"> 2161 + 2162 + <media-review-card-audience slot="tile" isverifiedreview="true" data-qa="audience-review-tile"> 2163 + <rt-link context="label" href="" size="0.875" slot="displayName" 2164 + style="--letterSpacing: 1px; --textColor: var(--grayDark3);" data-qa="user-name"> 2165 + Sanjeev 2166 + </rt-link> 2167 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2168 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2169 + Fantastic4 was okay. Choppy character development. Choppy story. 2170 + </rt-text> 2171 + </drawer-more> 2172 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2173 + <span aria-hidden="true">Rated 2/5 Stars &bull;&nbsp;</span> 2174 + <sr-text>Rated 2 out of 5 stars</sr-text> 2175 + </rt-text> 2176 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2177 + <span>09/07/25</span> 2178 + </rt-text> 2179 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2180 + data-rating-id="ce6c7281-990c-4086-b5d8-91f0402daac7" size="0.875" slot="fullReviewBtn" 2181 + data-qa="full-review-btn"> 2182 + Full Review 2183 + </rt-link> 2184 + </media-review-card-audience> 2185 + 2186 + <media-review-card-audience slot="tile" isverifiedreview="true" data-qa="audience-review-tile"> 2187 + <rt-link context="label" href="" size="0.875" slot="displayName" 2188 + style="--letterSpacing: 1px; --textColor: var(--grayDark3);" data-qa="user-name"> 2189 + Daniel 2190 + </rt-link> 2191 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2192 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2193 + Could have benefitted by adding battles with Mole Man and a few of the older FF4 rogues 2194 + gallery 2195 + </rt-text> 2196 + </drawer-more> 2197 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2198 + <span aria-hidden="true">Rated 4/5 Stars &bull;&nbsp;</span> 2199 + <sr-text>Rated 4 out of 5 stars</sr-text> 2200 + </rt-text> 2201 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2202 + <span>09/07/25</span> 2203 + </rt-text> 2204 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2205 + data-rating-id="05699be7-4082-4ccd-9f00-100bca2b87d2" size="0.875" slot="fullReviewBtn" 2206 + data-qa="full-review-btn"> 2207 + Full Review 2208 + </rt-link> 2209 + </media-review-card-audience> 2210 + 2211 + <media-review-card-audience slot="tile" isverifiedreview="true" data-qa="audience-review-tile"> 2212 + <rt-link context="label" href="" size="0.875" slot="displayName" 2213 + style="--letterSpacing: 1px; --textColor: var(--grayDark3);" data-qa="user-name"> 2214 + Valentina 2215 + </rt-link> 2216 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2217 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2218 + The whole family enjoyed it ๐Ÿ˜ƒ 2219 + </rt-text> 2220 + </drawer-more> 2221 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2222 + <span aria-hidden="true">Rated 4/5 Stars &bull;&nbsp;</span> 2223 + <sr-text>Rated 4 out of 5 stars</sr-text> 2224 + </rt-text> 2225 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2226 + <span>09/07/25</span> 2227 + </rt-text> 2228 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2229 + data-rating-id="0175adcb-18ab-461e-9230-762752a4edd4" size="0.875" slot="fullReviewBtn" 2230 + data-qa="full-review-btn"> 2231 + Full Review 2232 + </rt-link> 2233 + </media-review-card-audience> 2234 + 2235 + <media-review-card-audience slot="tile" isverifiedreview="true" data-qa="audience-review-tile"> 2236 + <rt-link context="label" href="" size="0.875" slot="displayName" 2237 + style="--letterSpacing: 1px; --textColor: var(--grayDark3);" data-qa="user-name"> 2238 + DUANE S 2239 + </rt-link> 2240 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2241 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2242 + It was surprisingly entertaining 2243 + </rt-text> 2244 + </drawer-more> 2245 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2246 + <span aria-hidden="true">Rated 4.5/5 Stars &bull;&nbsp;</span> 2247 + <sr-text>Rated 4.5 out of 5 stars</sr-text> 2248 + </rt-text> 2249 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2250 + <span>09/07/25</span> 2251 + </rt-text> 2252 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2253 + data-rating-id="9be6f14a-d9af-4694-aec3-b2b9eabb7e49" size="0.875" slot="fullReviewBtn" 2254 + data-qa="full-review-btn"> 2255 + Full Review 2256 + </rt-link> 2257 + </media-review-card-audience> 2258 + 2259 + <media-review-card-audience slot="tile" isverifiedreview="true" data-qa="audience-review-tile"> 2260 + <rt-link context="label" href="" size="0.875" slot="displayName" 2261 + style="--letterSpacing: 1px; --textColor: var(--grayDark3);" data-qa="user-name"> 2262 + Tish 2263 + </rt-link> 2264 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2265 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2266 + it was good but I feel like I missed something. 2267 + </rt-text> 2268 + </drawer-more> 2269 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2270 + <span aria-hidden="true">Rated 4/5 Stars &bull;&nbsp;</span> 2271 + <sr-text>Rated 4 out of 5 stars</sr-text> 2272 + </rt-text> 2273 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2274 + <span>09/07/25</span> 2275 + </rt-text> 2276 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2277 + data-rating-id="341b507a-56bc-4ba2-b414-3a39b480dd07" size="0.875" slot="fullReviewBtn" 2278 + data-qa="full-review-btn"> 2279 + Full Review 2280 + </rt-link> 2281 + </media-review-card-audience> 2282 + 2283 + <media-review-card-audience slot="tile" isverifiedreview="true" data-qa="audience-review-tile"> 2284 + <rt-link context="label" href="" size="0.875" slot="displayName" 2285 + style="--letterSpacing: 1px; --textColor: var(--grayDark3);" data-qa="user-name"> 2286 + David L 2287 + </rt-link> 2288 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2289 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2290 + Way too much back story and not enough action. Kept waiting for something to happen. 2291 + </rt-text> 2292 + </drawer-more> 2293 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2294 + <span aria-hidden="true">Rated 1/5 Stars &bull;&nbsp;</span> 2295 + <sr-text>Rated 1 out of 5 stars</sr-text> 2296 + </rt-text> 2297 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2298 + <span>09/07/25</span> 2299 + </rt-text> 2300 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2301 + data-rating-id="82dd27ed-86cb-471c-b791-a73b52cda4b5" size="0.875" slot="fullReviewBtn" 2302 + data-qa="full-review-btn"> 2303 + Full Review 2304 + </rt-link> 2305 + </media-review-card-audience> 2306 + 2307 + <tile-view-more aspect="fill" background="mediaHero" slot="tile"> 2308 + <rt-button href="/m/the_fantastic_four_first_steps/reviews?type=user" shape="pill" 2309 + theme="transparent-lighttext"> 2310 + Read all reviews 2311 + </rt-button> 2312 + </tile-view-more> 2313 + </carousel-slider> 2314 + 2315 + </div> 2316 + 2317 + <media-audience-reviews-manager> 2318 + <script type="application/json" 2319 + data-json="reviewsData">{"audienceScore":{"certifiedFresh":"certified","reviewCount":5804,"score":"91","sentiment":"POSITIVE","certified":true,"scorePercent":"91%"},"criticsScore":{"certified":true,"score":"87","sentiment":"POSITIVE","scorePercent":"87%"},"emptyMessage":"There are no Verified Audience reviews for The Fantastic Four: First Steps yet.","linkCss":"","partial":"pages/_shared/mediaAudienceReviewsCarousel.html","ratingsData":{"emsId":"db64beee-683b-39ce-9617-94f6b67aa997","isPreRelease":false},"reviews":[{"displayDate":"09/07/25","displayName":"Sanjeev","isVerified":true,"ratingId":"ce6c7281-990c-4086-b5d8-91f0402daac7","ratingRange":"Rated 2/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 2 out of 5 stars","review":"Fantastic4 was okay. Choppy character development. Choppy story."},{"displayDate":"09/07/25","displayName":"Daniel","isVerified":true,"ratingId":"05699be7-4082-4ccd-9f00-100bca2b87d2","ratingRange":"Rated 4/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 4 out of 5 stars","review":"Could have benefitted by adding battles with Mole Man and a few of the older FF4 rogues gallery"},{"displayDate":"09/07/25","displayName":"Valentina","isVerified":true,"ratingId":"0175adcb-18ab-461e-9230-762752a4edd4","ratingRange":"Rated 4/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 4 out of 5 stars","review":"The whole family enjoyed it ๐Ÿ˜ƒ"},{"displayDate":"09/07/25","displayName":"DUANE S","isVerified":true,"ratingId":"9be6f14a-d9af-4694-aec3-b2b9eabb7e49","ratingRange":"Rated 4.5/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 4.5 out of 5 stars","review":"It was surprisingly entertaining"},{"displayDate":"09/07/25","displayName":"Tish","isVerified":true,"ratingId":"341b507a-56bc-4ba2-b414-3a39b480dd07","ratingRange":"Rated 4/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 4 out of 5 stars","review":"it was good but I feel like I missed something."},{"displayDate":"09/07/25","displayName":"David L","isVerified":true,"ratingId":"82dd27ed-86cb-471c-b791-a73b52cda4b5","ratingRange":"Rated 1/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 1 out of 5 stars","review":"Way too much back story and not enough action. Kept waiting for something to happen."}],"reviewCount":5804,"reviewsUrl":"/m/the_fantastic_four_first_steps/reviews?type=user","title":"The Fantastic Four: First Steps","viewMoreText":"View More (1000+)"}</script> 2320 + </media-audience-reviews-manager> 2321 + </section> 2322 + 2323 + 2324 + 2325 + <section aria-labelledby="rate-and-review-label" class="rate-and-review" data-adobe-id="rate-and-review" 2326 + data-qa="section:rate-and-review"> 2327 + <rate-and-review-module-manager> 2328 + <script data-json="rateAndReviewModule" 2329 + type="application/json">{"emsId":"db64beee-683b-39ce-9617-94f6b67aa997","releaseDate":"Jul 25, 2025","mediaType":"movie","title":"The Fantastic Four: First Steps"}</script> 2330 + </rate-and-review-module-manager> 2331 + 2332 + <div class="header-wrap"> 2333 + <rt-text context="heading" size="0.75" 2334 + style="--textColor: #62686F; --letterSpacing: 1px; --textTransform: capitalize;"> 2335 + The Fantastic Four: First Steps 2336 + </rt-text> 2337 + <h2 class="unset" id="rate-and-review-label"> 2338 + <rt-text size="1.25" context="heading">My Rating</rt-text> 2339 + </h2> 2340 + </div> 2341 + 2342 + <div class="content"> 2343 + <rate-and-review-module data-RateAndReviewModuleManager="rateAndReviewModule" skeleton="panel" 2344 + status="unrated"> 2345 + <rating-stars-group data-RateAndReviewModuleManager="stars:changed" 2346 + data-RateAndReviewOverlayManager="moduleStars" aria-labelledby="ratingStarsLabel" is-selectable 2347 + size="2.75,2" slot="rating"> 2348 + </rating-stars-group> 2349 + <rating-descriptions context="label" data-RateAndReviewModuleManager="ratingDescriptions" size="1" 2350 + slot="description" hidden></rating-descriptions> 2351 + <drawer-more maxlines="2" slot="review-quote" status="closed"> 2352 + <rt-text data-RateAndReviewModuleManager="userReview" 2353 + data-RateAndReviewOverlayManager="moduleReview" size="0.875" slot="content"></rt-text> 2354 + <rt-link slot="ctaOpen" size="0.875" context="label">Read More</rt-link> 2355 + <rt-link slot="ctaClose" size="0.875" context="label">Read Less</rt-link> 2356 + </drawer-more> 2357 + 2358 + <rt-button data-RateAndReviewModuleManager="rateBtn:click" shape="pill" size="1" slot="cta-rate"> 2359 + POST RATING </rt-button> 2360 + <rt-button data-RateAndReviewModuleManager="writeReviewBtn:click" size="1" slot="cta-review" 2361 + theme="transparent"> WRITE A REVIEW </rt-button> 2362 + <rt-button data-RateAndReviewModuleManager="editReviewBtn:click" size="1" slot="cta-edit" 2363 + theme="transparent"> EDIT REVIEW </rt-button> 2364 + </rate-and-review-module> 2365 + </div> 2366 + 2367 + <rate-and-review-overlay-manager 2368 + data-RateAndReviewModuleManager="overlayManager:error,success"></rate-and-review-overlay-manager> 2369 + </section> 2370 + 2371 + 2372 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2373 + 2374 + <div id="cast-and-crew" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2375 + 2376 + 2377 + 2378 + <section aria-labelledby="cast-and-crew-label" class="cast-and-crew" data-adobe-id="cast-and-crew" 2379 + data-qa="section:cast-and-crew"> 2380 + <div class="header-wrap"> 2381 + <h2 class="unset" id="cast-and-crew-label"> 2382 + <rt-text size="1.25" context="heading" data-qa="title">Cast & Crew</rt-text> 2383 + </h2> 2384 + <rt-button arialabel="Cast and Crew" data-qa="view-all-link" 2385 + href="/m/the_fantastic_four_first_steps/cast-and-crew" shape="pill" size="0.875" 2386 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2387 + theme="light"> 2388 + View All 2389 + </rt-button> 2390 + </div> 2391 + 2392 + <div class="content-wrap"> 2393 + 2394 + 2395 + <a href="/celebrity/matt-shakman" data-qa="person-item"> 2396 + <tile-dynamic skeleton="panel"> 2397 + <rt-img alt="Matt Shakman thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2398 + src="https://resizing.flixster.com/GEC1uAUpUH1wNcCsixMU3Id9Y-I=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/103981_v9_bb.jpg"></rt-img> 2399 + <div slot="insetText" aria-label="Matt Shakman, Director"> 2400 + <p class="name" data-qa="person-name">Matt Shakman</p> 2401 + <p class="role" data-qa="person-role">Director</p> 2402 + </div> 2403 + </tile-dynamic> 2404 + </a> 2405 + 2406 + <a href="/celebrity/pedro_pascal" data-qa="person-item"> 2407 + <tile-dynamic skeleton="panel"> 2408 + <rt-img alt="Pedro Pascal thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2409 + src="https://resizing.flixster.com/gHGci208eTBBe6s555qqrVvMAlg=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/494807_v9_bd.jpg"></rt-img> 2410 + <div slot="insetText" aria-label="Pedro Pascal, Reed Richards "> 2411 + <p class="name" data-qa="person-name">Pedro Pascal</p> 2412 + <p class="role" data-qa="person-role">Reed Richards </p> 2413 + </div> 2414 + </tile-dynamic> 2415 + </a> 2416 + 2417 + <a href="/celebrity/vanessa_kirby" data-qa="person-item"> 2418 + <tile-dynamic skeleton="panel"> 2419 + <rt-img alt="Vanessa Kirby thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2420 + src="https://resizing.flixster.com/hYfFokzVjtDj7QBvMrYIJ5uAhmY=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/631337_v9_bb.jpg"></rt-img> 2421 + <div slot="insetText" aria-label="Vanessa Kirby, Sue Storm "> 2422 + <p class="name" data-qa="person-name">Vanessa Kirby</p> 2423 + <p class="role" data-qa="person-role">Sue Storm </p> 2424 + </div> 2425 + </tile-dynamic> 2426 + </a> 2427 + 2428 + <a href="/celebrity/ebon_moss_bachrach" data-qa="person-item"> 2429 + <tile-dynamic skeleton="panel"> 2430 + <rt-img alt="Ebon Moss-Bachrach thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2431 + src="https://resizing.flixster.com/cEb3kX_Yn_L4trv76D6rNON5nLA=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/252022_v9_bc.jpg"></rt-img> 2432 + <div slot="insetText" aria-label="Ebon Moss-Bachrach, Ben Grimm "> 2433 + <p class="name" data-qa="person-name">Ebon Moss-Bachrach</p> 2434 + <p class="role" data-qa="person-role">Ben Grimm </p> 2435 + </div> 2436 + </tile-dynamic> 2437 + </a> 2438 + 2439 + <a href="/celebrity/joseph_quinn" data-qa="person-item"> 2440 + <tile-dynamic skeleton="panel"> 2441 + <rt-img alt="Joseph Quinn thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2442 + src="https://resizing.flixster.com/mwGK9WCbDyzD9FKvC81OyaWTfjc=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/1102755_v9_bb.jpg"></rt-img> 2443 + <div slot="insetText" aria-label="Joseph Quinn, Johnny Storm "> 2444 + <p class="name" data-qa="person-name">Joseph Quinn</p> 2445 + <p class="role" data-qa="person-role">Johnny Storm </p> 2446 + </div> 2447 + </tile-dynamic> 2448 + </a> 2449 + 2450 + <a href="/celebrity/ralph-ineson" data-qa="person-item"> 2451 + <tile-dynamic skeleton="panel"> 2452 + <rt-img alt="Ralph Ineson thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2453 + src="https://resizing.flixster.com/-UyEiZ3UKHhGzdQU4wDV10Z6wO0=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/268419_v9_bc.jpg"></rt-img> 2454 + <div slot="insetText" aria-label="Ralph Ineson, Galactus"> 2455 + <p class="name" data-qa="person-name">Ralph Ineson</p> 2456 + <p class="role" data-qa="person-role">Galactus</p> 2457 + </div> 2458 + </tile-dynamic> 2459 + </a> 2460 + 2461 + </div> 2462 + 2463 + </section> 2464 + 2465 + </div> 2466 + 2467 + 2468 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2469 + 2470 + <div id="movie-clips" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2471 + 2472 + 2473 + 2474 + <section aria-labelledby="movie-clips-label" class="movie-clips" data-adobe-id="movie-clips" 2475 + data-qa="section:movie-clips"> 2476 + <div class="header-wrap"> 2477 + <div class="link-wrap"> 2478 + <h2 class="unset" id="movie-clips-label"> 2479 + <rt-text size="1.25" context="heading">Movie Clips</rt-text> 2480 + </h2> 2481 + <rt-button arialabel=" videos" data-qa="videos-view-all-link" 2482 + href="/m/the_fantastic_four_first_steps/videos" shape="pill" size="0.875" 2483 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2484 + theme="light"> 2485 + View All 2486 + </rt-button> 2487 + </div> 2488 + <h3 class="unset"> 2489 + <rt-text context="heading" size="0.75" 2490 + style="--letterSpacing: 1px; --textColor: var(--grayDark4); --textTransform: capitalize;"> 2491 + The Fantastic Four: First Steps 2492 + </rt-text> 2493 + </h3> 2494 + </div> 2495 + 2496 + <carousel-slider tile-width="80%,240px" data-VideosCarouselManager="carousel" skeleton="panel" 2497 + data-qa="videos-carousel"> 2498 + 2499 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2500 + <rt-img slot="image" loading="" 2501 + src="https://resizing.flixster.com/2ckR7vRcYqkP8nqhQWY7WPZHDRA=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/496/667/thumb_0598F689-083F-4438-9A8D-C95478298C2F.jpg" 2502 + alt="The Fantastic Four: First Steps: Movie Clip - I Herald Galactus "></rt-img> 2503 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 2504 + data-mpx-id="2437913667638" data-public-id="xE7nTGsSlCZU" data-type="Movie" 2505 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2506 + data-qa="video-trailer-play-btn"> 2507 + <span class="sr-only">The Fantastic Four: First Steps: Movie Clip - I Herald Galactus</span> 2508 + </rt-button> 2509 + 2510 + <drawer-more slot="caption" maxlines="2" status="closed"> 2511 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Fantastic Four: 2512 + First Steps: Movie Clip - I Herald Galactus</rt-text> 2513 + </drawer-more> 2514 + 2515 + <rt-badge slot="imageInsetLabel" theme="gray"> 2516 + 1:01 2517 + </rt-badge> 2518 + </tile-video> 2519 + 2520 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2521 + <rt-img slot="image" loading="" 2522 + src="https://resizing.flixster.com/o_5MtdtAJJdYl_U005ycG4AbHoM=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/273/518/thumb_ABC39A90-FC12-4796-9781-7821A147C50E.jpg" 2523 + alt="The Fantastic Four: First Steps: Movie Clip - Sunday Dinner "></rt-img> 2524 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 2525 + data-mpx-id="2437679683546" data-public-id="rWBzo2Bw49o3" data-type="Movie" 2526 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2527 + data-qa="video-trailer-play-btn"> 2528 + <span class="sr-only">The Fantastic Four: First Steps: Movie Clip - Sunday Dinner</span> 2529 + </rt-button> 2530 + 2531 + <drawer-more slot="caption" maxlines="2" status="closed"> 2532 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Fantastic Four: 2533 + First Steps: Movie Clip - Sunday Dinner</rt-text> 2534 + </drawer-more> 2535 + 2536 + <rt-badge slot="imageInsetLabel" theme="gray"> 2537 + 1:24 2538 + </rt-badge> 2539 + </tile-video> 2540 + 2541 + <tile-view-more aspect="landscape" background="mediaHero" slot="tile"> 2542 + <rt-button href="/m/the_fantastic_four_first_steps/videos" shape="pill" 2543 + theme="transparent-lighttext"> 2544 + View more videos 2545 + </rt-button> 2546 + </tile-view-more> 2547 + </carousel-slider> 2548 + </section> 2549 + 2550 + </div> 2551 + 2552 + 2553 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2554 + 2555 + <div id="more-like-this" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2556 + 2557 + 2558 + 2559 + <section aria-labelledby="more-like-this-label" class="more-like-this" data-adobe-id="more-like-this" 2560 + data-qa="section:more-like-this"> 2561 + <div class="header-wrap"> 2562 + <div class="link-wrap"> 2563 + <h3 class="unset" id="more-like-this-label"> 2564 + <rt-text size="1.25" context="heading"> 2565 + More Like This 2566 + </rt-text> 2567 + </h3> 2568 + <rt-button arialabel="Movies in Theaters" data-qa="view-all-link" 2569 + href="/browse/movies_in_theaters/sort:popular" shape="pill" size="0.875" 2570 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2571 + theme="light"> 2572 + View All 2573 + </rt-button> 2574 + </div> 2575 + </div> 2576 + 2577 + <div class="content-wrap"> 2578 + <carousel-slider skeleton="panel" tile-width="140px" gap="15px"> 2579 + 2580 + <tile-poster-card slot="tile"> 2581 + <rt-link slot="primaryImage" href="/m/godzilla_vs_kong" tabindex="-1"> 2582 + <sr-text>Godzilla vs. Kong</sr-text> 2583 + <rt-img loading="" 2584 + src="https://resizing.flixster.com/EEYz8hv8oK7__RZ-gAD9TaU9v1Y=/206x305/v2/https://resizing.flixster.com/tZyAodV5kbRWTPtyiBo71sOSee8=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzYzYThhNTAwLTdlZTAtNDM3MS1hNmEyLTdlNzczNWVjNmE2YS5qcGc=" 2585 + alt="Godzilla vs. Kong poster"></rt-img> 2586 + </rt-link> 2587 + <score-icon-critics certified="true" sentiment="POSITIVE" size="1" slot="criticsIcon" 2588 + verticalalign="sub"></score-icon-critics> 2589 + <rt-text slot="criticsScore" size="0.9" context="label"> 2590 + 76% 2591 + </rt-text> 2592 + <score-icon-audience certified="true" sentiment="POSITIVE" size="1" 2593 + slot="audienceIcon"></score-icon-audience> 2594 + <rt-text slot="audienceScore" size="0.9" context="label"> 2595 + 91% 2596 + </rt-text> 2597 + <rt-link slot="title" href="/m/godzilla_vs_kong" size="0.85" context="label"> 2598 + Godzilla vs. Kong 2599 + </rt-link> 2600 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2601 + emsid="04bd0a06-366b-39cb-a3f5-3d26aad6d986" mediatype="Movie" mediatitle="Godzilla vs. Kong" 2602 + slot="watchlistButton" state="unchecked"> 2603 + <span slot="text">Watchlist</span> 2604 + </watchlist-button> 2605 + 2606 + <rt-button data-content-type="PROMO" data-disable-ads="" 2607 + data-ems-id="04bd0a06-366b-39cb-a3f5-3d26aad6d986" data-mpx-id="1847861827818" 2608 + data-position="1" data-public-id="_Fg3QpNe3EO4" data-title="Godzilla vs. Kong: Trailer 1" 2609 + data-track="poster" data-type="Movie" data-VideoPlayerOverlayManager="btnVideo:click" 2610 + data-video-list="" slot="trailerButton" size="0.875" theme="transparent"> 2611 + <rt-icon icon="play"></rt-icon> 2612 + <span>TRAILER</span> 2613 + <sr-text> for Godzilla vs. Kong</sr-text> 2614 + </rt-button> 2615 + 2616 + </tile-poster-card> 2617 + 2618 + <tile-poster-card slot="tile"> 2619 + <rt-link slot="primaryImage" href="/m/avengers_infinity_war" tabindex="-1"> 2620 + <sr-text>Avengers: Infinity War</sr-text> 2621 + <rt-img loading="" 2622 + src="https://resizing.flixster.com/xC06wd4ol1CFog1PZ34PRcr_akg=/206x305/v2/https://resizing.flixster.com/CXOXbOpLNL1NNkXTQu-4Rgvcszs=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzM0NGRkMDM2LWVjNDQtNGZlMC04NGM3LWZkMzQ2Njg1OTUyNi53ZWJw" 2623 + alt="Avengers: Infinity War poster"></rt-img> 2624 + </rt-link> 2625 + <score-icon-critics certified="true" sentiment="POSITIVE" size="1" slot="criticsIcon" 2626 + verticalalign="sub"></score-icon-critics> 2627 + <rt-text slot="criticsScore" size="0.9" context="label"> 2628 + 85% 2629 + </rt-text> 2630 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2631 + slot="audienceIcon"></score-icon-audience> 2632 + <rt-text slot="audienceScore" size="0.9" context="label"> 2633 + 92% 2634 + </rt-text> 2635 + <rt-link slot="title" href="/m/avengers_infinity_war" size="0.85" context="label"> 2636 + Avengers: Infinity War 2637 + </rt-link> 2638 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2639 + emsid="8ef022ef-f88a-33c8-8f6e-ab87f5039eea" mediatype="Movie" 2640 + mediatitle="Avengers: Infinity War" slot="watchlistButton" state="unchecked"> 2641 + <span slot="text">Watchlist</span> 2642 + </watchlist-button> 2643 + 2644 + <rt-button data-content-type="PROMO" data-disable-ads="" 2645 + data-ems-id="8ef022ef-f88a-33c8-8f6e-ab87f5039eea" data-mpx-id="1187576387953" 2646 + data-position="2" data-public-id="VsE2xAyymQFk" data-title="Avengers: Infinity War: Trailer 2" 2647 + data-track="poster" data-type="Movie" data-VideoPlayerOverlayManager="btnVideo:click" 2648 + data-video-list="" slot="trailerButton" size="0.875" theme="transparent"> 2649 + <rt-icon icon="play"></rt-icon> 2650 + <span>TRAILER</span> 2651 + <sr-text> for Avengers: Infinity War</sr-text> 2652 + </rt-button> 2653 + 2654 + </tile-poster-card> 2655 + 2656 + <tile-poster-card slot="tile"> 2657 + <rt-link slot="primaryImage" href="/m/war_for_the_planet_of_the_apes" tabindex="-1"> 2658 + <sr-text>War for the Planet of the Apes</sr-text> 2659 + <rt-img loading="" 2660 + src="https://resizing.flixster.com/hzbgPAMhNcS60Ig1L2yRcCfuB0A=/206x305/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p12126545_p_v8_ar.jpg" 2661 + alt="War for the Planet of the Apes poster"></rt-img> 2662 + </rt-link> 2663 + <score-icon-critics certified="true" sentiment="POSITIVE" size="1" slot="criticsIcon" 2664 + verticalalign="sub"></score-icon-critics> 2665 + <rt-text slot="criticsScore" size="0.9" context="label"> 2666 + 94% 2667 + </rt-text> 2668 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2669 + slot="audienceIcon"></score-icon-audience> 2670 + <rt-text slot="audienceScore" size="0.9" context="label"> 2671 + 84% 2672 + </rt-text> 2673 + <rt-link slot="title" href="/m/war_for_the_planet_of_the_apes" size="0.85" context="label"> 2674 + War for the Planet of the Apes 2675 + </rt-link> 2676 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2677 + emsid="58230728-f14f-3d9d-8163-c42f77862c12" mediatype="Movie" 2678 + mediatitle="War for the Planet of the Apes" slot="watchlistButton" state="unchecked"> 2679 + <span slot="text">Watchlist</span> 2680 + </watchlist-button> 2681 + 2682 + <rt-button data-content-type="PROMO" data-disable-ads="" 2683 + data-ems-id="58230728-f14f-3d9d-8163-c42f77862c12" data-mpx-id="977018435843" 2684 + data-position="3" data-public-id="6uDzUM2KPOVC" 2685 + data-title="War for the Planet of the Apes: Trailer 4" data-track="poster" data-type="Movie" 2686 + data-VideoPlayerOverlayManager="btnVideo:click" data-video-list="" slot="trailerButton" 2687 + size="0.875" theme="transparent"> 2688 + <rt-icon icon="play"></rt-icon> 2689 + <span>TRAILER</span> 2690 + <sr-text> for War for the Planet of the Apes</sr-text> 2691 + </rt-button> 2692 + 2693 + </tile-poster-card> 2694 + 2695 + <tile-poster-card slot="tile"> 2696 + <rt-link slot="primaryImage" href="/m/godzilla_minus_one" tabindex="-1"> 2697 + <sr-text>Godzilla Minus One</sr-text> 2698 + <rt-img loading="" 2699 + src="https://resizing.flixster.com/54ve7LYDF04gM_uczrFs6oG2zTw=/206x305/v2/https://resizing.flixster.com/CDYB6aGzmamA9BCmveGRQ880KRs=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzk5MmIwMzZiLWU2ZGMtNDU4NC04YTYxLTA3YmRlMDVkYjI3YS5qcGc=" 2700 + alt="Godzilla Minus One poster"></rt-img> 2701 + </rt-link> 2702 + <score-icon-critics certified="true" sentiment="POSITIVE" size="1" slot="criticsIcon" 2703 + verticalalign="sub"></score-icon-critics> 2704 + <rt-text slot="criticsScore" size="0.9" context="label"> 2705 + 99% 2706 + </rt-text> 2707 + <score-icon-audience certified="true" sentiment="POSITIVE" size="1" 2708 + slot="audienceIcon"></score-icon-audience> 2709 + <rt-text slot="audienceScore" size="0.9" context="label"> 2710 + 98% 2711 + </rt-text> 2712 + <rt-link slot="title" href="/m/godzilla_minus_one" size="0.85" context="label"> 2713 + Godzilla Minus One 2714 + </rt-link> 2715 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2716 + emsid="90c22bee-a1dd-44f6-8345-d1792b4dddc3" mediatype="Movie" mediatitle="Godzilla Minus One" 2717 + slot="watchlistButton" state="unchecked"> 2718 + <span slot="text">Watchlist</span> 2719 + </watchlist-button> 2720 + 2721 + <rt-button data-content-type="PROMO" data-disable-ads="" 2722 + data-ems-id="90c22bee-a1dd-44f6-8345-d1792b4dddc3" data-mpx-id="2383603779658" 2723 + data-position="4" data-public-id="Mjli8tOlPmKB" 2724 + data-title="Godzilla Minus One: Re-Release Trailer" data-track="poster" data-type="Movie" 2725 + data-VideoPlayerOverlayManager="btnVideo:click" data-video-list="" slot="trailerButton" 2726 + size="0.875" theme="transparent"> 2727 + <rt-icon icon="play"></rt-icon> 2728 + <span>TRAILER</span> 2729 + <sr-text> for Godzilla Minus One</sr-text> 2730 + </rt-button> 2731 + 2732 + </tile-poster-card> 2733 + 2734 + <tile-poster-card slot="tile"> 2735 + <rt-link slot="primaryImage" href="/m/the_creator_2023" tabindex="-1"> 2736 + <sr-text>The Creator</sr-text> 2737 + <rt-img loading="" 2738 + src="https://resizing.flixster.com/a8yOHUJZN88nlYhy8BTgM1gxNbI=/206x305/v2/https://resizing.flixster.com/CqeQShqSXJ8Ec-2I9RYEXdoncH0=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzNjYzAzM2ZiLTc5ZGItNDUyYS05MmFkLTY5NDRiYjRiODlkYi5qcGc=" 2739 + alt="The Creator poster"></rt-img> 2740 + </rt-link> 2741 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2742 + verticalalign="sub"></score-icon-critics> 2743 + <rt-text slot="criticsScore" size="0.9" context="label"> 2744 + 67% 2745 + </rt-text> 2746 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2747 + slot="audienceIcon"></score-icon-audience> 2748 + <rt-text slot="audienceScore" size="0.9" context="label"> 2749 + 75% 2750 + </rt-text> 2751 + <rt-link slot="title" href="/m/the_creator_2023" size="0.85" context="label"> 2752 + The Creator 2753 + </rt-link> 2754 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2755 + emsid="7550c7be-4166-3c4c-a2dc-03a223aa3b29" mediatype="Movie" mediatitle="The Creator" 2756 + slot="watchlistButton" state="unchecked"> 2757 + <span slot="text">Watchlist</span> 2758 + </watchlist-button> 2759 + 2760 + <rt-button data-content-type="PROMO" data-disable-ads="" 2761 + data-ems-id="7550c7be-4166-3c4c-a2dc-03a223aa3b29" data-mpx-id="2263363651869" 2762 + data-position="5" data-public-id="UYuDwo6HZ1BN" data-title="The Creator: Final Trailer" 2763 + data-track="poster" data-type="Movie" data-VideoPlayerOverlayManager="btnVideo:click" 2764 + data-video-list="" slot="trailerButton" size="0.875" theme="transparent"> 2765 + <rt-icon icon="play"></rt-icon> 2766 + <span>TRAILER</span> 2767 + <sr-text> for The Creator</sr-text> 2768 + </rt-button> 2769 + 2770 + </tile-poster-card> 2771 + 2772 + 2773 + <tile-poster-card skeleton="panel" slot="tile" tabindex="-1"> 2774 + <tile-view-more aspect="posterCard" background="collage" slot="primaryImage"> 2775 + </tile-view-more> 2776 + <rt-text slot="title" size="0.85" context="label">Discover more movies and TV shows.</rt-text> 2777 + <rt-button href="/browse/movies_in_theaters/sort:popular" slot="watchlistButton" shape="pill" 2778 + size="0.875" theme="transparent-darktext" aria-label="View More Movies in Theaters"> 2779 + View More 2780 + </rt-button> 2781 + </tile-poster-card> 2782 + </carousel-slider> 2783 + </div> 2784 + </section> 2785 + 2786 + </div> 2787 + 2788 + 2789 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2790 + 2791 + <div id="news-and-guides" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2792 + 2793 + 2794 + 2795 + <section aria-labelledby="news-and-guides-label" class="news-and-guides" data-adobe-id="news-and-guides" 2796 + data-qa="section:news-and-guides"> 2797 + <div class="header-wrap"> 2798 + <div class="link-wrap"> 2799 + <h2 class="unset" id="news-and-guides-label"> 2800 + <rt-text size="1.25" style="--textTransform: capitalize;" context="heading" 2801 + data-qa="title">Related Movie News</rt-text> 2802 + </h2> 2803 + <rt-button arialabel="Related Movie News" data-qa="view-all-link" 2804 + href="https://editorial.rottentomatoes.com/more-related-content/?relatedmovieid=db64beee-683b-39ce-9617-94f6b67aa997" 2805 + shape="pill" size="0.875" 2806 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2807 + theme="light"> 2808 + View All 2809 + </rt-button> 2810 + </div> 2811 + </div> 2812 + 2813 + <div class="content-wrap"> 2814 + <carousel-slider tile-width="80%,240px" skeleton="panel" data-qa="carousel"> 2815 + 2816 + <a slot="tile" 2817 + href="https://editorial.rottentomatoes.com/article/the-most-anticipated-movies-of-2025/" 2818 + data-qa="article"> 2819 + <tile-dynamic orientation="landscape" skeleton="panel"> 2820 + <rt-img slot="image" 2821 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Most_Anticipated_Movies_2025_Running_Man-Rep.jpg" 2822 + loading="lazy"></rt-img> 2823 + <drawer-more slot="caption" maxlines="2" status="closed"> 2824 + <rt-text slot="content" size="1" context="label" data-qa="article-title">The Most 2825 + Anticipated Movies of 2025</rt-text> 2826 + </drawer-more> 2827 + </tile-dynamic> 2828 + </a> 2829 + 2830 + <a slot="tile" 2831 + href="https://editorial.rottentomatoes.com/article/12-plot-threads-marvel-still-needs-to-tie-up-after-the-fantastic-four-first-steps/" 2832 + data-qa="article"> 2833 + <tile-dynamic orientation="landscape" skeleton="panel"> 2834 + <rt-img slot="image" 2835 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/07/MCU_Plots-Rep.jpg" 2836 + loading="lazy"></rt-img> 2837 + <drawer-more slot="caption" maxlines="2" status="closed"> 2838 + <rt-text slot="content" size="1" context="label" data-qa="article-title">12 Plot Threads 2839 + Marvel Still Needs to Tie Up after <em>The Fantastic Four: First Steps</em></rt-text> 2840 + </drawer-more> 2841 + </tile-dynamic> 2842 + </a> 2843 + 2844 + <a slot="tile" 2845 + href="https://editorial.rottentomatoes.com/article/weekend-box-office-fantastic-four-scores-big-win-for-marvel/" 2846 + data-qa="article"> 2847 + <tile-dynamic orientation="landscape" skeleton="panel"> 2848 + <rt-img slot="image" 2849 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/07/Fantastic_Four_First_Steps_BO1-Rep.jpg" 2850 + loading="lazy"></rt-img> 2851 + <drawer-more slot="caption" maxlines="2" status="closed"> 2852 + <rt-text slot="content" size="1" context="label" data-qa="article-title">Weekend Box Office: 2853 + <em>The Fantastic Four</em> Scores a Big Win for Marvel</rt-text> 2854 + </drawer-more> 2855 + </tile-dynamic> 2856 + </a> 2857 + 2858 + </carousel-slider> 2859 + </div> 2860 + </section> 2861 + 2862 + </div> 2863 + 2864 + 2865 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2866 + 2867 + <div id="videos" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2868 + 2869 + 2870 + 2871 + <section aria-labelledby="videos-carousel-label" class="videos-carousel" data-adobe-id="videos-carousel" 2872 + data-qa="section:videos-carousel"> 2873 + <div class="header-wrap"> 2874 + <div class="link-wrap"> 2875 + <h2 class="unset" data-qa="videos-section-title" id="videos-carousel-label"> 2876 + <rt-text size="1.25" context="heading">Videos</rt-text> 2877 + </h2> 2878 + <rt-button arialabel=" videos" data-qa="videos-view-all-link" 2879 + href="/m/the_fantastic_four_first_steps/videos" shape="pill" size="0.875" 2880 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2881 + theme="light"> 2882 + View All 2883 + </rt-button> 2884 + </div> 2885 + <h3 class="unset"> 2886 + <rt-text context="heading" size="0.75" 2887 + style="--letterSpacing: 1px; --textColor: var(--grayDark4); --textTransform: capitalize;"> 2888 + The Fantastic Four: First Steps 2889 + </rt-text> 2890 + </h3> 2891 + </div> 2892 + 2893 + <carousel-slider tile-width="80%,240px" data-VideosCarouselManager="carousel" skeleton="panel" 2894 + data-qa="videos-carousel"> 2895 + 2896 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2897 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2898 + src="https://resizing.flixster.com/8pI5zoGYNLsqkovBikK9vs0Q_dE=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/663/931/thumb_4ca6d6c5-6a62-11f0-94b5-022bbbb30d69.jpg" 2899 + alt="The Fantastic Four: First Steps: 4 Us All"></rt-img> 2900 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 2901 + data-mpx-id="2441310275805" data-public-id="BBgYzBvAIQDN" data-type="Movie" 2902 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2903 + data-qa="video-trailer-play-btn"> 2904 + <span class="sr-only">The Fantastic Four: First Steps: 4 Us All</span> 2905 + </rt-button> 2906 + 2907 + <drawer-more slot="caption" maxlines="2" status="closed"> 2908 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Fantastic Four: 2909 + First Steps: 4 Us All</rt-text> 2910 + </drawer-more> 2911 + 2912 + <rt-badge slot="imageInsetLabel" theme="gray"> 2913 + 0:59 2914 + </rt-badge> 2915 + </tile-video> 2916 + 2917 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2918 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2919 + src="https://resizing.flixster.com/XZ_r9FybdPB8iwk74gCKy5aYSaU=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/555/522/thumb_27A9CD85-8C9C-46FC-BE15-5621BD2088B3.jpg" 2920 + alt="The Fantastic Four Draft Their MCU Fantasy Team"></rt-img> 2921 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 2922 + data-mpx-id="2441196611548" data-public-id="dKENBs1zPSMQ" data-type="Movie" 2923 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2924 + data-qa="video-trailer-play-btn"> 2925 + <span class="sr-only">The Fantastic Four Draft Their MCU Fantasy Team</span> 2926 + </rt-button> 2927 + 2928 + <drawer-more slot="caption" maxlines="2" status="closed"> 2929 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Fantastic Four 2930 + Draft Their MCU Fantasy Team</rt-text> 2931 + </drawer-more> 2932 + 2933 + <rt-badge slot="imageInsetLabel" theme="gray"> 2934 + 1:15 2935 + </rt-badge> 2936 + </tile-video> 2937 + 2938 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2939 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2940 + src="https://resizing.flixster.com/TFtzxS3dV1GMq0Zb5h8avmCaTI0=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/551/119/thumb_41241D95-C081-4422-962E-7A588798E2C2.jpg" 2941 + alt="How is Galactus as a Boss?"></rt-img> 2942 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 2943 + data-mpx-id="2441192003818" data-public-id="ky_Lk6vXvywy" data-type="Movie" 2944 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2945 + data-qa="video-trailer-play-btn"> 2946 + <span class="sr-only">How is Galactus as a Boss?</span> 2947 + </rt-button> 2948 + 2949 + <drawer-more slot="caption" maxlines="2" status="closed"> 2950 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">How is Galactus as a 2951 + Boss?</rt-text> 2952 + </drawer-more> 2953 + 2954 + <rt-badge slot="imageInsetLabel" theme="gray"> 2955 + 0:53 2956 + </rt-badge> 2957 + </tile-video> 2958 + 2959 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2960 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2961 + src="https://resizing.flixster.com/V-7Y5EWNCCikxneT-APVv4rQ8pw=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/551/619/thumb_5E7365E1-5257-4EE5-97C9-D8EDE5B21724.jpg" 2962 + alt="The Fantastic Four: First Steps: TV Spot - Best Team"></rt-img> 2963 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 2964 + data-mpx-id="2441192515681" data-public-id="8kSEbEu1Zhgw" data-type="Movie" 2965 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2966 + data-qa="video-trailer-play-btn"> 2967 + <span class="sr-only">The Fantastic Four: First Steps: TV Spot - Best Team</span> 2968 + </rt-button> 2969 + 2970 + <drawer-more slot="caption" maxlines="2" status="closed"> 2971 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Fantastic Four: 2972 + First Steps: TV Spot - Best Team</rt-text> 2973 + </drawer-more> 2974 + 2975 + <rt-badge slot="imageInsetLabel" theme="gray"> 2976 + 0:42 2977 + </rt-badge> 2978 + </tile-video> 2979 + 2980 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2981 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2982 + src="https://resizing.flixster.com/CyvZwgalYR4RpkWZ3JZAnY58zRU=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/553/71/thumb_A18EC82A-C972-4A45-9F62-94B441AB73D7.jpg" 2983 + alt="Who Is the Glue of the #FantasticFour?"></rt-img> 2984 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 2985 + data-mpx-id="2441194051608" data-public-id="O22eNh1x9EXr" data-type="Movie" 2986 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2987 + data-qa="video-trailer-play-btn"> 2988 + <span class="sr-only">Who Is the Glue of the #FantasticFour?</span> 2989 + </rt-button> 2990 + 2991 + <drawer-more slot="caption" maxlines="2" status="closed"> 2992 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Who Is the Glue of 2993 + the #FantasticFour?</rt-text> 2994 + </drawer-more> 2995 + 2996 + <rt-badge slot="imageInsetLabel" theme="gray"> 2997 + 1:12 2998 + </rt-badge> 2999 + </tile-video> 3000 + 3001 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3002 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3003 + src="https://resizing.flixster.com/Kae7Hpw4wvBW8mScdFxwgl4HDA4=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/546/239/thumb_E96B5C4E-11FD-44E8-ABBC-57DEF64D9182.jpg" 3004 + alt="The Herald Scene on DAY 1?! #FantasticFour"></rt-img> 3005 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 3006 + data-mpx-id="2441186883850" data-public-id="b7daKHSpDg_G" data-type="Movie" 3007 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3008 + data-qa="video-trailer-play-btn"> 3009 + <span class="sr-only">The Herald Scene on DAY 1?! #FantasticFour</span> 3010 + </rt-button> 3011 + 3012 + <drawer-more slot="caption" maxlines="2" status="closed"> 3013 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Herald Scene on 3014 + DAY 1?! #FantasticFour</rt-text> 3015 + </drawer-more> 3016 + 3017 + <rt-badge slot="imageInsetLabel" theme="gray"> 3018 + 1:09 3019 + </rt-badge> 3020 + </tile-video> 3021 + 3022 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3023 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3024 + src="https://resizing.flixster.com/ywU2R45-iE85jfOACE0QqIAEvPw=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/357/275/thumb_53CCBA70-92E5-46A7-86BA-9C9A4666249B.jpg" 3025 + alt="The Cast of &#39;The Fantastic Four: First Steps&#39; Talk Family Reunion, Heralding Galactus, and More!"></rt-img> 3026 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 3027 + data-mpx-id="2440988739926" data-public-id="tcGVvjLsPP54" data-type="Movie" 3028 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3029 + data-qa="video-trailer-play-btn"> 3030 + <span class="sr-only">The Cast of &#39;The Fantastic Four: First Steps&#39; Talk Family Reunion, 3031 + Heralding Galactus, and More!</span> 3032 + </rt-button> 3033 + 3034 + <drawer-more slot="caption" maxlines="2" status="closed"> 3035 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Cast of &#39;The 3036 + Fantastic Four: First Steps&#39; Talk Family Reunion, Heralding Galactus, and More!</rt-text> 3037 + </drawer-more> 3038 + 3039 + <rt-badge slot="imageInsetLabel" theme="gray"> 3040 + 23:37 3041 + </rt-badge> 3042 + </tile-video> 3043 + 3044 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3045 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3046 + src="https://resizing.flixster.com/E_WEVGUx0sdH8xGrMdgNW15RICc=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/322/615/thumb_1398D733-67C4-4CB3-8512-4094F4FF5D95.jpg" 3047 + alt="Meet Marvel&#39;s First Family in The Fantastic Four: First Steps, now playing in theaters"></rt-img> 3048 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 3049 + data-mpx-id="2440952387734" data-public-id="huVWhy5k8SXH" data-type="Movie" 3050 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3051 + data-qa="video-trailer-play-btn"> 3052 + <span class="sr-only">Meet Marvel&#39;s First Family in The Fantastic Four: First Steps, now 3053 + playing in theaters</span> 3054 + </rt-button> 3055 + 3056 + <drawer-more slot="caption" maxlines="2" status="closed"> 3057 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Meet Marvel&#39;s 3058 + First Family in The Fantastic Four: First Steps, now playing in theaters</rt-text> 3059 + </drawer-more> 3060 + 3061 + <rt-badge slot="imageInsetLabel" theme="gray"> 3062 + 0:15 3063 + </rt-badge> 3064 + </tile-video> 3065 + 3066 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3067 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3068 + src="https://resizing.flixster.com/tjwBmudKFkfoVN5wiJgpQPfQ9mM=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/208/351/thumb_dc59e6f6-682e-11f0-94b5-022bbbb30d69.jpg" 3069 + alt="The Fantastic Four: First Steps: Spot - Love Review"></rt-img> 3070 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 3071 + data-mpx-id="2440832579995" data-public-id="OuI1XuMEBu8H" data-type="Movie" 3072 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3073 + data-qa="video-trailer-play-btn"> 3074 + <span class="sr-only">The Fantastic Four: First Steps: Spot - Love Review</span> 3075 + </rt-button> 3076 + 3077 + <drawer-more slot="caption" maxlines="2" status="closed"> 3078 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Fantastic Four: 3079 + First Steps: Spot - Love Review</rt-text> 3080 + </drawer-more> 3081 + 3082 + <rt-badge slot="imageInsetLabel" theme="gray"> 3083 + 0:30 3084 + </rt-badge> 3085 + </tile-video> 3086 + 3087 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3088 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3089 + src="https://resizing.flixster.com/kCuTyrkJa444HyW_gTfg0zt-wxA=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/73/591/thumb_EF22AF7C-EFE5-4AAB-83F1-1154CE9997CB.jpg" 3090 + alt="The Fantastic Four: First Steps: Featurette - Crafting Fantastic Four"></rt-img> 3091 + <rt-button theme="transparent" data-ems-id="db64beee-683b-39ce-9617-94f6b67aa997" 3092 + data-mpx-id="2440691267905" data-public-id="zyEx4gF4eP51" data-type="Movie" 3093 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3094 + data-qa="video-trailer-play-btn"> 3095 + <span class="sr-only">The Fantastic Four: First Steps: Featurette - Crafting Fantastic 3096 + Four</span> 3097 + </rt-button> 3098 + 3099 + <drawer-more slot="caption" maxlines="2" status="closed"> 3100 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Fantastic Four: 3101 + First Steps: Featurette - Crafting Fantastic Four</rt-text> 3102 + </drawer-more> 3103 + 3104 + <rt-badge slot="imageInsetLabel" theme="gray"> 3105 + 2:27 3106 + </rt-badge> 3107 + </tile-video> 3108 + 3109 + <tile-view-more aspect="landscape" background="mediaHero" slot="tile"> 3110 + <rt-button href="/m/the_fantastic_four_first_steps/videos" shape="pill" 3111 + theme="transparent-lighttext"> 3112 + View more videos 3113 + </rt-button> 3114 + </tile-view-more> 3115 + </carousel-slider> 3116 + </section> 3117 + 3118 + </div> 3119 + 3120 + 3121 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 3122 + 3123 + <div id="photos" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 3124 + 3125 + 3126 + 3127 + <section aria-labelledby="photos-carousel-label" class="photos-carousel" data-adobe-id="photos-carousel" 3128 + data-qa="section:photos-carousel"> 3129 + <div class="header-wrap"> 3130 + <div class="link-wrap"> 3131 + <h2 class="unset" id="photos-carousel-label"> 3132 + <rt-text size="1.25" context="heading">Photos</rt-text> 3133 + </h2> 3134 + <rt-button arialabel="The Fantastic Four: First Steps photos" data-qa="photos-view-all-link" 3135 + href="/m/the_fantastic_four_first_steps/pictures" shape="pill" size="0.875" 3136 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 3137 + theme="light"> 3138 + View All 3139 + </rt-button> 3140 + </div> 3141 + <h3 class="unset"> 3142 + <rt-text context="label" size="0.75" style="--textColor: var(--grayDark4);"> 3143 + The Fantastic Four: First Steps 3144 + </rt-text> 3145 + </h3> 3146 + </div> 3147 + 3148 + <carousel-slider tile-width="80%,240px" skeleton="panel"> 3149 + 3150 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3151 + <span class="sr-only"></span> 3152 + 3153 + 3154 + 3155 + <rt-img slot="image" loading="" 3156 + src="https://resizing.flixster.com/qTjkbvDHGGF4MArm23ek9NhmrBo=/fit-in/352x330/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=,https://resizing.flixster.com/DNRCwl_allJWD22fZCnQ2W9VPmU=/fit-in/705x460/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=" 3157 + alt="The Fantastic Four: First Steps photo 1"></rt-img> 3158 + </tile-photo> 3159 + 3160 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3161 + <span class="sr-only"></span> 3162 + 3163 + 3164 + 3165 + <rt-img slot="image" loading="" 3166 + src="https://resizing.flixster.com/fa9BQgkaF55O36JAf0eAPXhL_Ss=/fit-in/352x330/v2/https://resizing.flixster.com/NMakI9bPdy_rQSENNXPalE0hqnE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzQwZDlkMDkyLTg4MmItNDEzYi04Njc4LWI0OGEyNzExMjdiOS5qcGc=,https://resizing.flixster.com/nT6_8v-aXCmJPjPnCdRI4ldAZMA=/fit-in/705x460/v2/https://resizing.flixster.com/NMakI9bPdy_rQSENNXPalE0hqnE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzQwZDlkMDkyLTg4MmItNDEzYi04Njc4LWI0OGEyNzExMjdiOS5qcGc=" 3167 + alt="The Fantastic Four: First Steps photo 2"></rt-img> 3168 + </tile-photo> 3169 + 3170 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3171 + <span class="sr-only"></span> 3172 + 3173 + 3174 + 3175 + <rt-img slot="image" loading="" 3176 + src="https://resizing.flixster.com/4wA-Nucq0MUbX5TeuproT0YBjM8=/fit-in/352x330/v2/https://resizing.flixster.com/h3qjIZZh3McU1bUtnjODSl-IfYA=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E1MWEzOTcxLWU4Y2ItNDFmZS04MGNiLWIzM2Q3MzRjZTFkMy5qcGc=,https://resizing.flixster.com/mhmTgP2FAYDZ33vLTG5E2b9d9mo=/fit-in/705x460/v2/https://resizing.flixster.com/h3qjIZZh3McU1bUtnjODSl-IfYA=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E1MWEzOTcxLWU4Y2ItNDFmZS04MGNiLWIzM2Q3MzRjZTFkMy5qcGc=" 3177 + alt="The Fantastic Four: First Steps photo 3"></rt-img> 3178 + </tile-photo> 3179 + 3180 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3181 + <span class="sr-only"></span> 3182 + 3183 + 3184 + 3185 + <rt-img slot="image" loading="" 3186 + src="https://resizing.flixster.com/RY9vcciJ_oIuzUifngXUDZ79xdY=/fit-in/352x330/v2/https://resizing.flixster.com/FxaNqQIUwadQIxRy51lxUIwJeE0=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzNjMmFkYjM2LTVkNTMtNDE3NS04NjM1LTVjMmIwNzliN2QyNS5qcGc=,https://resizing.flixster.com/CYsDL5r6RiNfyJ3zEjwE9IKbnWI=/fit-in/705x460/v2/https://resizing.flixster.com/FxaNqQIUwadQIxRy51lxUIwJeE0=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzNjMmFkYjM2LTVkNTMtNDE3NS04NjM1LTVjMmIwNzliN2QyNS5qcGc=" 3187 + alt="The Fantastic Four: First Steps photo 4"></rt-img> 3188 + </tile-photo> 3189 + 3190 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3191 + <span class="sr-only"></span> 3192 + 3193 + 3194 + 3195 + <rt-img slot="image" loading="" 3196 + src="https://resizing.flixster.com/UGd6_E-kZvfFLpcQYg5O7coHBMk=/fit-in/352x330/v2/https://resizing.flixster.com/KR_7hcRCZbmzBhvZc1PoWsoI418=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E0MjAzNzA0LTEzOGItNGEyMy04NTc3LTRhYTFjOGFmZWE0Ny5qcGc=,https://resizing.flixster.com/p5cVXOC6YYSAwuCbw781cGMPNs8=/fit-in/705x460/v2/https://resizing.flixster.com/KR_7hcRCZbmzBhvZc1PoWsoI418=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E0MjAzNzA0LTEzOGItNGEyMy04NTc3LTRhYTFjOGFmZWE0Ny5qcGc=" 3197 + alt="The Fantastic Four: First Steps photo 5"></rt-img> 3198 + </tile-photo> 3199 + 3200 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3201 + <span class="sr-only"></span> 3202 + 3203 + 3204 + 3205 + <rt-img slot="image" loading="lazy" 3206 + src="https://resizing.flixster.com/Wfw784_pPihhDr2pwLHILl0W1LY=/fit-in/352x330/v2/https://resizing.flixster.com/yvV2l_YUKcIYbYQX1HQOBKuPR0I=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2YyZmU0Y2NiLTIxMDktNDhhMy1hNDA3LTA1NWE4NzkwY2M1My5qcGc=,https://resizing.flixster.com/LSJHJhxA-0I2RY7vXimlI-6_U3s=/fit-in/705x460/v2/https://resizing.flixster.com/yvV2l_YUKcIYbYQX1HQOBKuPR0I=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2YyZmU0Y2NiLTIxMDktNDhhMy1hNDA3LTA1NWE4NzkwY2M1My5qcGc=" 3207 + alt="The Fantastic Four: First Steps photo 6"></rt-img> 3208 + </tile-photo> 3209 + 3210 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3211 + <span class="sr-only"></span> 3212 + 3213 + 3214 + 3215 + <rt-img slot="image" loading="lazy" 3216 + src="https://resizing.flixster.com/rEyevvgZFFi2mdLid2lT4T4GnZg=/fit-in/352x330/v2/https://resizing.flixster.com/4nKwigwbJ03iMnCLR1ULAtCsO3Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzVmMGY3NDI3LWU3MDYtNDJlMC1hNTk4LWJkYjQyNTA0NTk3My5qcGc=,https://resizing.flixster.com/2esfAiJ6NQJjpe1jhK52i1nU_xA=/fit-in/705x460/v2/https://resizing.flixster.com/4nKwigwbJ03iMnCLR1ULAtCsO3Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzVmMGY3NDI3LWU3MDYtNDJlMC1hNTk4LWJkYjQyNTA0NTk3My5qcGc=" 3217 + alt="The Fantastic Four: First Steps photo 7"></rt-img> 3218 + </tile-photo> 3219 + 3220 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3221 + <span class="sr-only"></span> 3222 + 3223 + 3224 + 3225 + <rt-img slot="image" loading="lazy" 3226 + src="https://resizing.flixster.com/giAA-wPhIc6UWiOUwphKoy6ja24=/fit-in/352x330/v2/https://resizing.flixster.com/VSHaQisp5-mTkFdOOGuZSoIjvOo=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2JjMmEzOGExLTY0NTgtNDc4OS04ZGNiLWYzZmJlOThkODliOS5qcGc=,https://resizing.flixster.com/H0sOEtXy-X7obRETv-GdDs7U2r8=/fit-in/705x460/v2/https://resizing.flixster.com/VSHaQisp5-mTkFdOOGuZSoIjvOo=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2JjMmEzOGExLTY0NTgtNDc4OS04ZGNiLWYzZmJlOThkODliOS5qcGc=" 3227 + alt="The Fantastic Four: First Steps photo 8"></rt-img> 3228 + </tile-photo> 3229 + 3230 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3231 + <span class="sr-only"></span> 3232 + 3233 + 3234 + 3235 + <rt-img slot="image" loading="lazy" 3236 + src="https://resizing.flixster.com/vBTxZZZhcWHFF3-_Dz51uqFEkno=/fit-in/352x330/v2/https://resizing.flixster.com/2T2houQcvUwzOYX7ea74XPWk0_Y=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzFmMDMyNjVhLWMwZGUtNDdiYi04ZTQxLTk0YTBjYTFkZDFjYy5qcGc=,https://resizing.flixster.com/pQmoSin0v9SUrIuiVrOSfwsUzVM=/fit-in/705x460/v2/https://resizing.flixster.com/2T2houQcvUwzOYX7ea74XPWk0_Y=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzFmMDMyNjVhLWMwZGUtNDdiYi04ZTQxLTk0YTBjYTFkZDFjYy5qcGc=" 3237 + alt="The Fantastic Four: First Steps photo 9"></rt-img> 3238 + </tile-photo> 3239 + 3240 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3241 + <span class="sr-only"></span> 3242 + 3243 + 3244 + 3245 + <rt-img slot="image" loading="lazy" 3246 + src="https://resizing.flixster.com/xDDXw_gNuut7V-y4b2d0MNeGoyk=/fit-in/352x330/v2/https://resizing.flixster.com/fvWTEvDl6uXrmW6yJzxm1pjqL90=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzAzNjMwYzQ1LWY2ZTAtNGEzMi1iMTRmLWY3NTRhZTQ5Y2M2Yy5qcGc=,https://resizing.flixster.com/zwz7yir5ovsSFgwpLdn-cqsxvzU=/fit-in/705x460/v2/https://resizing.flixster.com/fvWTEvDl6uXrmW6yJzxm1pjqL90=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzAzNjMwYzQ1LWY2ZTAtNGEzMi1iMTRmLWY3NTRhZTQ5Y2M2Yy5qcGc=" 3247 + alt="The Fantastic Four: First Steps photo 10"></rt-img> 3248 + </tile-photo> 3249 + 3250 + <tile-view-more aspect="square,landscape" background="mediaHero" slot="tile"> 3251 + <rt-button href="/m/the_fantastic_four_first_steps/pictures" shape="pill" 3252 + theme="transparent-lighttext" aria-label="View more The Fantastic Four: First Steps photos"> 3253 + View more photos 3254 + </rt-button> 3255 + </tile-view-more> 3256 + </carousel-slider> 3257 + 3258 + <photos-carousel-manager> 3259 + <script id="photosCarousel" type="application/json" hidden> 3260 + {"title":"The Fantastic Four: First Steps","images":[{"aspectRatio":"ASPECT_RATIO_2_3","height":"3000","width":"2000","imageUrl":"https://resizing.flixster.com/DNRCwl_allJWD22fZCnQ2W9VPmU=/fit-in/705x460/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=","imageUrlMobile":"https://resizing.flixster.com/qTjkbvDHGGF4MArm23ek9NhmrBo=/fit-in/352x330/v2/https://resizing.flixster.com/WEfe-vTCqjHioD77J7f-qeoZZdY=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2FjN2M2NzA0LWNiMTctNDhjMy05N2VlLTk3YWI3N2JhZDZmMS5qcGc=","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_3_4","height":"7500","width":"5876","imageUrl":"https://resizing.flixster.com/nT6_8v-aXCmJPjPnCdRI4ldAZMA=/fit-in/705x460/v2/https://resizing.flixster.com/NMakI9bPdy_rQSENNXPalE0hqnE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzQwZDlkMDkyLTg4MmItNDEzYi04Njc4LWI0OGEyNzExMjdiOS5qcGc=","imageUrlMobile":"https://resizing.flixster.com/fa9BQgkaF55O36JAf0eAPXhL_Ss=/fit-in/352x330/v2/https://resizing.flixster.com/NMakI9bPdy_rQSENNXPalE0hqnE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzQwZDlkMDkyLTg4MmItNDEzYi04Njc4LWI0OGEyNzExMjdiOS5qcGc=","imageLoading":""},{"height":"5333","width":"3000","imageUrl":"https://resizing.flixster.com/mhmTgP2FAYDZ33vLTG5E2b9d9mo=/fit-in/705x460/v2/https://resizing.flixster.com/h3qjIZZh3McU1bUtnjODSl-IfYA=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E1MWEzOTcxLWU4Y2ItNDFmZS04MGNiLWIzM2Q3MzRjZTFkMy5qcGc=","imageUrlMobile":"https://resizing.flixster.com/4wA-Nucq0MUbX5TeuproT0YBjM8=/fit-in/352x330/v2/https://resizing.flixster.com/h3qjIZZh3McU1bUtnjODSl-IfYA=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E1MWEzOTcxLWU4Y2ItNDFmZS04MGNiLWIzM2Q3MzRjZTFkMy5qcGc=","imageLoading":""},{"height":"5333","width":"3000","imageUrl":"https://resizing.flixster.com/CYsDL5r6RiNfyJ3zEjwE9IKbnWI=/fit-in/705x460/v2/https://resizing.flixster.com/FxaNqQIUwadQIxRy51lxUIwJeE0=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzNjMmFkYjM2LTVkNTMtNDE3NS04NjM1LTVjMmIwNzliN2QyNS5qcGc=","imageUrlMobile":"https://resizing.flixster.com/RY9vcciJ_oIuzUifngXUDZ79xdY=/fit-in/352x330/v2/https://resizing.flixster.com/FxaNqQIUwadQIxRy51lxUIwJeE0=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzNjMmFkYjM2LTVkNTMtNDE3NS04NjM1LTVjMmIwNzliN2QyNS5qcGc=","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_2_3","height":"3704","width":"2500","imageUrl":"https://resizing.flixster.com/p5cVXOC6YYSAwuCbw781cGMPNs8=/fit-in/705x460/v2/https://resizing.flixster.com/KR_7hcRCZbmzBhvZc1PoWsoI418=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E0MjAzNzA0LTEzOGItNGEyMy04NTc3LTRhYTFjOGFmZWE0Ny5qcGc=","imageUrlMobile":"https://resizing.flixster.com/UGd6_E-kZvfFLpcQYg5O7coHBMk=/fit-in/352x330/v2/https://resizing.flixster.com/KR_7hcRCZbmzBhvZc1PoWsoI418=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2E0MjAzNzA0LTEzOGItNGEyMy04NTc3LTRhYTFjOGFmZWE0Ny5qcGc=","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_2_3","height":"2500","width":"1688","imageUrl":"https://resizing.flixster.com/LSJHJhxA-0I2RY7vXimlI-6_U3s=/fit-in/705x460/v2/https://resizing.flixster.com/yvV2l_YUKcIYbYQX1HQOBKuPR0I=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2YyZmU0Y2NiLTIxMDktNDhhMy1hNDA3LTA1NWE4NzkwY2M1My5qcGc=","imageUrlMobile":"https://resizing.flixster.com/Wfw784_pPihhDr2pwLHILl0W1LY=/fit-in/352x330/v2/https://resizing.flixster.com/yvV2l_YUKcIYbYQX1HQOBKuPR0I=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2YyZmU0Y2NiLTIxMDktNDhhMy1hNDA3LTA1NWE4NzkwY2M1My5qcGc=","imageLoading":"lazy"},{"height":"1920","width":"1080","imageUrl":"https://resizing.flixster.com/2esfAiJ6NQJjpe1jhK52i1nU_xA=/fit-in/705x460/v2/https://resizing.flixster.com/4nKwigwbJ03iMnCLR1ULAtCsO3Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzVmMGY3NDI3LWU3MDYtNDJlMC1hNTk4LWJkYjQyNTA0NTk3My5qcGc=","imageUrlMobile":"https://resizing.flixster.com/rEyevvgZFFi2mdLid2lT4T4GnZg=/fit-in/352x330/v2/https://resizing.flixster.com/4nKwigwbJ03iMnCLR1ULAtCsO3Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzVmMGY3NDI3LWU3MDYtNDJlMC1hNTk4LWJkYjQyNTA0NTk3My5qcGc=","imageLoading":"lazy"},{"height":"1920","width":"1080","imageUrl":"https://resizing.flixster.com/H0sOEtXy-X7obRETv-GdDs7U2r8=/fit-in/705x460/v2/https://resizing.flixster.com/VSHaQisp5-mTkFdOOGuZSoIjvOo=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2JjMmEzOGExLTY0NTgtNDc4OS04ZGNiLWYzZmJlOThkODliOS5qcGc=","imageUrlMobile":"https://resizing.flixster.com/giAA-wPhIc6UWiOUwphKoy6ja24=/fit-in/352x330/v2/https://resizing.flixster.com/VSHaQisp5-mTkFdOOGuZSoIjvOo=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2JjMmEzOGExLTY0NTgtNDc4OS04ZGNiLWYzZmJlOThkODliOS5qcGc=","imageLoading":"lazy"},{"height":"1762","width":"991","imageUrl":"https://resizing.flixster.com/pQmoSin0v9SUrIuiVrOSfwsUzVM=/fit-in/705x460/v2/https://resizing.flixster.com/2T2houQcvUwzOYX7ea74XPWk0_Y=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzFmMDMyNjVhLWMwZGUtNDdiYi04ZTQxLTk0YTBjYTFkZDFjYy5qcGc=","imageUrlMobile":"https://resizing.flixster.com/vBTxZZZhcWHFF3-_Dz51uqFEkno=/fit-in/352x330/v2/https://resizing.flixster.com/2T2houQcvUwzOYX7ea74XPWk0_Y=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzFmMDMyNjVhLWMwZGUtNDdiYi04ZTQxLTk0YTBjYTFkZDFjYy5qcGc=","imageLoading":"lazy"},{"aspectRatio":"ASPECT_RATIO_2_3","height":"1609","width":"1086","imageUrl":"https://resizing.flixster.com/zwz7yir5ovsSFgwpLdn-cqsxvzU=/fit-in/705x460/v2/https://resizing.flixster.com/fvWTEvDl6uXrmW6yJzxm1pjqL90=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzAzNjMwYzQ1LWY2ZTAtNGEzMi1iMTRmLWY3NTRhZTQ5Y2M2Yy5qcGc=","imageUrlMobile":"https://resizing.flixster.com/xDDXw_gNuut7V-y4b2d0MNeGoyk=/fit-in/352x330/v2/https://resizing.flixster.com/fvWTEvDl6uXrmW6yJzxm1pjqL90=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzAzNjMwYzQ1LWY2ZTAtNGEzMi1iMTRmLWY3NTRhZTQ5Y2M2Yy5qcGc=","imageLoading":"lazy"}],"picturesPageUrl":"/m/the_fantastic_four_first_steps/pictures"} 3261 + </script> 3262 + </photos-carousel-manager> 3263 + </section> 3264 + 3265 + </div> 3266 + 3267 + 3268 + <ad-unit hidden unit-display="mobile" unit-type="mboxadtwo" show-ad-link> 3269 + <div slot="ad-inject" class="rectangle_ad mobile center"></div> 3270 + </ad-unit> 3271 + 3272 + 3273 + <ad-unit hidden unit-display="desktop" unit-type="opbannertwo"> 3274 + <div slot="ad-inject" class="banner-ad"></div> 3275 + </ad-unit> 3276 + 3277 + 3278 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 3279 + 3280 + <div id="media-info" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 3281 + 3282 + 3283 + 3284 + <section aria-labelledby="media-info-label" class="media-info" data-adobe-id="media-info" 3285 + data-qa="section:media-info"> 3286 + <div class="header-wrap"> 3287 + <h2 class="unset" id="media-info-label"> 3288 + <rt-text context="heading" size="1.25" style="--textTransform: capitalize;" data-qa="title"> 3289 + Movie Info 3290 + </rt-text> 3291 + </h2> 3292 + </div> 3293 + 3294 + <div class="content-wrap"> 3295 + 3296 + <div class="synopsis-wrap"> 3297 + <rt-text class="key" size="0.875" data-qa="synopsis-label">Synopsis</rt-text> 3298 + <rt-text data-qa="synopsis-value">Set against the vibrant backdrop of a 1960s-inspired, 3299 + retro-futuristic world, Marvel Studios&#39; &quot;The Fantastic Four: First Steps&quot; 3300 + introduces Marvel&#39;s First Family--Reed Richards/Mister Fantastic (Pedro Pascal), Sue 3301 + Storm/Invisible Woman (Vanessa Kirby), Johnny Storm/Human Torch (Joseph Quinn) and Ben Grimm/The 3302 + Thing (Ebon Moss-Bachrach) as they face their most daunting challenge yet. Forced to balance 3303 + their roles as heroes with the strength of their family bond, they must defend Earth from a 3304 + ravenous space god called Galactus (Ralph Ineson) and his enigmatic Herald, Silver Surfer (Julia 3305 + Garner). And if Galactus&#39; plan to devour the entire planet and everyone on it weren&#39;t 3306 + bad enough, it suddenly gets very personal.</rt-text> 3307 + </div> 3308 + 3309 + 3310 + <dl> 3311 + 3312 + <div class="category-wrap" data-qa="item"> 3313 + <dt class="key"> 3314 + <rt-text class="key" size="0.875" data-qa="item-label">Director</rt-text> 3315 + </dt> 3316 + <dd data-qa="item-value-group"> 3317 + 3318 + <rt-link href="/celebrity/matt-shakman" data-qa="item-value">Matt Shakman</rt-link> 3319 + 3320 + </dd> 3321 + </div> 3322 + 3323 + <div class="category-wrap" data-qa="item"> 3324 + <dt class="key"> 3325 + <rt-text class="key" size="0.875" data-qa="item-label">Producer</rt-text> 3326 + </dt> 3327 + <dd data-qa="item-value-group"> 3328 + 3329 + <rt-link href="/celebrity/kevin_feige" data-qa="item-value">Kevin Feige</rt-link> 3330 + 3331 + </dd> 3332 + </div> 3333 + 3334 + <div class="category-wrap" data-qa="item"> 3335 + <dt class="key"> 3336 + <rt-text class="key" size="0.875" data-qa="item-label">Screenwriter</rt-text> 3337 + </dt> 3338 + <dd data-qa="item-value-group"> 3339 + 3340 + <rt-link href="/celebrity/peter_cameron" data-qa="item-value">Peter Cameron</rt-link> 3341 + 3342 + </dd> 3343 + </div> 3344 + 3345 + <div class="category-wrap" data-qa="item"> 3346 + <dt class="key"> 3347 + <rt-text class="key" size="0.875" data-qa="item-label">Distributor</rt-text> 3348 + </dt> 3349 + <dd data-qa="item-value-group"> 3350 + 3351 + <rt-text data-qa="item-value">Walt Disney Pictures</rt-text> 3352 + 3353 + </dd> 3354 + </div> 3355 + 3356 + <div class="category-wrap" data-qa="item"> 3357 + <dt class="key"> 3358 + <rt-text class="key" size="0.875" data-qa="item-label">Production Co</rt-text> 3359 + </dt> 3360 + <dd data-qa="item-value-group"> 3361 + 3362 + <rt-text data-qa="item-value">Marvel Studios</rt-text> 3363 + 3364 + </dd> 3365 + </div> 3366 + 3367 + <div class="category-wrap" data-qa="item"> 3368 + <dt class="key"> 3369 + <rt-text class="key" size="0.875" data-qa="item-label">Rating</rt-text> 3370 + </dt> 3371 + <dd data-qa="item-value-group"> 3372 + 3373 + <rt-text data-qa="item-value">PG-13 (Some Language|Action/Violence)</rt-text> 3374 + 3375 + </dd> 3376 + </div> 3377 + 3378 + <div class="category-wrap" data-qa="item"> 3379 + <dt class="key"> 3380 + <rt-text class="key" size="0.875" data-qa="item-label">Genre</rt-text> 3381 + </dt> 3382 + <dd data-qa="item-value-group"> 3383 + 3384 + <rt-link href="/browse/movies_in_theaters/genres:action" 3385 + data-qa="item-value">Action</rt-link><rt-text class="delimiter">, </rt-text> 3386 + 3387 + <rt-link href="/browse/movies_in_theaters/genres:adventure" 3388 + data-qa="item-value">Adventure</rt-link><rt-text class="delimiter">, </rt-text> 3389 + 3390 + <rt-link href="/browse/movies_in_theaters/genres:sci_fi" 3391 + data-qa="item-value">Sci-Fi</rt-link><rt-text class="delimiter">, </rt-text> 3392 + 3393 + <rt-link href="/browse/movies_in_theaters/genres:fantasy" 3394 + data-qa="item-value">Fantasy</rt-link> 3395 + 3396 + </dd> 3397 + </div> 3398 + 3399 + <div class="category-wrap" data-qa="item"> 3400 + <dt class="key"> 3401 + <rt-text class="key" size="0.875" data-qa="item-label">Original Language</rt-text> 3402 + </dt> 3403 + <dd data-qa="item-value-group"> 3404 + 3405 + <rt-text data-qa="item-value">English</rt-text> 3406 + 3407 + </dd> 3408 + </div> 3409 + 3410 + <div class="category-wrap" data-qa="item"> 3411 + <dt class="key"> 3412 + <rt-text class="key" size="0.875" data-qa="item-label">Release Date (Theaters)</rt-text> 3413 + </dt> 3414 + <dd data-qa="item-value-group"> 3415 + 3416 + <rt-text data-qa="item-value">Jul 25, 2025, Wide</rt-text> 3417 + 3418 + </dd> 3419 + </div> 3420 + 3421 + <div class="category-wrap" data-qa="item"> 3422 + <dt class="key"> 3423 + <rt-text class="key" size="0.875" data-qa="item-label">Box Office (Gross USA)</rt-text> 3424 + </dt> 3425 + <dd data-qa="item-value-group"> 3426 + 3427 + <rt-text data-qa="item-value">$266.4M</rt-text> 3428 + 3429 + </dd> 3430 + </div> 3431 + 3432 + <div class="category-wrap" data-qa="item"> 3433 + <dt class="key"> 3434 + <rt-text class="key" size="0.875" data-qa="item-label">Runtime</rt-text> 3435 + </dt> 3436 + <dd data-qa="item-value-group"> 3437 + 3438 + <rt-text data-qa="item-value">1h 54m</rt-text> 3439 + 3440 + </dd> 3441 + </div> 3442 + 3443 + <div class="category-wrap" data-qa="item"> 3444 + <dt class="key"> 3445 + <rt-text class="key" size="0.875" data-qa="item-label">Sound Mix</rt-text> 3446 + </dt> 3447 + <dd data-qa="item-value-group"> 3448 + 3449 + <rt-text data-qa="item-value">Dolby Atmos</rt-text> 3450 + 3451 + </dd> 3452 + </div> 3453 + 3454 + <div class="category-wrap" data-qa="item"> 3455 + <dt class="key"> 3456 + <rt-text class="key" size="0.875" data-qa="item-label">Aspect Ratio</rt-text> 3457 + </dt> 3458 + <dd data-qa="item-value-group"> 3459 + 3460 + <rt-text data-qa="item-value">Digital 2.39:1</rt-text> 3461 + 3462 + </dd> 3463 + </div> 3464 + 3465 + </dl> 3466 + </div> 3467 + </section> 3468 + 3469 + </div> 3470 + 3471 + 3472 + </div> 3473 + 3474 + <div id="sidebar-wrap"> 3475 + <div data-adobe-id="discovery-sidebar" data-DiscoverySidebarManager="sticky"> 3476 + <discovery-sidebar-manager> 3477 + <script data-json="discoverySidebarJSON" 3478 + type="application/json">{"lifecycle":"IN_THEATERS","mediaType":"movie"}</script> 3479 + </discovery-sidebar-manager> 3480 + <discovery-sidebar skeleton="panel" data-DiscoverySidebarManager="sidebar"></discovery-sidebar> 3481 + 3482 + <ad-unit data-DiscoverySidebarManager="ad:instantiated" unit-display="desktop" unit-type="topmulti" 3483 + show-ad-link> 3484 + <div slot="ad-inject"></div> 3485 + </ad-unit> 3486 + </div> 3487 + </div> 3488 + 3489 + 3490 + <script id="curation-json" 3491 + type="application/json">{"emsId":"db64beee-683b-39ce-9617-94f6b67aa997","hasShowtimes":true,"rtId":"900067578","type":"movie"}</script> 3492 + 3493 + </div> 3494 + </div> 3495 + 3496 + 3497 + <overlay-base data-MediaAudienceReviewsManager="overlay" hidden> 3498 + <!-- do not remove content slot preset --> 3499 + <div slot="content"> 3500 + <media-review-full-audience> 3501 + <rt-button data-MediaAudienceReviewsManager="overlayClose:click" size="1" slot="close" 3502 + theme="transparent"> 3503 + <rt-icon icon="close"></rt-icon> 3504 + </rt-button> 3505 + </media-review-full-audience> 3506 + </div> 3507 + </overlay-base> 3508 + 3509 + 3510 + <tool-tip data-MediaScorecardManager="tipCritics" hidden> 3511 + <rt-button slot="btnClose" data-MediaScorecardManager="tipCriticsClose:click" theme="transparent" size="1.5"> 3512 + <rt-icon icon="close" image="true"></rt-icon> 3513 + </rt-button> 3514 + <div data-MediaScorecardManager="tipCriticsContent"></div> 3515 + </tool-tip> 3516 + 3517 + <tool-tip class="component" data-MediaScorecardManager="tipAudience" hidden> 3518 + <rt-button slot="btnClose" data-MediaScorecardManager="tipAudienceClose:click" theme="transparent" size="1.5"> 3519 + <rt-icon icon="close" image="true"></rt-icon> 3520 + </rt-button> 3521 + <div data-MediaScorecardManager="tipAudienceContent"></div> 3522 + </tool-tip> 3523 + 3524 + <overlay-base data-MediaScorecardManager="overlay:close" hidden> 3525 + <!-- do not remove content slot preset --> 3526 + <div slot="content"></div> 3527 + </overlay-base> 3528 + 3529 + <overlay-base data-PhotosCarouselManager="overlayBase:close" hidden> 3530 + <photos-carousel-overlay data-PhotosCarouselManager="photosOverlay:sliderBtnClick" slot="content"> 3531 + <rt-button data-PhotosCarouselManager="closeBtn:click" slot="closeBtn" theme="transparent"> 3532 + <rt-icon icon="close"></rt-icon> 3533 + </rt-button> 3534 + </photos-carousel-overlay> 3535 + </overlay-base> 3536 + <overlay-base data-RateAndReviewOverlayManager="overlayBase:close" hidden noclickoutside> 3537 + <div slot="content"></div> 3538 + </overlay-base> 3539 + 3540 + <toast-notification data-RateAndReviewOverlayManager="toast" aria-live="polite" hidden> 3541 + <rt-icon slot="icon" icon="check-circled" image size="1"></rt-icon> 3542 + <rt-text slot="message" data-RateAndReviewOverlayManager="toastMessage" context="label" size="0.875">- 3543 + -</rt-text> 3544 + <rt-button slot="close" theme="transparent"> 3545 + <rt-icon icon="close" image size="1"></rt-icon> 3546 + </rt-button> 3547 + </toast-notification> 3548 + 3549 + <overlay-base data-JwPlayerManager="overlayBase:close" data-VideoPlayerOverlayManager="overlayBase:close,open" 3550 + hidden> 3551 + <video-player-overlay class="video-overlay-wrap" data-qa="video-overlay" 3552 + data-VideoPlayerOverlayManager="videoPlayerOverlay:unmute" slot="content"> 3553 + <rt-button data-JwPlayerManager="unmuteBtn:click" slot="unmuteBtn" theme="light"> 3554 + <rt-icon icon="volume-mute-fill"></rt-icon> 3555 + &ensp; Tap to Unmute 3556 + </rt-button> 3557 + <div slot="header"> 3558 + <button class="unset transparent" data-VideoPlayerOverlayManager="btnOverlayClose:click" 3559 + data-qa="video-close-btn"> 3560 + <rt-icon icon="close"> 3561 + <span class="sr-only">Close video</span> 3562 + </rt-icon> 3563 + </button> 3564 + <a class="cta-btn header-cta button hide">See Details</a> 3565 + </div> 3566 + 3567 + <div slot="content"></div> 3568 + 3569 + <a slot="footer" class="cta-btn footer-cta button hide">See Details</a> 3570 + </video-player-overlay> 3571 + </overlay-base> 3572 + 3573 + <div id="video-overlay-player" hidden></div> 3574 + 3575 + <video-player-overlay-manager></video-player-overlay-manager> 3576 + <jw-player-manager data-AdsVideoSpotlightManager="jwPlayerManager:playlistItem,ready,remove" 3577 + data-VideoPlayerOverlayManager="jwPlayerManager:playlistItem,pause,ready,relatedClose,relatedOpen"> 3578 + </jw-player-manager> 3579 + 3580 + 3581 + <ads-media-scorecard-manager></ads-media-scorecard-manager> 3582 + 3583 + </div> 3584 + 3585 + <back-to-top hidden></back-to-top> 3586 + </main> 3587 + 3588 + <ad-unit hidden unit-display="desktop" unit-type="bottombanner"> 3589 + <div slot="ad-inject" class="sleaderboard_wrapper"></div> 3590 + </ad-unit> 3591 + 3592 + <ads-global-skin-takeover-manager></ads-global-skin-takeover-manager> 3593 + 3594 + <footer-manager></footer-manager> 3595 + <footer class="footer container" data-PagePicturesManager="footer"> 3596 + 3597 + <mobile-app-desktop-footer env="production" hidden></mobile-app-desktop-footer> 3598 + 3599 + 3600 + <div class="footer__content-desktop-block" data-qa="footer:section"> 3601 + <div class="footer__content-group"> 3602 + <ul class="footer__links-list"> 3603 + <li class="footer__links-list-item"> 3604 + <a href="/help_desk" data-qa="footer:link-helpdesk">Help</a> 3605 + </li> 3606 + <li class="footer__links-list-item"> 3607 + <a href="/about" data-qa="footer:link-about">About Rotten Tomatoes</a> 3608 + </li> 3609 + <li id="footer-feedback" class="footer__links-list-item" data-qa="footer-feedback-desktop"> 3610 + 3611 + </li> 3612 + </ul> 3613 + </div> 3614 + <div class="footer__content-group"> 3615 + <ul class="footer__links-list"> 3616 + <li class="footer__links-list-item"> 3617 + <a href="/critics/criteria" data-qa="footer:link-critic-submission">Critic Submission</a> 3618 + </li> 3619 + <li class="footer__links-list-item"> 3620 + <a href="/help_desk/licensing" data-qa="footer:link-licensing">Licensing</a> 3621 + </li> 3622 + <li class="footer__links-list-item"> 3623 + <a href="https://together.nbcuni.com/advertise/?utm_source=rotten_tomatoes&amp;utm_medium=referral&amp;utm_campaign=property_ad_pages&amp;utm_content=footer" 3624 + target="_blank" rel="noopener" data-qa="footer:link-ads">Advertise With Us</a> 3625 + </li> 3626 + <li class="footer__links-list-item"> 3627 + <a href="//www.fandango.com/careers" target="_blank" rel="noopener" 3628 + data-qa="footer:link-careers">Careers</a> 3629 + </li> 3630 + </ul> 3631 + </div> 3632 + <div class="footer__content-group footer__newsletter-block"> 3633 + <p class="h3 footer__content-group-title"> 3634 + <rt-icon icon="mail" size="1.25" style="fill:#fff"></rt-icon>&ensp;Join the Newsletter 3635 + </p> 3636 + <p class="footer__newsletter-copy">Get the freshest reviews, news, and more delivered right to your inbox!</p> 3637 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-desktop"> 3638 + Join The Newsletter 3639 + </rt-button> 3640 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 3641 + rel="noopener"> 3642 + Join The Newsletter 3643 + </a> 3644 + </div> 3645 + <div class="footer__content-group footer__social-block" data-qa="footer:social"> 3646 + <p class="h3 footer__content-group-title">Follow Us</p> 3647 + <social-media-icons theme="light" size="20"></social-media-icons> 3648 + </div> 3649 + </div> 3650 + 3651 + <div class="footer__content-mobile-block" data-qa="mfooter:section"> 3652 + <div class="footer__content-group"> 3653 + <div class="mobile-app-cta-wrap"> 3654 + 3655 + <mobile-app-cta env="production" showandroid="false" showios="true" hidden></mobile-app-cta> 3656 + </div> 3657 + 3658 + <p class="footer__copyright-legal" data-qa="mfooter:copyright"> 3659 + <rt-text size="0.75">Copyright &copy; Fandango. All rights reserved.</rt-text> 3660 + </p> 3661 + <p> 3662 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-mobile">Join The 3663 + Newsletter</rt-button> 3664 + </p> 3665 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 3666 + rel="noopener">Join The Newsletter</a> 3667 + 3668 + <ul class="footer__links-list list-inline"> 3669 + <li class="footer__links-list-item"> 3670 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 3671 + data-qa="mfooter:link-privacy-policy"> 3672 + Privacy Policy 3673 + </a> 3674 + </li> 3675 + <li class="footer__links-list-item"> 3676 + <a href="/policies/terms-and-policies" data-qa="mfooter:link-terms-policies">Terms and Policies</a> 3677 + </li> 3678 + <li class="footer__links-list-item"> 3679 + <img data-FooterManager="iconCCPA" 3680 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 3681 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 3682 + <!-- OneTrust Cookies Settings button start --> 3683 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings mobile" 3684 + data-qa="footer-cookie-settings-mobile">Cookie Settings</a> 3685 + <!-- OneTrust Cookies Settings button end --> 3686 + </li> 3687 + <li class="footer__links-list-item"> 3688 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 3689 + rel="noopener" data-qa="mfooter:link-california-notice">California Notice</a> 3690 + </li> 3691 + <li class="footer__links-list-item"> 3692 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 3693 + rel="noopener" data-qa="mfooter:link-adChoices">Ad Choices</a> 3694 + </li> 3695 + <li id="footer-feedback-mobile" class="footer__links-list-item" data-qa="footer-feedback-mobile"> 3696 + 3697 + </li> 3698 + <li class="footer__links-list-item"> 3699 + <a href="/faq#accessibility" data-qa="mfooter:link-accessibility">Accessibility</a> 3700 + </li> 3701 + </ul> 3702 + </div> 3703 + </div> 3704 + <div class="footer__copyright"> 3705 + <ul class="footer__links-list list-inline list-inline--separator" data-qa="footer:links-list-privacy"> 3706 + <li class="footer__links-list-item version" data-qa="footer:version"> 3707 + <span>V3.1</span> 3708 + </li> 3709 + <li class="footer__links-list-item"> 3710 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 3711 + data-qa="footer:link-privacy-policy"> 3712 + Privacy Policy 3713 + </a> 3714 + </li> 3715 + <li class="footer__links-list-item"> 3716 + <a href="/policies/terms-and-policies" data-qa="footer:link-terms-policies">Terms and Policies</a> 3717 + </li> 3718 + <li class="footer__links-list-item"> 3719 + <img data-FooterManager="iconCCPA" 3720 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 3721 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 3722 + <!-- OneTrust Cookies Settings button start --> 3723 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings" 3724 + data-qa="footer-cookie-settings-desktop">Cookie Settings</a> 3725 + <!-- OneTrust Cookies Settings button end --> 3726 + </li> 3727 + <li class="footer__links-list-item"> 3728 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 3729 + rel="noopener" data-qa="footer:link-california-notice">California Notice</a> 3730 + </li> 3731 + <li class="footer__links-list-item"> 3732 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 3733 + rel="noopener" data-qa="footer:link-adChoices">Ad Choices</a> 3734 + </li> 3735 + <li class="footer__links-list-item"> 3736 + <a href="/faq#accessibility" data-qa="footer:link-accessibility">Accessibility</a> 3737 + </li> 3738 + </ul> 3739 + <span class="footer__copyright-legal" data-qa="footer:copyright"> 3740 + Copyright &copy; Fandango. A Division of 3741 + <a href="https://www.nbcuniversal.com" target="_blank" rel="noopener" 3742 + data-qa="footer:link-nbcuniversal">NBCUniversal</a>. 3743 + All rights reserved. 3744 + </span> 3745 + </div> 3746 + </footer> 3747 + 3748 + </div> 3749 + 3750 + 3751 + <iframe-container hidden data-ArtiManager="iframeContainer:close,resize" 3752 + data-iframe-src="https://arti.rottentomatoes.com?theme=iframe" theme="widget"> 3753 + <span slot="logo"><img src="/assets/pizza-pie/images/arti.041d204c4a4.svg" alt="Logo"></img><span>beta</span></span> 3754 + <rt-button aria-label="New chat" data-ArtiManager="btnNewChat:click" id="artiNewChatButton" slot="optBtns" 3755 + theme="transparent" title="New chat"> 3756 + <rt-icon icon="new-chat" size="1.25" image></rt-icon> 3757 + </rt-button> 3758 + </iframe-container> 3759 + <arti-manager></arti-manager> 3760 + 3761 + 3762 + 3763 + 3764 + <script type="text/javascript"> 3765 + (function (root) { 3766 + /* -- Data -- */ 3767 + root.Fandango || (root.Fandango = {}); 3768 + root.Fandango.dtmData = { "webVersion": "node", "rtVersion": 3.1, "loggedInStatus": "", "customerId": "", "pageName": "trailers" }; 3769 + root.RottenTomatoes || (root.RottenTomatoes = {}); 3770 + root.RottenTomatoes.context || (root.RottenTomatoes.context = {}); 3771 + root.RottenTomatoes.context.resetCookies = ["AMCVS_8CF467C25245AE3F0A490D4C%40AdobeOrg", "AMCV_8CF467C25245AE3F0A490D4C%40AdobeOrg", "WRIgnore", "WRUIDAWS", "__CT_Data", "__gads", "_admrla", "_awl", "_cs_c", "_cs_id", "_cs_mk", "_cs_s", "_fbp", "_ga", "_gat_gtmTracker", "_gid", "aam_uuid", "akamai_generated_location", "auth_token", "auth_user", "auth_client", "check", "cognito", "fblo_326803741017", "fbm_326803741017", "fbsr_326803741017", "gpv_Page", "id_token", "is_auth", "loginPlatform", "mbox", "notice_behavior", "optimizelyBuckets", "optimizelyEndUserId", "optimizelyPendingLogEvents", "optimizelySegments", "s_cc", "s_dayslastvisit", "s_dayslastvisit_s", "s_invisit", "s_prevPage", "s_sq", "s_vnum", "cognito", "fbm_326803741017", "fbsr_326803741017", "id_token", "JSESSIONID", "QSI_HistorySession", "QSI_SI_8up4dWDOtjAg0hn_intercept", "_ALGOLIA", "__Host-color-scheme", "__Host-theme-options", "__host_color_scheme", "__host_theme_options", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "_chartbeat4", "_chartbeat5", "_sp_id.47f3", "_sp_ses.47f3", "_v__chartbeat3", "adops_master_kvs", "akacd_RTReplatform", "algoliaUT", "cognito", "cl_duid", "fbsr_326803741017", "id_token", "mps_uuid", "session_id", "_admrla", "_awl", "_ga", "_gid", "aam_uuid", "cognito", "fbm_326803741017", "id_token", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "adops_master_kvs", "cognito", "id_token", "krg_crb", "krg_uid", "mps_uuid"]; 3772 + root.RottenTomatoes.criticPage = { "vanity": "nick-macwilliam", "type": "movies", "typeDisplayName": "Movie", "totalReviews": "", "criticID": "26774" }; 3773 + root.RottenTomatoes.context.video = { "file": "https:\u002F\u002Flink.theplatform.com\u002Fs\u002FNGweTC\u002Fmedia\u002F4zllMWiyItlJ?formats=MPEG-DASH+widevine,M3U+appleHlsEncryption,M3U+none,MPEG-DASH+none,MPEG4,MP3", "type": "hls", "description": "Bravestone (Dwayne Johnson) fights Jurgen (Rory McCann), Ming (Awkwafina) races to help.", "image": "https:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F986\u002F163\u002Fthumb_9ED9A836-4111-422F-A455-E5F32EBD010B.jpg", "isRedBand": false, "mediaid": "1707208771741", "mpxId": "1707208771741", "publicId": "4zllMWiyItlJ", "title": "Jumanji: The Next Level: Official Clip - The Winged Horse", "default": false, "label": "0", "duration": "3:29", "durationInSeconds": "209.919", "emsMediaType": "Movie", "emsId": "46c4dbc9-c0eb-39aa-8294-71c736ee8b45", "overviewPageUrl": "\u002Fm\u002Fjumanji_the_next_level", "videoPageUrl": "\u002Fm\u002Fjumanji_the_next_level\u002Fvideos\u002F4zllMWiyItlJ", "videoType": "CLIP", "adobeDataLayer": { "content": { "id": "fandango_1707208771741", "length": "209.919", "type": "vod", "player_name": "jw", "sdk_version": "web: 6.51.0", "channel": "movie", "originator": "columbia pictures, sony pictures entertainment", "name": "jumanji: the next level: official clip - the winged horse", "rating": "not adult", "stream_type": "video" }, "media_params": { "genre": "adventure, action, comedy, fantasy", "show_type": 2 } }, "comscore": { "labelmapping": "c3=\"rottentomatoes.com\", ns_st_st=\"Rotten Tomatoes\", ns_st_pu=\"Columbia Pictures,Sony Pictures Entertainment\", ns_st_pr=\"Jumanji: The Next Level\", ns_st_sn=\"*null\", ns_st_en=\"*null\", ns_st_ge=\"Adventure,Action,Comedy,Fantasy\", ns_st_ia=\"0\", ns_st_ce=\"0\", ns_st_ddt=\"2019\", ns_st_tdt=\"2019\"" }, "thumbnail": "https:\u002F\u002Fresizing.flixster.com\u002FHlKgvL8nJEw3_WZMZMURZ86FSZM=\u002F270x160\u002Fv2\u002Fhttps:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F986\u002F163\u002Fthumb_9ED9A836-4111-422F-A455-E5F32EBD010B.jpg" }; 3774 + root.RottenTomatoes.context.videoClipsJson = { "count": 14 }; 3775 + root.RottenTomatoes.context.review = { "mediaType": "movie", "title": "Hair Wolf", "emsId": "4d6397d6-c541-39ef-8eb0-ee8b6748f17c", "type": "all", "sort": undefined, "reviewsCount": 0, "pageInfo": undefined, "reviewerDefaultImg": "https:\u002F\u002Fimages.fandango.com\u002Fcms\u002Fassets\u002F5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png", "reviewerDefaultImgWidth": "100" }; 3776 + root.RottenTomatoes.context.useCursorPagination = true; 3777 + root.RottenTomatoes.context.verifiedTooltip = undefined; 3778 + root.RottenTomatoes.context.layout = { "header": { "movies": { "moviesAtHome": { "tarsSlug": "rt-nav-movies-at-home", "linkList": [{ "header": "Fandango at Home", "slug": "fandango-at-home-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:fandango-at-home" }, { "header": "Peacock", "slug": "peacock-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:peacock" }, { "header": "Netflix", "slug": "netflix-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:netflix" }, { "header": "Apple TV+", "slug": "apple-tv-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:apple-tv-plus" }, { "header": "Prime Video", "slug": "prime-video-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:prime-video" }, { "header": "Most Popular Streaming movies", "slug": "most-popular-streaming-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, { "header": "Certified Fresh movies", "slug": "certified-fresh-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh" }, { "header": "Browse all", "slug": "browse-all-link", "url": "\u002Fbrowse\u002Fmovies_at_home" }] } }, "editorial": { "guides": { "posts": [{ "ID": 161109, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F09\u002F600EssentialFootballMovies.png" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-football-movies\u002F", "status": "publish", "title": "59 Best Football Movies, Ranked by Tomatometer", "type": "guide" }, { "ID": 253470, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FBest_New_Romcoms600.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-new-rom-coms-romance-movies\u002F", "status": "publish", "title": "50 Best New Rom-Coms and Romance Movies", "type": "guide" }], "title": "Guides", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F" }, "hubs": { "posts": [{ "ID": 237626, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002FRT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fwhat-to-watch\u002F", "status": "publish", "title": "What to Watch: In Theaters and On Streaming", "type": "rt-hub" }, { "ID": 140214, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F02\u002FRT_AwardsTour_Thumbnail_600x314.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fawards-tour\u002F", "status": "publish", "title": "Awards Tour", "type": "rt-hub" }], "title": "Hubs", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hubs\u002F" }, "news": { "posts": [{ "ID": 273082, "author": 79, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FNew_Streaming_September_2025-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fnew-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more\u002F", "status": "publish", "title": "New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More", "type": "article" }, { "ID": 273326, "author": 669, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F09\u002FConjuring_Last_Rites_Reviews-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fthe-conjuring-last-rites-first-reviews\u002F", "status": "publish", "title": "\u003Cem\u003EThe Conjuring: Last Rites\u003C\u002Fem\u003E First Reviews: A Frightful, Fitting Send-off", "type": "article" }], "title": "RT News", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fnews\u002F" } }, "trendingTarsSlug": "rt-nav-trending", "trending": [{ "header": "Emmy Noms", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002F2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores\u002F" }, { "header": "Re-Release Calendar", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fmovie-re-releases-calendar\u002F" }, { "header": "Renewed and Cancelled TV", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Frenewed-and-cancelled-tv-shows-2025\u002F" }, { "header": "The Rotten Tomatoes App ", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fapp\u002F" }], "certifiedMedia": { "certifiedFreshTvSeason": { "header": null, "media": { "url": "\u002Ftv\u002Fthe_paper_2025\u002Fs01", "name": "The Paper: Season 1", "score": 83, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FyFijQcjPYUWUelgmiZLHgkXU7hw=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FDFkkHf5pEVX_apKtIQZcoEvI6RU=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FtexEZJLAG-KcVpfCdkT2R1t4cmE=\u002Fems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" }, "tarsSlug": "rt-nav-list-cf-picks" }, "certifiedFreshMovieInTheater": { "header": null, "media": { "url": "\u002Fm\u002Ftwinless", "name": "Twinless", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002Fj7lw2KeY9_XyfZQdqRZGku7_9C8=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FuxoeWz7uWmeYIV94_SzEV_osqe4=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVlylB3xT2RIYmRivMx37O3yD76Q=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" } }, "certifiedFreshMovieInTheater4": { "header": null, "media": { "url": "\u002Fm\u002Fhamilton_2020", "name": "Hamilton", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002F1woquJmQfEhWCZtm7GcH0NMHsYA=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FPeAJ5ZpF5qB98ZiX6ixNDCgW2P0=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVmBvlTk8-z7pQvDZXTgSdj93WDE=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" } }, "certifiedFreshMovieAtHome": { "header": null, "media": { "url": "\u002Fm\u002Fthe_thursday_murder_club", "name": "The Thursday Murder Club", "score": 76, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FjeeldFGcfSMgG09ey5VB7TCFiek=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002F9LXDkCzIBBNEiPURkB9t6VefF5Q=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FrwdeR5xIiN0k7SWr6yXdnmb6zP8=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" } }, "tarsSlug": "rt-nav-list-cf-picks" }, "tvLists": { "newTvTonight": { "tarsSlug": "rt-hp-text-list-3", "title": "New TV Tonight", "shows": [{ "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "The Walking Dead: Daryl Dixon: Season 3", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_walking_dead_daryl_dixon\u002Fs03" }, { "title": "The Crow Girl: Season 1", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_crow_girl\u002Fs01" }, { "title": "Only Murders in the Building: Season 5", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fonly_murders_in_the_building\u002Fs05" }, { "title": "The Girlfriend: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_girlfriend\u002Fs01" }, { "title": "aka Charlie Sheen: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Faka_charlie_sheen\u002Fs01" }, { "title": "Wizards Beyond Waverly Place: Season 2", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fwizards_beyond_waverly_place\u002Fs02" }, { "title": "Seen & Heard: the History of Black Television: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fseen_and_heard_the_history_of_black_television\u002Fs01" }, { "title": "The Fragrant Flower Blooms With Dignity: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_fragrant_flower_blooms_with_dignity\u002Fs01" }, { "title": "Guts & Glory: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fguts_and_glory\u002Fs01" }] }, "mostPopularTvOnRt": { "tarsSlug": "rt-hp-text-list-2", "title": "Most Popular TV on RT", "shows": [{ "title": "The Paper: Season 1", "tomatometer": { "tomatometer": 83, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fthe_paper_2025\u002Fs01" }, { "title": "Dexter: Resurrection: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fdexter_resurrection\u002Fs01" }, { "title": "Alien: Earth: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Falien_earth\u002Fs01" }, { "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "Wednesday: Season 2", "tomatometer": { "tomatometer": 87, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fwednesday\u002Fs02" }, { "title": "Peacemaker: Season 2", "tomatometer": { "tomatometer": 99, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fpeacemaker_2022\u002Fs02" }, { "title": "The Terminal List: Dark Wolf: Season 1", "tomatometer": { "tomatometer": 73, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_terminal_list_dark_wolf\u002Fs01" }, { "title": "Hostage: Season 1", "tomatometer": { "tomatometer": 82, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fhostage_2025\u002Fs01" }, { "title": "Chief of War: Season 1", "tomatometer": { "tomatometer": 93, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fchief_of_war\u002Fs01" }, { "title": "Irish Blood: Season 1", "tomatometer": { "tomatometer": 100, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Firish_blood\u002Fs01" }] } } }, "links": { "moviesInTheaters": { "certifiedFresh": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fcritics:certified_fresh~sort:popular", "comingSoon": "\u002Fbrowse\u002Fmovies_coming_soon\u002F", "openingThisWeek": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fsort:newest", "title": "\u002Fbrowse\u002Fmovies_in_theaters", "topBoxOffice": "\u002Fbrowse\u002Fmovies_in_theaters" }, "onDvdAndStreaming": { "all": "\u002Fbrowse\u002Fmovies_at_home\u002F", "certifiedFresh": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh", "title": "\u002Fbrowse\u002Fmovies_at_home\u002F", "top": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, "moreMovies": { "topMovies": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular", "trailers": "\u002Ftrailers" }, "tvTonight": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:newest", "tvPopular": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "moreTv": { "topTv": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "certifiedFresh": "\u002Fbrowse\u002Ftv_series_browse\u002Fcritics:fresh" }, "editorial": { "allTimeLists": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fall-time-lists\u002F", "bingeGuide": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fbinge-guide\u002F", "comicsOnTv": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcomics-on-tv\u002F", "countdown": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F", "fiveFavoriteFilms": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Ffive-favorite-films\u002F", "videoInterviews": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fvideo-interviews\u002F", "weekendBoxOffice": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekend-box-office\u002F", "weeklyKetchup": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekly-ketchup\u002F", "whatToWatch": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwhat-to-watch\u002F" }, "advertisingFooter": "https:\u002F\u002Ftogether.nbcuni.com\u002Fadvertise\u002F?utm_source=rotten_tomatoes&utm_medium=referral&utm_campaign=property_ad_pages&utm_content=footer", "californiaNotice": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcalifornia-consumer-privacy-act", "careers": "\u002F\u002Fwww.fandango.com\u002Fcareers", "cookieManagement": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcookies#accordionheader2", "fandangoAbout": "https:\u002F\u002Fwww.fandango.com\u002Fabout-us", "privacyPolicy": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Ffandango-privacy-policy", "termsPolicies": "\u002Fpolicies\u002Fterms-and-policies" } }; 3779 + root.RottenTomatoes.thirdParty = { "chartBeat": { "auth": "64558", "domain": "rottentomatoes.com" }, "mpx": { "accountPid": "NGweTC", "playerPid": "y__7B0iQTi4P", "playerPidPDK6": "pdk6_y__7B0iQTi4P", "accountId": "2474312077" }, "algoliaSearch": { "aId": "79FRDP12PN", "sId": "175588f6e5f8319b27702e4cc4013561" }, "cognito": { "upId": "us-west-2_4L0ZX4b1U", "clientId": "7pu48v8i2n25t4vhes0edck31c" } }; 3780 + root.RottenTomatoes.serviceWorker = { "isServiceWokerOn": true }; 3781 + root.__RT__ || (root.__RT__ = {}); 3782 + root.__RT__.featureFlags = { "adsCarouselHP": false, "adsCarouselHPSlug": "rt-sponsored-carousel-list-mcdonalds-hp", "adsCarouselOP": false, "adsCarouselOPSlug": "rt-sponsored-carousel-list-mcdonalds-op", "adsMockDLP": false, "adsPages": "none", "adsSponsoredOverrideOP": true, "adsSponsoredOverrideOPSlugs": "rt-sponsored-override-op-starz", "adsVideoSpotlightHP": false, "appleSigninEnabled": true, "artiEnabled": true, "authPasswordEnabled": true, "authVerboseLogs": false, "bypassCriticValidationEnabled": false, "castAndCrewEnabled": true, "cookieConsentServiceEnabled": false, "crssoEnabled": false, "editorialApiDisabled": false, "faqUpdatesEnabled": true, "legacyBridge": true, "logVerboseEnabled": false, "mobileAppAndroid": "https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.rottentomatoes.android", "mobileAppIos": "https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Frotten-tomatoes-movies-tv\u002Fid6673916573", "mobileAppIosMeta": "app-id=6673916573, app-argument=https:\u002F\u002Fwww.rottentomatoes.com\u002F", "mobileNavEnabled": true, "oneTrustJwtApiUrl": "https:\u002F\u002Fonetrustjwt.services.fandango.com", "oneTrustJwtServiceEnabled": false, "pageJsonEnabled": false, "profilesFeaturesEnabled": false, "profilesUsernameEnabled": false, "redesignMediaHeroEnabled": true, "redesignMoreLikeThis": true, "redesignSortTable": true, "trafficAndroidEnabled": false, "trafficSafariEnabled": true, "userMigrationEnabled": true, "versantFreewheelEnabled": false, "versantMpsDomain": "app.mps.vsnt.net", "versantMpsEnabled": false, "versantOneTrustScriptBlock": "\u003C!-- OneTrust Cookies Consent Notice start for rottentomatoes.com --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fconsent\u002F01978557-1604-76a7-ad7c-18216757cf52-test\u002FotSDKStub.js\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" data-domain-script=\"01978557-1604-76a7-ad7c-18216757cf52-test\" integrity=\"sha384-Exfxdyaw5OnsUlHEKlNlz7OwgVCyLlitAtJsDmSNh3LeLlCjWXos3X\u002FCMNUbQ\u002FgA\" crossorigin=\"anonymous\" \u003E\u003C\u002Fscript\u003E \u003Cscript type=\"text\u002Fjavascript\"\u003E function OptanonWrapper() { if (OnetrustActiveGroups.includes('7')) { document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); } } \u003C\u002Fscript\u003E \u003C!-- OneTrust Cookies Consent Notice end for rottentomatoes.com --\u003E \u003C!-- OneTrust IAB US Privacy (USP) --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fopt-out\u002FotCCPAiab.js\" id=\"privacyCookie\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" ccpa-opt-out-ids=\"USP\" ccpa-opt-out-geo=\"US\" ccpa-opt-out-lspa=\"false\"\u003E\u003C\u002Fscript\u003E \u003C!-- OneTrust IAB US Privacy (USP) end --\u003E", "videoGeoFencingEnabled": true }; 3783 + root.RottenTomatoes.context.adsMockDLP = false; 3784 + root.RottenTomatoes.context.req = { "params": { "vanity": "the_fantastic_four_first_steps" }, "query": {}, "route": {}, "url": "\u002Fm\u002Fthe_fantastic_four_first_steps", "secure": false, "buildVersion": undefined }; 3785 + root.RottenTomatoes.context.config = {}; 3786 + root.BK = { "PageName": "http:\u002F\u002Fwww.rottentomatoes.com\u002Fm\u002Fthe_fantastic_four_first_steps", "SiteID": 37528, "SiteSection": "movie", "MovieId": "db64beee-683b-39ce-9617-94f6b67aa997", "MovieTitle": "The Fantastic Four: First Steps" }; 3787 + root.RottenTomatoes.dtmData = { "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "db64beee-683b-39ce-9617-94f6b67aa997", "lifeCycleWindow": "IN_THEATERS", "pageName": "rt | movies | overview | The Fantastic Four: First Steps", "titleGenre": "Action", "titleId": "db64beee-683b-39ce-9617-94f6b67aa997", "titleName": "The Fantastic Four: First Steps", "titleType": "Movie" }; 3788 + root.RottenTomatoes.context.gptSite = "movie"; 3789 + 3790 + }(this)); 3791 + </script> 3792 + 3793 + <script fetchpriority="high" src="/assets/pizza-pie/javascripts/bundles/roma/preload.18bcfff8e54.js"></script> 3794 + 3795 + <script src="/assets/pizza-pie/javascripts/bundles/roma/vendors.a4cc402b78a.js"></script> 3796 + 3797 + <script src="/assets/pizza-pie/javascripts/bundles/roma/default.24dc1977289.js"></script> 3798 + 3799 + 3800 + <script async data-SearchResultsNavManager="script:load" 3801 + src="https://cdn.jsdelivr.net/npm/algoliasearch@4/dist/algoliasearch-lite.umd.js"> 3802 + </script> 3803 + <script src="/assets/pizza-pie/javascripts/templates/roma/searchNav.a3288ea5efe.js"></script> 3804 + <script src="/assets/pizza-pie/javascripts/bundles/roma/searchNav.6a836b4ca81.js"></script> 3805 + 3806 + 3807 + 3808 + <script src="/assets/pizza-pie/javascripts/templates/pages/movie/index.3aa173d4c0f.js"></script> 3809 + 3810 + <script src="/assets/pizza-pie/javascripts/bundles/pages/movie/index.3138f97b28e.js"></script> 3811 + 3812 + 3813 + 3814 + 3815 + <script> 3816 + if (window.mps && typeof window.mps.writeFooter === 'function') { 3817 + window.mps.writeFooter(); 3818 + } 3819 + </script> 3820 + 3821 + 3822 + 3823 + 3824 + 3825 + <script> 3826 + window._satellite && _satellite.pageBottom(); 3827 + </script> 3828 + 3829 + 3830 + </body> 3831 + 3832 + </html>
+2154
internal/services/samples/search.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" 3 + prefix="fb: http://www.facebook.com/2008/fbml og: http://opengraphprotocol.org/schema/"> 4 + 5 + <head prefix="og: http://ogp.me/ns# flixstertomatoes: http://ogp.me/ns/apps/flixstertomatoes#"> 6 + 7 + 8 + 9 + 10 + <script charset="UTF-8" crossorigin="anonymous" data-domain-script="7e979733-6841-4fce-9182-515fac69187f" 11 + integrity="sha384-TKdmlzVmoD70HzftTw4WtOzIBL5mNx8mXSRzEvwrWjpIJ7FZ/EuX758yMDWXtRUN" 12 + src="https://cdn.cookielaw.org/consent/7e979733-6841-4fce-9182-515fac69187f/otSDKStub.js" type="text/javascript"> 13 + </script> 14 + <script type="text/javascript"> 15 + function OptanonWrapper() { 16 + if (OnetrustActiveGroups.includes('7')) { 17 + document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); 18 + } 19 + } 20 + </script> 21 + 22 + 23 + 24 + <script ccpa-opt-out-ids="USP" ccpa-opt-out-geo="US" ccpa-opt-out-lspa="false" charset="UTF-8" 25 + src="https://cdn.cookielaw.org/opt-out/otCCPAiab.js" type="text/javascript"> 26 + </script> 27 + 28 + 29 + 30 + 31 + 32 + 33 + <script src="/assets/pizza-pie/javascripts/bundles/roma/rt-common.js?single"></script> 34 + 35 + 36 + 37 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 38 + <meta http-equiv="x-ua-compatible" content="ie=edge"> 39 + <meta name="viewport" content="width=device-width, initial-scale=1"> 40 + 41 + <link rel="shortcut icon" sizes="76x76" type="image/x-icon" 42 + href="https://www.rottentomatoes.com/assets/pizza-pie/images/favicon.ico" /> 43 + 44 + 45 + <title>Search Results | Rotten Tomatoes</title> 46 + <meta name="description" 47 + content="Rotten Tomatoes, home of the Tomatometer, is the most trusted measurement of quality for Movies & TV. The definitive site for Reviews, Trailers, Showtimes, and Tickets"> 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + <meta property="fb:app_id" content=""> 59 + <meta property="og:site_name" content="Rotten Tomatoes"> 60 + <meta property="og:title" content="Search Results"> 61 + 62 + <meta property="og:description" 63 + content="Rotten Tomatoes, home of the Tomatometer, is the most trusted measurement of quality for Movies & TV. The definitive site for Reviews, Trailers, Showtimes, and Tickets"> 64 + <meta property="og:type" content=""> 65 + <meta property="og:url" content=""> 66 + <meta property="og:image" 67 + content="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/RT_TwitterCard_2018.jpg"> 68 + <meta property="og:locale" content="en_US"> 69 + 70 + 71 + <meta name="twitter:card" content="summary_large_image"> 72 + <meta name="twitter:image" 73 + content="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/RT_TwitterCard_2018.jpg"> 74 + <meta name="twitter:title" content="Search Results"> 75 + <meta name="twitter:text:title" content="Search Results"> 76 + <meta name="twitter:description" 77 + content="Rotten Tomatoes, home of the Tomatometer, is the most trusted measurement of quality for Movies & TV. The definitive site for Reviews, Trailers, Showtimes, and Tickets"> 78 + <meta name="twitter:site" content="@rottentomatoes"> 79 + 80 + <!-- JSON+LD --> 81 + 82 + 83 + 84 + <script> 85 + var dataLayer = dataLayer || []; 86 + dataLayer.push({ "webVersion": "node", "rtVersion": 3.1, "loggedInStatus": "", "customerId": "" }); 87 + </script> 88 + 89 + 90 + 91 + <script id="mps-page-integration"> 92 + window.mpscall = { "cag[score]": null, "cag[certified_fresh]": null, "cag[fresh_rotten]": null, "cag[rating]": null, "cag[release]": null, "cag[movieshow]": null, "cag[genre]": null, "cag[urlid]": null, "cat": "search|results", "field[env]": "production", "field[rtid]": null, "path": "/search", "site": "rottentomatoes-web", "title": "Search Results", "type": "results" }; 93 + var mpsopts = { 'host': 'mps.nbcuni.com', 'updatecorrelator': 1 }; 94 + var mps = mps || {}; mps._ext = mps._ext || {}; mps._adsheld = []; mps._queue = mps._queue || {}; mps._queue.mpsloaded = mps._queue.mpsloaded || []; mps._queue.mpsinit = mps._queue.mpsinit || []; mps._queue.gptloaded = mps._queue.gptloaded || []; mps._queue.adload = mps._queue.adload || []; mps._queue.adclone = mps._queue.adclone || []; mps._queue.adview = mps._queue.adview || []; mps._queue.refreshads = mps._queue.refreshads || []; mps.__timer = Date.now || function () { return +new Date }; mps.__intcode = "v2"; if (typeof mps.getAd != "function") mps.getAd = function (adunit) { if (typeof adunit != "string") return false; var slotid = "mps-getad-" + adunit.replace(/\W/g, ""); if (!mps._ext || !mps._ext.loaded) { mps._queue.gptloaded.push(function () { typeof mps._gptfirst == "function" && mps._gptfirst(adunit, slotid); mps.insertAd("#" + slotid, adunit) }); mps._adsheld.push(adunit) } return '<div id="' + slotid + '" class="mps-wrapper" data-mps-fill-slot="' + adunit + '"></div>' }; 95 + </script> 96 + <script src="//mps.nbcuni.com/fetch/ext/load-rottentomatoes-web.js?nowrite=2" id="mps-load"></script> 97 + 98 + 99 + 100 + 101 + 102 + 103 + 104 + <link rel="manifest" href="https://www.rottentomatoes.com/assets/pizza-pie/manifest/manifest.json" /> 105 + 106 + <link rel="apple-touch-icon" 107 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-60.jpg" /> 108 + <link rel="apple-touch-icon" sizes="152x152" 109 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-152.jpg" /> 110 + <link rel="apple-touch-icon" sizes="167x167" 111 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-167.jpg" /> 112 + <link rel="apple-touch-icon" sizes="180x180" 113 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-180.jpg" /> 114 + 115 + 116 + <!-- iOS Smart Banner --> 117 + <meta name="apple-itunes-app" content="app-id=6673916573, app-argument=https://www.rottentomatoes.com/"> 118 + 119 + 120 + 121 + 122 + 123 + 124 + <meta name="google-site-verification" content="VPPXtECgUUeuATBacnqnCm4ydGO99reF-xgNklSbNbc" /> 125 + 126 + 127 + <meta name="msvalidate.01" content="034F16304017CA7DCF45D43850915323" /> 128 + <meta name="theme-color" content="#FA320A"> 129 + 130 + <!-- DNS prefetch --> 131 + <meta http-equiv="x-dns-prefetch-control" content="on"> 132 + 133 + <link rel="dns-prefetch" href="//www.rottentomatoes.com" /> 134 + 135 + 136 + <link rel="preconnect" href="//www.rottentomatoes.com" /> 137 + 138 + 139 + 140 + 141 + <link rel="stylesheet" href="/assets/pizza-pie/stylesheets/bundles/layouts/default.b6077682d41.css" /> 142 + 143 + 144 + 145 + 146 + <link rel="preload" href="/assets/pizza-pie/stylesheets/bundles/pages/search.2697d48faa3.css" as="style" 147 + onload="this.onload=null;this.rel='stylesheet'" /> 148 + 149 + 150 + <script> 151 + window.RottenTomatoes = {}; 152 + window.RTLocals = {}; 153 + window.nunjucksPrecompiled = {}; 154 + window.__RT__ = {}; 155 + </script> 156 + 157 + 158 + 159 + <script src="https://cdn.jwplayer.com/libraries/U8MHzHHR.js"></script> 160 + <script src="https://sb.scorecardresearch.com/c2/plugins/streamingtag_plugin_jwplayer.js"></script> 161 + 162 + 163 + 164 + 165 + 166 + <script>!function (e) { var n = "https://s.go-mpulse.net/boomerang/"; if ("False" == "True") e.BOOMR_config = e.BOOMR_config || {}, e.BOOMR_config.PageParams = e.BOOMR_config.PageParams || {}, e.BOOMR_config.PageParams.pci = !0, n = "https://s2.go-mpulse.net/boomerang/"; if (window.BOOMR_API_key = "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9", function () { function e() { if (!o) { var e = document.createElement("script"); e.id = "boomr-scr-as", e.src = window.BOOMR.url, e.async = !0, i.parentNode.appendChild(e), o = !0 } } function t(e) { o = !0; var n, t, a, r, d = document, O = window; if (window.BOOMR.snippetMethod = e ? "if" : "i", t = function (e, n) { var t = d.createElement("script"); t.id = n || "boomr-if-as", t.src = window.BOOMR.url, BOOMR_lstart = (new Date).getTime(), e = e || d.body, e.appendChild(t) }, !window.addEventListener && window.attachEvent && navigator.userAgent.match(/MSIE [67]\./)) return window.BOOMR.snippetMethod = "s", void t(i.parentNode, "boomr-async"); a = document.createElement("IFRAME"), a.src = "about:blank", a.title = "", a.role = "presentation", a.loading = "eager", r = (a.frameElement || a).style, r.width = 0, r.height = 0, r.border = 0, r.display = "none", i.parentNode.appendChild(a); try { O = a.contentWindow, d = O.document.open() } catch (_) { n = document.domain, a.src = "javascript:var d=document.open();d.domain='" + n + "';void(0);", O = a.contentWindow, d = O.document.open() } if (n) d._boomrl = function () { this.domain = n, t() }, d.write("<bo" + "dy onload='document._boomrl();'>"); else if (O._boomrl = function () { t() }, O.addEventListener) O.addEventListener("load", O._boomrl, !1); else if (O.attachEvent) O.attachEvent("onload", O._boomrl); d.close() } function a(e) { window.BOOMR_onload = e && e.timeStamp || (new Date).getTime() } if (!window.BOOMR || !window.BOOMR.version && !window.BOOMR.snippetExecuted) { window.BOOMR = window.BOOMR || {}, window.BOOMR.snippetStart = (new Date).getTime(), window.BOOMR.snippetExecuted = !0, window.BOOMR.snippetVersion = 12, window.BOOMR.url = n + "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9"; var i = document.currentScript || document.getElementsByTagName("script")[0], o = !1, r = document.createElement("link"); if (r.relList && "function" == typeof r.relList.supports && r.relList.supports("preload") && "as" in r) window.BOOMR.snippetMethod = "p", r.href = window.BOOMR.url, r.rel = "preload", r.as = "script", r.addEventListener("load", e), r.addEventListener("error", function () { t(!0) }), setTimeout(function () { if (!o) t(!0) }, 3e3), BOOMR_lstart = (new Date).getTime(), i.parentNode.appendChild(r); else t(!1); if (window.addEventListener) window.addEventListener("load", a, !1); else if (window.attachEvent) window.attachEvent("onload", a) } }(), "".length > 0) if (e && "performance" in e && e.performance && "function" == typeof e.performance.setResourceTimingBufferSize) e.performance.setResourceTimingBufferSize(); !function () { if (BOOMR = e.BOOMR || {}, BOOMR.plugins = BOOMR.plugins || {}, !BOOMR.plugins.AK) { var n = "" == "true" ? 1 : 0, t = "", a = "eyd6zaauaeceajqacqcoyaaaevul3lwp-f-65027684e-clienttons-s.akamaihd.net", i = "false" == "true" ? 2 : 1, o = { "ak.v": "39", "ak.cp": "1839344", "ak.ai": parseInt("1226367", 10), "ak.ol": "0", "ak.cr": 17, "ak.ipv": 6, "ak.proto": "h2", "ak.rid": "3b031e30", "ak.r": 43885, "ak.a2": n, "ak.m": "dsca", "ak.n": "essl", "ak.bpcip": "2607:ec80:1401:440::", "ak.cport": 62968, "ak.gh": "23.199.45.9", "ak.quicv": "", "ak.tlsv": "tls1.3", "ak.0rtt": "", "ak.0rtt.ed": "", "ak.csrc": "-", "ak.acc": "", "ak.t": "1757261519", "ak.ak": "hOBiQwZUYzCg5VSAfCLimQ==Rujch2H8VUxen6Rm4ZRpLwpby86LIteu33YpY/FAcDRzHLn1OxkDzEfdH28VpGCMeDIq68sAsxquz9zSL8+LD+C/AYT1n4ikVTU0o6vxrSz8PsmzR/7UqRqnWmtkbjIgDLxgKficxihMzEnMDg/iCNKIev6M39p7hxr6UZw4jal++zii8ccIjmbdqGveRzZspVB29H8R3ssqTXUifnE9RcTQTTXAliNSlVhDlreixNX8AbB6fQuUmOdFwmI6ZpgekLrWSVcAr823PVRO5M+HoMq3ZnWlh+6map1NSRqiPpcY4Ne9g7/bHrVbwA90y2fShaz8tJn8/K5CgtkjR3gaXJ0MUhSKRHywWDnCnd/vRXbbfP9qUWKujdQB1jHIe+ke4TdTX1DXNWLqmNCjmi53JPztgmnZcS9px1qB1xdu7kI=", "ak.pv": "3", "ak.dpoabenc": "", "ak.tf": i }; if ("" !== t) o["ak.ruds"] = t; var r = { i: !1, av: function (n) { var t = "http.initiator"; if (n && (!n[t] || "spa_hard" === n[t])) o["ak.feo"] = void 0 !== e.aFeoApplied ? 1 : 0, BOOMR.addVar(o) }, rv: function () { var e = ["ak.bpcip", "ak.cport", "ak.cr", "ak.csrc", "ak.gh", "ak.ipv", "ak.m", "ak.n", "ak.ol", "ak.proto", "ak.quicv", "ak.tlsv", "ak.0rtt", "ak.0rtt.ed", "ak.r", "ak.acc", "ak.t", "ak.tf"]; BOOMR.removeVar(e) } }; BOOMR.plugins.AK = { akVars: o, akDNSPreFetchDomain: a, init: function () { if (!r.i) { var e = BOOMR.subscribe; e("before_beacon", r.av, null, null), e("onbeacon", r.rv, null, null), r.i = !0 } return this }, is_complete: function () { return !0 } } } }() }(window);</script> 167 + </head> 168 + 169 + <body class="body no-touch js-mptd-layout" data-AdsGlobalSkinTakeoverManager="body" data-SearchResultsNavManager="body"> 170 + <cookie-manager></cookie-manager> 171 + <device-inspection-manager 172 + endpoint="https://www.rottentomatoes.com/napi/device/inspection"></device-inspection-manager> 173 + 174 + <user-activity-manager profiles-features-enabled="false"></user-activity-manager> 175 + <user-identity-manager profiles-features-enabled="false"></user-identity-manager> 176 + <ad-unit-manager></ad-unit-manager> 177 + 178 + <auth-initiate-manager profiles-username-enabled="false" data-ArtiManager="authInitiateManager" 179 + data-WatchlistButtonManager="authInitiateManager:createAccount"> 180 + </auth-initiate-manager> 181 + <auth-profile-manager data-AuthInitiateManager="authProfileManager"></auth-profile-manager> 182 + <auth-validation-manager data-AuthInitiateManager="authValidation"></auth-validation-manager> 183 + <overlay-base data-AuthInitiateManager="overlayBase:close" data-PagePollsIndexManager="authOverlay:close" hidden> 184 + <overlay-flows data-AuthInitiateManager="overlayFlows" slot="content"> 185 + <action-icon slot="close" class="auth-overlay__icon-button auth-overlay__icon-button--close" aria-label="Close" 186 + data-qa="close-overlay-btn" icon="close"></action-icon> 187 + 188 + </overlay-flows> 189 + </overlay-base> 190 + 191 + <notification-alert data-AuthInitiateManager="authSuccess" animate hidden> 192 + <rt-icon icon="check-circled"></rt-icon> 193 + <span>Signed in</span> 194 + </notification-alert> 195 + 196 + <div id="auth-templates" data-AuthInitiateManager="authTemplates"> 197 + <template slot="screens" id="account-create-username-screen"> 198 + <account-create-username-screen data-qa="account-create-username-screen"> 199 + <input-label slot="input-username" state="default" data-qa="username-input-label"> 200 + <label slot="label" for="create-username-input">Username</label> 201 + <input slot="input" id="create-username-input" type="text" placeholder="Username" data-qa="username-input" /> 202 + </input-label> 203 + <rt-button disabled slot="btn-continue" shape="pill" data-qa="continue-btn">Continue</rt-button> 204 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 205 + By joining, you agree to the <rt-link href="/policies/terms-and-policies" target="_blank" 206 + data-qa="terms-policies-link">Terms and Policies</rt-link> and 207 + the <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 208 + data-qa="privacy-policy-link">Privacy Policy</rt-link> and to receive email from 209 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 210 + Brands</rt-link>. 211 + </rt-text> 212 + </account-create-username-screen> 213 + </template> 214 + 215 + <template slot="screens" id="account-email-change-screen"> 216 + <account-email-change-screen data-qa="account-email-change-screen" email="user@email.com"> 217 + <input-label class="new-email-input" state="default" slot="new-email-input" data-qa="email-input-label"> 218 + <label slot="label" for="newEmail">Enter new email</label> 219 + <input slot="input" name="newEmail" type="text" placeholder="Enter new email" autocomplete="off" 220 + data-qa="email-input"></input> 221 + </input-label> 222 + <rt-button slot="submit-button" disabled shape="pill" data-qa="submit-btn">Submit</rt-button> 223 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 224 + By joining, you agree to the 225 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link">Terms and 226 + Policies</rt-link> 227 + and <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 228 + data-qa="privacy-policy-link">Privacy Policy</rt-link> 229 + and to receive email from the 230 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 231 + Brands</rt-link>. 232 + </rt-text> 233 + </account-email-change-screen> 234 + </template> 235 + 236 + <template slot="screens" id="account-email-change-success-screen"> 237 + <account-email-change-success-screen data-qa="login-create-success-screen"> 238 + <rt-text slot="message" size="1.5" style="--fontWeight: var(--franklinGothicDemi);">Email change 239 + successful</rt-text> 240 + <rt-text slot="submessage">You are signed out for your security. </br> Please sign in again.</rt-text> 241 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 242 + height="105" /> 243 + </account-email-change-success-screen> 244 + </template> 245 + 246 + <template slot="screens" id="account-password-change-screen"> 247 + <account-password-change-screen data-qa="account-password-change-screen"> 248 + <input-label state="default" slot="input-password-existing"> 249 + <label slot="label" for="password-existing">Existing password</label> 250 + <input slot="input" name="password-existing" type="password" placeholder="Enter existing password" 251 + autocomplete="off"></input> 252 + </input-label> 253 + <input-label state="default" slot="input-password-new"> 254 + <label slot="label" for="password-new">New password</label> 255 + <input slot="input" name="password-new" type="password" placeholder="Enter new password" 256 + autocomplete="off"></input> 257 + </input-label> 258 + <rt-button disabled shape="pill" slot="submit-button">Submit</rt-button> 259 + </account-password-change-screen> 260 + </template> 261 + 262 + <template slot="screens" id="account-password-change-updating-screen"> 263 + <login-success-screen data-qa="account-password-change-updating-screen" hidebanner> 264 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 265 + Updating your password... 266 + </rt-text> 267 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 268 + height="105" /> 269 + </login-success-screen> 270 + </template> 271 + <template slot="screens" id="account-password-change-success-screen"> 272 + <login-success-screen data-qa="account-password-change-success-screen" hidebanner> 273 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 274 + Success! 275 + </rt-text> 276 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 277 + height="105" /> 278 + </login-success-screen> 279 + </template> 280 + <template slot="screens" id="account-verifying-email-screen"> 281 + <account-verifying-email-screen data-qa="account-verifying-email-screen"> 282 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-auth-verify.e74a69e9a77.svg" alt="email" /> 283 + <rt-text slot="status"> Verifying your email... </rt-text> 284 + <rt-button type="cta-large" href="/?authFlowScreen=loginStartScreen" slot="retryLink" size="0.875" 285 + style="--fontWeight: var(--franklinGothicMedium);" data-qa="retry-link"> 286 + Retry 287 + </rt-button> 288 + </account-verifying-email-screen> 289 + </template> 290 + <template slot="screens" id="cognito-loading"> 291 + <div> 292 + <loading-spinner id="cognito-auth-loading-spinner"></loading-spinner> 293 + <style> 294 + #cognito-auth-loading-spinner { 295 + font-size: 2rem; 296 + transform: translate(calc(100% - 1em), 250px); 297 + width: 50%; 298 + } 299 + </style> 300 + </div> 301 + </template> 302 + 303 + <template slot="screens" id="login-check-email-screen"> 304 + <login-check-email-screen data-qa="login-check-email-screen" email="user@email.com"> 305 + <rt-text class="note-text" size="1" slot="noteText"> 306 + Please open the email link from the same browser you initiated the change email process from. 307 + </rt-text> 308 + <rt-text slot="gotEmailMessage" size="0.875"> 309 + Didn't you get the email? 310 + </rt-text> 311 + <rt-button slot="resendEmailLink" size="0.875" type="cta-large" data-qa="resend-email-link"> 312 + Resend email 313 + </rt-button> 314 + <rt-link context="label" slot="troubleLoginLink" size="0.875" href="/reset-client" data-qa="reset-link">Having 315 + trouble logging in?</rt-link> 316 + 317 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 318 + By continuing, you agree to the 319 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 320 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 321 + and the 322 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 323 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 324 + and to receive email from 325 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 326 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 327 + </rt-text> 328 + </login-check-email-screen> 329 + </template> 330 + 331 + <template slot="screens" id="login-error-screen"> 332 + <login-error-screen data-qa="login-error"> 333 + <rt-text slot="header" size="1.5" context="heading" data-qa="header"> 334 + Something went wrong... 335 + </rt-text> 336 + <rt-text slot="description1" size="1" context="label" data-qa="description1"> 337 + Please try again. 338 + </rt-text> 339 + <img slot="image" src="/assets/pizza-pie/images/icons/cognito-error.c55e509a7fd.svg" /> 340 + <rt-text hidden slot="description2" size="1" context="label" data-qa="description2"></rt-text> 341 + <rt-link slot="ctaLink" hidden context="label" size="0.875" data-qa="retry-link">Retry</rt-link> 342 + </login-error-screen> 343 + </template> 344 + 345 + <template slot="screens" id="login-enter-password-screen"> 346 + <login-enter-password-screen data-qa="login-enter-password-screen"> 347 + <rt-text slot="title" size="1.5" style="--fontWeight: var(--franklinGothicMedium);"> 348 + Welcome back! 349 + </rt-text> 350 + <rt-text slot="username" data-qa="user-email"> 351 + username@email.com 352 + </rt-text> 353 + <input-label slot="inputPassword" state="default" data-qa="password-input-label"> 354 + <label slot="label" for="pass">Password</label> 355 + <input slot="input" id="pass" type="password" placeholder="Password" autocomplete="off" 356 + data-qa="password-input"></input> 357 + </input-label> 358 + <rt-button disabled slot="continueButton" type="cta-large" data-qa="continue-btn"> 359 + Continue 360 + </rt-button> 361 + <rt-button slot="emailLoginButton" theme="light" shape="pill" data-qa="send-email-btn"> 362 + Send email to verify 363 + </rt-button> 364 + <rt-link slot="forgotPasswordLink" theme="light" data-qa="forgot-password-link">Forgot password</rt-link> 365 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 366 + By continuing, you agree to the 367 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 368 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 369 + and the 370 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 371 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 372 + and to receive email from 373 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 374 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 375 + </rt-text> 376 + </login-enter-password-screen> 377 + </template> 378 + 379 + <template slot="screens" id="login-start-screen"> 380 + <login-start-screen data-qa="login-start-screen"> 381 + <input-label slot="inputEmail" state="default" data-qa="email-input-label"> 382 + <label slot="label" for="login-email-input">Email address</label> 383 + <input slot="input" autocomplete="username" id="login-email-input" placeholder="Email address" type="text" 384 + data-qa="email-input" /> 385 + </input-label> 386 + <rt-button disabled slot="emailLoginButton" type="cta-large" data-qa="continue-btn"> 387 + Continue 388 + </rt-button> 389 + <rt-button slot="googleLoginButton" shape="pill" theme="light" 390 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="google-login-btn" data-type="google"> 391 + <div class="social-login-btn-content"> 392 + <img height="16px" width="16px" src="/assets/pizza-pie/images/vendor/google/google_logo.28d9eb28faa.svg" /> 393 + Continue with Google 394 + </div> 395 + </rt-button> 396 + 397 + <rt-button slot="appleLoginButton" shape="pill" theme="light" 398 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="apple-login-btn" data-type="apple"> 399 + <div class="social-login-btn-content"> 400 + <rt-icon size="1" icon="apple"></rt-icon> 401 + Continue with apple 402 + </div> 403 + </rt-button> 404 + 405 + <rt-link slot="resetLink" class="reset-link" context="label" size="0.875" href="/reset-client" 406 + data-qa="reset-link"> 407 + Having trouble logging in? 408 + </rt-link> 409 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 410 + By continuing, you agree to the 411 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 412 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 413 + and the 414 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 415 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 416 + and to receive email from 417 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 418 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 419 + </rt-text> 420 + </login-start-screen> 421 + </template> 422 + 423 + <template slot="screens" id="login-success-screen"> 424 + <login-success-screen data-qa="login-success-screen"> 425 + <rt-text slot="status" size="1.5"> 426 + Login successful! 427 + </rt-text> 428 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 429 + height="105" /> 430 + </login-success-screen> 431 + </template> 432 + <template slot="screens" id="cognito-opt-in-us"> 433 + <auth-optin-screen data-qa="auth-opt-in-screen"> 434 + <div slot="newsletter-text"> 435 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 436 + </div> 437 + <img slot="image" class="image" 438 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 439 + alt="Rotten Tomatoes Newsletter">> 440 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 441 + </h2> 442 + <ul slot="options"> 443 + <li class="icon-item">Upcoming Movies and TV shows</li> 444 + <li class="icon-item">Rotten Tomatoes Podcast</li> 445 + <li class="icon-item">Media News + More</li> 446 + </ul> 447 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 448 + Sign me up 449 + </rt-button> 450 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 451 + No thanks 452 + </rt-button> 453 + <p slot="foot-note"> 454 + By clicking "Sign Me Up," you are agreeing to receive occasional emails and communications from Fandango Media 455 + (Fandango, Vudu, and Rotten Tomatoes) and consenting to Fandango's 456 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" class="optin-link" target="_blank" 457 + rel="noopener" data-qa="auth-name-screen-privacy-policy-link">Privacy Policy</a> 458 + and 459 + <a href="/policies/terms-and-policies" class="optin-link" target="_blank" rel="noopener" 460 + data-qa="auth-name-screen-privacy-policy-link">Terms and Policies</a>. 461 + Please allow 10 business days for your account to reflect your preferences. 462 + </p> 463 + </auth-optin-screen> 464 + </template> 465 + <template slot="screens" id="cognito-opt-in-foreign"> 466 + <auth-optin-screen data-qa="auth-opt-in-screen"> 467 + <div slot="newsletter-text"> 468 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 469 + </div> 470 + <img slot="image" class="image" 471 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 472 + alt="Rotten Tomatoes Newsletter">> 473 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 474 + </h2> 475 + <ul slot="options"> 476 + <li class="icon-item">Upcoming Movies and TV shows</li> 477 + <li class="icon-item">Rotten Tomatoes Podcast</li> 478 + <li class="icon-item">Media News + More</li> 479 + </ul> 480 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 481 + Sign me up 482 + </rt-button> 483 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 484 + No thanks 485 + </rt-button> 486 + </auth-optin-screen> 487 + </template> 488 + <template slot="screens" id="cognito-opt-in-success"> 489 + <auth-verify-screen> 490 + <rt-icon icon="check-circled" slot="icon"></rt-icon> 491 + <p class="h3" slot="status">OK, got it!</p> 492 + </auth-verify-screen> 493 + </template> 494 + 495 + </div> 496 + 497 + 498 + <div id="emptyPlaceholder"></div> 499 + 500 + 501 + 502 + <script ASYNC src="//assets.adobedtm.com/launch-EN549327edc13e414a9beb5d61bfd9aac6.min.js"></script> 503 + 504 + 505 + 506 + <div id="main" class="container rt-layout__body"> 507 + <a href="#main-page-content" class="skip-link">Skip to Main Content</a> 508 + 509 + 510 + 511 + <div id="header_and_leaderboard"> 512 + <div id="top_leaderboard_wrapper" class="leaderboard_wrapper "> 513 + <ad-unit hidden unit-display="desktop" unit-type="topbanner" adjust-height> 514 + <div slot="ad-inject"></div> 515 + </ad-unit> 516 + 517 + <ad-unit hidden unit-display="mobile" unit-type="mbanner"> 518 + <div slot="ad-inject"></div> 519 + </ad-unit> 520 + </div> 521 + </div> 522 + 523 + 524 + <rt-header-manager></rt-header-manager> 525 + 526 + <rt-header aria-label="navigation bar" class="navbar" data-qa="header-nav-bar" 527 + data-AdsGlobalNavTakeoverManager="header" id="header-main" skeleton="panel"> 528 + 529 + 530 + <button aria-label="Open aRTi" class="arti-mobile" data-ArtiManager="btnArti:click" slot="arti-mobile"> 531 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 532 + </button> 533 + 534 + 535 + <div slot="mobile-header-nav"> 536 + <rt-button id="mobile-header-nav-btn" data-RtHeaderManager="mobileHeaderNavBtn:click" size="1.6" 537 + style="--backgroundColor: transparent; --backgroundColorHover: transparent; --buttonPadding: 0 10px 4px;"> 538 + &#9776; 539 + </rt-button> 540 + <mobile-header-nav id="mobile-header-nav" data-RtHeaderManager="mobileHeaderNav"> 541 + <rt-img slot="logoImage" alt="Rotten Tomatoes" fetchpriority="high" 542 + src="/assets/pizza-pie/images/rt-tomato-logo.20c3bdbc97b.svg"></rt-img> 543 + <div slot="menusCss"></div> 544 + <div slot="menus"></div> 545 + </mobile-header-nav> 546 + </div> 547 + 548 + <a class="logo-wrap" data-AdsGlobalNavTakeoverManager="logoLink" data-SearchResultsNavManager="rtNavLogo" href="/" 549 + id="navbar" slot="logo"> 550 + <img alt="Rotten Tomatoes" data-qa="header-logo" data-AdsGlobalNavTakeoverManager="logo" 551 + src="/assets/pizza-pie/images/rtlogo.9b892cff3fd.png" fetchpriority="high" /> 552 + 553 + <div class="hide"> 554 + <ad-unit hidden unit-display="desktop,mobile" unit-type="logorepeat" unit-targeting="ploc=rtlogo;"> 555 + <div slot="ad-inject"></div> 556 + </ad-unit> 557 + </div> 558 + </a> 559 + 560 + <search-results-nav-manager></search-results-nav-manager> 561 + 562 + <search-results-nav data-adobe-id="global-nav-search" data-SearchResultsNavManager="search" slot="search" 563 + skeleton="chip"> 564 + <search-results-controls data-SearchResultsNavManager="searchControls" slot="controls"> 565 + <input aria-label="Search" data-AdsGlobalNavTakeoverManager="searchInput" 566 + data-SearchResultsNavManager="inputText:click,input,keydown" data-qa="search-input" placeholder="Search" 567 + slot="search-input" type="text" /> 568 + <rt-button class="search-clear" data-qa="search-clear" data-AdsGlobalNavTakeoverManager="searchClearBtn" 569 + data-SearchResultsNavManager="clearBtn:click" size="0.875" slot="search-clear" theme="transparent"> 570 + <rt-icon icon="close"></rt-icon> 571 + </rt-button> 572 + <rt-link class="search-submit" aria-label="Submit search" data-qa="search-submit" 573 + data-AdsGlobalNavTakeoverManager="searchSubmitBtn" data-SearchResultsNavManager="submitBtn:click" 574 + href="/search" size="0.875" slot="search-submit"> 575 + <rt-icon icon="search"></rt-icon> 576 + </rt-link> 577 + <rt-button class="search-cancel" data-qa="search-cancel" data-AdsGlobalNavTakeoverManager="searchCancelBtn" 578 + data-SearchResultsNavManager="cancelBtn:click" size="0.875" slot="search-cancel" theme="transparent"> 579 + Cancel 580 + </rt-button> 581 + </search-results-controls> 582 + 583 + <search-results aria-expanded="false" class="hide" data-SearchResultsNavManager="searchResults" slot="results"> 584 + </search-results> 585 + </search-results-nav> 586 + 587 + <ul slot="nav-links"> 588 + <li> 589 + <a href="/about" data-qa="header:link-whats-tmeter" data-AdsGlobalNavTakeoverManager="text"> 590 + About Rotten Tomatoes&reg; 591 + </a> 592 + </li> 593 + <li> 594 + <a href="/critics" data-qa="header:link-critics-home" data-AdsGlobalNavTakeoverManager="text"> 595 + Critics 596 + </a> 597 + </li> 598 + <li data-RtHeaderManager="loginLink"> 599 + <ul> 600 + <li> 601 + <button id="masthead-show-login-btn" class="js-cognito-signin button--link" 602 + data-AuthInitiateManager="btnSignIn:click" data-qa="header:login-btn" 603 + data-AdsGlobalNavTakeoverManager="text"> 604 + Login/signup 605 + </button> 606 + </li> 607 + </ul> 608 + </li> 609 + <li class="hide" data-RtHeaderManager="userItem:keydown,keyup,mouseenter" data-qa="header:user"> 610 + <a class="masthead-user-link" data-RtHeaderManager="navUserlink:focus" rel="nofollow" 611 + data-qa="user-profile-link"> 612 + <img data-RtHeaderManager="navUserImg" data-qa="user-profile-thumb"> 613 + <p data-AdsGlobalNavTakeoverManager="text" data-RtHeaderManager="navUserFirstName" 614 + data-qa="user-profile-name"></p> 615 + <rt-icon data-AdsGlobalNavTakeoverManager="text" icon="down-dir" image> 616 + </rt-icon> 617 + </a> 618 + <rt-header-user-info class="hide" data-RtHeaderManager="userInfo:focusout,mouseleave"> 619 + <a data-qa="user-stats-profile-pic" href="" rel="nofollow" slot="imageExpanded" tabindex="-1"> 620 + <img src="" width="40" alt=""> 621 + </a> 622 + <a slot="fullName" rel="nofollow" href="" class="username" data-qa="user-stats-name"></a> 623 + <a slot="wts" rel="nofollow" href="" class="wts-count-block" data-qa="user-stats-wts"> 624 + <rt-icon icon="plus" data-qa="user-stats-ratings-count"></rt-icon> 625 + <span class="count" data-qa="user-stats-wts-count"></span> 626 + &nbsp;Wants to See 627 + </a> 628 + <a slot="rating" rel="nofollow" href="" class="rating-count-block" data-qa="user-stats-ratings"> 629 + <rt-icon icon="star" data-qa="user-stats-ratings-count"></rt-icon> 630 + <span class="count"></span> 631 + &nbsp;Ratings 632 + </a> 633 + 634 + <a slot="profileLink" rel="nofollow" class="dropdown-link" href="" 635 + data-qa="user-stats-profile-link">Profile</a> 636 + <a slot="accountLink" rel="nofollow" class="dropdown-link" href="/user/account" 637 + data-qa="user-stats-account-link">Account</a> 638 + <a slot="logoutLink" class="dropdown-link" data-RtHeaderManager="logoutLink:click" href="#logout" 639 + data-qa="user-stats-logout-link">Log Out</a> 640 + </rt-header-user-info> 641 + </li> 642 + </ul> 643 + 644 + <rt-header-nav slot="nav-dropdowns"> 645 + 646 + <button aria-label="Open aRTi" class="arti-desktop" data-ArtiManager="btnArti:click" slot="arti-desktop"> 647 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 648 + </button> 649 + 650 + <rt-header-nav-item slot="movies" data-qa="masthead:movies-dvds"> 651 + <a class="unset" slot="link" href="/browse/movies_in_theaters/sort:popular" 652 + data-qa="masthead:movies-dvds-link" data-AdsGlobalNavTakeoverManager="text"> 653 + Movies 654 + </a> 655 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="movies-menu"> 656 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-in-theaters"> 657 + <p slot="title" class="h4" data-qa="movies-in-theaters-main-link"><a class="unset" 658 + href="/browse/movies_in_theaters/sort:popular">Movies in theaters</a></p> 659 + <ul slot="links"> 660 + <li data-qa="in-theaters-item"> 661 + <a href="/browse/movies_in_theaters/sort:newest" data-qa="opening-this-week-link">Opening This 662 + Week</a> 663 + </li> 664 + <li data-qa="in-theaters-item"> 665 + <a href="/browse/movies_in_theaters/sort:top_box_office" data-qa="top-box-office-link">Top Box 666 + Office</a> 667 + </li> 668 + <li data-qa="in-theaters-item"> 669 + <a href="/browse/movies_coming_soon/" data-qa="coming-soon-link">Coming Soon to Theaters</a> 670 + </li> 671 + <li data-qa="in-theaters-item"> 672 + <a href="/browse/movies_in_theaters/critics:certified_fresh~sort:popular" 673 + data-qa="certified-fresh-link">Certified Fresh Movies</a> 674 + </li> 675 + </ul> 676 + </rt-header-nav-item-dropdown-list> 677 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-on-dvd-streaming"> 678 + <p slot="title" class="h4" data-qa="dvd-streaming-main-link"><a class="unset" 679 + href="/browse/movies_at_home">Movies at Home</a></p> 680 + <ul slot="links"> 681 + 682 + <li data-qa="movies-at-home-item"> 683 + <a href="/browse/movies_at_home/affiliates:fandango-at-home" data-qa="fandango-at-home-link">Fandango 684 + at Home</a> 685 + </li> 686 + 687 + <li data-qa="movies-at-home-item"> 688 + <a href="/browse/movies_at_home/affiliates:peacock" data-qa="peacock-link">Peacock</a> 689 + </li> 690 + 691 + <li data-qa="movies-at-home-item"> 692 + <a href="/browse/movies_at_home/affiliates:netflix" data-qa="netflix-link">Netflix</a> 693 + </li> 694 + 695 + <li data-qa="movies-at-home-item"> 696 + <a href="/browse/movies_at_home/affiliates:apple-tv-plus" data-qa="apple-tv-link">Apple TV+</a> 697 + </li> 698 + 699 + <li data-qa="movies-at-home-item"> 700 + <a href="/browse/movies_at_home/affiliates:prime-video" data-qa="prime-video-link">Prime Video</a> 701 + </li> 702 + 703 + <li data-qa="movies-at-home-item"> 704 + <a href="/browse/movies_at_home/sort:popular" data-qa="most-popular-streaming-movies-link">Most 705 + Popular Streaming movies</a> 706 + </li> 707 + 708 + <li data-qa="movies-at-home-item"> 709 + <a href="/browse/movies_at_home/critics:certified_fresh" 710 + data-qa="certified-fresh-movies-link">Certified Fresh movies</a> 711 + </li> 712 + 713 + <li data-qa="movies-at-home-item"> 714 + <a href="/browse/movies_at_home" data-qa="browse-all-link">Browse all</a> 715 + </li> 716 + 717 + </ul> 718 + </rt-header-nav-item-dropdown-list> 719 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-more"> 720 + <p slot="title" class="h4">More</p> 721 + <ul slot="links"> 722 + <li data-qa="what-to-watch-item"> 723 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch" class="what-to-watch" 724 + data-qa="what-to-watch-link">What to Watch<rt-badge>New</rt-badge></a> 725 + </li> 726 + </ul> 727 + </rt-header-nav-item-dropdown-list> 728 + 729 + <rt-header-nav-item-dropdown-list slot="column" cfp> 730 + <p slot="title" class="h4">Certified fresh picks</p> 731 + <ul slot="links" class="cfp-wrap" data-qa="header-certified-fresh-picks" 732 + data-curation="rt-nav-list-cf-picks"> 733 + 734 + <li data-qa="cert-fresh-item"> 735 + 736 + <a class="cfp-tile" href="/m/twinless" data-qa="cert-fresh-link"> 737 + <tile-dynamic data-qa="tile"> 738 + <rt-img alt="Twinless poster image" slot="image" 739 + src="https://resizing.flixster.com/j7lw2KeY9_XyfZQdqRZGku7_9C8=/206x305/v2/https://resizing.flixster.com/uxoeWz7uWmeYIV94_SzEV_osqe4=/fit-in/180x240/v2/https://resizing.flixster.com/VlylB3xT2RIYmRivMx37O3yD76Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" 740 + loading="lazy"></rt-img> 741 + <div slot="caption" data-track="scores"> 742 + <div class="score-wrap"> 743 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 744 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 745 + </div> 746 + <span class="p--small">Twinless</span> 747 + <span class="sr-only">Link to Twinless</span> 748 + </div> 749 + </tile-dynamic> 750 + </a> 751 + </li> 752 + 753 + 754 + <li data-qa="cert-fresh-item"> 755 + 756 + <a class="cfp-tile" href="/m/hamilton_2020" data-qa="cert-fresh-link"> 757 + <tile-dynamic data-qa="tile"> 758 + <rt-img alt="Hamilton poster image" slot="image" 759 + src="https://resizing.flixster.com/1woquJmQfEhWCZtm7GcH0NMHsYA=/206x305/v2/https://resizing.flixster.com/PeAJ5ZpF5qB98ZiX6ixNDCgW2P0=/fit-in/180x240/v2/https://resizing.flixster.com/VmBvlTk8-z7pQvDZXTgSdj93WDE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" 760 + loading="lazy"></rt-img> 761 + <div slot="caption" data-track="scores"> 762 + <div class="score-wrap"> 763 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 764 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 765 + </div> 766 + <span class="p--small">Hamilton</span> 767 + <span class="sr-only">Link to Hamilton</span> 768 + </div> 769 + </tile-dynamic> 770 + </a> 771 + </li> 772 + 773 + 774 + <li data-qa="cert-fresh-item"> 775 + 776 + <a class="cfp-tile" href="/m/the_thursday_murder_club" data-qa="cert-fresh-link"> 777 + <tile-dynamic data-qa="tile"> 778 + <rt-img alt="The Thursday Murder Club poster image" slot="image" 779 + src="https://resizing.flixster.com/jeeldFGcfSMgG09ey5VB7TCFiek=/206x305/v2/https://resizing.flixster.com/9LXDkCzIBBNEiPURkB9t6VefF5Q=/fit-in/180x240/v2/https://resizing.flixster.com/rwdeR5xIiN0k7SWr6yXdnmb6zP8=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" 780 + loading="lazy"></rt-img> 781 + <div slot="caption" data-track="scores"> 782 + <div class="score-wrap"> 783 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 784 + <rt-text class="critics-score" size="1" context="label">76%</rt-text> 785 + </div> 786 + <span class="p--small">The Thursday Murder Club</span> 787 + <span class="sr-only">Link to The Thursday Murder Club</span> 788 + </div> 789 + </tile-dynamic> 790 + </a> 791 + </li> 792 + 793 + </ul> 794 + </rt-header-nav-item-dropdown-list> 795 + 796 + </rt-header-nav-item-dropdown> 797 + </rt-header-nav-item> 798 + 799 + <rt-header-nav-item slot="tv" data-qa="masthead:tv"> 800 + <a class="unset" slot="link" href="/browse/tv_series_browse/sort:popular" data-qa="masthead:tv-link" 801 + data-AdsGlobalNavTakeoverManager="text"> 802 + Tv shows 803 + </a> 804 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="tv-menu"> 805 + 806 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list1"> 807 + <p slot="title" class="h4" data-curation="rt-hp-text-list-3"> 808 + New TV Tonight 809 + </p> 810 + <ul slot="links" class="score-list-wrap"> 811 + 812 + <li data-qa="list-item"> 813 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 814 + <div class="score-wrap"> 815 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 816 + 817 + <rt-text class="critics-score" context="label" size="1" 818 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 819 + 820 + </div> 821 + <span> 822 + 823 + Task: Season 1 824 + 825 + </span> 826 + </a> 827 + </li> 828 + 829 + <li data-qa="list-item"> 830 + <a class="score-list-item" href="/tv/the_walking_dead_daryl_dixon/s03" data-qa="list-item-link"> 831 + <div class="score-wrap"> 832 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 833 + 834 + <rt-text class="critics-score" context="label" size="1" 835 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 836 + 837 + </div> 838 + <span> 839 + 840 + The Walking Dead: Daryl Dixon: Season 3 841 + 842 + </span> 843 + </a> 844 + </li> 845 + 846 + <li data-qa="list-item"> 847 + <a class="score-list-item" href="/tv/the_crow_girl/s01" data-qa="list-item-link"> 848 + <div class="score-wrap"> 849 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 850 + 851 + <rt-text class="critics-score" context="label" size="1" 852 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 853 + 854 + </div> 855 + <span> 856 + 857 + The Crow Girl: Season 1 858 + 859 + </span> 860 + </a> 861 + </li> 862 + 863 + <li data-qa="list-item"> 864 + <a class="score-list-item" href="/tv/only_murders_in_the_building/s05" data-qa="list-item-link"> 865 + <div class="score-wrap"> 866 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 867 + 868 + <rt-text class="critics-score-empty" context="label" size="1" 869 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 870 + 871 + </div> 872 + <span> 873 + 874 + Only Murders in the Building: Season 5 875 + 876 + </span> 877 + </a> 878 + </li> 879 + 880 + <li data-qa="list-item"> 881 + <a class="score-list-item" href="/tv/the_girlfriend/s01" data-qa="list-item-link"> 882 + <div class="score-wrap"> 883 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 884 + 885 + <rt-text class="critics-score-empty" context="label" size="1" 886 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 887 + 888 + </div> 889 + <span> 890 + 891 + The Girlfriend: Season 1 892 + 893 + </span> 894 + </a> 895 + </li> 896 + 897 + <li data-qa="list-item"> 898 + <a class="score-list-item" href="/tv/aka_charlie_sheen/s01" data-qa="list-item-link"> 899 + <div class="score-wrap"> 900 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 901 + 902 + <rt-text class="critics-score-empty" context="label" size="1" 903 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 904 + 905 + </div> 906 + <span> 907 + 908 + aka Charlie Sheen: Season 1 909 + 910 + </span> 911 + </a> 912 + </li> 913 + 914 + <li data-qa="list-item"> 915 + <a class="score-list-item" href="/tv/wizards_beyond_waverly_place/s02" data-qa="list-item-link"> 916 + <div class="score-wrap"> 917 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 918 + 919 + <rt-text class="critics-score-empty" context="label" size="1" 920 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 921 + 922 + </div> 923 + <span> 924 + 925 + Wizards Beyond Waverly Place: Season 2 926 + 927 + </span> 928 + </a> 929 + </li> 930 + 931 + <li data-qa="list-item"> 932 + <a class="score-list-item" href="/tv/seen_and_heard_the_history_of_black_television/s01" 933 + data-qa="list-item-link"> 934 + <div class="score-wrap"> 935 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 936 + 937 + <rt-text class="critics-score-empty" context="label" size="1" 938 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 939 + 940 + </div> 941 + <span> 942 + 943 + Seen &amp; Heard: the History of Black Television: Season 1 944 + 945 + </span> 946 + </a> 947 + </li> 948 + 949 + <li data-qa="list-item"> 950 + <a class="score-list-item" href="/tv/the_fragrant_flower_blooms_with_dignity/s01" 951 + data-qa="list-item-link"> 952 + <div class="score-wrap"> 953 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 954 + 955 + <rt-text class="critics-score-empty" context="label" size="1" 956 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 957 + 958 + </div> 959 + <span> 960 + 961 + The Fragrant Flower Blooms With Dignity: Season 1 962 + 963 + </span> 964 + </a> 965 + </li> 966 + 967 + <li data-qa="list-item"> 968 + <a class="score-list-item" href="/tv/guts_and_glory/s01" data-qa="list-item-link"> 969 + <div class="score-wrap"> 970 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 971 + 972 + <rt-text class="critics-score-empty" context="label" size="1" 973 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 974 + 975 + </div> 976 + <span> 977 + 978 + Guts &amp; Glory: Season 1 979 + 980 + </span> 981 + </a> 982 + </li> 983 + 984 + </ul> 985 + <a class="a--short" data-qa="tv-list1-view-all-link" href="/browse/tv_series_browse/sort:newest" 986 + slot="view-all-link"> 987 + View All 988 + </a> 989 + </rt-header-nav-item-dropdown-list> 990 + 991 + 992 + 993 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list2"> 994 + <p slot="title" class="h4" data-curation="rt-hp-text-list-2"> 995 + Most Popular TV on RT 996 + </p> 997 + <ul slot="links" class="score-list-wrap"> 998 + 999 + <li data-qa="list-item"> 1000 + <a class="score-list-item" href="/tv/the_paper_2025/s01" data-qa="list-item-link"> 1001 + <div class="score-wrap"> 1002 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1003 + 1004 + <rt-text class="critics-score" context="label" size="1" 1005 + style="--lineHeight: 1; --letterSpacing: 0.016em;">83%</rt-text> 1006 + 1007 + </div> 1008 + <span> 1009 + 1010 + The Paper: Season 1 1011 + 1012 + </span> 1013 + </a> 1014 + </li> 1015 + 1016 + <li data-qa="list-item"> 1017 + <a class="score-list-item" href="/tv/dexter_resurrection/s01" data-qa="list-item-link"> 1018 + <div class="score-wrap"> 1019 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1020 + 1021 + <rt-text class="critics-score" context="label" size="1" 1022 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1023 + 1024 + </div> 1025 + <span> 1026 + 1027 + Dexter: Resurrection: Season 1 1028 + 1029 + </span> 1030 + </a> 1031 + </li> 1032 + 1033 + <li data-qa="list-item"> 1034 + <a class="score-list-item" href="/tv/alien_earth/s01" data-qa="list-item-link"> 1035 + <div class="score-wrap"> 1036 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1037 + 1038 + <rt-text class="critics-score" context="label" size="1" 1039 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1040 + 1041 + </div> 1042 + <span> 1043 + 1044 + Alien: Earth: Season 1 1045 + 1046 + </span> 1047 + </a> 1048 + </li> 1049 + 1050 + <li data-qa="list-item"> 1051 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 1052 + <div class="score-wrap"> 1053 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1054 + 1055 + <rt-text class="critics-score" context="label" size="1" 1056 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 1057 + 1058 + </div> 1059 + <span> 1060 + 1061 + Task: Season 1 1062 + 1063 + </span> 1064 + </a> 1065 + </li> 1066 + 1067 + <li data-qa="list-item"> 1068 + <a class="score-list-item" href="/tv/wednesday/s02" data-qa="list-item-link"> 1069 + <div class="score-wrap"> 1070 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1071 + 1072 + <rt-text class="critics-score" context="label" size="1" 1073 + style="--lineHeight: 1; --letterSpacing: 0.016em;">87%</rt-text> 1074 + 1075 + </div> 1076 + <span> 1077 + 1078 + Wednesday: Season 2 1079 + 1080 + </span> 1081 + </a> 1082 + </li> 1083 + 1084 + <li data-qa="list-item"> 1085 + <a class="score-list-item" href="/tv/peacemaker_2022/s02" data-qa="list-item-link"> 1086 + <div class="score-wrap"> 1087 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1088 + 1089 + <rt-text class="critics-score" context="label" size="1" 1090 + style="--lineHeight: 1; --letterSpacing: 0.016em;">99%</rt-text> 1091 + 1092 + </div> 1093 + <span> 1094 + 1095 + Peacemaker: Season 2 1096 + 1097 + </span> 1098 + </a> 1099 + </li> 1100 + 1101 + <li data-qa="list-item"> 1102 + <a class="score-list-item" href="/tv/the_terminal_list_dark_wolf/s01" data-qa="list-item-link"> 1103 + <div class="score-wrap"> 1104 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1105 + 1106 + <rt-text class="critics-score" context="label" size="1" 1107 + style="--lineHeight: 1; --letterSpacing: 0.016em;">73%</rt-text> 1108 + 1109 + </div> 1110 + <span> 1111 + 1112 + The Terminal List: Dark Wolf: Season 1 1113 + 1114 + </span> 1115 + </a> 1116 + </li> 1117 + 1118 + <li data-qa="list-item"> 1119 + <a class="score-list-item" href="/tv/hostage_2025/s01" data-qa="list-item-link"> 1120 + <div class="score-wrap"> 1121 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1122 + 1123 + <rt-text class="critics-score" context="label" size="1" 1124 + style="--lineHeight: 1; --letterSpacing: 0.016em;">82%</rt-text> 1125 + 1126 + </div> 1127 + <span> 1128 + 1129 + Hostage: Season 1 1130 + 1131 + </span> 1132 + </a> 1133 + </li> 1134 + 1135 + <li data-qa="list-item"> 1136 + <a class="score-list-item" href="/tv/chief_of_war/s01" data-qa="list-item-link"> 1137 + <div class="score-wrap"> 1138 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1139 + 1140 + <rt-text class="critics-score" context="label" size="1" 1141 + style="--lineHeight: 1; --letterSpacing: 0.016em;">93%</rt-text> 1142 + 1143 + </div> 1144 + <span> 1145 + 1146 + Chief of War: Season 1 1147 + 1148 + </span> 1149 + </a> 1150 + </li> 1151 + 1152 + <li data-qa="list-item"> 1153 + <a class="score-list-item" href="/tv/irish_blood/s01" data-qa="list-item-link"> 1154 + <div class="score-wrap"> 1155 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1156 + 1157 + <rt-text class="critics-score" context="label" size="1" 1158 + style="--lineHeight: 1; --letterSpacing: 0.016em;">100%</rt-text> 1159 + 1160 + </div> 1161 + <span> 1162 + 1163 + Irish Blood: Season 1 1164 + 1165 + </span> 1166 + </a> 1167 + </li> 1168 + 1169 + </ul> 1170 + <a class="a--short" data-qa="tv-list2-view-all-link" href="/browse/tv_series_browse/sort:popular?" 1171 + slot="view-all-link"> 1172 + View All 1173 + </a> 1174 + </rt-header-nav-item-dropdown-list> 1175 + 1176 + 1177 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-more"> 1178 + <p slot="title" class="h4">More</p> 1179 + <ul slot="links"> 1180 + <li> 1181 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" class="what-to-watch" 1182 + data-qa="what-to-watch-link-tv"> 1183 + What to Watch<rt-badge>New</rt-badge> 1184 + </a> 1185 + </li> 1186 + <li> 1187 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-best-link"> 1188 + <span>Best TV Shows</span> 1189 + </a> 1190 + </li> 1191 + <li> 1192 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-popular-link"> 1193 + <span>Most Popular TV</span> 1194 + </a> 1195 + </li> 1196 + <li> 1197 + <a href="/browse/tv_series_browse/affiliates:fandango-at-home" data-qa="tv-fandango-at-home-link"> 1198 + <span>Fandango at Home</span> 1199 + </a> 1200 + </li> 1201 + <li> 1202 + <a href="/browse/tv_series_browse/affiliates:peacock" data-qa="tv-peacock-link"> 1203 + <span>Peacock</span> 1204 + </a> 1205 + </li> 1206 + <li> 1207 + <a href="/browse/tv_series_browse/affiliates:paramount-plus" data-qa="tv-paramount-link"> 1208 + <span>Paramount+</span> 1209 + </a> 1210 + </li> 1211 + <li> 1212 + <a href="/browse/tv_series_browse/affiliates:netflix" data-qa="tv-netflix-link"> 1213 + <span>Netflix</span> 1214 + </a> 1215 + </li> 1216 + <li> 1217 + <a href="/browse/tv_series_browse/affiliates:prime-video" data-qa="tv-prime-video-link"> 1218 + <span>Prime Video</span> 1219 + </a> 1220 + </li> 1221 + <li> 1222 + <a href="/browse/tv_series_browse/affiliates:apple-tv-plus" data-qa="tv-apple-tv-plus-link"> 1223 + <span>Apple TV+</span> 1224 + </a> 1225 + </li> 1226 + </ul> 1227 + </rt-header-nav-item-dropdown-list> 1228 + 1229 + 1230 + <rt-header-nav-item-dropdown-list slot="column" cfp data-qa="header-certified-fresh-pick"> 1231 + <p slot="title" class="h4"> 1232 + Certified fresh pick 1233 + </p> 1234 + <ul slot="links" class="cfp-wrap" data-curation="rt-nav-list-cf-picks"> 1235 + <li> 1236 + 1237 + <a class="cfp-tile" href="/tv/the_paper_2025/s01" data-qa="cert-fresh-link"> 1238 + <tile-dynamic data-qa="tile"> 1239 + <rt-img alt="The Paper: Season 1 poster image" slot="image" 1240 + src="https://resizing.flixster.com/yFijQcjPYUWUelgmiZLHgkXU7hw=/206x305/v2/https://resizing.flixster.com/DFkkHf5pEVX_apKtIQZcoEvI6RU=/fit-in/180x240/v2/https://resizing.flixster.com/texEZJLAG-KcVpfCdkT2R1t4cmE=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" 1241 + loading="lazy"></rt-img> 1242 + <div slot="caption" data-track="scores"> 1243 + <div class="score-wrap"> 1244 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 1245 + <rt-text class="critics-score" size="1" context="label">83%</rt-text> 1246 + </div> 1247 + <span class="p--small">The Paper: Season 1</span> 1248 + <span class="sr-only">Link to The Paper: Season 1</span> 1249 + </div> 1250 + </tile-dynamic> 1251 + </a> 1252 + </li> 1253 + </ul> 1254 + </rt-header-nav-item-dropdown-list> 1255 + 1256 + </rt-header-nav-item-dropdown> 1257 + </rt-header-nav-item> 1258 + 1259 + <rt-header-nav-item slot="shop"> 1260 + <a class="unset" id="appLink" slot="link" href="https://editorial.rottentomatoes.com/article/app/" 1261 + target="_blank" data-qa="masthead:app-link" data-AdsGlobalNavTakeoverManager="text"> 1262 + RT App 1263 + <temporary-display slot="temporary-display" key="app" element="#appLink" event="click"> 1264 + <rt-badge hidden>New</rt-badge> 1265 + </temporary-display> 1266 + </a> 1267 + </rt-header-nav-item> 1268 + 1269 + <rt-header-nav-item slot="news" data-qa="masthead:news"> 1270 + <a class="unset" slot="link" href="https://editorial.rottentomatoes.com/" data-qa="masthead:news-link" 1271 + data-AdsGlobalNavTakeoverManager="text"> 1272 + News 1273 + </a> 1274 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="news-menu"> 1275 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-columns"> 1276 + <p slot="title" class="h4">Columns</p> 1277 + <ul slot="links"> 1278 + <li data-qa="column-item"> 1279 + <a href="https://editorial.rottentomatoes.com/all-time-lists/" data-pageheader="All-Time Lists" 1280 + data-qa="column-link"> 1281 + All-Time Lists 1282 + </a> 1283 + </li> 1284 + <li data-qa="column-item"> 1285 + <a href="https://editorial.rottentomatoes.com/binge-guide/" data-pageheader="Binge Guide" 1286 + data-qa="column-link"> 1287 + Binge Guide 1288 + </a> 1289 + </li> 1290 + <li data-qa="column-item"> 1291 + <a href="https://editorial.rottentomatoes.com/comics-on-tv/" data-pageheader="Comics on TV" 1292 + data-qa="column-link"> 1293 + Comics on TV 1294 + </a> 1295 + </li> 1296 + <li data-qa="column-item"> 1297 + <a href="https://editorial.rottentomatoes.com/countdown/" data-pageheader="Countdown" 1298 + data-qa="column-link"> 1299 + Countdown 1300 + </a> 1301 + </li> 1302 + <li data-qa="column-item"> 1303 + <a href="https://editorial.rottentomatoes.com/five-favorite-films/" 1304 + data-pageheader="Five Favorite Films" data-qa="column-link"> 1305 + Five Favorite Films 1306 + </a> 1307 + </li> 1308 + <li data-qa="column-item"> 1309 + <a href="https://editorial.rottentomatoes.com/video-interviews/" data-pageheader="Video Interviews" 1310 + data-qa="column-link"> 1311 + Video Interviews 1312 + </a> 1313 + </li> 1314 + <li data-qa="column-item"> 1315 + <a href="https://editorial.rottentomatoes.com/weekend-box-office/" 1316 + data-pageheader="Weekend Box Office" data-qa="column-link">Weekend Box Office 1317 + </a> 1318 + </li> 1319 + <li data-qa="column-item"> 1320 + <a href="https://editorial.rottentomatoes.com/weekly-ketchup/" data-pageheader="Weekly Ketchup" 1321 + data-qa="column-link"> 1322 + Weekly Ketchup 1323 + </a> 1324 + </li> 1325 + <li data-qa="column-item"> 1326 + <a href="https://editorial.rottentomatoes.com/what-to-watch/" data-pageheader="What to Watch" 1327 + data-qa="column-link"> 1328 + What to Watch 1329 + </a> 1330 + </li> 1331 + </ul> 1332 + </rt-header-nav-item-dropdown-list> 1333 + 1334 + 1335 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-guides"> 1336 + <p slot="title" class="h4">Guides</p> 1337 + <ul slot="links" class="news-wrap"> 1338 + 1339 + <li data-qa="guides-item"> 1340 + <a class="news-tile" href="https://editorial.rottentomatoes.com/guide/best-football-movies/" 1341 + data-qa="news-link"> 1342 + <tile-dynamic data-qa="tile" orientation="landscape"> 1343 + <rt-img alt="59 Best Football Movies, Ranked by Tomatometer poster image" slot="image" 1344 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/09/600EssentialFootballMovies.png" 1345 + loading="lazy"></rt-img> 1346 + <div slot="caption"> 1347 + <p>59 Best Football Movies, Ranked by Tomatometer</p> 1348 + <span class="sr-only">Link to 59 Best Football Movies, Ranked by Tomatometer</span> 1349 + </div> 1350 + </tile-dynamic> 1351 + </a> 1352 + </li> 1353 + 1354 + <li data-qa="guides-item"> 1355 + <a class="news-tile" 1356 + href="https://editorial.rottentomatoes.com/guide/best-new-rom-coms-romance-movies/" 1357 + data-qa="news-link"> 1358 + <tile-dynamic data-qa="tile" orientation="landscape"> 1359 + <rt-img alt="50 Best New Rom-Coms and Romance Movies poster image" slot="image" 1360 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Best_New_Romcoms600.jpg" 1361 + loading="lazy"></rt-img> 1362 + <div slot="caption"> 1363 + <p>50 Best New Rom-Coms and Romance Movies</p> 1364 + <span class="sr-only">Link to 50 Best New Rom-Coms and Romance Movies</span> 1365 + </div> 1366 + </tile-dynamic> 1367 + </a> 1368 + </li> 1369 + 1370 + </ul> 1371 + <a class="a--short" data-qa="guides-view-all-link" href="https://editorial.rottentomatoes.com/countdown/" 1372 + slot="view-all-link"> 1373 + View All 1374 + </a> 1375 + </rt-header-nav-item-dropdown-list> 1376 + 1377 + 1378 + 1379 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-hubs"> 1380 + <p slot="title" class="h4">Hubs</p> 1381 + <ul slot="links" class="news-wrap"> 1382 + 1383 + <li data-qa="hubs-item"> 1384 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" 1385 + data-qa="news-link"> 1386 + <tile-dynamic data-qa="tile" orientation="landscape"> 1387 + <rt-img alt="What to Watch: In Theaters and On Streaming poster image" slot="image" 1388 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/05/RT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" 1389 + loading="lazy"></rt-img> 1390 + <div slot="caption"> 1391 + <p>What to Watch: In Theaters and On Streaming</p> 1392 + <span class="sr-only">Link to What to Watch: In Theaters and On Streaming</span> 1393 + </div> 1394 + </tile-dynamic> 1395 + </a> 1396 + </li> 1397 + 1398 + <li data-qa="hubs-item"> 1399 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/awards-tour/" 1400 + data-qa="news-link"> 1401 + <tile-dynamic data-qa="tile" orientation="landscape"> 1402 + <rt-img alt="Awards Tour poster image" slot="image" 1403 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/02/RT_AwardsTour_Thumbnail_600x314.jpg" 1404 + loading="lazy"></rt-img> 1405 + <div slot="caption"> 1406 + <p>Awards Tour</p> 1407 + <span class="sr-only">Link to Awards Tour</span> 1408 + </div> 1409 + </tile-dynamic> 1410 + </a> 1411 + </li> 1412 + 1413 + </ul> 1414 + <a class="a--short" data-qa="hubs-view-all-link" href="https://editorial.rottentomatoes.com/rt-hubs/" 1415 + slot="view-all-link"> 1416 + View All 1417 + </a> 1418 + </rt-header-nav-item-dropdown-list> 1419 + 1420 + 1421 + 1422 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-rt-news"> 1423 + <p slot="title" class="h4">RT News</p> 1424 + <ul slot="links" class="news-wrap"> 1425 + 1426 + <li data-qa="rt-news-item"> 1427 + <a class="news-tile" 1428 + href="https://editorial.rottentomatoes.com/article/new-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more/" 1429 + data-qa="news-link"> 1430 + <tile-dynamic data-qa="tile" orientation="landscape"> 1431 + <rt-img 1432 + alt="New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More poster image" 1433 + slot="image" 1434 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/New_Streaming_September_2025-Rep.jpg" 1435 + loading="lazy"></rt-img> 1436 + <div slot="caption"> 1437 + <p>New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, 1438 + Disney+ and More</p> 1439 + <span class="sr-only">Link to New Movies and Shows Streaming in September: What to watch on 1440 + Netflix, Prime Video, HBO Max, Disney+ and More</span> 1441 + </div> 1442 + </tile-dynamic> 1443 + </a> 1444 + </li> 1445 + 1446 + <li data-qa="rt-news-item"> 1447 + <a class="news-tile" 1448 + href="https://editorial.rottentomatoes.com/article/the-conjuring-last-rites-first-reviews/" 1449 + data-qa="news-link"> 1450 + <tile-dynamic data-qa="tile" orientation="landscape"> 1451 + <rt-img 1452 + alt="<em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off poster image" 1453 + slot="image" 1454 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/09/Conjuring_Last_Rites_Reviews-Rep.jpg" 1455 + loading="lazy"></rt-img> 1456 + <div slot="caption"> 1457 + <p><em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off</p> 1458 + <span class="sr-only">Link to <em>The Conjuring: Last Rites</em> First Reviews: A Frightful, 1459 + Fitting Send-off</span> 1460 + </div> 1461 + </tile-dynamic> 1462 + </a> 1463 + </li> 1464 + 1465 + </ul> 1466 + <a class="a--short" data-qa="rt-news-view-all-link" href="https://editorial.rottentomatoes.com/news/" 1467 + slot="view-all-link"> 1468 + View All 1469 + </a> 1470 + </rt-header-nav-item-dropdown-list> 1471 + 1472 + </rt-header-nav-item-dropdown> 1473 + </rt-header-nav-item> 1474 + 1475 + <rt-header-nav-item slot="showtimes"> 1476 + <a class="unset" slot="link" href="https://www.fandango.com/movies-in-theaters?a=13036" target="_blank" 1477 + rel="noopener" data-qa="masthead:tickets-showtimes-link" data-AdsGlobalNavTakeoverManager="text"> 1478 + Showtimes 1479 + </a> 1480 + </rt-header-nav-item> 1481 + </rt-header-nav> 1482 + 1483 + </rt-header> 1484 + 1485 + <ads-global-nav-takeover-manager></ads-global-nav-takeover-manager> 1486 + <section class="trending-bar"> 1487 + 1488 + 1489 + <ad-unit hidden id="trending_bar_ad" unit-display="desktop" unit-type="trendinggraphic"> 1490 + <div slot="ad-inject"></div> 1491 + </ad-unit> 1492 + <div id="trending-bar-start" class="trending-list-wrap" data-qa="trending-bar"> 1493 + <ul class="list-inline trending-bar__list" data-curation="rt-nav-trending" data-qa="trending-bar-list"> 1494 + <li class="trending-bar__header">Trending on RT</li> 1495 + 1496 + <li><a class="trending-bar__link" 1497 + href="https://editorial.rottentomatoes.com/article/2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores/" 1498 + data-qa="trending-bar-item"> Emmy Noms </a></li> 1499 + 1500 + <li><a class="trending-bar__link" 1501 + href="https://editorial.rottentomatoes.com/article/movie-re-releases-calendar/" 1502 + data-qa="trending-bar-item"> Re-Release Calendar </a></li> 1503 + 1504 + <li><a class="trending-bar__link" 1505 + href="https://editorial.rottentomatoes.com/article/renewed-and-cancelled-tv-shows-2025/" 1506 + data-qa="trending-bar-item"> Renewed and Cancelled TV </a></li> 1507 + 1508 + <li><a class="trending-bar__link" href="https://editorial.rottentomatoes.com/article/app/" 1509 + data-qa="trending-bar-item"> The Rotten Tomatoes App </a></li> 1510 + 1511 + </ul> 1512 + <div class="trending-bar__social" data-qa="trending-bar-social-list"> 1513 + <social-media-icons theme="light" size="14"></social-media-icons> 1514 + </div> 1515 + </div> 1516 + </section> 1517 + 1518 + 1519 + 1520 + 1521 + <main id="main_container" class="container rt-layout__content"> 1522 + <div id="main-page-content"> 1523 + 1524 + 1525 + 1526 + 1527 + 1528 + <div class="search__container layout"> 1529 + <section class="search__main layout__column layout__column--main"> 1530 + 1531 + <h1 class="unset"> 1532 + <rt-text context="heading" size="1.625">Search Results for : "peacemaker"</rt-text> 1533 + </h1> 1534 + 1535 + <search-page-manager searchQuery="peacemaker"></search-page-manager> 1536 + <div id="search-results" data-qa="search-results"> 1537 + <nav class="search__nav" slot="searchNav"> 1538 + <ul class="searchNav__filters"> 1539 + <li class="js-search-filter searchNav__filter searchNav__filter-all searchNav__filter--active" 1540 + data-filter="all" tabindex="0"><span data-qa="search-filter-text">All</span></li> 1541 + 1542 + <li class="js-search-filter searchNav__filter" data-filter="movie" tabindex="0"><span 1543 + data-qa="search-filter-text">Movies (23)</span></li> 1544 + 1545 + 1546 + <li class="js-search-filter searchNav__filter" data-filter="tvSeries" tabindex="0"><span 1547 + data-qa="search-filter-text">TV Shows (7)</span></li> 1548 + 1549 + 1550 + <li class="js-search-filter searchNav__filter" data-filter="celebrity" tabindex="0"><span 1551 + data-qa="search-filter-text">Celebrities (6)</span></li> 1552 + 1553 + </ul> 1554 + </nav> 1555 + 1556 + 1557 + <search-page-result skeleton="panel" type="movie" data-qa="search-result"> 1558 + <h2 class="unset" slot="title" data-qa="search-result-title"> 1559 + <rt-text context="heading" size="1.25"> Movies </rt-text> 1560 + </h2> 1561 + <button slot="prev-btn" data-qa="paging-btn-prev">Prev</button> 1562 + <button slot="next-btn" data-qa="paging-btn-next">Next</button> 1563 + <ul slot="list"> 1564 + 1565 + <search-page-media-row skeleton="panel" cast="George Clooney,Nicole Kidman,Marcel Iures" 1566 + data-qa="data-row" endyear="" releaseyear="1997" startyear="" tomatometeriscertified="false" 1567 + tomatometerscore="49" tomatometersentiment="NEGATIVE"> 1568 + <a href="https://www.rottentomatoes.com/m/1079516-peacemaker" class="unset" data-qa="thumbnail-link" 1569 + slot="thumbnail"> 1570 + <img alt="The Peacemaker" loading="lazy" 1571 + src="https://resizing.flixster.com/i7uhe_5HmxsFme8g4xpk6rrTpOk=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p19891_p_v11_al.jpg"> 1572 + </a> 1573 + <a href="https://www.rottentomatoes.com/m/1079516-peacemaker" class="unset" data-qa="info-name" 1574 + slot="title"> 1575 + The Peacemaker 1576 + </a> 1577 + </search-page-media-row> 1578 + 1579 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="2023" 1580 + startyear="" tomatometeriscertified="false" tomatometerscore="" tomatometersentiment=""> 1581 + <a href="https://www.rottentomatoes.com/m/peacemaker" class="unset" data-qa="thumbnail-link" 1582 + slot="thumbnail"> 1583 + <img alt="Peacemaker" loading="lazy" 1584 + src="https://resizing.flixster.com/FifmckbmDWBU26ZxH4_lLiS66z4=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p24452284_p_v13_aa.jpg"> 1585 + </a> 1586 + <a href="https://www.rottentomatoes.com/m/peacemaker" class="unset" data-qa="info-name" 1587 + slot="title"> 1588 + Peacemaker 1589 + </a> 1590 + </search-page-media-row> 1591 + 1592 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="2016" 1593 + startyear="" tomatometeriscertified="false" tomatometerscore="87" tomatometersentiment="POSITIVE"> 1594 + <a href="https://www.rottentomatoes.com/m/the_peacemaker_2018" class="unset" 1595 + data-qa="thumbnail-link" slot="thumbnail"> 1596 + <img alt="The Peacemaker" loading="lazy" 1597 + src="https://resizing.flixster.com/57Z1o_MPNtDPHudShZjMopFfQ_o=/fit-in/80x126/v2/https://resizing.flixster.com/87BNtC1RS1AzWpX2mdbXRAZAHiw=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzFkOTkyMTdjLWM4OTMtNDBiMS04OGI2LTZiOGRmYWIwYWNjZS53ZWJw"> 1598 + </a> 1599 + <a href="https://www.rottentomatoes.com/m/the_peacemaker_2018" class="unset" data-qa="info-name" 1600 + slot="title"> 1601 + The Peacemaker 1602 + </a> 1603 + </search-page-media-row> 1604 + 1605 + <search-page-media-row skeleton="panel" cast="Robert Forster,Lance Edwards,Hilary Shepard" 1606 + data-qa="data-row" endyear="" releaseyear="1990" startyear="" tomatometeriscertified="false" 1607 + tomatometerscore="" tomatometersentiment=""> 1608 + <a href="https://www.rottentomatoes.com/m/1016079-peacemaker" class="unset" data-qa="thumbnail-link" 1609 + slot="thumbnail"> 1610 + <img alt="Peacemaker" loading="lazy" 1611 + src="https://resizing.flixster.com/_tGJbBoysB6Gu0VFvwctHpl6L2Q=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p12586_p_v7_aa.jpg"> 1612 + </a> 1613 + <a href="https://www.rottentomatoes.com/m/1016079-peacemaker" class="unset" data-qa="info-name" 1614 + slot="title"> 1615 + Peacemaker 1616 + </a> 1617 + </search-page-media-row> 1618 + 1619 + <search-page-media-row skeleton="panel" cast="Yuki Kaji,Yumiko Kobayashi,Jรดji Nakata" 1620 + data-qa="data-row" endyear="" releaseyear="2018" startyear="" tomatometeriscertified="false" 1621 + tomatometerscore="" tomatometersentiment=""> 1622 + <a href="https://www.rottentomatoes.com/m/peacemaker_kurogane_belief" class="unset" 1623 + data-qa="thumbnail-link" slot="thumbnail"> 1624 + <img alt="Peacemaker Kurogane: Belief" loading="lazy" 1625 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1626 + </a> 1627 + <a href="https://www.rottentomatoes.com/m/peacemaker_kurogane_belief" class="unset" 1628 + data-qa="info-name" slot="title"> 1629 + Peacemaker Kurogane: Belief 1630 + </a> 1631 + </search-page-media-row> 1632 + 1633 + <search-page-media-row skeleton="panel" cast="Emeka Ike,Emeka Enyiocha,Angela Phillips" 1634 + data-qa="data-row" endyear="" releaseyear="2015" startyear="" tomatometeriscertified="false" 1635 + tomatometerscore="" tomatometersentiment=""> 1636 + <a href="https://www.rottentomatoes.com/m/uloma_the_peacemaker" class="unset" 1637 + data-qa="thumbnail-link" slot="thumbnail"> 1638 + <img alt="Uloma the Peacemaker" loading="lazy" 1639 + src="https://resizing.flixster.com/K-Uyv5b-TMkPka8rj_LqyLfZD0U=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p16449680_p_v8_ac.jpg"> 1640 + </a> 1641 + <a href="https://www.rottentomatoes.com/m/uloma_the_peacemaker" class="unset" data-qa="info-name" 1642 + slot="title"> 1643 + Uloma the Peacemaker 1644 + </a> 1645 + </search-page-media-row> 1646 + 1647 + <search-page-media-row skeleton="panel" cast="James Mitchell,Rosemarie Stack,Jan Merlin" 1648 + data-qa="data-row" endyear="" releaseyear="1956" startyear="" tomatometeriscertified="false" 1649 + tomatometerscore="" tomatometersentiment=""> 1650 + <a href="https://www.rottentomatoes.com/m/the_peacemaker" class="unset" data-qa="thumbnail-link" 1651 + slot="thumbnail"> 1652 + <img alt="The Peacemaker" loading="lazy" 1653 + src="https://resizing.flixster.com/TYOqAw5VyXeOWOHM6acK5KteyRU=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p2038_p_v8_aa.jpg"> 1654 + </a> 1655 + <a href="https://www.rottentomatoes.com/m/the_peacemaker" class="unset" data-qa="info-name" 1656 + slot="title"> 1657 + The Peacemaker 1658 + </a> 1659 + </search-page-media-row> 1660 + 1661 + <search-page-media-row skeleton="panel" cast="Onny Michael,Frederick Leonard,Beray Macwizu" 1662 + data-qa="data-row" endyear="" releaseyear="2021" startyear="" tomatometeriscertified="false" 1663 + tomatometerscore="" tomatometersentiment=""> 1664 + <a href="https://www.rottentomatoes.com/m/golden_heart" class="unset" data-qa="thumbnail-link" 1665 + slot="thumbnail"> 1666 + <img alt="Golden Heart" loading="lazy" 1667 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1668 + </a> 1669 + <a href="https://www.rottentomatoes.com/m/golden_heart" class="unset" data-qa="info-name" 1670 + slot="title"> 1671 + Golden Heart 1672 + </a> 1673 + </search-page-media-row> 1674 + 1675 + <search-page-media-row skeleton="panel" cast="Jennifer Eliogu,Kelechi Udegbe,Mary Lazarus" 1676 + data-qa="data-row" endyear="" releaseyear="2021" startyear="" tomatometeriscertified="false" 1677 + tomatometerscore="" tomatometersentiment=""> 1678 + <a href="https://www.rottentomatoes.com/m/sinners_2021" class="unset" data-qa="thumbnail-link" 1679 + slot="thumbnail"> 1680 + <img alt="Sinners" loading="lazy" 1681 + src="https://resizing.flixster.com/orLFZ-NVwmIUPctXGGUsKZXEPuk=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20810527_v_v9_aa.jpg"> 1682 + </a> 1683 + <a href="https://www.rottentomatoes.com/m/sinners_2021" class="unset" data-qa="info-name" 1684 + slot="title"> 1685 + Sinners 1686 + </a> 1687 + </search-page-media-row> 1688 + 1689 + <search-page-media-row skeleton="panel" cast="Kenneth Okolie,Mary Lazarus" data-qa="data-row" 1690 + endyear="" releaseyear="2018" startyear="" tomatometeriscertified="false" tomatometerscore="" 1691 + tomatometersentiment=""> 1692 + <a href="https://www.rottentomatoes.com/m/i_saw_the_devil" class="unset" data-qa="thumbnail-link" 1693 + slot="thumbnail"> 1694 + <img alt="I Saw the Devil" loading="lazy" 1695 + src="https://resizing.flixster.com/Lyl7Iw3_uWEl0CmGZuH_1gM7kSM=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p19057469_v_v8_aa.jpg"> 1696 + </a> 1697 + <a href="https://www.rottentomatoes.com/m/i_saw_the_devil" class="unset" data-qa="info-name" 1698 + slot="title"> 1699 + I Saw the Devil 1700 + </a> 1701 + </search-page-media-row> 1702 + 1703 + </ul> 1704 + <button slot="more-btn" data-qa="search-more-btn">More Movies...</button> 1705 + </search-page-result> 1706 + 1707 + 1708 + 1709 + <search-page-result skeleton="panel" type="tvSeries" data-qa="search-result"> 1710 + <h2 class="unset" slot="title" data-qa="search-result-title"> 1711 + <rt-text context="heading" size="1.25"> TV shows </rt-text> 1712 + </h2> 1713 + <button slot="prev-btn" data-qa="paging-btn-prev">Prev</button> 1714 + <button slot="next-btn" data-qa="paging-btn-next">Next</button> 1715 + <ul slot="list"> 1716 + 1717 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="" 1718 + startyear="2022" tomatometeriscertified="false" tomatometerscore="96" 1719 + tomatometersentiment="POSITIVE"> 1720 + <a href="https://www.rottentomatoes.com/tv/peacemaker_2022" class="unset" data-qa="thumbnail-link" 1721 + slot="thumbnail"> 1722 + <img alt="Peacemaker" loading="lazy" 1723 + src="https://resizing.flixster.com/IvieKvEZLCexNMA3tSUj2dCDIjk=/fit-in/80x126/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw=="> 1724 + </a> 1725 + <a href="https://www.rottentomatoes.com/tv/peacemaker_2022" class="unset" data-qa="info-name" 1726 + slot="title"> 1727 + Peacemaker 1728 + </a> 1729 + </search-page-media-row> 1730 + 1731 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="" 1732 + startyear="2020" tomatometeriscertified="false" tomatometerscore="" tomatometersentiment=""> 1733 + <a href="https://www.rottentomatoes.com/tv/peacemaker" class="unset" data-qa="thumbnail-link" 1734 + slot="thumbnail"> 1735 + <img alt="Peacemaker" loading="lazy" 1736 + src="https://resizing.flixster.com/D03p_C1KJHhZ4GQ07tzprwv7hQs=/fit-in/80x126/v2/https://resizing.flixster.com/NrEddnxNqQ5ArFwvUWxbcLW2-hU=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvUlRUVjEwMTE0NDkud2VicA=="> 1737 + </a> 1738 + <a href="https://www.rottentomatoes.com/tv/peacemaker" class="unset" data-qa="info-name" 1739 + slot="title"> 1740 + Peacemaker 1741 + </a> 1742 + </search-page-media-row> 1743 + 1744 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="" 1745 + startyear="2010" tomatometeriscertified="false" tomatometerscore="" tomatometersentiment=""> 1746 + <a href="https://www.rottentomatoes.com/tv/la_gang_wars_the_peacemaker" class="unset" 1747 + data-qa="thumbnail-link" slot="thumbnail"> 1748 + <img alt="L.A. Gang Wars: The Peacemaker" loading="lazy" 1749 + src="https://resizing.flixster.com/VQzveXPV2xFuHoVgjMv99xuw7gE=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p8393398_b_v13_ai.jpg"> 1750 + </a> 1751 + <a href="https://www.rottentomatoes.com/tv/la_gang_wars_the_peacemaker" class="unset" 1752 + data-qa="info-name" slot="title"> 1753 + L.A. Gang Wars: The Peacemaker 1754 + </a> 1755 + </search-page-media-row> 1756 + 1757 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="2003" releaseyear="" 1758 + startyear="2003" tomatometeriscertified="false" tomatometerscore="" tomatometersentiment=""> 1759 + <a href="https://www.rottentomatoes.com/tv/peacemakers" class="unset" data-qa="thumbnail-link" 1760 + slot="thumbnail"> 1761 + <img alt="Peacemakers" loading="lazy" 1762 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1763 + </a> 1764 + <a href="https://www.rottentomatoes.com/tv/peacemakers" class="unset" data-qa="info-name" 1765 + slot="title"> 1766 + Peacemakers 1767 + </a> 1768 + </search-page-media-row> 1769 + 1770 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="" 1771 + startyear="1992" tomatometeriscertified="false" tomatometerscore="" tomatometersentiment=""> 1772 + <a href="https://www.rottentomatoes.com/tv/pagemaker_40_learning_system" class="unset" 1773 + data-qa="thumbnail-link" slot="thumbnail"> 1774 + <img alt="Pagemaker 4.0 Learning System" loading="lazy" 1775 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1776 + </a> 1777 + <a href="https://www.rottentomatoes.com/tv/pagemaker_40_learning_system" class="unset" 1778 + data-qa="info-name" slot="title"> 1779 + Pagemaker 4.0 Learning System 1780 + </a> 1781 + </search-page-media-row> 1782 + 1783 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="" 1784 + startyear="" tomatometeriscertified="false" tomatometerscore="" tomatometersentiment=""> 1785 + <a href="https://www.rottentomatoes.com/tv/pagemaker_30_learning_system" class="unset" 1786 + data-qa="thumbnail-link" slot="thumbnail"> 1787 + <img alt="Pagemaker 3.0 Learning System" loading="lazy" 1788 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1789 + </a> 1790 + <a href="https://www.rottentomatoes.com/tv/pagemaker_30_learning_system" class="unset" 1791 + data-qa="info-name" slot="title"> 1792 + Pagemaker 3.0 Learning System 1793 + </a> 1794 + </search-page-media-row> 1795 + 1796 + <search-page-media-row skeleton="panel" cast="" data-qa="data-row" endyear="" releaseyear="" 1797 + startyear="2006" tomatometeriscertified="false" tomatometerscore="" tomatometersentiment=""> 1798 + <a href="https://www.rottentomatoes.com/tv/the_facemakers" class="unset" data-qa="thumbnail-link" 1799 + slot="thumbnail"> 1800 + <img alt="The Facemakers" loading="lazy" 1801 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1802 + </a> 1803 + <a href="https://www.rottentomatoes.com/tv/the_facemakers" class="unset" data-qa="info-name" 1804 + slot="title"> 1805 + The Facemakers 1806 + </a> 1807 + </search-page-media-row> 1808 + 1809 + </ul> 1810 + <button slot="more-btn" data-qa="search-more-btn">More TV Shows...</button> 1811 + </search-page-result> 1812 + 1813 + 1814 + <ad-unit hidden unit-display="mobile" unit-type="interscroller" no-retry> 1815 + <aside slot="ad-inject" class="center mobile-interscroller"></aside> 1816 + </ad-unit> 1817 + 1818 + 1819 + <search-page-result skeleton="panel" type="celebrity" data-qa="search-result"> 1820 + <h2 class="unset" slot="title" data-qa="search-result-title"> 1821 + <rt-text context="heading" size="1.25"> Celebrities </rt-text> 1822 + </h2> 1823 + <button slot="prev-btn" data-qa="paging-btn-prev">Prev</button> 1824 + <button slot="next-btn" data-qa="paging-btn-next">Next</button> 1825 + <ul slot="list"> 1826 + 1827 + <search-page-item-row skeleton="panel" data-qa="data-row"> 1828 + <a href="/celebrity/peacemaker_unamba" class="unset" data-qa="thumbnail-link" slot="thumbnail"> 1829 + <img alt="Peacemaker Unamba" loading="lazy" 1830 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1831 + </a> 1832 + <a href="/celebrity/peacemaker_unamba" class="unset" data-qa="info-name" slot="title"> 1833 + <span>Peacemaker Unamba</span> 1834 + </a> 1835 + </search-page-item-row> 1836 + 1837 + <search-page-item-row skeleton="panel" data-qa="data-row"> 1838 + <a href="/celebrity/peacemaker_simon" class="unset" data-qa="thumbnail-link" slot="thumbnail"> 1839 + <img alt="Peacemaker Simon" loading="lazy" 1840 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1841 + </a> 1842 + <a href="/celebrity/peacemaker_simon" class="unset" data-qa="info-name" slot="title"> 1843 + <span>Peacemaker Simon</span> 1844 + </a> 1845 + </search-page-item-row> 1846 + 1847 + <search-page-item-row skeleton="panel" data-qa="data-row"> 1848 + <a href="/celebrity/simon_peacemaker" class="unset" data-qa="thumbnail-link" slot="thumbnail"> 1849 + <img alt="Simon Peacemaker" loading="lazy" 1850 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1851 + </a> 1852 + <a href="/celebrity/simon_peacemaker" class="unset" data-qa="info-name" slot="title"> 1853 + <span>Simon Peacemaker</span> 1854 + </a> 1855 + </search-page-item-row> 1856 + 1857 + <search-page-item-row skeleton="panel" data-qa="data-row"> 1858 + <a href="/celebrity/simeon_peacemaker" class="unset" data-qa="thumbnail-link" slot="thumbnail"> 1859 + <img alt="Simeon Peacemaker" loading="lazy" 1860 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1861 + </a> 1862 + <a href="/celebrity/simeon_peacemaker" class="unset" data-qa="info-name" slot="title"> 1863 + <span>Simeon Peacemaker</span> 1864 + </a> 1865 + </search-page-item-row> 1866 + 1867 + <search-page-item-row skeleton="panel" data-qa="data-row"> 1868 + <a href="/celebrity/simon_peacemaker_onyimba" class="unset" data-qa="thumbnail-link" 1869 + slot="thumbnail"> 1870 + <img alt="Simon Peacemaker Onyimba" loading="lazy" 1871 + src="https://images.fandango.com/cms/assets/5d84d010-59b1-11ea-b175-791e911be53d--rt-poster-defaultgif.gif"> 1872 + </a> 1873 + <a href="/celebrity/simon_peacemaker_onyimba" class="unset" data-qa="info-name" slot="title"> 1874 + <span>Simon Peacemaker Onyimba</span> 1875 + </a> 1876 + </search-page-item-row> 1877 + 1878 + <search-page-item-row skeleton="panel" data-qa="data-row"> 1879 + <a href="/celebrity/770727094" class="unset" data-qa="thumbnail-link" slot="thumbnail"> 1880 + <img alt="Gerry &amp; The Pacemakers" loading="lazy" 1881 + src="https://resizing.flixster.com/tSp76M6rhz9cdyt6bxhAAL43QIA=/fit-in/80x126/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/v9/AllPhotos/449176/449176_v9_ba.jpg"> 1882 + </a> 1883 + <a href="/celebrity/770727094" class="unset" data-qa="info-name" slot="title"> 1884 + <span>Gerry &amp; The Pacemakers</span> 1885 + </a> 1886 + </search-page-item-row> 1887 + 1888 + </ul> 1889 + <button slot="more-btn" data-qa="search-more-btn">More Celebrities...</button> 1890 + </search-page-result> 1891 + 1892 + </div> 1893 + 1894 + </section> 1895 + 1896 + <section class="search__sidebar layout__column layout__column--sidebar"> 1897 + <div class="adColumn__content"> 1898 + <ad-unit hidden unit-display="desktop" unit-type="topmulti" show-ad-link> 1899 + <div slot="ad-inject"></div> 1900 + </ad-unit> 1901 + </div> 1902 + </section> 1903 + 1904 + </div> 1905 + 1906 + 1907 + </div> 1908 + 1909 + <back-to-top hidden></back-to-top> 1910 + </main> 1911 + 1912 + <ad-unit hidden unit-display="desktop" unit-type="bottombanner"> 1913 + <div slot="ad-inject" class="sleaderboard_wrapper"></div> 1914 + </ad-unit> 1915 + 1916 + <ads-global-skin-takeover-manager></ads-global-skin-takeover-manager> 1917 + 1918 + <footer-manager></footer-manager> 1919 + <footer class="footer container" data-PagePicturesManager="footer"> 1920 + 1921 + <mobile-app-desktop-footer env="production" hidden></mobile-app-desktop-footer> 1922 + 1923 + 1924 + <div class="footer__content-desktop-block" data-qa="footer:section"> 1925 + <div class="footer__content-group"> 1926 + <ul class="footer__links-list"> 1927 + <li class="footer__links-list-item"> 1928 + <a href="/help_desk" data-qa="footer:link-helpdesk">Help</a> 1929 + </li> 1930 + <li class="footer__links-list-item"> 1931 + <a href="/about" data-qa="footer:link-about">About Rotten Tomatoes</a> 1932 + </li> 1933 + <li id="footer-feedback" class="footer__links-list-item" data-qa="footer-feedback-desktop"> 1934 + 1935 + </li> 1936 + </ul> 1937 + </div> 1938 + <div class="footer__content-group"> 1939 + <ul class="footer__links-list"> 1940 + <li class="footer__links-list-item"> 1941 + <a href="/critics/criteria" data-qa="footer:link-critic-submission">Critic Submission</a> 1942 + </li> 1943 + <li class="footer__links-list-item"> 1944 + <a href="/help_desk/licensing" data-qa="footer:link-licensing">Licensing</a> 1945 + </li> 1946 + <li class="footer__links-list-item"> 1947 + <a href="https://together.nbcuni.com/advertise/?utm_source=rotten_tomatoes&amp;utm_medium=referral&amp;utm_campaign=property_ad_pages&amp;utm_content=footer" 1948 + target="_blank" rel="noopener" data-qa="footer:link-ads">Advertise With Us</a> 1949 + </li> 1950 + <li class="footer__links-list-item"> 1951 + <a href="//www.fandango.com/careers" target="_blank" rel="noopener" 1952 + data-qa="footer:link-careers">Careers</a> 1953 + </li> 1954 + </ul> 1955 + </div> 1956 + <div class="footer__content-group footer__newsletter-block"> 1957 + <p class="h3 footer__content-group-title"> 1958 + <rt-icon icon="mail" size="1.25" style="fill:#fff"></rt-icon>&ensp;Join the Newsletter 1959 + </p> 1960 + <p class="footer__newsletter-copy">Get the freshest reviews, news, and more delivered right to your inbox!</p> 1961 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-desktop"> 1962 + Join The Newsletter 1963 + </rt-button> 1964 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 1965 + rel="noopener"> 1966 + Join The Newsletter 1967 + </a> 1968 + </div> 1969 + <div class="footer__content-group footer__social-block" data-qa="footer:social"> 1970 + <p class="h3 footer__content-group-title">Follow Us</p> 1971 + <social-media-icons theme="light" size="20"></social-media-icons> 1972 + </div> 1973 + </div> 1974 + 1975 + <div class="footer__content-mobile-block" data-qa="mfooter:section"> 1976 + <div class="footer__content-group"> 1977 + <div class="mobile-app-cta-wrap"> 1978 + 1979 + <mobile-app-cta env="production" showandroid="false" showios="true" hidden></mobile-app-cta> 1980 + </div> 1981 + 1982 + <p class="footer__copyright-legal" data-qa="mfooter:copyright"> 1983 + <rt-text size="0.75">Copyright &copy; Fandango. All rights reserved.</rt-text> 1984 + </p> 1985 + <p> 1986 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-mobile">Join The 1987 + Newsletter</rt-button> 1988 + </p> 1989 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 1990 + rel="noopener">Join The Newsletter</a> 1991 + 1992 + <ul class="footer__links-list list-inline"> 1993 + <li class="footer__links-list-item"> 1994 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 1995 + data-qa="mfooter:link-privacy-policy"> 1996 + Privacy Policy 1997 + </a> 1998 + </li> 1999 + <li class="footer__links-list-item"> 2000 + <a href="/policies/terms-and-policies" data-qa="mfooter:link-terms-policies">Terms and Policies</a> 2001 + </li> 2002 + <li class="footer__links-list-item"> 2003 + <img data-FooterManager="iconCCPA" 2004 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 2005 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 2006 + <!-- OneTrust Cookies Settings button start --> 2007 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings mobile" 2008 + data-qa="footer-cookie-settings-mobile">Cookie Settings</a> 2009 + <!-- OneTrust Cookies Settings button end --> 2010 + </li> 2011 + <li class="footer__links-list-item"> 2012 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 2013 + rel="noopener" data-qa="mfooter:link-california-notice">California Notice</a> 2014 + </li> 2015 + <li class="footer__links-list-item"> 2016 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 2017 + rel="noopener" data-qa="mfooter:link-adChoices">Ad Choices</a> 2018 + </li> 2019 + <li id="footer-feedback-mobile" class="footer__links-list-item" data-qa="footer-feedback-mobile"> 2020 + 2021 + </li> 2022 + <li class="footer__links-list-item"> 2023 + <a href="/faq#accessibility" data-qa="mfooter:link-accessibility">Accessibility</a> 2024 + </li> 2025 + </ul> 2026 + </div> 2027 + </div> 2028 + <div class="footer__copyright"> 2029 + <ul class="footer__links-list list-inline list-inline--separator" data-qa="footer:links-list-privacy"> 2030 + <li class="footer__links-list-item version" data-qa="footer:version"> 2031 + <span>V3.1</span> 2032 + </li> 2033 + <li class="footer__links-list-item"> 2034 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 2035 + data-qa="footer:link-privacy-policy"> 2036 + Privacy Policy 2037 + </a> 2038 + </li> 2039 + <li class="footer__links-list-item"> 2040 + <a href="/policies/terms-and-policies" data-qa="footer:link-terms-policies">Terms and Policies</a> 2041 + </li> 2042 + <li class="footer__links-list-item"> 2043 + <img data-FooterManager="iconCCPA" 2044 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 2045 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 2046 + <!-- OneTrust Cookies Settings button start --> 2047 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings" 2048 + data-qa="footer-cookie-settings-desktop">Cookie Settings</a> 2049 + <!-- OneTrust Cookies Settings button end --> 2050 + </li> 2051 + <li class="footer__links-list-item"> 2052 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 2053 + rel="noopener" data-qa="footer:link-california-notice">California Notice</a> 2054 + </li> 2055 + <li class="footer__links-list-item"> 2056 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 2057 + rel="noopener" data-qa="footer:link-adChoices">Ad Choices</a> 2058 + </li> 2059 + <li class="footer__links-list-item"> 2060 + <a href="/faq#accessibility" data-qa="footer:link-accessibility">Accessibility</a> 2061 + </li> 2062 + </ul> 2063 + <span class="footer__copyright-legal" data-qa="footer:copyright"> 2064 + Copyright &copy; Fandango. A Division of 2065 + <a href="https://www.nbcuniversal.com" target="_blank" rel="noopener" 2066 + data-qa="footer:link-nbcuniversal">NBCUniversal</a>. 2067 + All rights reserved. 2068 + </span> 2069 + </div> 2070 + </footer> 2071 + 2072 + </div> 2073 + 2074 + 2075 + <iframe-container hidden data-ArtiManager="iframeContainer:close,resize" 2076 + data-iframe-src="https://arti.rottentomatoes.com?theme=iframe" theme="widget"> 2077 + <span slot="logo"><img src="/assets/pizza-pie/images/arti.041d204c4a4.svg" alt="Logo"></img><span>beta</span></span> 2078 + <rt-button aria-label="New chat" data-ArtiManager="btnNewChat:click" id="artiNewChatButton" slot="optBtns" 2079 + theme="transparent" title="New chat"> 2080 + <rt-icon icon="new-chat" size="1.25" image></rt-icon> 2081 + </rt-button> 2082 + </iframe-container> 2083 + <arti-manager></arti-manager> 2084 + 2085 + 2086 + 2087 + 2088 + <script type="text/javascript"> 2089 + (function (root) { 2090 + /* -- Data -- */ 2091 + root.RottenTomatoes || (root.RottenTomatoes = {}); 2092 + root.RottenTomatoes.context || (root.RottenTomatoes.context = {}); 2093 + root.RottenTomatoes.context.resetCookies = ["AMCVS_8CF467C25245AE3F0A490D4C%40AdobeOrg", "AMCV_8CF467C25245AE3F0A490D4C%40AdobeOrg", "WRIgnore", "WRUIDAWS", "__CT_Data", "__gads", "_admrla", "_awl", "_cs_c", "_cs_id", "_cs_mk", "_cs_s", "_fbp", "_ga", "_gat_gtmTracker", "_gid", "aam_uuid", "akamai_generated_location", "auth_token", "auth_user", "auth_client", "check", "cognito", "fblo_326803741017", "fbm_326803741017", "fbsr_326803741017", "gpv_Page", "id_token", "is_auth", "loginPlatform", "mbox", "notice_behavior", "optimizelyBuckets", "optimizelyEndUserId", "optimizelyPendingLogEvents", "optimizelySegments", "s_cc", "s_dayslastvisit", "s_dayslastvisit_s", "s_invisit", "s_prevPage", "s_sq", "s_vnum", "cognito", "fbm_326803741017", "fbsr_326803741017", "id_token", "JSESSIONID", "QSI_HistorySession", "QSI_SI_8up4dWDOtjAg0hn_intercept", "_ALGOLIA", "__Host-color-scheme", "__Host-theme-options", "__host_color_scheme", "__host_theme_options", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "_chartbeat4", "_chartbeat5", "_sp_id.47f3", "_sp_ses.47f3", "_v__chartbeat3", "adops_master_kvs", "akacd_RTReplatform", "algoliaUT", "cognito", "cl_duid", "fbsr_326803741017", "id_token", "mps_uuid", "session_id", "_admrla", "_awl", "_ga", "_gid", "aam_uuid", "cognito", "fbm_326803741017", "id_token", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "adops_master_kvs", "cognito", "id_token", "krg_crb", "krg_uid", "mps_uuid"]; 2094 + root.Fandango || (root.Fandango = {}); 2095 + root.Fandango.dtmData = { "webVersion": "node", "rtVersion": 3.1, "loggedInStatus": "", "customerId": "", "pageName": "trailers" }; 2096 + root.RottenTomatoes.criticPage = { "vanity": "jacqueline-andriakos", "type": "movies", "typeDisplayName": "Movie", "totalReviews": "", "criticID": "15412" }; 2097 + root.RottenTomatoes.context.video = { "file": "https:\u002F\u002Flink.theplatform.com\u002Fs\u002FNGweTC\u002Fmedia\u002FhggLQwXPvYKW?formats=MPEG-DASH+widevine,M3U+appleHlsEncryption,M3U+none,MPEG-DASH+none,MPEG4,MP3", "type": "hls", "description": "Your mission, should you decide to accept it, is to enjoy all the best scenes in the Mission Impossible franchise-- from the tensest scenes to the craziest stunts, watch Ethan Hunt (Tom Cruise) and the rest of the IMF accept some of the most dangerous missions of all time. What was your favorite Mission Impossible scene? Sound off in the comments below!", "image": "https:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F874\u002F155\u002Fthumb_FF413F40-AAD7-4F37-92E2-03F3C0857CCC.jpg", "isRedBand": false, "mediaid": "2239667267748", "mpxId": "2239667267748", "publicId": "hggLQwXPvYKW", "title": "Movieclips: Mission Impossible's Best Scenes", "default": false, "label": "0", "duration": "32:30", "durationInSeconds": "1950.574", "emsMediaType": "Movie", "emsId": "cd9060e7-5a09-3f24-af38-8d57a821db37", "overviewPageUrl": "\u002Fm\u002Fmission_impossible_rogue_nation", "videoPageUrl": "\u002Fm\u002Fmission_impossible_rogue_nation\u002Fvideos\u002FhggLQwXPvYKW", "videoType": "CLIP", "adobeDataLayer": { "content": { "id": "fandango_2239667267748", "length": "1950.574", "type": "vod", "player_name": "jw", "sdk_version": "web: 6.51.0", "channel": "movie", "originator": "paramount pictures", "name": "movieclips: mission impossible's best scenes", "rating": "not adult", "stream_type": "video" }, "media_params": { "genre": "action, adventure, mystery & thriller", "show_type": 2 } }, "comscore": { "labelmapping": "c3=\"rottentomatoes.com\", ns_st_st=\"Rotten Tomatoes\", ns_st_pu=\"Paramount Pictures\", ns_st_pr=\"Mission: Impossible - Rogue Nation\", ns_st_sn=\"*null\", ns_st_en=\"*null\", ns_st_ge=\"Action,Adventure,Mystery & Thriller\", ns_st_ia=\"0\", ns_st_ce=\"0\", ns_st_ddt=\"2015\", ns_st_tdt=\"2015\"" }, "thumbnail": "https:\u002F\u002Fresizing.flixster.com\u002F9dX2bYPEHEy-jggcJR989Ts_CIE=\u002F270x160\u002Fv2\u002Fhttps:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F874\u002F155\u002Fthumb_FF413F40-AAD7-4F37-92E2-03F3C0857CCC.jpg" }; 2098 + root.RottenTomatoes.context.videoClipsJson = { "count": 12 }; 2099 + root.RottenTomatoes.context.review = { "mediaType": "movie", "title": "Andhadhun", "emsId": "30ee238d-cdc4-320f-adfa-474133f2390e", "type": "user", "sort": undefined, "reviewsCount": 0, "pageInfo": undefined, "reviewerDefaultImg": "https:\u002F\u002Fimages.fandango.com\u002Fcms\u002Fassets\u002F5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png", "reviewerDefaultImgWidth": "100" }; 2100 + root.RottenTomatoes.context.useCursorPagination = true; 2101 + root.RottenTomatoes.context.verifiedTooltip = undefined; 2102 + root.RottenTomatoes.context.layout = { "header": { "movies": { "moviesAtHome": { "tarsSlug": "rt-nav-movies-at-home", "linkList": [{ "header": "Fandango at Home", "slug": "fandango-at-home-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:fandango-at-home" }, { "header": "Peacock", "slug": "peacock-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:peacock" }, { "header": "Netflix", "slug": "netflix-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:netflix" }, { "header": "Apple TV+", "slug": "apple-tv-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:apple-tv-plus" }, { "header": "Prime Video", "slug": "prime-video-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:prime-video" }, { "header": "Most Popular Streaming movies", "slug": "most-popular-streaming-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, { "header": "Certified Fresh movies", "slug": "certified-fresh-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh" }, { "header": "Browse all", "slug": "browse-all-link", "url": "\u002Fbrowse\u002Fmovies_at_home" }] } }, "editorial": { "guides": { "posts": [{ "ID": 161109, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F09\u002F600EssentialFootballMovies.png" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-football-movies\u002F", "status": "publish", "title": "59 Best Football Movies, Ranked by Tomatometer", "type": "guide" }, { "ID": 253470, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FBest_New_Romcoms600.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-new-rom-coms-romance-movies\u002F", "status": "publish", "title": "50 Best New Rom-Coms and Romance Movies", "type": "guide" }], "title": "Guides", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F" }, "hubs": { "posts": [{ "ID": 237626, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002FRT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fwhat-to-watch\u002F", "status": "publish", "title": "What to Watch: In Theaters and On Streaming", "type": "rt-hub" }, { "ID": 140214, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F02\u002FRT_AwardsTour_Thumbnail_600x314.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fawards-tour\u002F", "status": "publish", "title": "Awards Tour", "type": "rt-hub" }], "title": "Hubs", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hubs\u002F" }, "news": { "posts": [{ "ID": 273082, "author": 79, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FNew_Streaming_September_2025-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fnew-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more\u002F", "status": "publish", "title": "New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More", "type": "article" }, { "ID": 273326, "author": 669, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F09\u002FConjuring_Last_Rites_Reviews-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fthe-conjuring-last-rites-first-reviews\u002F", "status": "publish", "title": "\u003Cem\u003EThe Conjuring: Last Rites\u003C\u002Fem\u003E First Reviews: A Frightful, Fitting Send-off", "type": "article" }], "title": "RT News", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fnews\u002F" } }, "trendingTarsSlug": "rt-nav-trending", "trending": [{ "header": "Emmy Noms", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002F2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores\u002F" }, { "header": "Re-Release Calendar", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fmovie-re-releases-calendar\u002F" }, { "header": "Renewed and Cancelled TV", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Frenewed-and-cancelled-tv-shows-2025\u002F" }, { "header": "The Rotten Tomatoes App ", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fapp\u002F" }], "certifiedMedia": { "certifiedFreshTvSeason": { "header": null, "media": { "url": "\u002Ftv\u002Fthe_paper_2025\u002Fs01", "name": "The Paper: Season 1", "score": 83, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FyFijQcjPYUWUelgmiZLHgkXU7hw=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FDFkkHf5pEVX_apKtIQZcoEvI6RU=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FtexEZJLAG-KcVpfCdkT2R1t4cmE=\u002Fems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" }, "tarsSlug": "rt-nav-list-cf-picks" }, "certifiedFreshMovieInTheater": { "header": null, "media": { "url": "\u002Fm\u002Ftwinless", "name": "Twinless", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002Fj7lw2KeY9_XyfZQdqRZGku7_9C8=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FuxoeWz7uWmeYIV94_SzEV_osqe4=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVlylB3xT2RIYmRivMx37O3yD76Q=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" } }, "certifiedFreshMovieInTheater4": { "header": null, "media": { "url": "\u002Fm\u002Fhamilton_2020", "name": "Hamilton", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002F1woquJmQfEhWCZtm7GcH0NMHsYA=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FPeAJ5ZpF5qB98ZiX6ixNDCgW2P0=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVmBvlTk8-z7pQvDZXTgSdj93WDE=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" } }, "certifiedFreshMovieAtHome": { "header": null, "media": { "url": "\u002Fm\u002Fthe_thursday_murder_club", "name": "The Thursday Murder Club", "score": 76, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FjeeldFGcfSMgG09ey5VB7TCFiek=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002F9LXDkCzIBBNEiPURkB9t6VefF5Q=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FrwdeR5xIiN0k7SWr6yXdnmb6zP8=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" } }, "tarsSlug": "rt-nav-list-cf-picks" }, "tvLists": { "newTvTonight": { "tarsSlug": "rt-hp-text-list-3", "title": "New TV Tonight", "shows": [{ "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "The Walking Dead: Daryl Dixon: Season 3", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_walking_dead_daryl_dixon\u002Fs03" }, { "title": "The Crow Girl: Season 1", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_crow_girl\u002Fs01" }, { "title": "Only Murders in the Building: Season 5", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fonly_murders_in_the_building\u002Fs05" }, { "title": "The Girlfriend: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_girlfriend\u002Fs01" }, { "title": "aka Charlie Sheen: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Faka_charlie_sheen\u002Fs01" }, { "title": "Wizards Beyond Waverly Place: Season 2", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fwizards_beyond_waverly_place\u002Fs02" }, { "title": "Seen & Heard: the History of Black Television: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fseen_and_heard_the_history_of_black_television\u002Fs01" }, { "title": "The Fragrant Flower Blooms With Dignity: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_fragrant_flower_blooms_with_dignity\u002Fs01" }, { "title": "Guts & Glory: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fguts_and_glory\u002Fs01" }] }, "mostPopularTvOnRt": { "tarsSlug": "rt-hp-text-list-2", "title": "Most Popular TV on RT", "shows": [{ "title": "The Paper: Season 1", "tomatometer": { "tomatometer": 83, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fthe_paper_2025\u002Fs01" }, { "title": "Dexter: Resurrection: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fdexter_resurrection\u002Fs01" }, { "title": "Alien: Earth: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Falien_earth\u002Fs01" }, { "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "Wednesday: Season 2", "tomatometer": { "tomatometer": 87, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fwednesday\u002Fs02" }, { "title": "Peacemaker: Season 2", "tomatometer": { "tomatometer": 99, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fpeacemaker_2022\u002Fs02" }, { "title": "The Terminal List: Dark Wolf: Season 1", "tomatometer": { "tomatometer": 73, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_terminal_list_dark_wolf\u002Fs01" }, { "title": "Hostage: Season 1", "tomatometer": { "tomatometer": 82, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fhostage_2025\u002Fs01" }, { "title": "Chief of War: Season 1", "tomatometer": { "tomatometer": 93, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fchief_of_war\u002Fs01" }, { "title": "Irish Blood: Season 1", "tomatometer": { "tomatometer": 100, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Firish_blood\u002Fs01" }] } } }, "links": { "moviesInTheaters": { "certifiedFresh": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fcritics:certified_fresh~sort:popular", "comingSoon": "\u002Fbrowse\u002Fmovies_coming_soon\u002F", "openingThisWeek": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fsort:newest", "title": "\u002Fbrowse\u002Fmovies_in_theaters", "topBoxOffice": "\u002Fbrowse\u002Fmovies_in_theaters" }, "onDvdAndStreaming": { "all": "\u002Fbrowse\u002Fmovies_at_home\u002F", "certifiedFresh": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh", "title": "\u002Fbrowse\u002Fmovies_at_home\u002F", "top": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, "moreMovies": { "topMovies": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular", "trailers": "\u002Ftrailers" }, "tvTonight": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:newest", "tvPopular": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "moreTv": { "topTv": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "certifiedFresh": "\u002Fbrowse\u002Ftv_series_browse\u002Fcritics:fresh" }, "editorial": { "allTimeLists": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fall-time-lists\u002F", "bingeGuide": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fbinge-guide\u002F", "comicsOnTv": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcomics-on-tv\u002F", "countdown": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F", "fiveFavoriteFilms": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Ffive-favorite-films\u002F", "videoInterviews": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fvideo-interviews\u002F", "weekendBoxOffice": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekend-box-office\u002F", "weeklyKetchup": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekly-ketchup\u002F", "whatToWatch": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwhat-to-watch\u002F" }, "advertisingFooter": "https:\u002F\u002Ftogether.nbcuni.com\u002Fadvertise\u002F?utm_source=rotten_tomatoes&utm_medium=referral&utm_campaign=property_ad_pages&utm_content=footer", "californiaNotice": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcalifornia-consumer-privacy-act", "careers": "\u002F\u002Fwww.fandango.com\u002Fcareers", "cookieManagement": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcookies#accordionheader2", "fandangoAbout": "https:\u002F\u002Fwww.fandango.com\u002Fabout-us", "privacyPolicy": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Ffandango-privacy-policy", "termsPolicies": "\u002Fpolicies\u002Fterms-and-policies" } }; 2103 + root.RottenTomatoes.thirdParty = { "chartBeat": { "auth": "64558", "domain": "rottentomatoes.com" }, "mpx": { "accountPid": "NGweTC", "playerPid": "y__7B0iQTi4P", "playerPidPDK6": "pdk6_y__7B0iQTi4P", "accountId": "2474312077" }, "algoliaSearch": { "aId": "79FRDP12PN", "sId": "175588f6e5f8319b27702e4cc4013561" }, "cognito": { "upId": "us-west-2_4L0ZX4b1U", "clientId": "7pu48v8i2n25t4vhes0edck31c" } }; 2104 + root.RottenTomatoes.serviceWorker = { "isServiceWokerOn": true }; 2105 + root.__RT__ || (root.__RT__ = {}); 2106 + root.__RT__.featureFlags = { "adsCarouselHP": false, "adsCarouselHPSlug": "rt-sponsored-carousel-list-mcdonalds-hp", "adsCarouselOP": false, "adsCarouselOPSlug": "rt-sponsored-carousel-list-mcdonalds-op", "adsMockDLP": false, "adsPages": "none", "adsSponsoredOverrideOP": true, "adsSponsoredOverrideOPSlugs": "rt-sponsored-override-op-starz", "adsVideoSpotlightHP": false, "appleSigninEnabled": true, "artiEnabled": true, "authPasswordEnabled": true, "authVerboseLogs": false, "bypassCriticValidationEnabled": false, "castAndCrewEnabled": true, "cookieConsentServiceEnabled": false, "crssoEnabled": false, "editorialApiDisabled": false, "faqUpdatesEnabled": true, "legacyBridge": true, "logVerboseEnabled": false, "mobileAppAndroid": "https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.rottentomatoes.android", "mobileAppIos": "https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Frotten-tomatoes-movies-tv\u002Fid6673916573", "mobileAppIosMeta": "app-id=6673916573, app-argument=https:\u002F\u002Fwww.rottentomatoes.com\u002F", "mobileNavEnabled": true, "oneTrustJwtApiUrl": "https:\u002F\u002Fonetrustjwt.services.fandango.com", "oneTrustJwtServiceEnabled": false, "pageJsonEnabled": false, "profilesFeaturesEnabled": false, "profilesUsernameEnabled": false, "redesignMediaHeroEnabled": true, "redesignMoreLikeThis": true, "redesignSortTable": true, "trafficAndroidEnabled": false, "trafficSafariEnabled": true, "userMigrationEnabled": true, "versantFreewheelEnabled": false, "versantMpsDomain": "app.mps.vsnt.net", "versantMpsEnabled": false, "versantOneTrustScriptBlock": "\u003C!-- OneTrust Cookies Consent Notice start for rottentomatoes.com --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fconsent\u002F01978557-1604-76a7-ad7c-18216757cf52-test\u002FotSDKStub.js\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" data-domain-script=\"01978557-1604-76a7-ad7c-18216757cf52-test\" integrity=\"sha384-Exfxdyaw5OnsUlHEKlNlz7OwgVCyLlitAtJsDmSNh3LeLlCjWXos3X\u002FCMNUbQ\u002FgA\" crossorigin=\"anonymous\" \u003E\u003C\u002Fscript\u003E \u003Cscript type=\"text\u002Fjavascript\"\u003E function OptanonWrapper() { if (OnetrustActiveGroups.includes('7')) { document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); } } \u003C\u002Fscript\u003E \u003C!-- OneTrust Cookies Consent Notice end for rottentomatoes.com --\u003E \u003C!-- OneTrust IAB US Privacy (USP) --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fopt-out\u002FotCCPAiab.js\" id=\"privacyCookie\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" ccpa-opt-out-ids=\"USP\" ccpa-opt-out-geo=\"US\" ccpa-opt-out-lspa=\"false\"\u003E\u003C\u002Fscript\u003E \u003C!-- OneTrust IAB US Privacy (USP) end --\u003E", "videoGeoFencingEnabled": true }; 2107 + root.RottenTomatoes.context.adsMockDLP = false; 2108 + root.RottenTomatoes.context.req = { "params": {}, "query": { "search": "peacemaker" }, "route": {}, "url": "\u002Fsearch?search=peacemaker", "secure": false, "buildVersion": undefined }; 2109 + root.RottenTomatoes.context.config = {}; 2110 + root.BK = { "PageName": "http:\u002F\u002Fwww.rottentomatoes.com\u002Fm\u002Fnight_swim", "SiteID": 37528, "SiteSection": "movie", "MovieId": "fb5d1291-c772-301c-b3ff-c50dfefaeaaa", "MovieTitle": "Night Swim" }; 2111 + root.RottenTomatoes.dtmData = { "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "fb5d1291-c772-301c-b3ff-c50dfefaeaaa", "lifeCycleWindow": "OUT_OF_THEATERS", "pageName": "rt | movies | overview | Night Swim", "titleGenre": "Horror", "titleId": "fb5d1291-c772-301c-b3ff-c50dfefaeaaa", "titleName": "Night Swim", "titleType": "Movie" }; 2112 + root.RottenTomatoes.context.gptSite = "search"; 2113 + 2114 + }(this)); 2115 + </script> 2116 + 2117 + <script fetchpriority="high" src="/assets/pizza-pie/javascripts/bundles/roma/preload.18bcfff8e54.js"></script> 2118 + 2119 + <script src="/assets/pizza-pie/javascripts/bundles/roma/vendors.a4cc402b78a.js"></script> 2120 + 2121 + <script src="/assets/pizza-pie/javascripts/bundles/roma/default.24dc1977289.js"></script> 2122 + 2123 + 2124 + <script async data-SearchResultsNavManager="script:load" 2125 + src="https://cdn.jsdelivr.net/npm/algoliasearch@4/dist/algoliasearch-lite.umd.js"> 2126 + </script> 2127 + <script src="/assets/pizza-pie/javascripts/templates/roma/searchNav.a3288ea5efe.js"></script> 2128 + <script src="/assets/pizza-pie/javascripts/bundles/roma/searchNav.6a836b4ca81.js"></script> 2129 + 2130 + 2131 + 2132 + <script src="/assets/pizza-pie/javascripts/bundles/search.3cbb7fc9cd1.js"></script> 2133 + 2134 + 2135 + 2136 + 2137 + <script> 2138 + if (window.mps && typeof window.mps.writeFooter === 'function') { 2139 + window.mps.writeFooter(); 2140 + } 2141 + </script> 2142 + 2143 + 2144 + 2145 + 2146 + 2147 + <script> 2148 + window._satellite && _satellite.pageBottom(); 2149 + </script> 2150 + 2151 + 2152 + </body> 2153 + 2154 + </html>
+3150
internal/services/samples/series_overview.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" 3 + prefix="fb: http://www.facebook.com/2008/fbml og: http://opengraphprotocol.org/schema/"> 4 + 5 + <head prefix="og: http://ogp.me/ns# flixstertomatoes: http://ogp.me/ns/apps/flixstertomatoes#"> 6 + 7 + 8 + 9 + 10 + <script charset="UTF-8" crossorigin="anonymous" data-domain-script="7e979733-6841-4fce-9182-515fac69187f" 11 + integrity="sha384-TKdmlzVmoD70HzftTw4WtOzIBL5mNx8mXSRzEvwrWjpIJ7FZ/EuX758yMDWXtRUN" 12 + src="https://cdn.cookielaw.org/consent/7e979733-6841-4fce-9182-515fac69187f/otSDKStub.js" type="text/javascript"> 13 + </script> 14 + <script type="text/javascript"> 15 + function OptanonWrapper() { 16 + if (OnetrustActiveGroups.includes('7')) { 17 + document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); 18 + } 19 + } 20 + </script> 21 + 22 + 23 + 24 + <script ccpa-opt-out-ids="USP" ccpa-opt-out-geo="US" ccpa-opt-out-lspa="false" charset="UTF-8" 25 + src="https://cdn.cookielaw.org/opt-out/otCCPAiab.js" type="text/javascript"> 26 + </script> 27 + 28 + 29 + 30 + 31 + 32 + 33 + <script src="/assets/pizza-pie/javascripts/bundles/roma/rt-common.js?single"></script> 34 + 35 + 36 + 37 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 38 + <meta http-equiv="x-ua-compatible" content="ie=edge"> 39 + <meta name="viewport" content="width=device-width, initial-scale=1"> 40 + 41 + <link rel="shortcut icon" sizes="76x76" type="image/x-icon" 42 + href="https://www.rottentomatoes.com/assets/pizza-pie/images/favicon.ico" /> 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + <title>Peacemaker (2022) | Rotten Tomatoes</title> 51 + 52 + 53 + <meta name="description" 54 + content="Discover reviews, ratings, and trailers for Peacemaker (2022) on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 55 + 56 + <meta name="twitter:card" content="summary" /> 57 + 58 + <meta name="twitter:image" 59 + content="https://resizing.flixster.com/UHglta_RX5_h8fsHS2BljZkvfZk=/206x305/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==" /> 60 + 61 + <meta name="twitter:title" content="Peacemaker (2022) | Rotten Tomatoes" /> 62 + 63 + <meta name="twitter:text:title" content="Peacemaker (2022) | Rotten Tomatoes" /> 64 + 65 + <meta name="twitter:description" 66 + content="Discover reviews, ratings, and trailers for Peacemaker (2022) on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 67 + 68 + 69 + 70 + <meta property="og:site_name" content="Rotten Tomatoes" /> 71 + 72 + <meta property="og:title" content="Peacemaker (2022) | Rotten Tomatoes" /> 73 + 74 + <meta property="og:description" 75 + content="Discover reviews, ratings, and trailers for Peacemaker (2022) on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 76 + 77 + <meta property="og:type" content="video.tv_show" /> 78 + 79 + <meta property="og:url" content="https://www.rottentomatoes.com/tv/peacemaker_2022" /> 80 + 81 + <meta property="og:image" 82 + content="https://resizing.flixster.com/UHglta_RX5_h8fsHS2BljZkvfZk=/206x305/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==" /> 83 + 84 + <meta property="og:locale" content="en_US" /> 85 + 86 + 87 + 88 + <link rel="canonical" href="https://www.rottentomatoes.com/tv/peacemaker_2022" /> 89 + 90 + 91 + <script> 92 + var dataLayer = dataLayer || []; 93 + var RottenTomatoes = RottenTomatoes || {}; 94 + RottenTomatoes.dtmData = { "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed", "Series Title": "Peacemaker (2022)", "pageName": "rt | tv | series | Peacemaker (2022)", "titleGenre": "Comedy", "titleId": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed", "titleName": "Peacemaker (2022)", "titleType": "Tv" }; 95 + dataLayer.push({ "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed", "Series Title": "Peacemaker (2022)", "pageName": "rt | tv | series | Peacemaker (2022)", "titleGenre": "Comedy", "titleId": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed", "titleName": "Peacemaker (2022)", "titleType": "Tv" }); 96 + </script> 97 + 98 + 99 + 100 + <script id="mps-page-integration"> 101 + window.mpscall = { "cag[certified_fresh]": "0", "cag[fresh_rotten]": "rotten", "cag[genre]": "Comedy|Action", "cag[release]": "Jan 13, 2022", "cag[movieshow]": "Peacemaker", "cag[score]": "null", "cag[urlid]": "/peacemaker_2022", "cat": "tv|series", "field[env]": "production", "field[rtid]": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed", "title": "Peacemaker (2022)", "type": "series", "site": "rottentomatoes-web" }; 102 + var mpsopts = { 'host': 'mps.nbcuni.com', 'updatecorrelator': 1 }; 103 + var mps = mps || {}; mps._ext = mps._ext || {}; mps._adsheld = []; mps._queue = mps._queue || {}; mps._queue.mpsloaded = mps._queue.mpsloaded || []; mps._queue.mpsinit = mps._queue.mpsinit || []; mps._queue.gptloaded = mps._queue.gptloaded || []; mps._queue.adload = mps._queue.adload || []; mps._queue.adclone = mps._queue.adclone || []; mps._queue.adview = mps._queue.adview || []; mps._queue.refreshads = mps._queue.refreshads || []; mps.__timer = Date.now || function () { return +new Date }; mps.__intcode = "v2"; if (typeof mps.getAd != "function") mps.getAd = function (adunit) { if (typeof adunit != "string") return false; var slotid = "mps-getad-" + adunit.replace(/\W/g, ""); if (!mps._ext || !mps._ext.loaded) { mps._queue.gptloaded.push(function () { typeof mps._gptfirst == "function" && mps._gptfirst(adunit, slotid); mps.insertAd("#" + slotid, adunit) }); mps._adsheld.push(adunit) } return '<div id="' + slotid + '" class="mps-wrapper" data-mps-fill-slot="' + adunit + '"></div>' }; 104 + </script> 105 + <script src="//mps.nbcuni.com/fetch/ext/load-rottentomatoes-web.js?nowrite=2" id="mps-load"></script> 106 + 107 + 108 + 109 + <script 110 + type="application/ld+json">{"@context":"http://schema.org","@type":"TVSeries","actor":[{"@type":"Person","name":"John Cena","sameAs":"https://www.rottentomatoes.com/celebrity/john_cena","image":"https://resizing.flixster.com/qFr2ZK1qYDkqSmM5eT3nz_n6E_g=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/487578_v9_ba.jpg"},{"@type":"Person","name":"Danielle Brooks","sameAs":"https://www.rottentomatoes.com/celebrity/danielle_brooks","image":"https://resizing.flixster.com/KhnY5vsfjM0vtw0cZL3aNxXbeUE=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/765589_v9_bc.jpg"},{"@type":"Person","name":"Freddie Stroma","sameAs":"https://www.rottentomatoes.com/celebrity/freddie_stroma","image":"https://resizing.flixster.com/Yk2eiDCtamfmNlK-xMa7nmEw_Po=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/GNLZZGG00283ZZD.jpg"},{"@type":"Person","name":"Chukwudi Iwuji","sameAs":"https://www.rottentomatoes.com/celebrity/chukwudi_iwuji","image":"https://resizing.flixster.com/uNAFlG9dNMjJwyMbPDiCsbjkX8I=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/565157_v9_ba.jpg"},{"@type":"Person","name":"Jennifer Holland","sameAs":"https://www.rottentomatoes.com/celebrity/jennifer_holland","image":"https://resizing.flixster.com/-xeYAf0O7fGIQHRx_YkL7vnaMMg=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/331642_v9_bb.jpg"},{"@type":"Person","name":"Steve Agee","sameAs":"https://www.rottentomatoes.com/celebrity/steve_agee","image":"https://resizing.flixster.com/YprPSg0SXNIqq-Wy4UEz4ovBnOw=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/223358_v9_bd.jpg"}],"aggregateRating":{"@type":"AggregateRating","bestRating":"100","description":"The Tomatometer rating โ€“ based on the published opinions of hundreds of film and television critics โ€“ is a trusted measurement of movie and TV programming quality for millions of moviegoers. It represents the percentage of professional critic reviews that are positive for a given film or television show.","name":"Tomatometer","ratingCount":150,"ratingValue":"96","reviewCount":150,"worstRating":"0"},"containsSeason":[{"@type":"TVSeason","name":"Season 2","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02"},{"@type":"TVSeason","name":"Season 1","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s01"}],"contentRating":"TV-MA","dateCreated":"2022-01-13","description":"Discover reviews, ratings, and trailers for Peacemaker (2022) on Rotten Tomatoes. Stay updated with critic and audience scores today!","genre":["Comedy","Action"],"image":"https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==","name":"Peacemaker (2022)","numberOfSeasons":2,"partOfSeries":{"@type":"TVSeries","name":"Peacemaker (2022)","startDate":"2022-01-13","url":"https://www.rottentomatoes.com/tv/peacemaker_2022"},"producer":[{"@type":"Person","name":"James Gunn","sameAs":"https://www.rottentomatoes.com/celebrity/james_gunn","image":"https://images.fandango.com/cms/assets/b0cefeb0-b6a8-11ed-81d8-51a487a38835--poster-default-thumbnail.jpg"},{"@type":"Person","name":"Peter Safran","sameAs":"https://www.rottentomatoes.com/celebrity/peter_safran","image":"https://images.fandango.com/cms/assets/b0cefeb0-b6a8-11ed-81d8-51a487a38835--poster-default-thumbnail.jpg"}],"url":"https://www.rottentomatoes.com/tv/peacemaker_2022","video":{"@type":"VideoObject","thumbnailUrl":"https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg","name":"Peacemaker: Season 2 Trailer - Weeks Ahead","duration":"1:39","sourceOrganization":"MPX","uploadDate":"2025-08-28T16:36:57","description":"","contentUrl":"https://www.rottentomatoes.com/tv/peacemaker_2022/videos/nTePljVEct61"}}</script> 111 + 112 + 113 + <link rel="manifest" href="https://www.rottentomatoes.com/assets/pizza-pie/manifest/manifest.json" /> 114 + 115 + <link rel="apple-touch-icon" 116 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-60.jpg" /> 117 + <link rel="apple-touch-icon" sizes="152x152" 118 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-152.jpg" /> 119 + <link rel="apple-touch-icon" sizes="167x167" 120 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-167.jpg" /> 121 + <link rel="apple-touch-icon" sizes="180x180" 122 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-180.jpg" /> 123 + 124 + 125 + <!-- iOS Smart Banner --> 126 + <meta name="apple-itunes-app" content="app-id=6673916573, app-argument=https://www.rottentomatoes.com/"> 127 + 128 + 129 + 130 + 131 + 132 + 133 + <meta name="google-site-verification" content="VPPXtECgUUeuATBacnqnCm4ydGO99reF-xgNklSbNbc" /> 134 + 135 + 136 + <meta name="msvalidate.01" content="034F16304017CA7DCF45D43850915323" /> 137 + <meta name="theme-color" content="#FA320A"> 138 + 139 + <!-- DNS prefetch --> 140 + <meta http-equiv="x-dns-prefetch-control" content="on"> 141 + 142 + <link rel="dns-prefetch" href="//www.rottentomatoes.com" /> 143 + 144 + 145 + <link rel="preconnect" href="//www.rottentomatoes.com" /> 146 + 147 + 148 + 149 + 150 + <link rel="stylesheet" href="/assets/pizza-pie/stylesheets/bundles/layouts/default.b6077682d41.css" /> 151 + 152 + 153 + 154 + 155 + <link rel="preload" href="/assets/pizza-pie/stylesheets/bundles/pages/tvSeries.ab02677a549.css" as="style" 156 + onload="this.onload=null;this.rel='stylesheet'" /> 157 + 158 + 159 + <script> 160 + window.RottenTomatoes = {}; 161 + window.RTLocals = {}; 162 + window.nunjucksPrecompiled = {}; 163 + window.__RT__ = {}; 164 + </script> 165 + 166 + 167 + 168 + <script src="https://cdn.jwplayer.com/libraries/U8MHzHHR.js"></script> 169 + <script src="https://sb.scorecardresearch.com/c2/plugins/streamingtag_plugin_jwplayer.js"></script> 170 + 171 + 172 + 173 + 174 + 175 + <script>!function (e) { var n = "https://s.go-mpulse.net/boomerang/"; if ("False" == "True") e.BOOMR_config = e.BOOMR_config || {}, e.BOOMR_config.PageParams = e.BOOMR_config.PageParams || {}, e.BOOMR_config.PageParams.pci = !0, n = "https://s2.go-mpulse.net/boomerang/"; if (window.BOOMR_API_key = "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9", function () { function e() { if (!o) { var e = document.createElement("script"); e.id = "boomr-scr-as", e.src = window.BOOMR.url, e.async = !0, i.parentNode.appendChild(e), o = !0 } } function t(e) { o = !0; var n, t, a, r, d = document, O = window; if (window.BOOMR.snippetMethod = e ? "if" : "i", t = function (e, n) { var t = d.createElement("script"); t.id = n || "boomr-if-as", t.src = window.BOOMR.url, BOOMR_lstart = (new Date).getTime(), e = e || d.body, e.appendChild(t) }, !window.addEventListener && window.attachEvent && navigator.userAgent.match(/MSIE [67]\./)) return window.BOOMR.snippetMethod = "s", void t(i.parentNode, "boomr-async"); a = document.createElement("IFRAME"), a.src = "about:blank", a.title = "", a.role = "presentation", a.loading = "eager", r = (a.frameElement || a).style, r.width = 0, r.height = 0, r.border = 0, r.display = "none", i.parentNode.appendChild(a); try { O = a.contentWindow, d = O.document.open() } catch (_) { n = document.domain, a.src = "javascript:var d=document.open();d.domain='" + n + "';void(0);", O = a.contentWindow, d = O.document.open() } if (n) d._boomrl = function () { this.domain = n, t() }, d.write("<bo" + "dy onload='document._boomrl();'>"); else if (O._boomrl = function () { t() }, O.addEventListener) O.addEventListener("load", O._boomrl, !1); else if (O.attachEvent) O.attachEvent("onload", O._boomrl); d.close() } function a(e) { window.BOOMR_onload = e && e.timeStamp || (new Date).getTime() } if (!window.BOOMR || !window.BOOMR.version && !window.BOOMR.snippetExecuted) { window.BOOMR = window.BOOMR || {}, window.BOOMR.snippetStart = (new Date).getTime(), window.BOOMR.snippetExecuted = !0, window.BOOMR.snippetVersion = 12, window.BOOMR.url = n + "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9"; var i = document.currentScript || document.getElementsByTagName("script")[0], o = !1, r = document.createElement("link"); if (r.relList && "function" == typeof r.relList.supports && r.relList.supports("preload") && "as" in r) window.BOOMR.snippetMethod = "p", r.href = window.BOOMR.url, r.rel = "preload", r.as = "script", r.addEventListener("load", e), r.addEventListener("error", function () { t(!0) }), setTimeout(function () { if (!o) t(!0) }, 3e3), BOOMR_lstart = (new Date).getTime(), i.parentNode.appendChild(r); else t(!1); if (window.addEventListener) window.addEventListener("load", a, !1); else if (window.attachEvent) window.attachEvent("onload", a) } }(), "".length > 0) if (e && "performance" in e && e.performance && "function" == typeof e.performance.setResourceTimingBufferSize) e.performance.setResourceTimingBufferSize(); !function () { if (BOOMR = e.BOOMR || {}, BOOMR.plugins = BOOMR.plugins || {}, !BOOMR.plugins.AK) { var n = "" == "true" ? 1 : 0, t = "", a = "eyd6zaauaeceajqacqcoyaaafful3lzp-f-4780c27a5-clienttons-s.akamaihd.net", i = "false" == "true" ? 2 : 1, o = { "ak.v": "39", "ak.cp": "1839344", "ak.ai": parseInt("1226367", 10), "ak.ol": "0", "ak.cr": 18, "ak.ipv": 6, "ak.proto": "h2", "ak.rid": "142d2895", "ak.r": 43883, "ak.a2": n, "ak.m": "dsca", "ak.n": "essl", "ak.bpcip": "2607:ec80:1401:440::", "ak.cport": 62979, "ak.gh": "23.205.103.137", "ak.quicv": "", "ak.tlsv": "tls1.3", "ak.0rtt": "", "ak.0rtt.ed": "", "ak.csrc": "-", "ak.acc": "", "ak.t": "1757261615", "ak.ak": "hOBiQwZUYzCg5VSAfCLimQ==F7ryKYjya435igG8RC/8OtaNbm8Faad5KbpGjrcLFo1JAcFeE+SXg8riCQgHW9HagZShxYG3/SnCxjDb8xoegU/PZaLQc2CyDLxQM9Q67nTexzqN07i7hIb95Bv8ZA/6LTdYsbedlAiCANtUoqcWw/KCxF4EmMiAAwhF4sLkxn40J7umMLTJfMh3Ybs92NnSK92yr88pBBk31ailH7eRDlXUZ3kk2Y8ssPvEbZxAJki70srrGQVPK0Cjnk4SwdWxcY1geNc1aZLsXkZ/4BXyeCmCoayFISRGGsM/h25+qr2i9lfoe5coKptUsEgfSHExKYXEDzPnaGvtXilpuODdzPAwNuy0eSsUGQNLUo98Os6EHxh3QnbJxx/QnDxeH1fv/6eh10V/uUj0erkJu1ZWHl9gDAb9NiEmM0iv0u01VWo=", "ak.pv": "3", "ak.dpoabenc": "", "ak.tf": i }; if ("" !== t) o["ak.ruds"] = t; var r = { i: !1, av: function (n) { var t = "http.initiator"; if (n && (!n[t] || "spa_hard" === n[t])) o["ak.feo"] = void 0 !== e.aFeoApplied ? 1 : 0, BOOMR.addVar(o) }, rv: function () { var e = ["ak.bpcip", "ak.cport", "ak.cr", "ak.csrc", "ak.gh", "ak.ipv", "ak.m", "ak.n", "ak.ol", "ak.proto", "ak.quicv", "ak.tlsv", "ak.0rtt", "ak.0rtt.ed", "ak.r", "ak.acc", "ak.t", "ak.tf"]; BOOMR.removeVar(e) } }; BOOMR.plugins.AK = { akVars: o, akDNSPreFetchDomain: a, init: function () { if (!r.i) { var e = BOOMR.subscribe; e("before_beacon", r.av, null, null), e("onbeacon", r.rv, null, null), r.i = !0 } return this }, is_complete: function () { return !0 } } } }() }(window);</script> 176 + </head> 177 + 178 + <body class="body no-touch js-mptd-layout" data-AdsGlobalSkinTakeoverManager="body" data-SearchResultsNavManager="body"> 179 + <cookie-manager></cookie-manager> 180 + <device-inspection-manager 181 + endpoint="https://www.rottentomatoes.com/napi/device/inspection"></device-inspection-manager> 182 + 183 + <user-activity-manager profiles-features-enabled="false"></user-activity-manager> 184 + <user-identity-manager profiles-features-enabled="false"></user-identity-manager> 185 + <ad-unit-manager></ad-unit-manager> 186 + 187 + <auth-initiate-manager profiles-username-enabled="false" data-ArtiManager="authInitiateManager" 188 + data-WatchlistButtonManager="authInitiateManager:createAccount"> 189 + </auth-initiate-manager> 190 + <auth-profile-manager data-AuthInitiateManager="authProfileManager"></auth-profile-manager> 191 + <auth-validation-manager data-AuthInitiateManager="authValidation"></auth-validation-manager> 192 + <overlay-base data-AuthInitiateManager="overlayBase:close" data-PagePollsIndexManager="authOverlay:close" hidden> 193 + <overlay-flows data-AuthInitiateManager="overlayFlows" slot="content"> 194 + <action-icon slot="close" class="auth-overlay__icon-button auth-overlay__icon-button--close" aria-label="Close" 195 + data-qa="close-overlay-btn" icon="close"></action-icon> 196 + 197 + </overlay-flows> 198 + </overlay-base> 199 + 200 + <notification-alert data-AuthInitiateManager="authSuccess" animate hidden> 201 + <rt-icon icon="check-circled"></rt-icon> 202 + <span>Signed in</span> 203 + </notification-alert> 204 + 205 + <div id="auth-templates" data-AuthInitiateManager="authTemplates"> 206 + <template slot="screens" id="account-create-username-screen"> 207 + <account-create-username-screen data-qa="account-create-username-screen"> 208 + <input-label slot="input-username" state="default" data-qa="username-input-label"> 209 + <label slot="label" for="create-username-input">Username</label> 210 + <input slot="input" id="create-username-input" type="text" placeholder="Username" data-qa="username-input" /> 211 + </input-label> 212 + <rt-button disabled slot="btn-continue" shape="pill" data-qa="continue-btn">Continue</rt-button> 213 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 214 + By joining, you agree to the <rt-link href="/policies/terms-and-policies" target="_blank" 215 + data-qa="terms-policies-link">Terms and Policies</rt-link> and 216 + the <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 217 + data-qa="privacy-policy-link">Privacy Policy</rt-link> and to receive email from 218 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 219 + Brands</rt-link>. 220 + </rt-text> 221 + </account-create-username-screen> 222 + </template> 223 + 224 + <template slot="screens" id="account-email-change-screen"> 225 + <account-email-change-screen data-qa="account-email-change-screen" email="user@email.com"> 226 + <input-label class="new-email-input" state="default" slot="new-email-input" data-qa="email-input-label"> 227 + <label slot="label" for="newEmail">Enter new email</label> 228 + <input slot="input" name="newEmail" type="text" placeholder="Enter new email" autocomplete="off" 229 + data-qa="email-input"></input> 230 + </input-label> 231 + <rt-button slot="submit-button" disabled shape="pill" data-qa="submit-btn">Submit</rt-button> 232 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 233 + By joining, you agree to the 234 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link">Terms and 235 + Policies</rt-link> 236 + and <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 237 + data-qa="privacy-policy-link">Privacy Policy</rt-link> 238 + and to receive email from the 239 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 240 + Brands</rt-link>. 241 + </rt-text> 242 + </account-email-change-screen> 243 + </template> 244 + 245 + <template slot="screens" id="account-email-change-success-screen"> 246 + <account-email-change-success-screen data-qa="login-create-success-screen"> 247 + <rt-text slot="message" size="1.5" style="--fontWeight: var(--franklinGothicDemi);">Email change 248 + successful</rt-text> 249 + <rt-text slot="submessage">You are signed out for your security. </br> Please sign in again.</rt-text> 250 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 251 + height="105" /> 252 + </account-email-change-success-screen> 253 + </template> 254 + 255 + <template slot="screens" id="account-password-change-screen"> 256 + <account-password-change-screen data-qa="account-password-change-screen"> 257 + <input-label state="default" slot="input-password-existing"> 258 + <label slot="label" for="password-existing">Existing password</label> 259 + <input slot="input" name="password-existing" type="password" placeholder="Enter existing password" 260 + autocomplete="off"></input> 261 + </input-label> 262 + <input-label state="default" slot="input-password-new"> 263 + <label slot="label" for="password-new">New password</label> 264 + <input slot="input" name="password-new" type="password" placeholder="Enter new password" 265 + autocomplete="off"></input> 266 + </input-label> 267 + <rt-button disabled shape="pill" slot="submit-button">Submit</rt-button> 268 + </account-password-change-screen> 269 + </template> 270 + 271 + <template slot="screens" id="account-password-change-updating-screen"> 272 + <login-success-screen data-qa="account-password-change-updating-screen" hidebanner> 273 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 274 + Updating your password... 275 + </rt-text> 276 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 277 + height="105" /> 278 + </login-success-screen> 279 + </template> 280 + <template slot="screens" id="account-password-change-success-screen"> 281 + <login-success-screen data-qa="account-password-change-success-screen" hidebanner> 282 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 283 + Success! 284 + </rt-text> 285 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 286 + height="105" /> 287 + </login-success-screen> 288 + </template> 289 + <template slot="screens" id="account-verifying-email-screen"> 290 + <account-verifying-email-screen data-qa="account-verifying-email-screen"> 291 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-auth-verify.e74a69e9a77.svg" alt="email" /> 292 + <rt-text slot="status"> Verifying your email... </rt-text> 293 + <rt-button type="cta-large" href="/?authFlowScreen=loginStartScreen" slot="retryLink" size="0.875" 294 + style="--fontWeight: var(--franklinGothicMedium);" data-qa="retry-link"> 295 + Retry 296 + </rt-button> 297 + </account-verifying-email-screen> 298 + </template> 299 + <template slot="screens" id="cognito-loading"> 300 + <div> 301 + <loading-spinner id="cognito-auth-loading-spinner"></loading-spinner> 302 + <style> 303 + #cognito-auth-loading-spinner { 304 + font-size: 2rem; 305 + transform: translate(calc(100% - 1em), 250px); 306 + width: 50%; 307 + } 308 + </style> 309 + </div> 310 + </template> 311 + 312 + <template slot="screens" id="login-check-email-screen"> 313 + <login-check-email-screen data-qa="login-check-email-screen" email="user@email.com"> 314 + <rt-text class="note-text" size="1" slot="noteText"> 315 + Please open the email link from the same browser you initiated the change email process from. 316 + </rt-text> 317 + <rt-text slot="gotEmailMessage" size="0.875"> 318 + Didn't you get the email? 319 + </rt-text> 320 + <rt-button slot="resendEmailLink" size="0.875" type="cta-large" data-qa="resend-email-link"> 321 + Resend email 322 + </rt-button> 323 + <rt-link context="label" slot="troubleLoginLink" size="0.875" href="/reset-client" data-qa="reset-link">Having 324 + trouble logging in?</rt-link> 325 + 326 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 327 + By continuing, you agree to the 328 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 329 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 330 + and the 331 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 332 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 333 + and to receive email from 334 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 335 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 336 + </rt-text> 337 + </login-check-email-screen> 338 + </template> 339 + 340 + <template slot="screens" id="login-error-screen"> 341 + <login-error-screen data-qa="login-error"> 342 + <rt-text slot="header" size="1.5" context="heading" data-qa="header"> 343 + Something went wrong... 344 + </rt-text> 345 + <rt-text slot="description1" size="1" context="label" data-qa="description1"> 346 + Please try again. 347 + </rt-text> 348 + <img slot="image" src="/assets/pizza-pie/images/icons/cognito-error.c55e509a7fd.svg" /> 349 + <rt-text hidden slot="description2" size="1" context="label" data-qa="description2"></rt-text> 350 + <rt-link slot="ctaLink" hidden context="label" size="0.875" data-qa="retry-link">Retry</rt-link> 351 + </login-error-screen> 352 + </template> 353 + 354 + <template slot="screens" id="login-enter-password-screen"> 355 + <login-enter-password-screen data-qa="login-enter-password-screen"> 356 + <rt-text slot="title" size="1.5" style="--fontWeight: var(--franklinGothicMedium);"> 357 + Welcome back! 358 + </rt-text> 359 + <rt-text slot="username" data-qa="user-email"> 360 + username@email.com 361 + </rt-text> 362 + <input-label slot="inputPassword" state="default" data-qa="password-input-label"> 363 + <label slot="label" for="pass">Password</label> 364 + <input slot="input" id="pass" type="password" placeholder="Password" autocomplete="off" 365 + data-qa="password-input"></input> 366 + </input-label> 367 + <rt-button disabled slot="continueButton" type="cta-large" data-qa="continue-btn"> 368 + Continue 369 + </rt-button> 370 + <rt-button slot="emailLoginButton" theme="light" shape="pill" data-qa="send-email-btn"> 371 + Send email to verify 372 + </rt-button> 373 + <rt-link slot="forgotPasswordLink" theme="light" data-qa="forgot-password-link">Forgot password</rt-link> 374 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 375 + By continuing, you agree to the 376 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 377 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 378 + and the 379 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 380 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 381 + and to receive email from 382 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 383 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 384 + </rt-text> 385 + </login-enter-password-screen> 386 + </template> 387 + 388 + <template slot="screens" id="login-start-screen"> 389 + <login-start-screen data-qa="login-start-screen"> 390 + <input-label slot="inputEmail" state="default" data-qa="email-input-label"> 391 + <label slot="label" for="login-email-input">Email address</label> 392 + <input slot="input" autocomplete="username" id="login-email-input" placeholder="Email address" type="text" 393 + data-qa="email-input" /> 394 + </input-label> 395 + <rt-button disabled slot="emailLoginButton" type="cta-large" data-qa="continue-btn"> 396 + Continue 397 + </rt-button> 398 + <rt-button slot="googleLoginButton" shape="pill" theme="light" 399 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="google-login-btn" data-type="google"> 400 + <div class="social-login-btn-content"> 401 + <img height="16px" width="16px" src="/assets/pizza-pie/images/vendor/google/google_logo.28d9eb28faa.svg" /> 402 + Continue with Google 403 + </div> 404 + </rt-button> 405 + 406 + <rt-button slot="appleLoginButton" shape="pill" theme="light" 407 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="apple-login-btn" data-type="apple"> 408 + <div class="social-login-btn-content"> 409 + <rt-icon size="1" icon="apple"></rt-icon> 410 + Continue with apple 411 + </div> 412 + </rt-button> 413 + 414 + <rt-link slot="resetLink" class="reset-link" context="label" size="0.875" href="/reset-client" 415 + data-qa="reset-link"> 416 + Having trouble logging in? 417 + </rt-link> 418 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 419 + By continuing, you agree to the 420 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 421 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 422 + and the 423 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 424 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 425 + and to receive email from 426 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 427 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 428 + </rt-text> 429 + </login-start-screen> 430 + </template> 431 + 432 + <template slot="screens" id="login-success-screen"> 433 + <login-success-screen data-qa="login-success-screen"> 434 + <rt-text slot="status" size="1.5"> 435 + Login successful! 436 + </rt-text> 437 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 438 + height="105" /> 439 + </login-success-screen> 440 + </template> 441 + <template slot="screens" id="cognito-opt-in-us"> 442 + <auth-optin-screen data-qa="auth-opt-in-screen"> 443 + <div slot="newsletter-text"> 444 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 445 + </div> 446 + <img slot="image" class="image" 447 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 448 + alt="Rotten Tomatoes Newsletter">> 449 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 450 + </h2> 451 + <ul slot="options"> 452 + <li class="icon-item">Upcoming Movies and TV shows</li> 453 + <li class="icon-item">Rotten Tomatoes Podcast</li> 454 + <li class="icon-item">Media News + More</li> 455 + </ul> 456 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 457 + Sign me up 458 + </rt-button> 459 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 460 + No thanks 461 + </rt-button> 462 + <p slot="foot-note"> 463 + By clicking "Sign Me Up," you are agreeing to receive occasional emails and communications from Fandango Media 464 + (Fandango, Vudu, and Rotten Tomatoes) and consenting to Fandango's 465 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" class="optin-link" target="_blank" 466 + rel="noopener" data-qa="auth-name-screen-privacy-policy-link">Privacy Policy</a> 467 + and 468 + <a href="/policies/terms-and-policies" class="optin-link" target="_blank" rel="noopener" 469 + data-qa="auth-name-screen-privacy-policy-link">Terms and Policies</a>. 470 + Please allow 10 business days for your account to reflect your preferences. 471 + </p> 472 + </auth-optin-screen> 473 + </template> 474 + <template slot="screens" id="cognito-opt-in-foreign"> 475 + <auth-optin-screen data-qa="auth-opt-in-screen"> 476 + <div slot="newsletter-text"> 477 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 478 + </div> 479 + <img slot="image" class="image" 480 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 481 + alt="Rotten Tomatoes Newsletter">> 482 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 483 + </h2> 484 + <ul slot="options"> 485 + <li class="icon-item">Upcoming Movies and TV shows</li> 486 + <li class="icon-item">Rotten Tomatoes Podcast</li> 487 + <li class="icon-item">Media News + More</li> 488 + </ul> 489 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 490 + Sign me up 491 + </rt-button> 492 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 493 + No thanks 494 + </rt-button> 495 + </auth-optin-screen> 496 + </template> 497 + <template slot="screens" id="cognito-opt-in-success"> 498 + <auth-verify-screen> 499 + <rt-icon icon="check-circled" slot="icon"></rt-icon> 500 + <p class="h3" slot="status">OK, got it!</p> 501 + </auth-verify-screen> 502 + </template> 503 + 504 + </div> 505 + 506 + 507 + <div id="emptyPlaceholder"></div> 508 + 509 + 510 + 511 + <script ASYNC src="//assets.adobedtm.com/launch-EN549327edc13e414a9beb5d61bfd9aac6.min.js"></script> 512 + 513 + 514 + 515 + <div id="main" class="container rt-layout__body"> 516 + <a href="#main-page-content" class="skip-link">Skip to Main Content</a> 517 + 518 + 519 + 520 + <div id="header_and_leaderboard"> 521 + <div id="top_leaderboard_wrapper" class="leaderboard_wrapper "> 522 + <ad-unit hidden unit-display="desktop" unit-type="topbanner" adjust-height> 523 + <div slot="ad-inject"></div> 524 + </ad-unit> 525 + 526 + <ad-unit hidden unit-display="mobile" unit-type="mbanner"> 527 + <div slot="ad-inject"></div> 528 + </ad-unit> 529 + </div> 530 + </div> 531 + 532 + 533 + <rt-header-manager></rt-header-manager> 534 + 535 + <rt-header aria-label="navigation bar" class="navbar" data-qa="header-nav-bar" 536 + data-AdsGlobalNavTakeoverManager="header" id="header-main" skeleton="panel"> 537 + 538 + 539 + <button aria-label="Open aRTi" class="arti-mobile" data-ArtiManager="btnArti:click" slot="arti-mobile"> 540 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 541 + </button> 542 + 543 + 544 + <div slot="mobile-header-nav"> 545 + <rt-button id="mobile-header-nav-btn" data-RtHeaderManager="mobileHeaderNavBtn:click" size="1.6" 546 + style="--backgroundColor: transparent; --backgroundColorHover: transparent; --buttonPadding: 0 10px 4px;"> 547 + &#9776; 548 + </rt-button> 549 + <mobile-header-nav id="mobile-header-nav" data-RtHeaderManager="mobileHeaderNav"> 550 + <rt-img slot="logoImage" alt="Rotten Tomatoes" fetchpriority="high" 551 + src="/assets/pizza-pie/images/rt-tomato-logo.20c3bdbc97b.svg"></rt-img> 552 + <div slot="menusCss"></div> 553 + <div slot="menus"></div> 554 + </mobile-header-nav> 555 + </div> 556 + 557 + <a class="logo-wrap" data-AdsGlobalNavTakeoverManager="logoLink" data-SearchResultsNavManager="rtNavLogo" href="/" 558 + id="navbar" slot="logo"> 559 + <img alt="Rotten Tomatoes" data-qa="header-logo" data-AdsGlobalNavTakeoverManager="logo" 560 + src="/assets/pizza-pie/images/rtlogo.9b892cff3fd.png" fetchpriority="high" /> 561 + 562 + <div class="hide"> 563 + <ad-unit hidden unit-display="desktop,mobile" unit-type="logorepeat" unit-targeting="ploc=rtlogo;"> 564 + <div slot="ad-inject"></div> 565 + </ad-unit> 566 + </div> 567 + </a> 568 + 569 + <search-results-nav-manager></search-results-nav-manager> 570 + 571 + <search-results-nav data-adobe-id="global-nav-search" data-SearchResultsNavManager="search" slot="search" 572 + skeleton="chip"> 573 + <search-results-controls data-SearchResultsNavManager="searchControls" slot="controls"> 574 + <input aria-label="Search" data-AdsGlobalNavTakeoverManager="searchInput" 575 + data-SearchResultsNavManager="inputText:click,input,keydown" data-qa="search-input" placeholder="Search" 576 + slot="search-input" type="text" /> 577 + <rt-button class="search-clear" data-qa="search-clear" data-AdsGlobalNavTakeoverManager="searchClearBtn" 578 + data-SearchResultsNavManager="clearBtn:click" size="0.875" slot="search-clear" theme="transparent"> 579 + <rt-icon icon="close"></rt-icon> 580 + </rt-button> 581 + <rt-link class="search-submit" aria-label="Submit search" data-qa="search-submit" 582 + data-AdsGlobalNavTakeoverManager="searchSubmitBtn" data-SearchResultsNavManager="submitBtn:click" 583 + href="/search" size="0.875" slot="search-submit"> 584 + <rt-icon icon="search"></rt-icon> 585 + </rt-link> 586 + <rt-button class="search-cancel" data-qa="search-cancel" data-AdsGlobalNavTakeoverManager="searchCancelBtn" 587 + data-SearchResultsNavManager="cancelBtn:click" size="0.875" slot="search-cancel" theme="transparent"> 588 + Cancel 589 + </rt-button> 590 + </search-results-controls> 591 + 592 + <search-results aria-expanded="false" class="hide" data-SearchResultsNavManager="searchResults" slot="results"> 593 + </search-results> 594 + </search-results-nav> 595 + 596 + <ul slot="nav-links"> 597 + <li> 598 + <a href="/about" data-qa="header:link-whats-tmeter" data-AdsGlobalNavTakeoverManager="text"> 599 + About Rotten Tomatoes&reg; 600 + </a> 601 + </li> 602 + <li> 603 + <a href="/critics" data-qa="header:link-critics-home" data-AdsGlobalNavTakeoverManager="text"> 604 + Critics 605 + </a> 606 + </li> 607 + <li data-RtHeaderManager="loginLink"> 608 + <ul> 609 + <li> 610 + <button id="masthead-show-login-btn" class="js-cognito-signin button--link" 611 + data-AuthInitiateManager="btnSignIn:click" data-qa="header:login-btn" 612 + data-AdsGlobalNavTakeoverManager="text"> 613 + Login/signup 614 + </button> 615 + </li> 616 + </ul> 617 + </li> 618 + <li class="hide" data-RtHeaderManager="userItem:keydown,keyup,mouseenter" data-qa="header:user"> 619 + <a class="masthead-user-link" data-RtHeaderManager="navUserlink:focus" rel="nofollow" 620 + data-qa="user-profile-link"> 621 + <img data-RtHeaderManager="navUserImg" data-qa="user-profile-thumb"> 622 + <p data-AdsGlobalNavTakeoverManager="text" data-RtHeaderManager="navUserFirstName" 623 + data-qa="user-profile-name"></p> 624 + <rt-icon data-AdsGlobalNavTakeoverManager="text" icon="down-dir" image> 625 + </rt-icon> 626 + </a> 627 + <rt-header-user-info class="hide" data-RtHeaderManager="userInfo:focusout,mouseleave"> 628 + <a data-qa="user-stats-profile-pic" href="" rel="nofollow" slot="imageExpanded" tabindex="-1"> 629 + <img src="" width="40" alt=""> 630 + </a> 631 + <a slot="fullName" rel="nofollow" href="" class="username" data-qa="user-stats-name"></a> 632 + <a slot="wts" rel="nofollow" href="" class="wts-count-block" data-qa="user-stats-wts"> 633 + <rt-icon icon="plus" data-qa="user-stats-ratings-count"></rt-icon> 634 + <span class="count" data-qa="user-stats-wts-count"></span> 635 + &nbsp;Wants to See 636 + </a> 637 + <a slot="rating" rel="nofollow" href="" class="rating-count-block" data-qa="user-stats-ratings"> 638 + <rt-icon icon="star" data-qa="user-stats-ratings-count"></rt-icon> 639 + <span class="count"></span> 640 + &nbsp;Ratings 641 + </a> 642 + 643 + <a slot="profileLink" rel="nofollow" class="dropdown-link" href="" 644 + data-qa="user-stats-profile-link">Profile</a> 645 + <a slot="accountLink" rel="nofollow" class="dropdown-link" href="/user/account" 646 + data-qa="user-stats-account-link">Account</a> 647 + <a slot="logoutLink" class="dropdown-link" data-RtHeaderManager="logoutLink:click" href="#logout" 648 + data-qa="user-stats-logout-link">Log Out</a> 649 + </rt-header-user-info> 650 + </li> 651 + </ul> 652 + 653 + <rt-header-nav slot="nav-dropdowns"> 654 + 655 + <button aria-label="Open aRTi" class="arti-desktop" data-ArtiManager="btnArti:click" slot="arti-desktop"> 656 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 657 + </button> 658 + 659 + <rt-header-nav-item slot="movies" data-qa="masthead:movies-dvds"> 660 + <a class="unset" slot="link" href="/browse/movies_in_theaters/sort:popular" 661 + data-qa="masthead:movies-dvds-link" data-AdsGlobalNavTakeoverManager="text"> 662 + Movies 663 + </a> 664 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="movies-menu"> 665 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-in-theaters"> 666 + <p slot="title" class="h4" data-qa="movies-in-theaters-main-link"><a class="unset" 667 + href="/browse/movies_in_theaters/sort:popular">Movies in theaters</a></p> 668 + <ul slot="links"> 669 + <li data-qa="in-theaters-item"> 670 + <a href="/browse/movies_in_theaters/sort:newest" data-qa="opening-this-week-link">Opening This 671 + Week</a> 672 + </li> 673 + <li data-qa="in-theaters-item"> 674 + <a href="/browse/movies_in_theaters/sort:top_box_office" data-qa="top-box-office-link">Top Box 675 + Office</a> 676 + </li> 677 + <li data-qa="in-theaters-item"> 678 + <a href="/browse/movies_coming_soon/" data-qa="coming-soon-link">Coming Soon to Theaters</a> 679 + </li> 680 + <li data-qa="in-theaters-item"> 681 + <a href="/browse/movies_in_theaters/critics:certified_fresh~sort:popular" 682 + data-qa="certified-fresh-link">Certified Fresh Movies</a> 683 + </li> 684 + </ul> 685 + </rt-header-nav-item-dropdown-list> 686 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-on-dvd-streaming"> 687 + <p slot="title" class="h4" data-qa="dvd-streaming-main-link"><a class="unset" 688 + href="/browse/movies_at_home">Movies at Home</a></p> 689 + <ul slot="links"> 690 + 691 + <li data-qa="movies-at-home-item"> 692 + <a href="/browse/movies_at_home/affiliates:fandango-at-home" data-qa="fandango-at-home-link">Fandango 693 + at Home</a> 694 + </li> 695 + 696 + <li data-qa="movies-at-home-item"> 697 + <a href="/browse/movies_at_home/affiliates:peacock" data-qa="peacock-link">Peacock</a> 698 + </li> 699 + 700 + <li data-qa="movies-at-home-item"> 701 + <a href="/browse/movies_at_home/affiliates:netflix" data-qa="netflix-link">Netflix</a> 702 + </li> 703 + 704 + <li data-qa="movies-at-home-item"> 705 + <a href="/browse/movies_at_home/affiliates:apple-tv-plus" data-qa="apple-tv-link">Apple TV+</a> 706 + </li> 707 + 708 + <li data-qa="movies-at-home-item"> 709 + <a href="/browse/movies_at_home/affiliates:prime-video" data-qa="prime-video-link">Prime Video</a> 710 + </li> 711 + 712 + <li data-qa="movies-at-home-item"> 713 + <a href="/browse/movies_at_home/sort:popular" data-qa="most-popular-streaming-movies-link">Most 714 + Popular Streaming movies</a> 715 + </li> 716 + 717 + <li data-qa="movies-at-home-item"> 718 + <a href="/browse/movies_at_home/critics:certified_fresh" 719 + data-qa="certified-fresh-movies-link">Certified Fresh movies</a> 720 + </li> 721 + 722 + <li data-qa="movies-at-home-item"> 723 + <a href="/browse/movies_at_home" data-qa="browse-all-link">Browse all</a> 724 + </li> 725 + 726 + </ul> 727 + </rt-header-nav-item-dropdown-list> 728 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-more"> 729 + <p slot="title" class="h4">More</p> 730 + <ul slot="links"> 731 + <li data-qa="what-to-watch-item"> 732 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch" class="what-to-watch" 733 + data-qa="what-to-watch-link">What to Watch<rt-badge>New</rt-badge></a> 734 + </li> 735 + </ul> 736 + </rt-header-nav-item-dropdown-list> 737 + 738 + <rt-header-nav-item-dropdown-list slot="column" cfp> 739 + <p slot="title" class="h4">Certified fresh picks</p> 740 + <ul slot="links" class="cfp-wrap" data-qa="header-certified-fresh-picks" 741 + data-curation="rt-nav-list-cf-picks"> 742 + 743 + <li data-qa="cert-fresh-item"> 744 + 745 + <a class="cfp-tile" href="/m/twinless" data-qa="cert-fresh-link"> 746 + <tile-dynamic data-qa="tile"> 747 + <rt-img alt="Twinless poster image" slot="image" 748 + src="https://resizing.flixster.com/j7lw2KeY9_XyfZQdqRZGku7_9C8=/206x305/v2/https://resizing.flixster.com/uxoeWz7uWmeYIV94_SzEV_osqe4=/fit-in/180x240/v2/https://resizing.flixster.com/VlylB3xT2RIYmRivMx37O3yD76Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" 749 + loading="lazy"></rt-img> 750 + <div slot="caption" data-track="scores"> 751 + <div class="score-wrap"> 752 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 753 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 754 + </div> 755 + <span class="p--small">Twinless</span> 756 + <span class="sr-only">Link to Twinless</span> 757 + </div> 758 + </tile-dynamic> 759 + </a> 760 + </li> 761 + 762 + 763 + <li data-qa="cert-fresh-item"> 764 + 765 + <a class="cfp-tile" href="/m/hamilton_2020" data-qa="cert-fresh-link"> 766 + <tile-dynamic data-qa="tile"> 767 + <rt-img alt="Hamilton poster image" slot="image" 768 + src="https://resizing.flixster.com/1woquJmQfEhWCZtm7GcH0NMHsYA=/206x305/v2/https://resizing.flixster.com/PeAJ5ZpF5qB98ZiX6ixNDCgW2P0=/fit-in/180x240/v2/https://resizing.flixster.com/VmBvlTk8-z7pQvDZXTgSdj93WDE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" 769 + loading="lazy"></rt-img> 770 + <div slot="caption" data-track="scores"> 771 + <div class="score-wrap"> 772 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 773 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 774 + </div> 775 + <span class="p--small">Hamilton</span> 776 + <span class="sr-only">Link to Hamilton</span> 777 + </div> 778 + </tile-dynamic> 779 + </a> 780 + </li> 781 + 782 + 783 + <li data-qa="cert-fresh-item"> 784 + 785 + <a class="cfp-tile" href="/m/the_thursday_murder_club" data-qa="cert-fresh-link"> 786 + <tile-dynamic data-qa="tile"> 787 + <rt-img alt="The Thursday Murder Club poster image" slot="image" 788 + src="https://resizing.flixster.com/jeeldFGcfSMgG09ey5VB7TCFiek=/206x305/v2/https://resizing.flixster.com/9LXDkCzIBBNEiPURkB9t6VefF5Q=/fit-in/180x240/v2/https://resizing.flixster.com/rwdeR5xIiN0k7SWr6yXdnmb6zP8=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" 789 + loading="lazy"></rt-img> 790 + <div slot="caption" data-track="scores"> 791 + <div class="score-wrap"> 792 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 793 + <rt-text class="critics-score" size="1" context="label">76%</rt-text> 794 + </div> 795 + <span class="p--small">The Thursday Murder Club</span> 796 + <span class="sr-only">Link to The Thursday Murder Club</span> 797 + </div> 798 + </tile-dynamic> 799 + </a> 800 + </li> 801 + 802 + </ul> 803 + </rt-header-nav-item-dropdown-list> 804 + 805 + </rt-header-nav-item-dropdown> 806 + </rt-header-nav-item> 807 + 808 + <rt-header-nav-item slot="tv" data-qa="masthead:tv"> 809 + <a class="unset" slot="link" href="/browse/tv_series_browse/sort:popular" data-qa="masthead:tv-link" 810 + data-AdsGlobalNavTakeoverManager="text"> 811 + Tv shows 812 + </a> 813 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="tv-menu"> 814 + 815 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list1"> 816 + <p slot="title" class="h4" data-curation="rt-hp-text-list-3"> 817 + New TV Tonight 818 + </p> 819 + <ul slot="links" class="score-list-wrap"> 820 + 821 + <li data-qa="list-item"> 822 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 823 + <div class="score-wrap"> 824 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 825 + 826 + <rt-text class="critics-score" context="label" size="1" 827 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 828 + 829 + </div> 830 + <span> 831 + 832 + Task: Season 1 833 + 834 + </span> 835 + </a> 836 + </li> 837 + 838 + <li data-qa="list-item"> 839 + <a class="score-list-item" href="/tv/the_walking_dead_daryl_dixon/s03" data-qa="list-item-link"> 840 + <div class="score-wrap"> 841 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 842 + 843 + <rt-text class="critics-score" context="label" size="1" 844 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 845 + 846 + </div> 847 + <span> 848 + 849 + The Walking Dead: Daryl Dixon: Season 3 850 + 851 + </span> 852 + </a> 853 + </li> 854 + 855 + <li data-qa="list-item"> 856 + <a class="score-list-item" href="/tv/the_crow_girl/s01" data-qa="list-item-link"> 857 + <div class="score-wrap"> 858 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 859 + 860 + <rt-text class="critics-score" context="label" size="1" 861 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 862 + 863 + </div> 864 + <span> 865 + 866 + The Crow Girl: Season 1 867 + 868 + </span> 869 + </a> 870 + </li> 871 + 872 + <li data-qa="list-item"> 873 + <a class="score-list-item" href="/tv/only_murders_in_the_building/s05" data-qa="list-item-link"> 874 + <div class="score-wrap"> 875 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 876 + 877 + <rt-text class="critics-score-empty" context="label" size="1" 878 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 879 + 880 + </div> 881 + <span> 882 + 883 + Only Murders in the Building: Season 5 884 + 885 + </span> 886 + </a> 887 + </li> 888 + 889 + <li data-qa="list-item"> 890 + <a class="score-list-item" href="/tv/the_girlfriend/s01" data-qa="list-item-link"> 891 + <div class="score-wrap"> 892 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 893 + 894 + <rt-text class="critics-score-empty" context="label" size="1" 895 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 896 + 897 + </div> 898 + <span> 899 + 900 + The Girlfriend: Season 1 901 + 902 + </span> 903 + </a> 904 + </li> 905 + 906 + <li data-qa="list-item"> 907 + <a class="score-list-item" href="/tv/aka_charlie_sheen/s01" data-qa="list-item-link"> 908 + <div class="score-wrap"> 909 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 910 + 911 + <rt-text class="critics-score-empty" context="label" size="1" 912 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 913 + 914 + </div> 915 + <span> 916 + 917 + aka Charlie Sheen: Season 1 918 + 919 + </span> 920 + </a> 921 + </li> 922 + 923 + <li data-qa="list-item"> 924 + <a class="score-list-item" href="/tv/wizards_beyond_waverly_place/s02" data-qa="list-item-link"> 925 + <div class="score-wrap"> 926 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 927 + 928 + <rt-text class="critics-score-empty" context="label" size="1" 929 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 930 + 931 + </div> 932 + <span> 933 + 934 + Wizards Beyond Waverly Place: Season 2 935 + 936 + </span> 937 + </a> 938 + </li> 939 + 940 + <li data-qa="list-item"> 941 + <a class="score-list-item" href="/tv/seen_and_heard_the_history_of_black_television/s01" 942 + data-qa="list-item-link"> 943 + <div class="score-wrap"> 944 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 945 + 946 + <rt-text class="critics-score-empty" context="label" size="1" 947 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 948 + 949 + </div> 950 + <span> 951 + 952 + Seen &amp; Heard: the History of Black Television: Season 1 953 + 954 + </span> 955 + </a> 956 + </li> 957 + 958 + <li data-qa="list-item"> 959 + <a class="score-list-item" href="/tv/the_fragrant_flower_blooms_with_dignity/s01" 960 + data-qa="list-item-link"> 961 + <div class="score-wrap"> 962 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 963 + 964 + <rt-text class="critics-score-empty" context="label" size="1" 965 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 966 + 967 + </div> 968 + <span> 969 + 970 + The Fragrant Flower Blooms With Dignity: Season 1 971 + 972 + </span> 973 + </a> 974 + </li> 975 + 976 + <li data-qa="list-item"> 977 + <a class="score-list-item" href="/tv/guts_and_glory/s01" data-qa="list-item-link"> 978 + <div class="score-wrap"> 979 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 980 + 981 + <rt-text class="critics-score-empty" context="label" size="1" 982 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 983 + 984 + </div> 985 + <span> 986 + 987 + Guts &amp; Glory: Season 1 988 + 989 + </span> 990 + </a> 991 + </li> 992 + 993 + </ul> 994 + <a class="a--short" data-qa="tv-list1-view-all-link" href="/browse/tv_series_browse/sort:newest" 995 + slot="view-all-link"> 996 + View All 997 + </a> 998 + </rt-header-nav-item-dropdown-list> 999 + 1000 + 1001 + 1002 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list2"> 1003 + <p slot="title" class="h4" data-curation="rt-hp-text-list-2"> 1004 + Most Popular TV on RT 1005 + </p> 1006 + <ul slot="links" class="score-list-wrap"> 1007 + 1008 + <li data-qa="list-item"> 1009 + <a class="score-list-item" href="/tv/the_paper_2025/s01" data-qa="list-item-link"> 1010 + <div class="score-wrap"> 1011 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1012 + 1013 + <rt-text class="critics-score" context="label" size="1" 1014 + style="--lineHeight: 1; --letterSpacing: 0.016em;">83%</rt-text> 1015 + 1016 + </div> 1017 + <span> 1018 + 1019 + The Paper: Season 1 1020 + 1021 + </span> 1022 + </a> 1023 + </li> 1024 + 1025 + <li data-qa="list-item"> 1026 + <a class="score-list-item" href="/tv/dexter_resurrection/s01" data-qa="list-item-link"> 1027 + <div class="score-wrap"> 1028 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1029 + 1030 + <rt-text class="critics-score" context="label" size="1" 1031 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1032 + 1033 + </div> 1034 + <span> 1035 + 1036 + Dexter: Resurrection: Season 1 1037 + 1038 + </span> 1039 + </a> 1040 + </li> 1041 + 1042 + <li data-qa="list-item"> 1043 + <a class="score-list-item" href="/tv/alien_earth/s01" data-qa="list-item-link"> 1044 + <div class="score-wrap"> 1045 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1046 + 1047 + <rt-text class="critics-score" context="label" size="1" 1048 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1049 + 1050 + </div> 1051 + <span> 1052 + 1053 + Alien: Earth: Season 1 1054 + 1055 + </span> 1056 + </a> 1057 + </li> 1058 + 1059 + <li data-qa="list-item"> 1060 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 1061 + <div class="score-wrap"> 1062 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1063 + 1064 + <rt-text class="critics-score" context="label" size="1" 1065 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 1066 + 1067 + </div> 1068 + <span> 1069 + 1070 + Task: Season 1 1071 + 1072 + </span> 1073 + </a> 1074 + </li> 1075 + 1076 + <li data-qa="list-item"> 1077 + <a class="score-list-item" href="/tv/wednesday/s02" data-qa="list-item-link"> 1078 + <div class="score-wrap"> 1079 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1080 + 1081 + <rt-text class="critics-score" context="label" size="1" 1082 + style="--lineHeight: 1; --letterSpacing: 0.016em;">87%</rt-text> 1083 + 1084 + </div> 1085 + <span> 1086 + 1087 + Wednesday: Season 2 1088 + 1089 + </span> 1090 + </a> 1091 + </li> 1092 + 1093 + <li data-qa="list-item"> 1094 + <a class="score-list-item" href="/tv/peacemaker_2022/s02" data-qa="list-item-link"> 1095 + <div class="score-wrap"> 1096 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1097 + 1098 + <rt-text class="critics-score" context="label" size="1" 1099 + style="--lineHeight: 1; --letterSpacing: 0.016em;">99%</rt-text> 1100 + 1101 + </div> 1102 + <span> 1103 + 1104 + Peacemaker: Season 2 1105 + 1106 + </span> 1107 + </a> 1108 + </li> 1109 + 1110 + <li data-qa="list-item"> 1111 + <a class="score-list-item" href="/tv/the_terminal_list_dark_wolf/s01" data-qa="list-item-link"> 1112 + <div class="score-wrap"> 1113 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1114 + 1115 + <rt-text class="critics-score" context="label" size="1" 1116 + style="--lineHeight: 1; --letterSpacing: 0.016em;">73%</rt-text> 1117 + 1118 + </div> 1119 + <span> 1120 + 1121 + The Terminal List: Dark Wolf: Season 1 1122 + 1123 + </span> 1124 + </a> 1125 + </li> 1126 + 1127 + <li data-qa="list-item"> 1128 + <a class="score-list-item" href="/tv/hostage_2025/s01" data-qa="list-item-link"> 1129 + <div class="score-wrap"> 1130 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1131 + 1132 + <rt-text class="critics-score" context="label" size="1" 1133 + style="--lineHeight: 1; --letterSpacing: 0.016em;">82%</rt-text> 1134 + 1135 + </div> 1136 + <span> 1137 + 1138 + Hostage: Season 1 1139 + 1140 + </span> 1141 + </a> 1142 + </li> 1143 + 1144 + <li data-qa="list-item"> 1145 + <a class="score-list-item" href="/tv/chief_of_war/s01" data-qa="list-item-link"> 1146 + <div class="score-wrap"> 1147 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1148 + 1149 + <rt-text class="critics-score" context="label" size="1" 1150 + style="--lineHeight: 1; --letterSpacing: 0.016em;">93%</rt-text> 1151 + 1152 + </div> 1153 + <span> 1154 + 1155 + Chief of War: Season 1 1156 + 1157 + </span> 1158 + </a> 1159 + </li> 1160 + 1161 + <li data-qa="list-item"> 1162 + <a class="score-list-item" href="/tv/irish_blood/s01" data-qa="list-item-link"> 1163 + <div class="score-wrap"> 1164 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1165 + 1166 + <rt-text class="critics-score" context="label" size="1" 1167 + style="--lineHeight: 1; --letterSpacing: 0.016em;">100%</rt-text> 1168 + 1169 + </div> 1170 + <span> 1171 + 1172 + Irish Blood: Season 1 1173 + 1174 + </span> 1175 + </a> 1176 + </li> 1177 + 1178 + </ul> 1179 + <a class="a--short" data-qa="tv-list2-view-all-link" href="/browse/tv_series_browse/sort:popular?" 1180 + slot="view-all-link"> 1181 + View All 1182 + </a> 1183 + </rt-header-nav-item-dropdown-list> 1184 + 1185 + 1186 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-more"> 1187 + <p slot="title" class="h4">More</p> 1188 + <ul slot="links"> 1189 + <li> 1190 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" class="what-to-watch" 1191 + data-qa="what-to-watch-link-tv"> 1192 + What to Watch<rt-badge>New</rt-badge> 1193 + </a> 1194 + </li> 1195 + <li> 1196 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-best-link"> 1197 + <span>Best TV Shows</span> 1198 + </a> 1199 + </li> 1200 + <li> 1201 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-popular-link"> 1202 + <span>Most Popular TV</span> 1203 + </a> 1204 + </li> 1205 + <li> 1206 + <a href="/browse/tv_series_browse/affiliates:fandango-at-home" data-qa="tv-fandango-at-home-link"> 1207 + <span>Fandango at Home</span> 1208 + </a> 1209 + </li> 1210 + <li> 1211 + <a href="/browse/tv_series_browse/affiliates:peacock" data-qa="tv-peacock-link"> 1212 + <span>Peacock</span> 1213 + </a> 1214 + </li> 1215 + <li> 1216 + <a href="/browse/tv_series_browse/affiliates:paramount-plus" data-qa="tv-paramount-link"> 1217 + <span>Paramount+</span> 1218 + </a> 1219 + </li> 1220 + <li> 1221 + <a href="/browse/tv_series_browse/affiliates:netflix" data-qa="tv-netflix-link"> 1222 + <span>Netflix</span> 1223 + </a> 1224 + </li> 1225 + <li> 1226 + <a href="/browse/tv_series_browse/affiliates:prime-video" data-qa="tv-prime-video-link"> 1227 + <span>Prime Video</span> 1228 + </a> 1229 + </li> 1230 + <li> 1231 + <a href="/browse/tv_series_browse/affiliates:apple-tv-plus" data-qa="tv-apple-tv-plus-link"> 1232 + <span>Apple TV+</span> 1233 + </a> 1234 + </li> 1235 + </ul> 1236 + </rt-header-nav-item-dropdown-list> 1237 + 1238 + 1239 + <rt-header-nav-item-dropdown-list slot="column" cfp data-qa="header-certified-fresh-pick"> 1240 + <p slot="title" class="h4"> 1241 + Certified fresh pick 1242 + </p> 1243 + <ul slot="links" class="cfp-wrap" data-curation="rt-nav-list-cf-picks"> 1244 + <li> 1245 + 1246 + <a class="cfp-tile" href="/tv/the_paper_2025/s01" data-qa="cert-fresh-link"> 1247 + <tile-dynamic data-qa="tile"> 1248 + <rt-img alt="The Paper: Season 1 poster image" slot="image" 1249 + src="https://resizing.flixster.com/yFijQcjPYUWUelgmiZLHgkXU7hw=/206x305/v2/https://resizing.flixster.com/DFkkHf5pEVX_apKtIQZcoEvI6RU=/fit-in/180x240/v2/https://resizing.flixster.com/texEZJLAG-KcVpfCdkT2R1t4cmE=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" 1250 + loading="lazy"></rt-img> 1251 + <div slot="caption" data-track="scores"> 1252 + <div class="score-wrap"> 1253 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 1254 + <rt-text class="critics-score" size="1" context="label">83%</rt-text> 1255 + </div> 1256 + <span class="p--small">The Paper: Season 1</span> 1257 + <span class="sr-only">Link to The Paper: Season 1</span> 1258 + </div> 1259 + </tile-dynamic> 1260 + </a> 1261 + </li> 1262 + </ul> 1263 + </rt-header-nav-item-dropdown-list> 1264 + 1265 + </rt-header-nav-item-dropdown> 1266 + </rt-header-nav-item> 1267 + 1268 + <rt-header-nav-item slot="shop"> 1269 + <a class="unset" id="appLink" slot="link" href="https://editorial.rottentomatoes.com/article/app/" 1270 + target="_blank" data-qa="masthead:app-link" data-AdsGlobalNavTakeoverManager="text"> 1271 + RT App 1272 + <temporary-display slot="temporary-display" key="app" element="#appLink" event="click"> 1273 + <rt-badge hidden>New</rt-badge> 1274 + </temporary-display> 1275 + </a> 1276 + </rt-header-nav-item> 1277 + 1278 + <rt-header-nav-item slot="news" data-qa="masthead:news"> 1279 + <a class="unset" slot="link" href="https://editorial.rottentomatoes.com/" data-qa="masthead:news-link" 1280 + data-AdsGlobalNavTakeoverManager="text"> 1281 + News 1282 + </a> 1283 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="news-menu"> 1284 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-columns"> 1285 + <p slot="title" class="h4">Columns</p> 1286 + <ul slot="links"> 1287 + <li data-qa="column-item"> 1288 + <a href="https://editorial.rottentomatoes.com/all-time-lists/" data-pageheader="All-Time Lists" 1289 + data-qa="column-link"> 1290 + All-Time Lists 1291 + </a> 1292 + </li> 1293 + <li data-qa="column-item"> 1294 + <a href="https://editorial.rottentomatoes.com/binge-guide/" data-pageheader="Binge Guide" 1295 + data-qa="column-link"> 1296 + Binge Guide 1297 + </a> 1298 + </li> 1299 + <li data-qa="column-item"> 1300 + <a href="https://editorial.rottentomatoes.com/comics-on-tv/" data-pageheader="Comics on TV" 1301 + data-qa="column-link"> 1302 + Comics on TV 1303 + </a> 1304 + </li> 1305 + <li data-qa="column-item"> 1306 + <a href="https://editorial.rottentomatoes.com/countdown/" data-pageheader="Countdown" 1307 + data-qa="column-link"> 1308 + Countdown 1309 + </a> 1310 + </li> 1311 + <li data-qa="column-item"> 1312 + <a href="https://editorial.rottentomatoes.com/five-favorite-films/" 1313 + data-pageheader="Five Favorite Films" data-qa="column-link"> 1314 + Five Favorite Films 1315 + </a> 1316 + </li> 1317 + <li data-qa="column-item"> 1318 + <a href="https://editorial.rottentomatoes.com/video-interviews/" data-pageheader="Video Interviews" 1319 + data-qa="column-link"> 1320 + Video Interviews 1321 + </a> 1322 + </li> 1323 + <li data-qa="column-item"> 1324 + <a href="https://editorial.rottentomatoes.com/weekend-box-office/" 1325 + data-pageheader="Weekend Box Office" data-qa="column-link">Weekend Box Office 1326 + </a> 1327 + </li> 1328 + <li data-qa="column-item"> 1329 + <a href="https://editorial.rottentomatoes.com/weekly-ketchup/" data-pageheader="Weekly Ketchup" 1330 + data-qa="column-link"> 1331 + Weekly Ketchup 1332 + </a> 1333 + </li> 1334 + <li data-qa="column-item"> 1335 + <a href="https://editorial.rottentomatoes.com/what-to-watch/" data-pageheader="What to Watch" 1336 + data-qa="column-link"> 1337 + What to Watch 1338 + </a> 1339 + </li> 1340 + </ul> 1341 + </rt-header-nav-item-dropdown-list> 1342 + 1343 + 1344 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-guides"> 1345 + <p slot="title" class="h4">Guides</p> 1346 + <ul slot="links" class="news-wrap"> 1347 + 1348 + <li data-qa="guides-item"> 1349 + <a class="news-tile" href="https://editorial.rottentomatoes.com/guide/best-football-movies/" 1350 + data-qa="news-link"> 1351 + <tile-dynamic data-qa="tile" orientation="landscape"> 1352 + <rt-img alt="59 Best Football Movies, Ranked by Tomatometer poster image" slot="image" 1353 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/09/600EssentialFootballMovies.png" 1354 + loading="lazy"></rt-img> 1355 + <div slot="caption"> 1356 + <p>59 Best Football Movies, Ranked by Tomatometer</p> 1357 + <span class="sr-only">Link to 59 Best Football Movies, Ranked by Tomatometer</span> 1358 + </div> 1359 + </tile-dynamic> 1360 + </a> 1361 + </li> 1362 + 1363 + <li data-qa="guides-item"> 1364 + <a class="news-tile" 1365 + href="https://editorial.rottentomatoes.com/guide/best-new-rom-coms-romance-movies/" 1366 + data-qa="news-link"> 1367 + <tile-dynamic data-qa="tile" orientation="landscape"> 1368 + <rt-img alt="50 Best New Rom-Coms and Romance Movies poster image" slot="image" 1369 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Best_New_Romcoms600.jpg" 1370 + loading="lazy"></rt-img> 1371 + <div slot="caption"> 1372 + <p>50 Best New Rom-Coms and Romance Movies</p> 1373 + <span class="sr-only">Link to 50 Best New Rom-Coms and Romance Movies</span> 1374 + </div> 1375 + </tile-dynamic> 1376 + </a> 1377 + </li> 1378 + 1379 + </ul> 1380 + <a class="a--short" data-qa="guides-view-all-link" href="https://editorial.rottentomatoes.com/countdown/" 1381 + slot="view-all-link"> 1382 + View All 1383 + </a> 1384 + </rt-header-nav-item-dropdown-list> 1385 + 1386 + 1387 + 1388 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-hubs"> 1389 + <p slot="title" class="h4">Hubs</p> 1390 + <ul slot="links" class="news-wrap"> 1391 + 1392 + <li data-qa="hubs-item"> 1393 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" 1394 + data-qa="news-link"> 1395 + <tile-dynamic data-qa="tile" orientation="landscape"> 1396 + <rt-img alt="What to Watch: In Theaters and On Streaming poster image" slot="image" 1397 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/05/RT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" 1398 + loading="lazy"></rt-img> 1399 + <div slot="caption"> 1400 + <p>What to Watch: In Theaters and On Streaming</p> 1401 + <span class="sr-only">Link to What to Watch: In Theaters and On Streaming</span> 1402 + </div> 1403 + </tile-dynamic> 1404 + </a> 1405 + </li> 1406 + 1407 + <li data-qa="hubs-item"> 1408 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/awards-tour/" 1409 + data-qa="news-link"> 1410 + <tile-dynamic data-qa="tile" orientation="landscape"> 1411 + <rt-img alt="Awards Tour poster image" slot="image" 1412 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/02/RT_AwardsTour_Thumbnail_600x314.jpg" 1413 + loading="lazy"></rt-img> 1414 + <div slot="caption"> 1415 + <p>Awards Tour</p> 1416 + <span class="sr-only">Link to Awards Tour</span> 1417 + </div> 1418 + </tile-dynamic> 1419 + </a> 1420 + </li> 1421 + 1422 + </ul> 1423 + <a class="a--short" data-qa="hubs-view-all-link" href="https://editorial.rottentomatoes.com/rt-hubs/" 1424 + slot="view-all-link"> 1425 + View All 1426 + </a> 1427 + </rt-header-nav-item-dropdown-list> 1428 + 1429 + 1430 + 1431 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-rt-news"> 1432 + <p slot="title" class="h4">RT News</p> 1433 + <ul slot="links" class="news-wrap"> 1434 + 1435 + <li data-qa="rt-news-item"> 1436 + <a class="news-tile" 1437 + href="https://editorial.rottentomatoes.com/article/new-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more/" 1438 + data-qa="news-link"> 1439 + <tile-dynamic data-qa="tile" orientation="landscape"> 1440 + <rt-img 1441 + alt="New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More poster image" 1442 + slot="image" 1443 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/New_Streaming_September_2025-Rep.jpg" 1444 + loading="lazy"></rt-img> 1445 + <div slot="caption"> 1446 + <p>New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, 1447 + Disney+ and More</p> 1448 + <span class="sr-only">Link to New Movies and Shows Streaming in September: What to watch on 1449 + Netflix, Prime Video, HBO Max, Disney+ and More</span> 1450 + </div> 1451 + </tile-dynamic> 1452 + </a> 1453 + </li> 1454 + 1455 + <li data-qa="rt-news-item"> 1456 + <a class="news-tile" 1457 + href="https://editorial.rottentomatoes.com/article/the-conjuring-last-rites-first-reviews/" 1458 + data-qa="news-link"> 1459 + <tile-dynamic data-qa="tile" orientation="landscape"> 1460 + <rt-img 1461 + alt="<em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off poster image" 1462 + slot="image" 1463 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/09/Conjuring_Last_Rites_Reviews-Rep.jpg" 1464 + loading="lazy"></rt-img> 1465 + <div slot="caption"> 1466 + <p><em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off</p> 1467 + <span class="sr-only">Link to <em>The Conjuring: Last Rites</em> First Reviews: A Frightful, 1468 + Fitting Send-off</span> 1469 + </div> 1470 + </tile-dynamic> 1471 + </a> 1472 + </li> 1473 + 1474 + </ul> 1475 + <a class="a--short" data-qa="rt-news-view-all-link" href="https://editorial.rottentomatoes.com/news/" 1476 + slot="view-all-link"> 1477 + View All 1478 + </a> 1479 + </rt-header-nav-item-dropdown-list> 1480 + 1481 + </rt-header-nav-item-dropdown> 1482 + </rt-header-nav-item> 1483 + 1484 + <rt-header-nav-item slot="showtimes"> 1485 + <a class="unset" slot="link" href="https://www.fandango.com/movies-in-theaters?a=13036" target="_blank" 1486 + rel="noopener" data-qa="masthead:tickets-showtimes-link" data-AdsGlobalNavTakeoverManager="text"> 1487 + Showtimes 1488 + </a> 1489 + </rt-header-nav-item> 1490 + </rt-header-nav> 1491 + 1492 + </rt-header> 1493 + 1494 + <ads-global-nav-takeover-manager></ads-global-nav-takeover-manager> 1495 + <section class="trending-bar"> 1496 + 1497 + 1498 + <ad-unit hidden id="trending_bar_ad" unit-display="desktop" unit-type="trendinggraphic"> 1499 + <div slot="ad-inject"></div> 1500 + </ad-unit> 1501 + <div id="trending-bar-start" class="trending-list-wrap" data-qa="trending-bar"> 1502 + <ul class="list-inline trending-bar__list" data-curation="rt-nav-trending" data-qa="trending-bar-list"> 1503 + <li class="trending-bar__header">Trending on RT</li> 1504 + 1505 + <li><a class="trending-bar__link" 1506 + href="https://editorial.rottentomatoes.com/article/2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores/" 1507 + data-qa="trending-bar-item"> Emmy Noms </a></li> 1508 + 1509 + <li><a class="trending-bar__link" 1510 + href="https://editorial.rottentomatoes.com/article/movie-re-releases-calendar/" 1511 + data-qa="trending-bar-item"> Re-Release Calendar </a></li> 1512 + 1513 + <li><a class="trending-bar__link" 1514 + href="https://editorial.rottentomatoes.com/article/renewed-and-cancelled-tv-shows-2025/" 1515 + data-qa="trending-bar-item"> Renewed and Cancelled TV </a></li> 1516 + 1517 + <li><a class="trending-bar__link" href="https://editorial.rottentomatoes.com/article/app/" 1518 + data-qa="trending-bar-item"> The Rotten Tomatoes App </a></li> 1519 + 1520 + </ul> 1521 + <div class="trending-bar__social" data-qa="trending-bar-social-list"> 1522 + <social-media-icons theme="light" size="14"></social-media-icons> 1523 + </div> 1524 + </div> 1525 + </section> 1526 + 1527 + 1528 + 1529 + 1530 + <main id="main_container" class="container rt-layout__content"> 1531 + <div id="main-page-content"> 1532 + 1533 + 1534 + 1535 + 1536 + <div id="tv-series-overview" data-HeroModulesManager="overviewWrap"> 1537 + <watchlist-button-manager></watchlist-button-manager> 1538 + 1539 + <div id="hero-wrap" data-AdUnitManager="heroWrap" data-AdsMediaScorecardManager="heroWrap" 1540 + data-HeroModulesManager="heroWrap"> 1541 + 1542 + <div aria-labelledby="media-hero-label" class="media-hero-wrap" skeleton="panel" data-adobe-id="media-hero" 1543 + data-qa="section:media-hero" data-HeroModulesManager="mediaHeroWrap"> 1544 + <h1 class="unset" id="media-hero-label"> 1545 + <sr-text> Peacemaker </sr-text> 1546 + </h1> 1547 + 1548 + <media-hero averagecolor="33,54,15" mediatype="TvSeries" scrolly="0" scrollystart="0" 1549 + data-AdsMediaScorecardManager="mediaHero" data-HeroModulesManager="mediaHero:collapse"> 1550 + <rt-button slot="iconicVideoCta" theme="transparent" data-content-type="PROMO" 1551 + data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" data-mpx-id="2447231043621" 1552 + data-public-id="nTePljVEct61" data-title="Peacemaker" data-type="TvSeries" 1553 + data-VideoPlayerOverlayManager="btnVideo:click"><sr-text>Play trailer</sr-text></rt-button> 1554 + 1555 + <rt-text slot="iconicVideoRuntime" size="0.75">1:39</rt-text> 1556 + 1557 + <rt-img slot="iconic" alt="Main image for Peacemaker" fallbacktheme="iconic" fetchpriority="high" 1558 + src="https://resizing.flixster.com/bvZfzyIQHc8UI0CJS9UdOdRXC7w=/375x210/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg,https://resizing.flixster.com/2jGm07y7TAmgwksV1KSg9Xsogtg=/620x336/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg"></rt-img> 1559 + 1560 + 1561 + <img slot="poster" alt="Poster for " fetchpriority="high" 1562 + src="https://resizing.flixster.com/fxG7Llnq_i5HAiGsTWJ3fB5a29Q=/68x102/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==" /> 1563 + 1564 + 1565 + <rt-text slot="title" size="1.25,1.75" context="heading">Peacemaker</rt-text> 1566 + <rt-text slot="episodeTitle" size="1,1.5" context="label"></rt-text> 1567 + 1568 + 1569 + <rt-text slot="metadataProp" context="label" size="0.875">TV-MA</rt-text> 1570 + 1571 + <rt-text slot="metadataProp" context="label" size="0.875">Next Ep Thu Sep 11</rt-text> 1572 + 1573 + <rt-text slot="metadataProp" context="label" size="0.875">2 Seasons</rt-text> 1574 + 1575 + 1576 + 1577 + <rt-text slot="metadataGenre" size="0.875">Comedy</rt-text> 1578 + 1579 + <rt-text slot="metadataGenre" size="0.875">Action</rt-text> 1580 + 1581 + 1582 + <rt-button slot="trailerCta" shape="pill" theme="light" data-content-type="PROMO" 1583 + data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" data-mpx-id="2447231043621" 1584 + data-public-id="nTePljVEct61" data-title="Peacemaker" data-type="TvSeries" 1585 + data-VideoPlayerOverlayManager="btnVideo:click"><rt-icon icon="play"></rt-icon> 1586 + <sr-text>Play</sr-text> Trailer </rt-button> 1587 + 1588 + <watchlist-button slot="watchlistCta" emsid="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" mediatype="TvSeries" 1589 + mediatitle="Peacemaker" state="unchecked" theme="transparent-lighttext" 1590 + data-HeroModulesManager="mediaHeroWatchlistBtn" data-WatchlistButtonManager="watchlistButton:click"> 1591 + <span slot="text">Watchlist</span> 1592 + </watchlist-button> 1593 + 1594 + <watchlist-button slot="mobileWatchlistCta" emsid="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 1595 + mediatype="TvSeries" mediatitle="Peacemaker" state="unchecked" 1596 + data-HeroModulesManager="mediaHeroWatchlistBtn" 1597 + data-WatchlistButtonManager="watchlistButton:click"></watchlist-button> 1598 + 1599 + <div slot="desktopVideos" data-HeroModulesManager="mediaHeroVideos"></div> 1600 + 1601 + <rt-button slot="collapsedPrimaryCta" hidden shape="pill" theme="simplified" 1602 + data-AdsMediaScorecardManager="collapsedPrimaryCta" 1603 + data-HeroModulesManager="mediaHeroCta:click"></rt-button> 1604 + 1605 + <watchlist-button slot="collapsedWatchlistCta" emsid="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 1606 + mediatype="TvSeries" mediatitle="Peacemaker" state="unchecked" theme="transparent-lighttext" 1607 + data-HeroModulesManager="mediaHeroWatchlistBtn" data-WatchlistButtonManager="watchlistButton:click"> 1608 + <span slot="text">Watchlist</span> 1609 + </watchlist-button> 1610 + 1611 + <score-icon-critics slot="collapsedCriticsIcon" size="2.5"></score-icon-critics> 1612 + <rt-text slot="collapsedCriticsScore" context="label" size="1.375"></rt-text> 1613 + <rt-link slot="collapsedCriticsLink" size="0.75"></rt-link> 1614 + <rt-text slot="collapsedCriticsLabel" size="0.75">Tomatometer</rt-text> 1615 + 1616 + <score-icon-audience slot="collapsedAudienceIcon" size="2.5"></score-icon-audience> 1617 + <rt-text slot="collapsedAudienceScore" context="label" size="1.375"></rt-text> 1618 + <rt-link slot="collapsedAudienceLink" size="0.75"></rt-link> 1619 + <rt-text slot="collapsedAudienceLabel" size="0.75">Popcornmeter</rt-text> 1620 + </media-hero> 1621 + 1622 + <script id="media-hero-json" data-json="mediaHero" type="application/json"> 1623 + {"averageColorHsl":"33,54,15","iconic":{"srcDesktop":"https://resizing.flixster.com/2jGm07y7TAmgwksV1KSg9Xsogtg=/620x336/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg","srcMobile":"https://resizing.flixster.com/bvZfzyIQHc8UI0CJS9UdOdRXC7w=/375x210/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg"},"content":{"episodeTitle":"","metadataGenres":["Comedy","Action"],"metadataProps":["TV-MA","Next Ep Thu Sep 11","2 Seasons"],"posterSrc":"https://resizing.flixster.com/fxG7Llnq_i5HAiGsTWJ3fB5a29Q=/68x102/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==","title":"Peacemaker","primaryVideo":{"contentType":"PROMO","durationInSeconds":"99.933","mpxId":"2447231043621","publicId":"nTePljVEct61","thumbnail":{"url":"https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg"},"title":"Peacemaker: Season 2 Trailer - Weeks Ahead","runtime":"1:39"}}} 1624 + </script> 1625 + </div> 1626 + 1627 + 1628 + 1629 + <hero-modules-manager> 1630 + <script data-json="vanity" 1631 + type="application/json">{"emsId":"c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed","href":"/tv/peacemaker_2022","lifecycleWindow":{"date":"2025-09-11","lifecycle":"AIRING"},"type":"tvSeries","title":"Peacemaker","value":"peacemaker_2022","parents":[],"mediaType":"TvSeries"}</script> 1632 + </hero-modules-manager> 1633 + </div> 1634 + 1635 + <div id="main-wrap"> 1636 + <div id="modules-wrap" data-curation="drawer"> 1637 + 1638 + <div class="media-scorecard no-border" data-adobe-id="media-scorecard" data-qa="section:media-scorecard"> 1639 + <media-scorecard hideaudiencescore="false" skeleton="panel" 1640 + data-AdsMediaScorecardManager="mediaScorecard" data-HeroModulesManager="mediaScorecard"> 1641 + <rt-img alt="poster image" loading="lazy" slot="posterImage" 1642 + src="https://resizing.flixster.com/UHglta_RX5_h8fsHS2BljZkvfZk=/206x305/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw=="></rt-img> 1643 + <rt-button slot="criticsScoreIcon" data-MediaScorecardManager="overlayOpen:click" theme="transparent"> 1644 + <score-icon-critics certified="false" sentiment="POSITIVE" size="2.5"></score-icon-critics> 1645 + </rt-button> 1646 + <rt-text slot="criticsScore" context="label" role="button" size="1.375" 1647 + data-MediaScorecardManager="overlayOpen:click">96%</rt-text> 1648 + <rt-text slot="criticsScoreType" class="critics-score-type" role="button" size="0.75" 1649 + data-MediaScorecardManager="overlayOpen:click">Avg. Tomatometer</rt-text> 1650 + <rt-link slot="criticsReviews" size="0.75" href=""> 1651 + 150 Reviews 1652 + </rt-link> 1653 + 1654 + <rt-button slot="audienceScoreIcon" data-MediaScorecardManager="overlayOpen:click" 1655 + theme="transparent"> 1656 + <score-icon-audience certified="false" size="2.5" sentiment="POSITIVE"></score-icon-audience> 1657 + </rt-button> 1658 + <rt-text slot="audienceScore" context="label" role="button" size="1.375" 1659 + data-MediaScorecardManager="overlayOpen:click">84%</rt-text> 1660 + <rt-text slot="audienceScoreType" class="audience-score-type" role="button" size="0.75" 1661 + data-MediaScorecardManager="overlayOpen:click">Avg. Popcornmeter</rt-text> 1662 + <rt-link slot="audienceReviews" size="0.75" href=""> 1663 + 2,500+ Ratings 1664 + </rt-link> 1665 + 1666 + <div slot="description" data-AdsMediaScorecardManager="description"> 1667 + <drawer-more maxlines="2" skeleton="panel" status="closed" style="--display: flex; gap: 4px;"> 1668 + <rt-text slot="content" size="1"> 1669 + A man fights for peace at any cost, no matter how many people he has to kill to get it. 1670 + </rt-text> 1671 + <rt-link slot="ctaOpen"> 1672 + <rt-icon icon="down-open"></rt-icon> 1673 + </rt-link> 1674 + <rt-link slot="ctaClose"> 1675 + <rt-icon icon="up-open"></rt-icon> 1676 + </rt-link> 1677 + </drawer-more> 1678 + </div> 1679 + 1680 + 1681 + <affiliate-icon data-AdsMediaScorecardManager="affiliateIcon" icon="fandango-at-home" 1682 + slot="affiliateIcon"></affiliate-icon> 1683 + <!-- --> 1684 + <rt-img data-AdsMediaScorecardManager="affiliateIconCustom" slot="affiliateIconCustom" hidden> 1685 + </rt-img> 1686 + <rt-text context="label" data-AdsMediaScorecardManager="affiliatePrimaryText" size="1" 1687 + slot="affiliatePrimaryText">Watch on Fandango at Home</rt-text> 1688 + <rt-text data-AdsMediaScorecardManager="affiliateSecondaryText" size="0.75" 1689 + slot="affiliateSecondaryText"></rt-text> 1690 + <rt-button arialabel="Stream Peacemaker on Fandango at Home" 1691 + href="https://athome.fandango.com/content/browse/details/Peacemaker-A-Whole-New-Whirled/2089756?cmp=rt_leaderboard" 1692 + rel="noopener" shape="pill" slot="affiliateCtaBtn" 1693 + style="--backgroundColor: #3478C1; --textColor: #FFFFFF;" target="_blank" theme="simplified" 1694 + data-AdsMediaScorecardManager="affiliateCtaBtn" data-HeroModulesManager="mediaScorecardCta:click"> 1695 + Stream Now 1696 + </rt-button> 1697 + <div slot="adImpressions"></div> 1698 + 1699 + </media-scorecard> 1700 + 1701 + <media-scorecard-manager> 1702 + <script id="media-scorecard-json" data-json="mediaScorecard" type="application/json"> 1703 + {"audienceScore":{"bandedRatingCount":"2,500+ Ratings","score":"84","scoreType":"ALL","sentiment":"POSITIVE","certified":false,"scorePercent":"84%","title":"Avg. Popcornmeter"},"criticsScore":{"averageRating":"7.80","certified":false,"likedCount":143,"notLikedCount":7,"ratingCount":150,"reviewCount":150,"score":"96","sentiment":"POSITIVE","scorePercent":"96%","title":"Avg. Tomatometer"},"cta":{"affiliate":"fandango-at-home","buttonStyle":{"backgroundColor":"#3478C1","textColor":"#FFFFFF"},"buttonText":"Stream Now","buttonAnnouncement":"Stream Peacemaker on Fandango at Home","buttonUrl":"https://athome.fandango.com/content/browse/details/Peacemaker-A-Whole-New-Whirled/2089756?cmp=rt_leaderboard","icon":"fandango-at-home","windowDate":"","windowText":"Watch on Fandango at Home"},"description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","hideAudienceScore":false,"overlay":{"audienceAll":{"bandedRatingCount":"2,500+ Ratings","score":"84","scoreType":"ALL","sentiment":"POSITIVE","certified":false,"scorePercent":"84%","title":"Avg. Popcornmeter"},"audienceTitle":"Avg. Popcornmeter","audienceVerified":{"title":"Avg. Popcornmeter"},"criticsAll":{"averageRating":"7.80","certified":false,"likedCount":143,"notLikedCount":7,"ratingCount":150,"reviewCount":150,"score":"96","sentiment":"POSITIVE","scorePercent":"96%","title":"Avg. Tomatometer","scoreLinkText":"150 Reviews"},"criticsTitle":"Avg. Tomatometer","criticsTop":{"averageRating":"7.40","certified":false,"likedCount":36,"notLikedCount":2,"ratingCount":38,"reviewCount":38,"score":"95","sentiment":"POSITIVE","scorePercent":"95%","title":"Avg. Tomatometer","scoreLinkText":"38 Top Critic Reviews"},"hasAudienceAll":true,"hasAudienceVerified":false,"hasCriticsAll":true,"hasCriticsTop":true,"mediaType":"TvSeries","showScoreDetailsAudience":true,"learnMoreUrl":"https://editorial.rottentomatoes.com/article/introducing-verified-audience-score/"},"primaryImageUrl":"https://resizing.flixster.com/UHglta_RX5_h8fsHS2BljZkvfZk=/206x305/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw=="} 1704 + </script> 1705 + </media-scorecard-manager> 1706 + </div> 1707 + 1708 + 1709 + <section class="modules-nav" data-ModulesNavigationManager="navWrap"> 1710 + <modules-navigation-manager></modules-navigation-manager> 1711 + 1712 + <nav> 1713 + <modules-navigation-carousel skeleton="panel" tilewidth="auto" 1714 + data-ModulesNavigationManager="navCarousel"> 1715 + 1716 + 1717 + 1718 + 1719 + 1720 + 1721 + <a slot="tile" href="#where-to-watch"> 1722 + <rt-tab data-ModulesNavigationManager="navTab">Where to Watch</rt-tab> 1723 + </a> 1724 + 1725 + 1726 + 1727 + <a slot="tile" href="#seasons"> 1728 + <rt-tab data-ModulesNavigationManager="navTab">Seasons</rt-tab> 1729 + </a> 1730 + 1731 + 1732 + 1733 + <a slot="tile" href="#cast-and-crew"> 1734 + <rt-tab data-ModulesNavigationManager="navTab">Cast &amp; Crew</rt-tab> 1735 + </a> 1736 + 1737 + 1738 + 1739 + 1740 + 1741 + 1742 + 1743 + <a slot="tile" href="#more-like-this"> 1744 + <rt-tab data-ModulesNavigationManager="navTab">More Like This</rt-tab> 1745 + </a> 1746 + 1747 + 1748 + 1749 + <a slot="tile" href="#news-and-guides"> 1750 + <rt-tab data-ModulesNavigationManager="navTab">Related News</rt-tab> 1751 + </a> 1752 + 1753 + 1754 + 1755 + <a slot="tile" href="#videos"> 1756 + <rt-tab data-ModulesNavigationManager="navTab">Videos</rt-tab> 1757 + </a> 1758 + 1759 + 1760 + 1761 + <a slot="tile" href="#photos"> 1762 + <rt-tab data-ModulesNavigationManager="navTab">Photos</rt-tab> 1763 + </a> 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + 1771 + <a slot="tile" href="#media-info"> 1772 + <rt-tab data-ModulesNavigationManager="navTab">Media Info</rt-tab> 1773 + </a> 1774 + 1775 + 1776 + </modules-navigation-carousel> 1777 + </nav> 1778 + </section> 1779 + 1780 + 1781 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1782 + 1783 + <div id="where-to-watch" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1784 + 1785 + 1786 + 1787 + <section aria-labelledby="where-to-watch-label" class="where-to-watch" data-adobe-id="where-to-watch" 1788 + data-qa="section:where-to-watch"> 1789 + <div class="header-wrap"> 1790 + <h2 class="unset" id="where-to-watch-label"> 1791 + <rt-text context="heading" size="1.25" style="--textTransform: capitalize;">Where to 1792 + Watch</rt-text> 1793 + </h2> 1794 + <h3 class="unset"> 1795 + <rt-text context="heading" size="0.75" 1796 + style="--textColor: var(--grayDark4); --letterSpacing: 1px; --textTransform: capitalize;"> 1797 + Peacemaker 1798 + </rt-text> 1799 + </h3> 1800 + </div> 1801 + 1802 + <where-to-watch-manager> 1803 + <script id="where-to-watch-json" data-json="whereToWatch" type="application/json"> 1804 + {"affiliates":[{"icon":"fandango-at-home","url":"https://athome.fandango.com/content/browse/details/Peacemaker-A-Whole-New-Whirled/2089756?cmp=rt_where_to_watch","isSponsoredLink":false,"text":"Fandango at Home","availableSeasons":"Season 1"},{"icon":"max-us","url":"https://max.prf.hn/click/camref:1100lqRUT?cmp=rt_where_to_watch","isSponsoredLink":true,"text":"Max","availableSeasons":"Seasons 1-2"}],"affiliatesText":"Watch Peacemaker with a subscription on Max, or buy it on Fandango at Home.","justWatchMediaType":"show","showtimesUrl":"","releaseYear":"2022","tarsSlug":"rt-affiliates-sort-order","title":"Peacemaker"} 1805 + </script> 1806 + </where-to-watch-manager> 1807 + 1808 + <div hidden data-WhereToWatchManager="jwContainer"></div> 1809 + <div hidden data-WhereToWatchManager="w2wContainer"> 1810 + <carousel-slider data-curation="rt-affiliates-sort-order" gap="15px" skeleton="panel" 1811 + tile-width="80px" exclude-page-indicators> 1812 + 1813 + 1814 + <where-to-watch-meta affiliate="fandango-at-home" data-qa="affiliate-item" 1815 + href="https://athome.fandango.com/content/browse/details/Peacemaker-A-Whole-New-Whirled/2089756?cmp=rt_where_to_watch" 1816 + issponsoredlink="false" skeleton="panel" slot="tile"> 1817 + <where-to-watch-bubble image="fandango-at-home" slot="bubble" 1818 + tabindex="-1"></where-to-watch-bubble> 1819 + <span slot="license">Fandango at Home</span> 1820 + <span slot="coverage">Season 1</span> 1821 + </where-to-watch-meta> 1822 + 1823 + <where-to-watch-meta affiliate="max-us" data-qa="affiliate-item" 1824 + href="https://max.prf.hn/click/camref:1100lqRUT?cmp=rt_where_to_watch" issponsoredlink="true" 1825 + skeleton="panel" slot="tile"> 1826 + <where-to-watch-bubble image="max-us" slot="bubble" tabindex="-1"></where-to-watch-bubble> 1827 + <span slot="license">Max</span> 1828 + <span slot="coverage">Seasons 1-2</span> 1829 + </where-to-watch-meta> 1830 + 1831 + </carousel-slider> 1832 + 1833 + <p class="affiliates-text">Watch Peacemaker with a subscription on Max, or buy it on Fandango at 1834 + Home. </p> 1835 + </div> 1836 + </section> 1837 + 1838 + </div> 1839 + 1840 + 1841 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1842 + 1843 + <div id="seasons" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1844 + 1845 + 1846 + 1847 + 1848 + <section aria-labelledby="seasons-label" data-adobe-id="seasons" data-qa="section:seasons"> 1849 + <div class="header-wrap"> 1850 + <h2 class="unset" id="seasons-label"> 1851 + <rt-text size="1.25" context="heading">Seasons</rt-text> 1852 + </h2> 1853 + </div> 1854 + 1855 + <div class="content-wrap"> 1856 + <carousel-slider tile-width="240"> 1857 + 1858 + <tile-season slot="tile" href="/tv/peacemaker_2022/s02" skeleton="panel"> 1859 + <rt-img alt="Season 2" slot="image" 1860 + src="https://resizing.flixster.com/icqaMuFdXKqmN8qur-dfG4I-hWs=/206x305/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw=="></rt-img> 1861 + <rt-text size="1" context="label" slot="title" style="--letterSpacing: 1px;">Season 2</rt-text> 1862 + <score-icon-critics certified="true" sentiment="POSITIVE" size="0.875" 1863 + slot="criticsIcon"></score-icon-critics> 1864 + <rt-text slot="criticsScore" size="0.75" context="label">99%</rt-text> 1865 + <rt-text size="0.875" slot="airDate">Next Ep Thu Sep 11</rt-text> 1866 + <rt-text size="0.875" context="label" slot="details"> 1867 + Details <rt-icon icon="right-chevron"></rt-icon> 1868 + </rt-text> 1869 + </tile-season> 1870 + 1871 + <tile-season slot="tile" href="/tv/peacemaker_2022/s01" skeleton="panel"> 1872 + <rt-img alt="Season 1" slot="image" 1873 + src="https://resizing.flixster.com/5u5bKuemqBmiK2W2Xuxb7xBnuZI=/206x305/v2/https://resizing.flixster.com/YjquXjsEOPntiHVUvZlTljYnlZw=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNDJkODE0MDctYjAzNy00MWIyLTlmMjgtZDM5YWY3MDI0YjUzLmpwZw=="></rt-img> 1874 + <rt-text size="1" context="label" slot="title" style="--letterSpacing: 1px;">Season 1</rt-text> 1875 + <score-icon-critics certified="true" sentiment="POSITIVE" size="0.875" 1876 + slot="criticsIcon"></score-icon-critics> 1877 + <rt-text slot="criticsScore" size="0.75" context="label">93%</rt-text> 1878 + <rt-text size="0.875" slot="airDate">2022</rt-text> 1879 + <rt-text size="0.875" context="label" slot="details"> 1880 + Details <rt-icon icon="right-chevron"></rt-icon> 1881 + </rt-text> 1882 + </tile-season> 1883 + 1884 + </carousel-slider> 1885 + </div> 1886 + </section> 1887 + 1888 + </div> 1889 + 1890 + 1891 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1892 + 1893 + <div id="cast-and-crew" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1894 + 1895 + 1896 + 1897 + <section aria-labelledby="cast-and-crew-label" class="cast-and-crew" data-adobe-id="cast-and-crew" 1898 + data-qa="section:cast-and-crew"> 1899 + <div class="header-wrap"> 1900 + <h2 class="unset" id="cast-and-crew-label"> 1901 + <rt-text size="1.25" context="heading" data-qa="title">Cast & Crew</rt-text> 1902 + </h2> 1903 + <rt-button arialabel="Cast and Crew" data-qa="view-all-link" 1904 + href="/tv/peacemaker_2022/cast-and-crew" shape="pill" size="0.875" 1905 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 1906 + theme="light"> 1907 + View All 1908 + </rt-button> 1909 + </div> 1910 + 1911 + <div class="content-wrap"> 1912 + 1913 + 1914 + <a href="/celebrity/john_cena" data-qa="person-item"> 1915 + <tile-dynamic skeleton="panel"> 1916 + <rt-img alt="John Cena thumbnail image" aria-hidden="true" loading="lazy" slot="image" 1917 + src="https://resizing.flixster.com/qFr2ZK1qYDkqSmM5eT3nz_n6E_g=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/487578_v9_ba.jpg"></rt-img> 1918 + <div slot="insetText" aria-label="John Cena, Peacemaker"> 1919 + <p class="name" data-qa="person-name">John Cena</p> 1920 + <p class="role" data-qa="person-role">Peacemaker</p> 1921 + </div> 1922 + </tile-dynamic> 1923 + </a> 1924 + 1925 + <a href="/celebrity/danielle_brooks" data-qa="person-item"> 1926 + <tile-dynamic skeleton="panel"> 1927 + <rt-img alt="Danielle Brooks thumbnail image" aria-hidden="true" loading="lazy" slot="image" 1928 + src="https://resizing.flixster.com/KhnY5vsfjM0vtw0cZL3aNxXbeUE=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/765589_v9_bc.jpg"></rt-img> 1929 + <div slot="insetText" aria-label="Danielle Brooks, Leota Adebayo"> 1930 + <p class="name" data-qa="person-name">Danielle Brooks</p> 1931 + <p class="role" data-qa="person-role">Leota Adebayo</p> 1932 + </div> 1933 + </tile-dynamic> 1934 + </a> 1935 + 1936 + <a href="/celebrity/freddie_stroma" data-qa="person-item"> 1937 + <tile-dynamic skeleton="panel"> 1938 + <rt-img alt="Freddie Stroma thumbnail image" aria-hidden="true" loading="lazy" slot="image" 1939 + src="https://resizing.flixster.com/Yk2eiDCtamfmNlK-xMa7nmEw_Po=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/GNLZZGG00283ZZD.jpg"></rt-img> 1940 + <div slot="insetText" aria-label="Freddie Stroma, Vigilante"> 1941 + <p class="name" data-qa="person-name">Freddie Stroma</p> 1942 + <p class="role" data-qa="person-role">Vigilante</p> 1943 + </div> 1944 + </tile-dynamic> 1945 + </a> 1946 + 1947 + <a href="/celebrity/chukwudi_iwuji" data-qa="person-item"> 1948 + <tile-dynamic skeleton="panel"> 1949 + <rt-img alt="Chukwudi Iwuji thumbnail image" aria-hidden="true" loading="lazy" slot="image" 1950 + src="https://resizing.flixster.com/uNAFlG9dNMjJwyMbPDiCsbjkX8I=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/565157_v9_ba.jpg"></rt-img> 1951 + <div slot="insetText" aria-label="Chukwudi Iwuji, Clemson Murn"> 1952 + <p class="name" data-qa="person-name">Chukwudi Iwuji</p> 1953 + <p class="role" data-qa="person-role">Clemson Murn</p> 1954 + </div> 1955 + </tile-dynamic> 1956 + </a> 1957 + 1958 + <a href="/celebrity/jennifer_holland" data-qa="person-item"> 1959 + <tile-dynamic skeleton="panel"> 1960 + <rt-img alt="Jennifer Holland thumbnail image" aria-hidden="true" loading="lazy" slot="image" 1961 + src="https://resizing.flixster.com/-xeYAf0O7fGIQHRx_YkL7vnaMMg=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/331642_v9_bb.jpg"></rt-img> 1962 + <div slot="insetText" aria-label="Jennifer Holland, Emilia Harcourt"> 1963 + <p class="name" data-qa="person-name">Jennifer Holland</p> 1964 + <p class="role" data-qa="person-role">Emilia Harcourt</p> 1965 + </div> 1966 + </tile-dynamic> 1967 + </a> 1968 + 1969 + <a href="/celebrity/steve_agee" data-qa="person-item"> 1970 + <tile-dynamic skeleton="panel"> 1971 + <rt-img alt="Steve Agee thumbnail image" aria-hidden="true" loading="lazy" slot="image" 1972 + src="https://resizing.flixster.com/YprPSg0SXNIqq-Wy4UEz4ovBnOw=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/223358_v9_bd.jpg"></rt-img> 1973 + <div slot="insetText" aria-label="Steve Agee, John Economos"> 1974 + <p class="name" data-qa="person-name">Steve Agee</p> 1975 + <p class="role" data-qa="person-role">John Economos</p> 1976 + </div> 1977 + </tile-dynamic> 1978 + </a> 1979 + 1980 + </div> 1981 + 1982 + </section> 1983 + 1984 + </div> 1985 + 1986 + 1987 + <ad-unit hidden unit-display="desktop" unit-type="opbannerone"> 1988 + <div slot="ad-inject" class="banner-ad"></div> 1989 + </ad-unit> 1990 + 1991 + 1992 + <ad-unit hidden unit-display="mobile" unit-type="interscroller" no-retry 1993 + data-AdUnitManager="adUnit:interscrollerinstantiated"> 1994 + <aside slot="ad-inject" class="center mobile-interscroller"></aside> 1995 + </ad-unit> 1996 + 1997 + 1998 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1999 + 2000 + <div id="more-like-this" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2001 + 2002 + 2003 + 2004 + <section aria-labelledby="more-like-this-label" class="more-like-this" data-adobe-id="more-like-this" 2005 + data-qa="section:more-like-this"> 2006 + <div class="header-wrap"> 2007 + <div class="link-wrap"> 2008 + <h3 class="unset" id="more-like-this-label"> 2009 + <rt-text size="1.25" context="heading"> 2010 + More Like This 2011 + </rt-text> 2012 + </h3> 2013 + <rt-button arialabel="Popular TV on Streaming" data-qa="view-all-link" 2014 + href="/browse/tv_series_browse/sort:popular" shape="pill" size="0.875" 2015 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2016 + theme="light"> 2017 + View All 2018 + </rt-button> 2019 + </div> 2020 + </div> 2021 + 2022 + <div class="content-wrap"> 2023 + <carousel-slider skeleton="panel" tile-width="140px" gap="15px"> 2024 + 2025 + <tile-poster-card slot="tile"> 2026 + <rt-link slot="primaryImage" href="/tv/twisted_metal" tabindex="-1"> 2027 + <sr-text>Twisted Metal</sr-text> 2028 + <rt-img loading="" 2029 + src="https://resizing.flixster.com/MtyzaFnLaDY2B3SeRCOm91EwADE=/206x305/v2/https://resizing.flixster.com/mAAW4s6Bzl9wVHeH6GYXImTQFYY=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvNWNlYzRjODUtYzU0OS00NzJhLTk5NmQtOTgwOTg1MTlkYWJjLmpwZw==" 2030 + alt="Twisted Metal poster"></rt-img> 2031 + </rt-link> 2032 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2033 + verticalalign="sub"></score-icon-critics> 2034 + <rt-text slot="criticsScore" size="0.9" context="label"> 2035 + 79% 2036 + </rt-text> 2037 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2038 + slot="audienceIcon"></score-icon-audience> 2039 + <rt-text slot="audienceScore" size="0.9" context="label"> 2040 + 88% 2041 + </rt-text> 2042 + <rt-link slot="title" href="/tv/twisted_metal" size="0.85" context="label"> 2043 + Twisted Metal 2044 + </rt-link> 2045 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2046 + emsid="80499e3c-a069-3e48-9d23-5b72d9f58079" mediatype="TvSeries" mediatitle="Twisted Metal" 2047 + slot="watchlistButton" state="unchecked"> 2048 + <span slot="text">Watchlist</span> 2049 + </watchlist-button> 2050 + 2051 + <rt-button data-content-type="PROMO" data-disable-ads="" 2052 + data-ems-id="80499e3c-a069-3e48-9d23-5b72d9f58079" data-mpx-id="2438157891760" 2053 + data-position="1" data-public-id="sGoBrIyuO6Gy" data-title="Twisted Metal: Season 2 Trailer" 2054 + data-track="poster" data-type="TvSeries" data-VideoPlayerOverlayManager="btnVideo:click" 2055 + data-video-list="" slot="trailerButton" size="0.875" theme="transparent"> 2056 + <rt-icon icon="play"></rt-icon> 2057 + <span>TRAILER</span> 2058 + <sr-text> for Twisted Metal</sr-text> 2059 + </rt-button> 2060 + 2061 + </tile-poster-card> 2062 + 2063 + <tile-poster-card slot="tile"> 2064 + <rt-link slot="primaryImage" href="/tv/comrade_detective" tabindex="-1"> 2065 + <sr-text>Comrade Detective</sr-text> 2066 + <rt-img loading="" 2067 + src="https://resizing.flixster.com/L44TL1O_i8N47QRPZ1DpAjipU78=/206x305/v2/https://resizing.flixster.com/sUXscZBjGl80M7C8wEX9qISu3Ls=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvUlRUVjI1OTA1OC53ZWJw" 2068 + alt="Comrade Detective poster"></rt-img> 2069 + </rt-link> 2070 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2071 + verticalalign="sub"></score-icon-critics> 2072 + <rt-text slot="criticsScore" size="0.9" context="label"> 2073 + 85% 2074 + </rt-text> 2075 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2076 + slot="audienceIcon"></score-icon-audience> 2077 + <rt-text slot="audienceScore" size="0.9" context="label"> 2078 + 88% 2079 + </rt-text> 2080 + <rt-link slot="title" href="/tv/comrade_detective" size="0.85" context="label"> 2081 + Comrade Detective 2082 + </rt-link> 2083 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2084 + emsid="bcb4d43d-3dbc-3da9-8051-51454a471ea1" mediatype="TvSeries" 2085 + mediatitle="Comrade Detective" slot="watchlistButton" state="unchecked"> 2086 + <span slot="text">Watchlist</span> 2087 + </watchlist-button> 2088 + 2089 + </tile-poster-card> 2090 + 2091 + <tile-poster-card slot="tile"> 2092 + <rt-link slot="primaryImage" href="/tv/saul_of_the_mole_men" tabindex="-1"> 2093 + <sr-text>Saul of the Mole Men</sr-text> 2094 + <rt-img loading="" 2095 + src="https://resizing.flixster.com/vvIDMwPetdv8iLBHM9DCici60ag=/206x305/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p284327_b_v8_ab.jpg" 2096 + alt="Saul of the Mole Men poster"></rt-img> 2097 + </rt-link> 2098 + <score-icon-critics certified="false" sentiment="NEGATIVE" size="1" slot="criticsIcon" 2099 + verticalalign="sub"></score-icon-critics> 2100 + <rt-text slot="criticsScore" size="0.9" context="label"> 2101 + 17% 2102 + </rt-text> 2103 + <score-icon-audience certified="false" sentiment="" size="1" 2104 + slot="audienceIcon"></score-icon-audience> 2105 + <rt-text slot="audienceScore" size="0.9" context="label"> 2106 + % 2107 + </rt-text> 2108 + <rt-link slot="title" href="/tv/saul_of_the_mole_men" size="0.85" context="label"> 2109 + Saul of the Mole Men 2110 + </rt-link> 2111 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2112 + emsid="19f88158-8f52-3e02-b11e-89f20b21eb4e" mediatype="TvSeries" 2113 + mediatitle="Saul of the Mole Men" slot="watchlistButton" state="unchecked"> 2114 + <span slot="text">Watchlist</span> 2115 + </watchlist-button> 2116 + 2117 + </tile-poster-card> 2118 + 2119 + <tile-poster-card slot="tile"> 2120 + <rt-link slot="primaryImage" href="/tv/somebody_somewhere" tabindex="-1"> 2121 + <sr-text>Somebody Somewhere</sr-text> 2122 + <rt-img loading="" 2123 + src="https://resizing.flixster.com/TJvPpdNIt4ic6QlG5Kwgkf80PZo=/206x305/v2/https://resizing.flixster.com/v8tcpv_dwS6GbygTvvUXubTn9_w=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvNTNiNTUwMzUtMzQyNi00NGM3LTkzNTgtMjU0NzU2MGU4NmE4LmpwZw==" 2124 + alt="Somebody Somewhere poster"></rt-img> 2125 + </rt-link> 2126 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2127 + verticalalign="sub"></score-icon-critics> 2128 + <rt-text slot="criticsScore" size="0.9" context="label"> 2129 + 100% 2130 + </rt-text> 2131 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2132 + slot="audienceIcon"></score-icon-audience> 2133 + <rt-text slot="audienceScore" size="0.9" context="label"> 2134 + 93% 2135 + </rt-text> 2136 + <rt-link slot="title" href="/tv/somebody_somewhere" size="0.85" context="label"> 2137 + Somebody Somewhere 2138 + </rt-link> 2139 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2140 + emsid="5cddaabc-0c8d-3e41-b44b-c44487f54cc9" mediatype="TvSeries" 2141 + mediatitle="Somebody Somewhere" slot="watchlistButton" state="unchecked"> 2142 + <span slot="text">Watchlist</span> 2143 + </watchlist-button> 2144 + 2145 + <rt-button data-content-type="PROMO" data-disable-ads="" 2146 + data-ems-id="5cddaabc-0c8d-3e41-b44b-c44487f54cc9" data-mpx-id="2378416707669" 2147 + data-position="4" data-public-id="wnDPGb8gSEC7" 2148 + data-title="Somebody Somewhere: Season 3 Trailer" data-track="poster" data-type="TvSeries" 2149 + data-VideoPlayerOverlayManager="btnVideo:click" data-video-list="" slot="trailerButton" 2150 + size="0.875" theme="transparent"> 2151 + <rt-icon icon="play"></rt-icon> 2152 + <span>TRAILER</span> 2153 + <sr-text> for Somebody Somewhere</sr-text> 2154 + </rt-button> 2155 + 2156 + </tile-poster-card> 2157 + 2158 + <tile-poster-card slot="tile"> 2159 + <rt-link slot="primaryImage" href="/tv/south_side" tabindex="-1"> 2160 + <sr-text>South Side</sr-text> 2161 + <rt-img loading="" src="none" alt="South Side poster"></rt-img> 2162 + </rt-link> 2163 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2164 + verticalalign="sub"></score-icon-critics> 2165 + <rt-text slot="criticsScore" size="0.9" context="label"> 2166 + 100% 2167 + </rt-text> 2168 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2169 + slot="audienceIcon"></score-icon-audience> 2170 + <rt-text slot="audienceScore" size="0.9" context="label"> 2171 + 92% 2172 + </rt-text> 2173 + <rt-link slot="title" href="/tv/south_side" size="0.85" context="label"> 2174 + South Side 2175 + </rt-link> 2176 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2177 + emsid="6942346f-6675-39af-945a-1c6c6d526cef" mediatype="TvSeries" mediatitle="South Side" 2178 + slot="watchlistButton" state="unchecked"> 2179 + <span slot="text">Watchlist</span> 2180 + </watchlist-button> 2181 + 2182 + <rt-button data-content-type="PROMO" data-disable-ads="" 2183 + data-ems-id="6942346f-6675-39af-945a-1c6c6d526cef" data-mpx-id="2130332739528" 2184 + data-position="5" data-public-id="RFlaFZLoP7L5" data-title="South Side: Season 3 Trailer" 2185 + data-track="poster" data-type="TvSeries" data-VideoPlayerOverlayManager="btnVideo:click" 2186 + data-video-list="" slot="trailerButton" size="0.875" theme="transparent"> 2187 + <rt-icon icon="play"></rt-icon> 2188 + <span>TRAILER</span> 2189 + <sr-text> for South Side</sr-text> 2190 + </rt-button> 2191 + 2192 + </tile-poster-card> 2193 + 2194 + 2195 + <tile-poster-card skeleton="panel" slot="tile" tabindex="-1"> 2196 + <tile-view-more aspect="posterCard" background="collage" slot="primaryImage"> 2197 + </tile-view-more> 2198 + <rt-text slot="title" size="0.85" context="label">Discover more movies and TV shows.</rt-text> 2199 + <rt-button href="/browse/tv_series_browse/sort:popular" slot="watchlistButton" shape="pill" 2200 + size="0.875" theme="transparent-darktext" aria-label="View More Popular TV on Streaming"> 2201 + View More 2202 + </rt-button> 2203 + </tile-poster-card> 2204 + </carousel-slider> 2205 + </div> 2206 + </section> 2207 + 2208 + </div> 2209 + 2210 + 2211 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2212 + 2213 + <div id="news-and-guides" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2214 + 2215 + 2216 + 2217 + <section aria-labelledby="news-and-guides-label" class="news-and-guides" data-adobe-id="news-and-guides" 2218 + data-qa="section:news-and-guides"> 2219 + <div class="header-wrap"> 2220 + <div class="link-wrap"> 2221 + <h2 class="unset" id="news-and-guides-label"> 2222 + <rt-text size="1.25" style="--textTransform: capitalize;" context="heading" 2223 + data-qa="title">Related TV News</rt-text> 2224 + </h2> 2225 + <rt-button arialabel="Related TV News" data-qa="view-all-link" 2226 + href="https://editorial.rottentomatoes.com/more-related-content/?relatedtvseriesid=c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2227 + shape="pill" size="0.875" 2228 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2229 + theme="light"> 2230 + View All 2231 + </rt-button> 2232 + </div> 2233 + </div> 2234 + 2235 + <div class="content-wrap"> 2236 + <carousel-slider tile-width="80%,240px" skeleton="panel" data-qa="carousel"> 2237 + 2238 + <a slot="tile" 2239 + href="https://editorial.rottentomatoes.com/article/what-to-expect-in-peacemaker-season-2/" 2240 + data-qa="article"> 2241 + <tile-dynamic orientation="landscape" skeleton="panel"> 2242 + <rt-img slot="image" 2243 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Peacemaker_S2_Preview-Rep.jpg" 2244 + loading="lazy"></rt-img> 2245 + <drawer-more slot="caption" maxlines="2" status="closed"> 2246 + <rt-text slot="content" size="1" context="label" data-qa="article-title">What To Expect In 2247 + <em>Peacemaker</em>: Season 2</rt-text> 2248 + </drawer-more> 2249 + </tile-dynamic> 2250 + </a> 2251 + 2252 + <a slot="tile" 2253 + href="https://editorial.rottentomatoes.com/article/peacemaker-season-2-first-reviews/" 2254 + data-qa="article"> 2255 + <tile-dynamic orientation="landscape" skeleton="panel"> 2256 + <rt-img slot="image" 2257 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Peacemaker_S2_Reviews-Rep.jpg" 2258 + loading="lazy"></rt-img> 2259 + <drawer-more slot="caption" maxlines="2" status="closed"> 2260 + <rt-text slot="content" size="1" context="label" 2261 + data-qa="article-title"><em>Peacemaker</em>: Season 2 First Reviews: Even Better Than the 2262 + First Season</rt-text> 2263 + </drawer-more> 2264 + </tile-dynamic> 2265 + </a> 2266 + 2267 + <a slot="tile" 2268 + href="https://editorial.rottentomatoes.com/article/6-tv-and-streaming-shows-you-should-binge-watch-in-august-2025/" 2269 + data-qa="article"> 2270 + <tile-dynamic orientation="landscape" skeleton="panel"> 2271 + <rt-img slot="image" 2272 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/07/600KingOfTheHill.jpg" 2273 + loading="lazy"></rt-img> 2274 + <drawer-more slot="caption" maxlines="2" status="closed"> 2275 + <rt-text slot="content" size="1" context="label" data-qa="article-title">6 TV and Streaming 2276 + Shows You Should Binge-Watch in August</rt-text> 2277 + </drawer-more> 2278 + </tile-dynamic> 2279 + </a> 2280 + 2281 + </carousel-slider> 2282 + </div> 2283 + </section> 2284 + 2285 + </div> 2286 + 2287 + 2288 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2289 + 2290 + <div id="videos" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2291 + 2292 + 2293 + 2294 + <section aria-labelledby="videos-carousel-label" class="videos-carousel" data-adobe-id="videos-carousel" 2295 + data-qa="section:videos-carousel"> 2296 + <div class="header-wrap"> 2297 + <div class="link-wrap"> 2298 + <h2 class="unset" data-qa="videos-section-title" id="videos-carousel-label"> 2299 + <rt-text size="1.25" context="heading">Videos</rt-text> 2300 + </h2> 2301 + <rt-button arialabel=" videos" data-qa="videos-view-all-link" href="/tv/peacemaker_2022/videos" 2302 + shape="pill" size="0.875" 2303 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2304 + theme="light"> 2305 + View All 2306 + </rt-button> 2307 + </div> 2308 + <h3 class="unset"> 2309 + <rt-text context="heading" size="0.75" 2310 + style="--letterSpacing: 1px; --textColor: var(--grayDark4); --textTransform: capitalize;"> 2311 + Peacemaker 2312 + </rt-text> 2313 + </h3> 2314 + </div> 2315 + 2316 + <carousel-slider tile-width="80%,240px" data-VideosCarouselManager="carousel" skeleton="panel" 2317 + data-qa="videos-carousel"> 2318 + 2319 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2320 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2321 + src="https://resizing.flixster.com/Q9pHL0plKwChI7M2x8OIXc4tTmY=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg" 2322 + alt="Peacemaker: Season 2 Trailer - Weeks Ahead"></rt-img> 2323 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2324 + data-mpx-id="2447231043621" data-public-id="nTePljVEct61" data-type="TvSeries" 2325 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2326 + data-qa="video-trailer-play-btn"> 2327 + <span class="sr-only">Peacemaker: Season 2 Trailer - Weeks Ahead</span> 2328 + </rt-button> 2329 + 2330 + <drawer-more slot="caption" maxlines="2" status="closed"> 2331 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 2332 + Trailer - Weeks Ahead</rt-text> 2333 + </drawer-more> 2334 + 2335 + <rt-badge slot="imageInsetLabel" theme="gray"> 2336 + 1:39 2337 + </rt-badge> 2338 + </tile-video> 2339 + 2340 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2341 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2342 + src="https://resizing.flixster.com/xwQEohhLNSYlXEPpuV8X_yi_hwc=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/206/519/thumb_2CDEC1BA-4D54-4C43-B824-2101B8C0A29D.jpg" 2343 + alt="Peacemaker: Season 2 Opening Title Sequence"></rt-img> 2344 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2345 + data-mpx-id="2446199363799" data-public-id="evKz2_ikqufb" data-type="TvSeries" 2346 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2347 + data-qa="video-trailer-play-btn"> 2348 + <span class="sr-only">Peacemaker: Season 2 Opening Title Sequence</span> 2349 + </rt-button> 2350 + 2351 + <drawer-more slot="caption" maxlines="2" status="closed"> 2352 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 2353 + Opening Title Sequence</rt-text> 2354 + </drawer-more> 2355 + 2356 + <rt-badge slot="imageInsetLabel" theme="gray"> 2357 + 1:44 2358 + </rt-badge> 2359 + </tile-video> 2360 + 2361 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2362 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2363 + src="https://resizing.flixster.com/uHrBotX26H8cgnZBr_y9pQrDfik=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/959/599/thumb_AE4DD3A1-45A3-463E-8C12-F066951D541A.jpg" 2364 + alt="Peacemaker: Season 2 Red Band Trailer"></rt-img> 2365 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2366 + data-mpx-id="2444841539922" data-public-id="LulHILmxo0GT" data-type="TvSeries" 2367 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2368 + data-qa="video-trailer-play-btn"> 2369 + <span class="sr-only">Peacemaker: Season 2 Red Band Trailer</span> 2370 + </rt-button> 2371 + 2372 + <drawer-more slot="caption" maxlines="2" status="closed"> 2373 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 2374 + Red Band Trailer</rt-text> 2375 + </drawer-more> 2376 + 2377 + <rt-badge slot="imageInsetLabel" theme="gray"> 2378 + 1:50 2379 + </rt-badge> 2380 + </tile-video> 2381 + 2382 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2383 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2384 + src="https://resizing.flixster.com/6ehG77KgLPJPYWPzW35z3UDrY3c=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/670/763/thumb_D04B0098-73B3-44A9-B14A-E1CC89B500E9.jpg" 2385 + alt="Peacemaker: Season 2 Comic-Con Trailer"></rt-img> 2386 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2387 + data-mpx-id="2441317443647" data-public-id="uguhp6w33VWb" data-type="TvSeries" 2388 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2389 + data-qa="video-trailer-play-btn"> 2390 + <span class="sr-only">Peacemaker: Season 2 Comic-Con Trailer</span> 2391 + </rt-button> 2392 + 2393 + <drawer-more slot="caption" maxlines="2" status="closed"> 2394 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 2395 + Comic-Con Trailer</rt-text> 2396 + </drawer-more> 2397 + 2398 + <rt-badge slot="imageInsetLabel" theme="gray"> 2399 + 2:37 2400 + </rt-badge> 2401 + </tile-video> 2402 + 2403 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2404 + <rt-img slot="image" fallbacktheme="iconic" loading="" 2405 + src="https://resizing.flixster.com/WN7wehopSKOYXw3sjPGPH7l4Mwg=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/7/359/thumb_35C0690D-5C54-4803-95D0-AEE78E22CDD3.jpg" 2406 + alt="Peacemaker: Season 2 Teaser"></rt-img> 2407 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2408 + data-mpx-id="2430958147932" data-public-id="ZOqU2VM5_juu" data-type="TvSeries" 2409 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2410 + data-qa="video-trailer-play-btn"> 2411 + <span class="sr-only">Peacemaker: Season 2 Teaser</span> 2412 + </rt-button> 2413 + 2414 + <drawer-more slot="caption" maxlines="2" status="closed"> 2415 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 2416 + Teaser</rt-text> 2417 + </drawer-more> 2418 + 2419 + <rt-badge slot="imageInsetLabel" theme="gray"> 2420 + 2:12 2421 + </rt-badge> 2422 + </tile-video> 2423 + 2424 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2425 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 2426 + src="https://resizing.flixster.com/ArY8dUMMJ4Uj3Z_2479ppTxYbI4=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/6/882/thumb_86D17DB7-30AA-4DB3-96D1-387997524FA5.jpg" 2427 + alt="Peacemaker: Season 2 &#39;Hype Sizzle&#39; Teaser"></rt-img> 2428 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2429 + data-mpx-id="2430957635557" data-public-id="ucZ_SFM3jCd3" data-type="TvSeries" 2430 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2431 + data-qa="video-trailer-play-btn"> 2432 + <span class="sr-only">Peacemaker: Season 2 &#39;Hype Sizzle&#39; Teaser</span> 2433 + </rt-button> 2434 + 2435 + <drawer-more slot="caption" maxlines="2" status="closed"> 2436 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 2437 + &#39;Hype Sizzle&#39; Teaser</rt-text> 2438 + </drawer-more> 2439 + 2440 + <rt-badge slot="imageInsetLabel" theme="gray"> 2441 + 1:31 2442 + </rt-badge> 2443 + </tile-video> 2444 + 2445 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2446 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 2447 + src="https://resizing.flixster.com/h8Pwz2jtI_AAsGxT2kEU4A6HHYw=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/606/731/thumb_A33D0BAB-F8A9-43C6-8971-B11DF5642BE0.jpg" 2448 + alt="Peacemaker: Season 1 Featurette - Behind the Scenes Set Tour"></rt-img> 2449 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2450 + data-mpx-id="2004237379870" data-public-id="hy7gINV20Xgz" data-type="TvSeries" 2451 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2452 + data-qa="video-trailer-play-btn"> 2453 + <span class="sr-only">Peacemaker: Season 1 Featurette - Behind the Scenes Set Tour</span> 2454 + </rt-button> 2455 + 2456 + <drawer-more slot="caption" maxlines="2" status="closed"> 2457 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 1 2458 + Featurette - Behind the Scenes Set Tour</rt-text> 2459 + </drawer-more> 2460 + 2461 + <rt-badge slot="imageInsetLabel" theme="gray"> 2462 + 2:25 2463 + </rt-badge> 2464 + </tile-video> 2465 + 2466 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2467 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 2468 + src="https://resizing.flixster.com/Zf72nYNVLThCE_c3MTZwXQk9O-w=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/187/395/thumb_751C1C8C-ACD5-49BA-862D-584331E8EF42.jpg" 2469 + alt="Peacemaker: Season 1 Featurette - Opening Credits Behind The Scenes"></rt-img> 2470 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2471 + data-mpx-id="1995207747775" data-public-id="xR3FXHupihhm" data-type="TvSeries" 2472 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2473 + data-qa="video-trailer-play-btn"> 2474 + <span class="sr-only">Peacemaker: Season 1 Featurette - Opening Credits Behind The Scenes</span> 2475 + </rt-button> 2476 + 2477 + <drawer-more slot="caption" maxlines="2" status="closed"> 2478 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 1 2479 + Featurette - Opening Credits Behind The Scenes</rt-text> 2480 + </drawer-more> 2481 + 2482 + <rt-badge slot="imageInsetLabel" theme="gray"> 2483 + 1:40 2484 + </rt-badge> 2485 + </tile-video> 2486 + 2487 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2488 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 2489 + src="https://resizing.flixster.com/5ecIljmgvVUMDcGdo8XdSxLRO_I=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/100/135/thumb_E53011DB-F8C7-4E3C-831B-E950B662F6BC.jpg" 2490 + alt="Peacemaker: Season 1 Opening Title Sequence"></rt-img> 2491 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2492 + data-mpx-id="1992968771590" data-public-id="qbI1i6F_q5v2" data-type="TvSeries" 2493 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2494 + data-qa="video-trailer-play-btn"> 2495 + <span class="sr-only">Peacemaker: Season 1 Opening Title Sequence</span> 2496 + </rt-button> 2497 + 2498 + <drawer-more slot="caption" maxlines="2" status="closed"> 2499 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 1 2500 + Opening Title Sequence</rt-text> 2501 + </drawer-more> 2502 + 2503 + <rt-badge slot="imageInsetLabel" theme="gray"> 2504 + 1:27 2505 + </rt-badge> 2506 + </tile-video> 2507 + 2508 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 2509 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 2510 + src="https://resizing.flixster.com/TgkyPcA__FO7UGZYkLAUzPBzUDI=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/421/735/thumb_871DE5CB-0944-426F-8B7A-48B30F9B4470.jpg" 2511 + alt="Peacemaker: Season 1 Red Band Trailer"></rt-img> 2512 + <rt-button theme="transparent" data-ems-id="c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" 2513 + data-mpx-id="1989011011859" data-public-id="VgqYycz107wr" data-type="TvSeries" 2514 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 2515 + data-qa="video-trailer-play-btn"> 2516 + <span class="sr-only">Peacemaker: Season 1 Red Band Trailer</span> 2517 + </rt-button> 2518 + 2519 + <drawer-more slot="caption" maxlines="2" status="closed"> 2520 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 1 2521 + Red Band Trailer</rt-text> 2522 + </drawer-more> 2523 + 2524 + <rt-badge slot="imageInsetLabel" theme="gray"> 2525 + 2:39 2526 + </rt-badge> 2527 + </tile-video> 2528 + 2529 + <tile-view-more aspect="landscape" background="mediaHero" slot="tile"> 2530 + <rt-button href="/tv/peacemaker_2022/videos" shape="pill" theme="transparent-lighttext"> 2531 + View more videos 2532 + </rt-button> 2533 + </tile-view-more> 2534 + </carousel-slider> 2535 + </section> 2536 + 2537 + </div> 2538 + 2539 + 2540 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2541 + 2542 + <div id="photos" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2543 + 2544 + 2545 + 2546 + <section aria-labelledby="photos-carousel-label" class="photos-carousel" data-adobe-id="photos-carousel" 2547 + data-qa="section:photos-carousel"> 2548 + <div class="header-wrap"> 2549 + <div class="link-wrap"> 2550 + <h2 class="unset" id="photos-carousel-label"> 2551 + <rt-text size="1.25" context="heading">Photos</rt-text> 2552 + </h2> 2553 + <rt-button arialabel="Peacemaker photos" data-qa="photos-view-all-link" 2554 + href="/tv/peacemaker_2022/pictures" shape="pill" size="0.875" 2555 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2556 + theme="light"> 2557 + View All 2558 + </rt-button> 2559 + </div> 2560 + <h3 class="unset"> 2561 + <rt-text context="label" size="0.75" style="--textColor: var(--grayDark4);"> 2562 + Peacemaker 2563 + </rt-text> 2564 + </h3> 2565 + </div> 2566 + 2567 + <carousel-slider tile-width="80%,240px" skeleton="panel"> 2568 + 2569 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2570 + <span class="sr-only"></span> 2571 + 2572 + 2573 + 2574 + <rt-img slot="image" loading="" 2575 + src="https://resizing.flixster.com/pnnbrMa3XqrNasqyxJqaN--H4Cc=/fit-in/352x330/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==,https://resizing.flixster.com/AyiRajTpy6lnaHumW_fILpwVRGg=/fit-in/705x460/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==" 2576 + alt="Peacemaker photo 1"></rt-img> 2577 + </tile-photo> 2578 + 2579 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2580 + <span class="sr-only"></span> 2581 + 2582 + 2583 + 2584 + <rt-img slot="image" loading="" 2585 + src="https://resizing.flixster.com/qE6FP4Bj6VCTuBfe7N66IQTIhRw=/fit-in/352x330/v2/https://resizing.flixster.com/k3cQC7eE0DrdhOhTJ7dknLuhrzk=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMDE5NGY5NjctZGE2ZC00NWQxLWI0MmUtNGU4ODU1MjNlYzBhLmpwZw==,https://resizing.flixster.com/xAQuYUE2M6oqOo_BeDF9s0Y7J5Y=/fit-in/705x460/v2/https://resizing.flixster.com/k3cQC7eE0DrdhOhTJ7dknLuhrzk=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMDE5NGY5NjctZGE2ZC00NWQxLWI0MmUtNGU4ODU1MjNlYzBhLmpwZw==" 2586 + alt="Peacemaker photo 2"></rt-img> 2587 + </tile-photo> 2588 + 2589 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2590 + <span class="sr-only"></span> 2591 + 2592 + 2593 + 2594 + <rt-img slot="image" loading="" 2595 + src="https://resizing.flixster.com/_3jHOzArNe3oiiVgxP_OQ-cmMHc=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h9_ag.jpg,https://resizing.flixster.com/EKOMJrRq1EHckFjYDh5SOVSn1vo=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h9_ag.jpg" 2596 + alt="Peacemaker photo 3"></rt-img> 2597 + </tile-photo> 2598 + 2599 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2600 + <span class="sr-only"></span> 2601 + 2602 + 2603 + 2604 + <rt-img slot="image" loading="" 2605 + src="https://resizing.flixster.com/QWAqHtLh7bMuf2TELXEDuAtQ5zM=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_v10_ag.jpg,https://resizing.flixster.com/2tHUgn3tU7-WCqrUQUSir93Gkdk=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_v10_ag.jpg" 2606 + alt="Peacemaker photo 4"></rt-img> 2607 + </tile-photo> 2608 + 2609 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2610 + <span class="sr-only"></span> 2611 + 2612 + 2613 + 2614 + <rt-img slot="image" loading="" 2615 + src="https://resizing.flixster.com/2qpZeM1Z2Zs7axXvrcp0rMD26-o=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h8_ag.jpg,https://resizing.flixster.com/2IaL5BpJB4siKUg4nW6oiaAmqWA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h8_ag.jpg" 2616 + alt="Peacemaker photo 5"></rt-img> 2617 + </tile-photo> 2618 + 2619 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2620 + <span class="sr-only"></span> 2621 + 2622 + 2623 + 2624 + <rt-img slot="image" loading="lazy" 2625 + src="https://resizing.flixster.com/5TjvqvQvONn4KxuHv07rgFfNjrU=/fit-in/352x330/v2/https://resizing.flixster.com/fwYgrAHcwGp2fRYUl5SKoTnVSzY=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMjYxOTllNmEtNTg1My00ZDJkLWJmOTQtNjFhOTc4YWY2YTJhLmpwZw==,https://resizing.flixster.com/5HHcytoqlM09VW1dilRz7tpS1t8=/fit-in/705x460/v2/https://resizing.flixster.com/fwYgrAHcwGp2fRYUl5SKoTnVSzY=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMjYxOTllNmEtNTg1My00ZDJkLWJmOTQtNjFhOTc4YWY2YTJhLmpwZw==" 2626 + alt="Peacemaker photo 6"></rt-img> 2627 + </tile-photo> 2628 + 2629 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2630 + <span class="sr-only">Peacemaker</span> 2631 + 2632 + 2633 + 2634 + <rt-img slot="image" loading="lazy" 2635 + src="https://resizing.flixster.com/zNFtUY54pAUCxSEy3Klf2tr3QQI=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h9_ac.jpg,https://resizing.flixster.com/Gn0OcNgEMPmXB_i-_0whwUrWWr0=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h9_ac.jpg" 2636 + alt="Peacemaker"></rt-img> 2637 + </tile-photo> 2638 + 2639 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2640 + <span class="sr-only">Peacemaker</span> 2641 + 2642 + 2643 + 2644 + <rt-img slot="image" loading="lazy" 2645 + src="https://resizing.flixster.com/ZdM1ETY1IFBSx3tEOi79gBn0aXQ=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v9_ac.jpg,https://resizing.flixster.com/e2CrSohJjji7pRMIiCRIwlmfDLg=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v9_ac.jpg" 2646 + alt="Peacemaker"></rt-img> 2647 + </tile-photo> 2648 + 2649 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2650 + <span class="sr-only">Peacemaker</span> 2651 + 2652 + 2653 + 2654 + <rt-img slot="image" loading="lazy" 2655 + src="https://resizing.flixster.com/bpwzsf_4hgeeBn5V4TODTxkAuow=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v8_ac.jpg,https://resizing.flixster.com/z7TWSr_eYCpEotH8_wlxVqshvBk=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v8_ac.jpg" 2656 + alt="Peacemaker"></rt-img> 2657 + </tile-photo> 2658 + 2659 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 2660 + <span class="sr-only">Peacemaker</span> 2661 + 2662 + 2663 + 2664 + <rt-img slot="image" loading="lazy" 2665 + src="https://resizing.flixster.com/vSIL4zB3ZG0p9Jnc_3H6y5K7r90=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h10_ac.jpg,https://resizing.flixster.com/KWIVpOvaUn3tHEP8QNJH5_PgkIA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h10_ac.jpg" 2666 + alt="Peacemaker"></rt-img> 2667 + </tile-photo> 2668 + 2669 + <tile-view-more aspect="square,landscape" background="mediaHero" slot="tile"> 2670 + <rt-button href="/tv/peacemaker_2022/pictures" shape="pill" theme="transparent-lighttext" 2671 + aria-label="View more Peacemaker photos"> 2672 + View more photos 2673 + </rt-button> 2674 + </tile-view-more> 2675 + </carousel-slider> 2676 + 2677 + <photos-carousel-manager> 2678 + <script id="photosCarousel" type="application/json" hidden> 2679 + {"title":"Peacemaker","images":[{"aspectRatio":"ASPECT_RATIO_2_3","height":"1920","width":"1296","imageUrl":"https://resizing.flixster.com/AyiRajTpy6lnaHumW_fILpwVRGg=/fit-in/705x460/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==","imageUrlMobile":"https://resizing.flixster.com/pnnbrMa3XqrNasqyxJqaN--H4Cc=/fit-in/352x330/v2/https://resizing.flixster.com/mEY3rZ4CClCMjpOT2WJSWBvf_p8=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvOTY5OTU0MzYtZmM5MC00MmI4LWI1YTEtYjQ4NDU2MWRmZWMzLmpwZw==","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_2_3","height":"6000","width":"4050","imageUrl":"https://resizing.flixster.com/xAQuYUE2M6oqOo_BeDF9s0Y7J5Y=/fit-in/705x460/v2/https://resizing.flixster.com/k3cQC7eE0DrdhOhTJ7dknLuhrzk=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMDE5NGY5NjctZGE2ZC00NWQxLWI0MmUtNGU4ODU1MjNlYzBhLmpwZw==","imageUrlMobile":"https://resizing.flixster.com/qE6FP4Bj6VCTuBfe7N66IQTIhRw=/fit-in/352x330/v2/https://resizing.flixster.com/k3cQC7eE0DrdhOhTJ7dknLuhrzk=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMDE5NGY5NjctZGE2ZC00NWQxLWI0MmUtNGU4ODU1MjNlYzBhLmpwZw==","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_4_3","height":"1080","width":"1440","imageUrl":"https://resizing.flixster.com/EKOMJrRq1EHckFjYDh5SOVSn1vo=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h9_ag.jpg","imageUrlMobile":"https://resizing.flixster.com/_3jHOzArNe3oiiVgxP_OQ-cmMHc=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h9_ag.jpg","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_3_4","height":"2048","width":"1536","imageUrl":"https://resizing.flixster.com/2tHUgn3tU7-WCqrUQUSir93Gkdk=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_v10_ag.jpg","imageUrlMobile":"https://resizing.flixster.com/QWAqHtLh7bMuf2TELXEDuAtQ5zM=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_v10_ag.jpg","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_16_9","height":"2160","width":"3840","imageUrl":"https://resizing.flixster.com/2IaL5BpJB4siKUg4nW6oiaAmqWA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h8_ag.jpg","imageUrlMobile":"https://resizing.flixster.com/2qpZeM1Z2Zs7axXvrcp0rMD26-o=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_b_h8_ag.jpg","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_3_2","height":"1280","width":"1920","imageUrl":"https://resizing.flixster.com/5HHcytoqlM09VW1dilRz7tpS1t8=/fit-in/705x460/v2/https://resizing.flixster.com/fwYgrAHcwGp2fRYUl5SKoTnVSzY=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMjYxOTllNmEtNTg1My00ZDJkLWJmOTQtNjFhOTc4YWY2YTJhLmpwZw==","imageUrlMobile":"https://resizing.flixster.com/5TjvqvQvONn4KxuHv07rgFfNjrU=/fit-in/352x330/v2/https://resizing.flixster.com/fwYgrAHcwGp2fRYUl5SKoTnVSzY=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvMjYxOTllNmEtNTg1My00ZDJkLWJmOTQtNjFhOTc4YWY2YTJhLmpwZw==","imageLoading":"lazy"},{"aspectRatio":"ASPECT_RATIO_4_3","caption":"Peacemaker","height":"1080","width":"1440","imageUrl":"https://resizing.flixster.com/Gn0OcNgEMPmXB_i-_0whwUrWWr0=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h9_ac.jpg","imageUrlMobile":"https://resizing.flixster.com/zNFtUY54pAUCxSEy3Klf2tr3QQI=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h9_ac.jpg","imageLoading":"lazy"},{"aspectRatio":"ASPECT_RATIO_3_4","caption":"Peacemaker","height":"1440","width":"1080","imageUrl":"https://resizing.flixster.com/e2CrSohJjji7pRMIiCRIwlmfDLg=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v9_ac.jpg","imageUrlMobile":"https://resizing.flixster.com/ZdM1ETY1IFBSx3tEOi79gBn0aXQ=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v9_ac.jpg","imageLoading":"lazy"},{"aspectRatio":"ASPECT_RATIO_2_3","caption":"Peacemaker","height":"1440","width":"960","imageUrl":"https://resizing.flixster.com/z7TWSr_eYCpEotH8_wlxVqshvBk=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v8_ac.jpg","imageUrlMobile":"https://resizing.flixster.com/bpwzsf_4hgeeBn5V4TODTxkAuow=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_v8_ac.jpg","imageLoading":"lazy"},{"aspectRatio":"ASPECT_RATIO_16_9","caption":"Peacemaker","height":"1080","width":"1920","imageUrl":"https://resizing.flixster.com/KWIVpOvaUn3tHEP8QNJH5_PgkIA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h10_ac.jpg","imageUrlMobile":"https://resizing.flixster.com/vSIL4zB3ZG0p9Jnc_3H6y5K7r90=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p20861895_i_h10_ac.jpg","imageLoading":"lazy"}],"picturesPageUrl":"/tv/peacemaker_2022/pictures"} 2680 + </script> 2681 + </photos-carousel-manager> 2682 + </section> 2683 + 2684 + </div> 2685 + 2686 + 2687 + <ad-unit hidden unit-display="mobile" unit-type="mboxadtwo" show-ad-link> 2688 + <div slot="ad-inject" class="rectangle_ad mobile center"></div> 2689 + </ad-unit> 2690 + 2691 + 2692 + <ad-unit hidden unit-display="desktop" unit-type="opbannertwo"> 2693 + <div slot="ad-inject" class="banner-ad"></div> 2694 + </ad-unit> 2695 + 2696 + 2697 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2698 + 2699 + <div id="media-info" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2700 + 2701 + 2702 + 2703 + <section aria-labelledby="media-info-label" class="media-info" data-adobe-id="media-info" 2704 + data-qa="section:media-info"> 2705 + <div class="header-wrap"> 2706 + <h2 class="unset" id="media-info-label"> 2707 + <rt-text context="heading" size="1.25" style="--textTransform: capitalize;" data-qa="title"> 2708 + Series Info 2709 + </rt-text> 2710 + </h2> 2711 + </div> 2712 + 2713 + <div class="content-wrap"> 2714 + 2715 + <div class="synopsis-wrap"> 2716 + <rt-text class="key" size="0.875" data-qa="synopsis-label">Synopsis</rt-text> 2717 + <rt-text data-qa="synopsis-value">A man fights for peace at any cost, no matter how many people he 2718 + has to kill to get it.</rt-text> 2719 + </div> 2720 + 2721 + 2722 + <dl> 2723 + 2724 + <div class="category-wrap" data-qa="item"> 2725 + <dt class="key"> 2726 + <rt-text class="key" size="0.875" data-qa="item-label">Executive Producer</rt-text> 2727 + </dt> 2728 + <dd data-qa="item-value-group"> 2729 + 2730 + <rt-link href="/celebrity/james_gunn" data-qa="item-value">James Gunn</rt-link><rt-text 2731 + class="delimiter">, </rt-text> 2732 + 2733 + <rt-link href="/celebrity/peter_safran" data-qa="item-value">Peter Safran</rt-link><rt-text 2734 + class="delimiter">, </rt-text> 2735 + 2736 + <rt-link href="/celebrity/john_cena" data-qa="item-value">John Cena</rt-link> 2737 + 2738 + </dd> 2739 + </div> 2740 + 2741 + <div class="category-wrap" data-qa="item"> 2742 + <dt class="key"> 2743 + <rt-text class="key" size="0.875" data-qa="item-label">Screenwriter</rt-text> 2744 + </dt> 2745 + <dd data-qa="item-value-group"> 2746 + 2747 + <rt-link href="/celebrity/james_gunn" data-qa="item-value">James Gunn</rt-link> 2748 + 2749 + </dd> 2750 + </div> 2751 + 2752 + <div class="category-wrap" data-qa="item"> 2753 + <dt class="key"> 2754 + <rt-text class="key" size="0.875" data-qa="item-label">Network</rt-text> 2755 + </dt> 2756 + <dd data-qa="item-value-group"> 2757 + 2758 + <rt-text data-qa="item-value">HBO Max</rt-text> 2759 + 2760 + </dd> 2761 + </div> 2762 + 2763 + <div class="category-wrap" data-qa="item"> 2764 + <dt class="key"> 2765 + <rt-text class="key" size="0.875" data-qa="item-label">Rating</rt-text> 2766 + </dt> 2767 + <dd data-qa="item-value-group"> 2768 + 2769 + <rt-text data-qa="item-value">TV-MA</rt-text> 2770 + 2771 + </dd> 2772 + </div> 2773 + 2774 + <div class="category-wrap" data-qa="item"> 2775 + <dt class="key"> 2776 + <rt-text class="key" size="0.875" data-qa="item-label">Genre</rt-text> 2777 + </dt> 2778 + <dd data-qa="item-value-group"> 2779 + 2780 + <rt-link href="/browse/tv_series_browse/genres:comedy" 2781 + data-qa="item-value">Comedy</rt-link><rt-text class="delimiter">, </rt-text> 2782 + 2783 + <rt-link href="/browse/tv_series_browse/genres:action" data-qa="item-value">Action</rt-link> 2784 + 2785 + </dd> 2786 + </div> 2787 + 2788 + <div class="category-wrap" data-qa="item"> 2789 + <dt class="key"> 2790 + <rt-text class="key" size="0.875" data-qa="item-label">Original Language</rt-text> 2791 + </dt> 2792 + <dd data-qa="item-value-group"> 2793 + 2794 + <rt-text data-qa="item-value">English</rt-text> 2795 + 2796 + </dd> 2797 + </div> 2798 + 2799 + <div class="category-wrap" data-qa="item"> 2800 + <dt class="key"> 2801 + <rt-text class="key" size="0.875" data-qa="item-label">Release Date</rt-text> 2802 + </dt> 2803 + <dd data-qa="item-value-group"> 2804 + 2805 + <rt-text data-qa="item-value">Jan 13, 2022</rt-text> 2806 + 2807 + </dd> 2808 + </div> 2809 + 2810 + </dl> 2811 + </div> 2812 + </section> 2813 + 2814 + </div> 2815 + 2816 + 2817 + </div> 2818 + 2819 + <div id="sidebar-wrap"> 2820 + <div data-adobe-id="discovery-sidebar" data-DiscoverySidebarManager="sticky"> 2821 + <discovery-sidebar-manager> 2822 + <script data-json="discoverySidebarJSON" type="application/json">{"mediaType":"tvSeries"}</script> 2823 + </discovery-sidebar-manager> 2824 + <discovery-sidebar skeleton="panel" data-DiscoverySidebarManager="sidebar"></discovery-sidebar> 2825 + 2826 + <ad-unit data-DiscoverySidebarManager="ad:instantiated" unit-display="desktop" unit-type="topmulti" 2827 + show-ad-link> 2828 + <div slot="ad-inject"></div> 2829 + </ad-unit> 2830 + </div> 2831 + </div> 2832 + 2833 + 2834 + <script id="curation-json" 2835 + type="application/json">{"emsId":"c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed","rtId":"16913","rtIdTvss":"16913","type":"tvSeries"}</script> 2836 + 2837 + </div> 2838 + </div> 2839 + 2840 + 2841 + <tool-tip data-MediaScorecardManager="tipCritics" hidden> 2842 + <rt-button slot="btnClose" data-MediaScorecardManager="tipCriticsClose:click" theme="transparent" size="1.5"> 2843 + <rt-icon icon="close" image="true"></rt-icon> 2844 + </rt-button> 2845 + <div data-MediaScorecardManager="tipCriticsContent"></div> 2846 + </tool-tip> 2847 + 2848 + <tool-tip class="component" data-MediaScorecardManager="tipAudience" hidden> 2849 + <rt-button slot="btnClose" data-MediaScorecardManager="tipAudienceClose:click" theme="transparent" size="1.5"> 2850 + <rt-icon icon="close" image="true"></rt-icon> 2851 + </rt-button> 2852 + <div data-MediaScorecardManager="tipAudienceContent"></div> 2853 + </tool-tip> 2854 + 2855 + <overlay-base data-MediaScorecardManager="overlay:close" hidden> 2856 + <!-- do not remove content slot preset --> 2857 + <div slot="content"></div> 2858 + </overlay-base> 2859 + 2860 + <overlay-base data-PhotosCarouselManager="overlayBase:close" hidden> 2861 + <photos-carousel-overlay data-PhotosCarouselManager="photosOverlay:sliderBtnClick" slot="content"> 2862 + <rt-button data-PhotosCarouselManager="closeBtn:click" slot="closeBtn" theme="transparent"> 2863 + <rt-icon icon="close"></rt-icon> 2864 + </rt-button> 2865 + </photos-carousel-overlay> 2866 + </overlay-base> 2867 + <overlay-base data-JwPlayerManager="overlayBase:close" data-VideoPlayerOverlayManager="overlayBase:close,open" 2868 + hidden> 2869 + <video-player-overlay class="video-overlay-wrap" data-qa="video-overlay" 2870 + data-VideoPlayerOverlayManager="videoPlayerOverlay:unmute" slot="content"> 2871 + <rt-button data-JwPlayerManager="unmuteBtn:click" slot="unmuteBtn" theme="light"> 2872 + <rt-icon icon="volume-mute-fill"></rt-icon> 2873 + &ensp; Tap to Unmute 2874 + </rt-button> 2875 + <div slot="header"> 2876 + <button class="unset transparent" data-VideoPlayerOverlayManager="btnOverlayClose:click" 2877 + data-qa="video-close-btn"> 2878 + <rt-icon icon="close"> 2879 + <span class="sr-only">Close video</span> 2880 + </rt-icon> 2881 + </button> 2882 + <a class="cta-btn header-cta button hide">See Details</a> 2883 + </div> 2884 + 2885 + <div slot="content"></div> 2886 + 2887 + <a slot="footer" class="cta-btn footer-cta button hide">See Details</a> 2888 + </video-player-overlay> 2889 + </overlay-base> 2890 + 2891 + <div id="video-overlay-player" hidden></div> 2892 + 2893 + <video-player-overlay-manager></video-player-overlay-manager> 2894 + <jw-player-manager data-AdsVideoSpotlightManager="jwPlayerManager:playlistItem,ready,remove" 2895 + data-VideoPlayerOverlayManager="jwPlayerManager:playlistItem,pause,ready,relatedClose,relatedOpen"> 2896 + </jw-player-manager> 2897 + 2898 + 2899 + <ads-media-scorecard-manager></ads-media-scorecard-manager> 2900 + 2901 + </div> 2902 + 2903 + <back-to-top hidden></back-to-top> 2904 + </main> 2905 + 2906 + <ad-unit hidden unit-display="desktop" unit-type="bottombanner"> 2907 + <div slot="ad-inject" class="sleaderboard_wrapper"></div> 2908 + </ad-unit> 2909 + 2910 + <ads-global-skin-takeover-manager></ads-global-skin-takeover-manager> 2911 + 2912 + <footer-manager></footer-manager> 2913 + <footer class="footer container" data-PagePicturesManager="footer"> 2914 + 2915 + <mobile-app-desktop-footer env="production" hidden></mobile-app-desktop-footer> 2916 + 2917 + 2918 + <div class="footer__content-desktop-block" data-qa="footer:section"> 2919 + <div class="footer__content-group"> 2920 + <ul class="footer__links-list"> 2921 + <li class="footer__links-list-item"> 2922 + <a href="/help_desk" data-qa="footer:link-helpdesk">Help</a> 2923 + </li> 2924 + <li class="footer__links-list-item"> 2925 + <a href="/about" data-qa="footer:link-about">About Rotten Tomatoes</a> 2926 + </li> 2927 + <li id="footer-feedback" class="footer__links-list-item" data-qa="footer-feedback-desktop"> 2928 + 2929 + </li> 2930 + </ul> 2931 + </div> 2932 + <div class="footer__content-group"> 2933 + <ul class="footer__links-list"> 2934 + <li class="footer__links-list-item"> 2935 + <a href="/critics/criteria" data-qa="footer:link-critic-submission">Critic Submission</a> 2936 + </li> 2937 + <li class="footer__links-list-item"> 2938 + <a href="/help_desk/licensing" data-qa="footer:link-licensing">Licensing</a> 2939 + </li> 2940 + <li class="footer__links-list-item"> 2941 + <a href="https://together.nbcuni.com/advertise/?utm_source=rotten_tomatoes&amp;utm_medium=referral&amp;utm_campaign=property_ad_pages&amp;utm_content=footer" 2942 + target="_blank" rel="noopener" data-qa="footer:link-ads">Advertise With Us</a> 2943 + </li> 2944 + <li class="footer__links-list-item"> 2945 + <a href="//www.fandango.com/careers" target="_blank" rel="noopener" 2946 + data-qa="footer:link-careers">Careers</a> 2947 + </li> 2948 + </ul> 2949 + </div> 2950 + <div class="footer__content-group footer__newsletter-block"> 2951 + <p class="h3 footer__content-group-title"> 2952 + <rt-icon icon="mail" size="1.25" style="fill:#fff"></rt-icon>&ensp;Join the Newsletter 2953 + </p> 2954 + <p class="footer__newsletter-copy">Get the freshest reviews, news, and more delivered right to your inbox!</p> 2955 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-desktop"> 2956 + Join The Newsletter 2957 + </rt-button> 2958 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 2959 + rel="noopener"> 2960 + Join The Newsletter 2961 + </a> 2962 + </div> 2963 + <div class="footer__content-group footer__social-block" data-qa="footer:social"> 2964 + <p class="h3 footer__content-group-title">Follow Us</p> 2965 + <social-media-icons theme="light" size="20"></social-media-icons> 2966 + </div> 2967 + </div> 2968 + 2969 + <div class="footer__content-mobile-block" data-qa="mfooter:section"> 2970 + <div class="footer__content-group"> 2971 + <div class="mobile-app-cta-wrap"> 2972 + 2973 + <mobile-app-cta env="production" showandroid="false" showios="true" hidden></mobile-app-cta> 2974 + </div> 2975 + 2976 + <p class="footer__copyright-legal" data-qa="mfooter:copyright"> 2977 + <rt-text size="0.75">Copyright &copy; Fandango. All rights reserved.</rt-text> 2978 + </p> 2979 + <p> 2980 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-mobile">Join The 2981 + Newsletter</rt-button> 2982 + </p> 2983 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 2984 + rel="noopener">Join The Newsletter</a> 2985 + 2986 + <ul class="footer__links-list list-inline"> 2987 + <li class="footer__links-list-item"> 2988 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 2989 + data-qa="mfooter:link-privacy-policy"> 2990 + Privacy Policy 2991 + </a> 2992 + </li> 2993 + <li class="footer__links-list-item"> 2994 + <a href="/policies/terms-and-policies" data-qa="mfooter:link-terms-policies">Terms and Policies</a> 2995 + </li> 2996 + <li class="footer__links-list-item"> 2997 + <img data-FooterManager="iconCCPA" 2998 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 2999 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 3000 + <!-- OneTrust Cookies Settings button start --> 3001 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings mobile" 3002 + data-qa="footer-cookie-settings-mobile">Cookie Settings</a> 3003 + <!-- OneTrust Cookies Settings button end --> 3004 + </li> 3005 + <li class="footer__links-list-item"> 3006 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 3007 + rel="noopener" data-qa="mfooter:link-california-notice">California Notice</a> 3008 + </li> 3009 + <li class="footer__links-list-item"> 3010 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 3011 + rel="noopener" data-qa="mfooter:link-adChoices">Ad Choices</a> 3012 + </li> 3013 + <li id="footer-feedback-mobile" class="footer__links-list-item" data-qa="footer-feedback-mobile"> 3014 + 3015 + </li> 3016 + <li class="footer__links-list-item"> 3017 + <a href="/faq#accessibility" data-qa="mfooter:link-accessibility">Accessibility</a> 3018 + </li> 3019 + </ul> 3020 + </div> 3021 + </div> 3022 + <div class="footer__copyright"> 3023 + <ul class="footer__links-list list-inline list-inline--separator" data-qa="footer:links-list-privacy"> 3024 + <li class="footer__links-list-item version" data-qa="footer:version"> 3025 + <span>V3.1</span> 3026 + </li> 3027 + <li class="footer__links-list-item"> 3028 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 3029 + data-qa="footer:link-privacy-policy"> 3030 + Privacy Policy 3031 + </a> 3032 + </li> 3033 + <li class="footer__links-list-item"> 3034 + <a href="/policies/terms-and-policies" data-qa="footer:link-terms-policies">Terms and Policies</a> 3035 + </li> 3036 + <li class="footer__links-list-item"> 3037 + <img data-FooterManager="iconCCPA" 3038 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 3039 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 3040 + <!-- OneTrust Cookies Settings button start --> 3041 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings" 3042 + data-qa="footer-cookie-settings-desktop">Cookie Settings</a> 3043 + <!-- OneTrust Cookies Settings button end --> 3044 + </li> 3045 + <li class="footer__links-list-item"> 3046 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 3047 + rel="noopener" data-qa="footer:link-california-notice">California Notice</a> 3048 + </li> 3049 + <li class="footer__links-list-item"> 3050 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 3051 + rel="noopener" data-qa="footer:link-adChoices">Ad Choices</a> 3052 + </li> 3053 + <li class="footer__links-list-item"> 3054 + <a href="/faq#accessibility" data-qa="footer:link-accessibility">Accessibility</a> 3055 + </li> 3056 + </ul> 3057 + <span class="footer__copyright-legal" data-qa="footer:copyright"> 3058 + Copyright &copy; Fandango. A Division of 3059 + <a href="https://www.nbcuniversal.com" target="_blank" rel="noopener" 3060 + data-qa="footer:link-nbcuniversal">NBCUniversal</a>. 3061 + All rights reserved. 3062 + </span> 3063 + </div> 3064 + </footer> 3065 + 3066 + </div> 3067 + 3068 + 3069 + <iframe-container hidden data-ArtiManager="iframeContainer:close,resize" 3070 + data-iframe-src="https://arti.rottentomatoes.com?theme=iframe" theme="widget"> 3071 + <span slot="logo"><img src="/assets/pizza-pie/images/arti.041d204c4a4.svg" alt="Logo"></img><span>beta</span></span> 3072 + <rt-button aria-label="New chat" data-ArtiManager="btnNewChat:click" id="artiNewChatButton" slot="optBtns" 3073 + theme="transparent" title="New chat"> 3074 + <rt-icon icon="new-chat" size="1.25" image></rt-icon> 3075 + </rt-button> 3076 + </iframe-container> 3077 + <arti-manager></arti-manager> 3078 + 3079 + 3080 + 3081 + 3082 + <script type="text/javascript"> 3083 + (function (root) { 3084 + /* -- Data -- */ 3085 + root.RottenTomatoes || (root.RottenTomatoes = {}); 3086 + root.RottenTomatoes.context || (root.RottenTomatoes.context = {}); 3087 + root.RottenTomatoes.context.resetCookies = ["AMCVS_8CF467C25245AE3F0A490D4C%40AdobeOrg", "AMCV_8CF467C25245AE3F0A490D4C%40AdobeOrg", "WRIgnore", "WRUIDAWS", "__CT_Data", "__gads", "_admrla", "_awl", "_cs_c", "_cs_id", "_cs_mk", "_cs_s", "_fbp", "_ga", "_gat_gtmTracker", "_gid", "aam_uuid", "akamai_generated_location", "auth_token", "auth_user", "auth_client", "check", "cognito", "fblo_326803741017", "fbm_326803741017", "fbsr_326803741017", "gpv_Page", "id_token", "is_auth", "loginPlatform", "mbox", "notice_behavior", "optimizelyBuckets", "optimizelyEndUserId", "optimizelyPendingLogEvents", "optimizelySegments", "s_cc", "s_dayslastvisit", "s_dayslastvisit_s", "s_invisit", "s_prevPage", "s_sq", "s_vnum", "cognito", "fbm_326803741017", "fbsr_326803741017", "id_token", "JSESSIONID", "QSI_HistorySession", "QSI_SI_8up4dWDOtjAg0hn_intercept", "_ALGOLIA", "__Host-color-scheme", "__Host-theme-options", "__host_color_scheme", "__host_theme_options", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "_chartbeat4", "_chartbeat5", "_sp_id.47f3", "_sp_ses.47f3", "_v__chartbeat3", "adops_master_kvs", "akacd_RTReplatform", "algoliaUT", "cognito", "cl_duid", "fbsr_326803741017", "id_token", "mps_uuid", "session_id", "_admrla", "_awl", "_ga", "_gid", "aam_uuid", "cognito", "fbm_326803741017", "id_token", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "adops_master_kvs", "cognito", "id_token", "krg_crb", "krg_uid", "mps_uuid"]; 3088 + root.Fandango || (root.Fandango = {}); 3089 + root.Fandango.dtmData = { "webVersion": "node", "rtVersion": 3.1, "loggedInStatus": "", "customerId": "", "pageName": "trailers" }; 3090 + root.RottenTomatoes.criticPage = { "vanity": "david-wilson1", "type": "movies", "typeDisplayName": "Movie", "totalReviews": "", "criticID": "10597" }; 3091 + root.RottenTomatoes.context.review = { "mediaType": "movie", "title": "No News From God", "emsId": "ef49e96b-6185-3ae1-a768-5ada72678f3d", "type": "all", "sort": undefined, "reviewsCount": 0, "pageInfo": undefined, "reviewerDefaultImg": "https:\u002F\u002Fimages.fandango.com\u002Fcms\u002Fassets\u002F5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png", "reviewerDefaultImgWidth": "100" }; 3092 + root.RottenTomatoes.context.useCursorPagination = true; 3093 + root.RottenTomatoes.context.verifiedTooltip = undefined; 3094 + root.RottenTomatoes.context.video = { "file": "https:\u002F\u002Flink.theplatform.com\u002Fs\u002FNGweTC\u002Fmedia\u002FumcvJJBe0zN4?formats=MPEG-DASH+widevine,M3U+appleHlsEncryption,M3U+none,MPEG-DASH+none,MPEG4,MP3", "type": "hls", "description": "", "image": "https:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F433\u002F995\u002Fthumb_249E752F-75BD-4BA4-8EC8-E3BAA4693CA8.jpg", "isRedBand": false, "mediaid": "1105334339671", "mpxId": "1105334339671", "publicId": "umcvJJBe0zN4", "title": "Roman Holiday: Trailer 1", "default": false, "label": "0", "duration": "2:26", "durationInSeconds": "146.313", "emsMediaType": "Movie", "emsId": "a50a127d-e1cb-373d-8f20-4999b7186c77", "overviewPageUrl": "\u002Fm\u002Froman_holiday", "videoPageUrl": "\u002Fm\u002Froman_holiday\u002Fvideos\u002FumcvJJBe0zN4", "videoType": "TRAILER", "adobeDataLayer": { "content": { "id": "fandango_1105334339671", "length": "146.313", "type": "vod", "player_name": "jw", "sdk_version": "web: 6.51.0", "channel": "movie", "originator": "paramount pictures", "name": "roman holiday: trailer 1", "rating": "not adult", "stream_type": "video" }, "media_params": { "genre": "romance, comedy", "show_type": 1 } }, "comscore": { "labelmapping": "c3=\"rottentomatoes.com\", ns_st_st=\"Rotten Tomatoes\", ns_st_pu=\"Paramount Pictures\", ns_st_pr=\"Roman Holiday\", ns_st_sn=\"*null\", ns_st_en=\"*null\", ns_st_ge=\"Romance,Comedy\", ns_st_ia=\"0\", ns_st_ce=\"0\", ns_st_ddt=\"1953\", ns_st_tdt=\"1953\"" }, "thumbnail": "https:\u002F\u002Fresizing.flixster.com\u002F-3W0tBGrEVaKaECTa6BWAMP_J0Y=\u002F270x160\u002Fv2\u002Fhttps:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F433\u002F995\u002Fthumb_249E752F-75BD-4BA4-8EC8-E3BAA4693CA8.jpg" }; 3095 + root.RottenTomatoes.context.videoClipsJson = { "count": 11 }; 3096 + root.RottenTomatoes.context.layout = { "header": { "movies": { "moviesAtHome": { "tarsSlug": "rt-nav-movies-at-home", "linkList": [{ "header": "Fandango at Home", "slug": "fandango-at-home-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:fandango-at-home" }, { "header": "Peacock", "slug": "peacock-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:peacock" }, { "header": "Netflix", "slug": "netflix-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:netflix" }, { "header": "Apple TV+", "slug": "apple-tv-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:apple-tv-plus" }, { "header": "Prime Video", "slug": "prime-video-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:prime-video" }, { "header": "Most Popular Streaming movies", "slug": "most-popular-streaming-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, { "header": "Certified Fresh movies", "slug": "certified-fresh-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh" }, { "header": "Browse all", "slug": "browse-all-link", "url": "\u002Fbrowse\u002Fmovies_at_home" }] } }, "editorial": { "guides": { "posts": [{ "ID": 161109, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F09\u002F600EssentialFootballMovies.png" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-football-movies\u002F", "status": "publish", "title": "59 Best Football Movies, Ranked by Tomatometer", "type": "guide" }, { "ID": 253470, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FBest_New_Romcoms600.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-new-rom-coms-romance-movies\u002F", "status": "publish", "title": "50 Best New Rom-Coms and Romance Movies", "type": "guide" }], "title": "Guides", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F" }, "hubs": { "posts": [{ "ID": 237626, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002FRT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fwhat-to-watch\u002F", "status": "publish", "title": "What to Watch: In Theaters and On Streaming", "type": "rt-hub" }, { "ID": 140214, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F02\u002FRT_AwardsTour_Thumbnail_600x314.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fawards-tour\u002F", "status": "publish", "title": "Awards Tour", "type": "rt-hub" }], "title": "Hubs", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hubs\u002F" }, "news": { "posts": [{ "ID": 273082, "author": 79, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FNew_Streaming_September_2025-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fnew-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more\u002F", "status": "publish", "title": "New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More", "type": "article" }, { "ID": 273326, "author": 669, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F09\u002FConjuring_Last_Rites_Reviews-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fthe-conjuring-last-rites-first-reviews\u002F", "status": "publish", "title": "\u003Cem\u003EThe Conjuring: Last Rites\u003C\u002Fem\u003E First Reviews: A Frightful, Fitting Send-off", "type": "article" }], "title": "RT News", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fnews\u002F" } }, "trendingTarsSlug": "rt-nav-trending", "trending": [{ "header": "Emmy Noms", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002F2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores\u002F" }, { "header": "Re-Release Calendar", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fmovie-re-releases-calendar\u002F" }, { "header": "Renewed and Cancelled TV", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Frenewed-and-cancelled-tv-shows-2025\u002F" }, { "header": "The Rotten Tomatoes App ", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fapp\u002F" }], "certifiedMedia": { "certifiedFreshTvSeason": { "header": null, "media": { "url": "\u002Ftv\u002Fthe_paper_2025\u002Fs01", "name": "The Paper: Season 1", "score": 83, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FyFijQcjPYUWUelgmiZLHgkXU7hw=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FDFkkHf5pEVX_apKtIQZcoEvI6RU=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FtexEZJLAG-KcVpfCdkT2R1t4cmE=\u002Fems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" }, "tarsSlug": "rt-nav-list-cf-picks" }, "certifiedFreshMovieInTheater": { "header": null, "media": { "url": "\u002Fm\u002Ftwinless", "name": "Twinless", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002Fj7lw2KeY9_XyfZQdqRZGku7_9C8=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FuxoeWz7uWmeYIV94_SzEV_osqe4=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVlylB3xT2RIYmRivMx37O3yD76Q=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" } }, "certifiedFreshMovieInTheater4": { "header": null, "media": { "url": "\u002Fm\u002Fhamilton_2020", "name": "Hamilton", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002F1woquJmQfEhWCZtm7GcH0NMHsYA=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FPeAJ5ZpF5qB98ZiX6ixNDCgW2P0=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVmBvlTk8-z7pQvDZXTgSdj93WDE=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" } }, "certifiedFreshMovieAtHome": { "header": null, "media": { "url": "\u002Fm\u002Fthe_thursday_murder_club", "name": "The Thursday Murder Club", "score": 76, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FjeeldFGcfSMgG09ey5VB7TCFiek=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002F9LXDkCzIBBNEiPURkB9t6VefF5Q=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FrwdeR5xIiN0k7SWr6yXdnmb6zP8=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" } }, "tarsSlug": "rt-nav-list-cf-picks" }, "tvLists": { "newTvTonight": { "tarsSlug": "rt-hp-text-list-3", "title": "New TV Tonight", "shows": [{ "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "The Walking Dead: Daryl Dixon: Season 3", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_walking_dead_daryl_dixon\u002Fs03" }, { "title": "The Crow Girl: Season 1", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_crow_girl\u002Fs01" }, { "title": "Only Murders in the Building: Season 5", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fonly_murders_in_the_building\u002Fs05" }, { "title": "The Girlfriend: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_girlfriend\u002Fs01" }, { "title": "aka Charlie Sheen: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Faka_charlie_sheen\u002Fs01" }, { "title": "Wizards Beyond Waverly Place: Season 2", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fwizards_beyond_waverly_place\u002Fs02" }, { "title": "Seen & Heard: the History of Black Television: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fseen_and_heard_the_history_of_black_television\u002Fs01" }, { "title": "The Fragrant Flower Blooms With Dignity: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_fragrant_flower_blooms_with_dignity\u002Fs01" }, { "title": "Guts & Glory: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fguts_and_glory\u002Fs01" }] }, "mostPopularTvOnRt": { "tarsSlug": "rt-hp-text-list-2", "title": "Most Popular TV on RT", "shows": [{ "title": "The Paper: Season 1", "tomatometer": { "tomatometer": 83, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fthe_paper_2025\u002Fs01" }, { "title": "Dexter: Resurrection: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fdexter_resurrection\u002Fs01" }, { "title": "Alien: Earth: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Falien_earth\u002Fs01" }, { "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "Wednesday: Season 2", "tomatometer": { "tomatometer": 87, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fwednesday\u002Fs02" }, { "title": "Peacemaker: Season 2", "tomatometer": { "tomatometer": 99, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fpeacemaker_2022\u002Fs02" }, { "title": "The Terminal List: Dark Wolf: Season 1", "tomatometer": { "tomatometer": 73, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_terminal_list_dark_wolf\u002Fs01" }, { "title": "Hostage: Season 1", "tomatometer": { "tomatometer": 82, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fhostage_2025\u002Fs01" }, { "title": "Chief of War: Season 1", "tomatometer": { "tomatometer": 93, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fchief_of_war\u002Fs01" }, { "title": "Irish Blood: Season 1", "tomatometer": { "tomatometer": 100, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Firish_blood\u002Fs01" }] } } }, "links": { "moviesInTheaters": { "certifiedFresh": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fcritics:certified_fresh~sort:popular", "comingSoon": "\u002Fbrowse\u002Fmovies_coming_soon\u002F", "openingThisWeek": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fsort:newest", "title": "\u002Fbrowse\u002Fmovies_in_theaters", "topBoxOffice": "\u002Fbrowse\u002Fmovies_in_theaters" }, "onDvdAndStreaming": { "all": "\u002Fbrowse\u002Fmovies_at_home\u002F", "certifiedFresh": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh", "title": "\u002Fbrowse\u002Fmovies_at_home\u002F", "top": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, "moreMovies": { "topMovies": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular", "trailers": "\u002Ftrailers" }, "tvTonight": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:newest", "tvPopular": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "moreTv": { "topTv": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "certifiedFresh": "\u002Fbrowse\u002Ftv_series_browse\u002Fcritics:fresh" }, "editorial": { "allTimeLists": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fall-time-lists\u002F", "bingeGuide": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fbinge-guide\u002F", "comicsOnTv": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcomics-on-tv\u002F", "countdown": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F", "fiveFavoriteFilms": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Ffive-favorite-films\u002F", "videoInterviews": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fvideo-interviews\u002F", "weekendBoxOffice": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekend-box-office\u002F", "weeklyKetchup": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekly-ketchup\u002F", "whatToWatch": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwhat-to-watch\u002F" }, "advertisingFooter": "https:\u002F\u002Ftogether.nbcuni.com\u002Fadvertise\u002F?utm_source=rotten_tomatoes&utm_medium=referral&utm_campaign=property_ad_pages&utm_content=footer", "californiaNotice": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcalifornia-consumer-privacy-act", "careers": "\u002F\u002Fwww.fandango.com\u002Fcareers", "cookieManagement": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcookies#accordionheader2", "fandangoAbout": "https:\u002F\u002Fwww.fandango.com\u002Fabout-us", "privacyPolicy": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Ffandango-privacy-policy", "termsPolicies": "\u002Fpolicies\u002Fterms-and-policies" } }; 3097 + root.RottenTomatoes.thirdParty = { "chartBeat": { "auth": "64558", "domain": "rottentomatoes.com" }, "mpx": { "accountPid": "NGweTC", "playerPid": "y__7B0iQTi4P", "playerPidPDK6": "pdk6_y__7B0iQTi4P", "accountId": "2474312077" }, "algoliaSearch": { "aId": "79FRDP12PN", "sId": "175588f6e5f8319b27702e4cc4013561" }, "cognito": { "upId": "us-west-2_4L0ZX4b1U", "clientId": "7pu48v8i2n25t4vhes0edck31c" } }; 3098 + root.RottenTomatoes.serviceWorker = { "isServiceWokerOn": true }; 3099 + root.__RT__ || (root.__RT__ = {}); 3100 + root.__RT__.featureFlags = { "adsCarouselHP": false, "adsCarouselHPSlug": "rt-sponsored-carousel-list-mcdonalds-hp", "adsCarouselOP": false, "adsCarouselOPSlug": "rt-sponsored-carousel-list-mcdonalds-op", "adsMockDLP": false, "adsPages": "none", "adsSponsoredOverrideOP": true, "adsSponsoredOverrideOPSlugs": "rt-sponsored-override-op-starz", "adsVideoSpotlightHP": false, "appleSigninEnabled": true, "artiEnabled": true, "authPasswordEnabled": true, "authVerboseLogs": false, "bypassCriticValidationEnabled": false, "castAndCrewEnabled": true, "cookieConsentServiceEnabled": false, "crssoEnabled": false, "editorialApiDisabled": false, "faqUpdatesEnabled": true, "legacyBridge": true, "logVerboseEnabled": false, "mobileAppAndroid": "https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.rottentomatoes.android", "mobileAppIos": "https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Frotten-tomatoes-movies-tv\u002Fid6673916573", "mobileAppIosMeta": "app-id=6673916573, app-argument=https:\u002F\u002Fwww.rottentomatoes.com\u002F", "mobileNavEnabled": true, "oneTrustJwtApiUrl": "https:\u002F\u002Fonetrustjwt.services.fandango.com", "oneTrustJwtServiceEnabled": false, "pageJsonEnabled": false, "profilesFeaturesEnabled": false, "profilesUsernameEnabled": false, "redesignMediaHeroEnabled": true, "redesignMoreLikeThis": true, "redesignSortTable": true, "trafficAndroidEnabled": false, "trafficSafariEnabled": true, "userMigrationEnabled": true, "versantFreewheelEnabled": false, "versantMpsDomain": "app.mps.vsnt.net", "versantMpsEnabled": false, "versantOneTrustScriptBlock": "\u003C!-- OneTrust Cookies Consent Notice start for rottentomatoes.com --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fconsent\u002F01978557-1604-76a7-ad7c-18216757cf52-test\u002FotSDKStub.js\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" data-domain-script=\"01978557-1604-76a7-ad7c-18216757cf52-test\" integrity=\"sha384-Exfxdyaw5OnsUlHEKlNlz7OwgVCyLlitAtJsDmSNh3LeLlCjWXos3X\u002FCMNUbQ\u002FgA\" crossorigin=\"anonymous\" \u003E\u003C\u002Fscript\u003E \u003Cscript type=\"text\u002Fjavascript\"\u003E function OptanonWrapper() { if (OnetrustActiveGroups.includes('7')) { document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); } } \u003C\u002Fscript\u003E \u003C!-- OneTrust Cookies Consent Notice end for rottentomatoes.com --\u003E \u003C!-- OneTrust IAB US Privacy (USP) --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fopt-out\u002FotCCPAiab.js\" id=\"privacyCookie\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" ccpa-opt-out-ids=\"USP\" ccpa-opt-out-geo=\"US\" ccpa-opt-out-lspa=\"false\"\u003E\u003C\u002Fscript\u003E \u003C!-- OneTrust IAB US Privacy (USP) end --\u003E", "videoGeoFencingEnabled": true }; 3101 + root.RottenTomatoes.context.adsMockDLP = false; 3102 + root.RottenTomatoes.context.req = { "params": { "vanity": "peacemaker_2022" }, "query": {}, "route": {}, "url": "\u002Ftv\u002Fpeacemaker_2022", "secure": false, "buildVersion": undefined }; 3103 + root.RottenTomatoes.context.config = {}; 3104 + root.BK = { "PageName": "http:\u002F\u002Fwww.rottentomatoes.com\u002Ftv\u002Fpeacemaker_2022", "SiteID": 37528, "SiteSection": "tv", "TvSeriesTitle": "Peacemaker", "TvSeriesId": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" }; 3105 + root.RottenTomatoes.dtmData = { "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed", "Series Title": "Peacemaker (2022)", "pageName": "rt | tv | series | Peacemaker (2022)", "titleGenre": "Comedy", "titleId": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed", "titleName": "Peacemaker (2022)", "titleType": "Tv" }; 3106 + root.RottenTomatoes.context.gptSite = "tv"; 3107 + 3108 + }(this)); 3109 + </script> 3110 + 3111 + <script fetchpriority="high" src="/assets/pizza-pie/javascripts/bundles/roma/preload.18bcfff8e54.js"></script> 3112 + 3113 + <script src="/assets/pizza-pie/javascripts/bundles/roma/vendors.a4cc402b78a.js"></script> 3114 + 3115 + <script src="/assets/pizza-pie/javascripts/bundles/roma/default.24dc1977289.js"></script> 3116 + 3117 + 3118 + <script async data-SearchResultsNavManager="script:load" 3119 + src="https://cdn.jsdelivr.net/npm/algoliasearch@4/dist/algoliasearch-lite.umd.js"> 3120 + </script> 3121 + <script src="/assets/pizza-pie/javascripts/templates/roma/searchNav.a3288ea5efe.js"></script> 3122 + <script src="/assets/pizza-pie/javascripts/bundles/roma/searchNav.6a836b4ca81.js"></script> 3123 + 3124 + 3125 + 3126 + <script src="/assets/pizza-pie/javascripts/templates/pages/tvSeries/index.cef0f7dcfdd.js"></script> 3127 + 3128 + <script src="/assets/pizza-pie/javascripts/bundles/pages/tvSeries/index.8bffb4ba4ad.js"></script> 3129 + 3130 + 3131 + 3132 + 3133 + <script> 3134 + if (window.mps && typeof window.mps.writeFooter === 'function') { 3135 + window.mps.writeFooter(); 3136 + } 3137 + </script> 3138 + 3139 + 3140 + 3141 + 3142 + 3143 + <script> 3144 + window._satellite && _satellite.pageBottom(); 3145 + </script> 3146 + 3147 + 3148 + </body> 3149 + 3150 + </html>
+3888
internal/services/samples/series_season.html
··· 1 + <!DOCTYPE html> 2 + <html lang="en" dir="ltr" xmlns="http://www.w3.org/1999/xhtml" 3 + prefix="fb: http://www.facebook.com/2008/fbml og: http://opengraphprotocol.org/schema/"> 4 + 5 + <head prefix="og: http://ogp.me/ns# flixstertomatoes: http://ogp.me/ns/apps/flixstertomatoes#"> 6 + 7 + 8 + 9 + 10 + <script charset="UTF-8" crossorigin="anonymous" data-domain-script="7e979733-6841-4fce-9182-515fac69187f" 11 + integrity="sha384-TKdmlzVmoD70HzftTw4WtOzIBL5mNx8mXSRzEvwrWjpIJ7FZ/EuX758yMDWXtRUN" 12 + src="https://cdn.cookielaw.org/consent/7e979733-6841-4fce-9182-515fac69187f/otSDKStub.js" type="text/javascript"> 13 + </script> 14 + <script type="text/javascript"> 15 + function OptanonWrapper() { 16 + if (OnetrustActiveGroups.includes('7')) { 17 + document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); 18 + } 19 + } 20 + </script> 21 + 22 + 23 + 24 + <script ccpa-opt-out-ids="USP" ccpa-opt-out-geo="US" ccpa-opt-out-lspa="false" charset="UTF-8" 25 + src="https://cdn.cookielaw.org/opt-out/otCCPAiab.js" type="text/javascript"> 26 + </script> 27 + 28 + 29 + 30 + 31 + 32 + 33 + <script src="/assets/pizza-pie/javascripts/bundles/roma/rt-common.js?single"></script> 34 + 35 + 36 + 37 + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 38 + <meta http-equiv="x-ua-compatible" content="ie=edge"> 39 + <meta name="viewport" content="width=device-width, initial-scale=1"> 40 + 41 + <link rel="shortcut icon" sizes="76x76" type="image/x-icon" 42 + href="https://www.rottentomatoes.com/assets/pizza-pie/images/favicon.ico" /> 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + <title>Peacemaker: Season 2 | Rotten Tomatoes</title> 51 + 52 + 53 + <meta name="description" 54 + content="Discover reviews, ratings, and trailers for Peacemaker: Season 2 on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 55 + 56 + <meta name="twitter:card" content="summary" /> 57 + 58 + <meta name="twitter:image" 59 + content="https://resizing.flixster.com/icqaMuFdXKqmN8qur-dfG4I-hWs=/206x305/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==" /> 60 + 61 + <meta name="twitter:title" content="Peacemaker: Season 2 | Rotten Tomatoes" /> 62 + 63 + <meta name="twitter:text:title" content="Peacemaker: Season 2 | Rotten Tomatoes" /> 64 + 65 + <meta name="twitter:description" 66 + content="Discover reviews, ratings, and trailers for Peacemaker: Season 2 on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 67 + 68 + 69 + 70 + <meta property="og:site_name" content="Rotten Tomatoes" /> 71 + 72 + <meta property="og:title" content="Peacemaker: Season 2 | Rotten Tomatoes" /> 73 + 74 + <meta property="og:description" 75 + content="Discover reviews, ratings, and trailers for Peacemaker: Season 2 on Rotten Tomatoes. Stay updated with critic and audience scores today!" /> 76 + 77 + <meta property="og:type" content="video.tv_show" /> 78 + 79 + <meta property="og:url" content="https://www.rottentomatoes.com/tv/peacemaker_2022/s02" /> 80 + 81 + <meta property="og:image" 82 + content="https://resizing.flixster.com/icqaMuFdXKqmN8qur-dfG4I-hWs=/206x305/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==" /> 83 + 84 + <meta property="og:locale" content="en_US" /> 85 + 86 + 87 + 88 + <link rel="canonical" href="https://www.rottentomatoes.com/tv/peacemaker_2022/s02" /> 89 + 90 + 91 + <script> 92 + var dataLayer = dataLayer || []; 93 + var RottenTomatoes = RottenTomatoes || {}; 94 + RottenTomatoes.dtmData = { "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "76add34d-b98d-34b5-9e0f-2eac74d2ab10", "Season Title": "Season 2", "Series Title": "Peacemaker", "pageName": "rt | tv | season | Peacemaker | Season 2", "titleGenre": "Comedy", "titleId": "76add34d-b98d-34b5-9e0f-2eac74d2ab10", "titleName": "Peacemaker", "titleType": "Tv" }; 95 + dataLayer.push({ "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "76add34d-b98d-34b5-9e0f-2eac74d2ab10", "Season Title": "Season 2", "Series Title": "Peacemaker", "pageName": "rt | tv | season | Peacemaker | Season 2", "titleGenre": "Comedy", "titleId": "76add34d-b98d-34b5-9e0f-2eac74d2ab10", "titleName": "Peacemaker", "titleType": "Tv" }); 96 + </script> 97 + 98 + 99 + 100 + <script id="mps-page-integration"> 101 + window.mpscall = { "cag[certified_fresh]": "0", "cag[fresh_rotten]": "rotten", "cag[genre]": "Comedy|Action", "cag[movieshow]": "Peacemaker", "cag[release]": "Aug 21, 2025", "cag[score]": "null", "cag[urlid]": "/peacemaker_2022/s02", "cat": "tv|season", "field[env]": "production", "field[rtid]": "76add34d-b98d-34b5-9e0f-2eac74d2ab10", "site": "rottentomatoes-web", "title": "Season 2", "type": "season" }; 102 + var mpsopts = { 'host': 'mps.nbcuni.com', 'updatecorrelator': 1 }; 103 + var mps = mps || {}; mps._ext = mps._ext || {}; mps._adsheld = []; mps._queue = mps._queue || {}; mps._queue.mpsloaded = mps._queue.mpsloaded || []; mps._queue.mpsinit = mps._queue.mpsinit || []; mps._queue.gptloaded = mps._queue.gptloaded || []; mps._queue.adload = mps._queue.adload || []; mps._queue.adclone = mps._queue.adclone || []; mps._queue.adview = mps._queue.adview || []; mps._queue.refreshads = mps._queue.refreshads || []; mps.__timer = Date.now || function () { return +new Date }; mps.__intcode = "v2"; if (typeof mps.getAd != "function") mps.getAd = function (adunit) { if (typeof adunit != "string") return false; var slotid = "mps-getad-" + adunit.replace(/\W/g, ""); if (!mps._ext || !mps._ext.loaded) { mps._queue.gptloaded.push(function () { typeof mps._gptfirst == "function" && mps._gptfirst(adunit, slotid); mps.insertAd("#" + slotid, adunit) }); mps._adsheld.push(adunit) } return '<div id="' + slotid + '" class="mps-wrapper" data-mps-fill-slot="' + adunit + '"></div>' }; 104 + </script> 105 + <script src="//mps.nbcuni.com/fetch/ext/load-rottentomatoes-web.js?nowrite=2" id="mps-load"></script> 106 + 107 + 108 + 109 + <script 110 + type="application/ld+json">{"@context":"http://schema.org","@type":"TVSeason","actor":[{"@type":"Person","name":"John Cena","sameAs":"https://www.rottentomatoes.com/celebrity/john_cena","image":"https://resizing.flixster.com/qFr2ZK1qYDkqSmM5eT3nz_n6E_g=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/487578_v9_ba.jpg"},{"@type":"Person","name":"Danielle Brooks","sameAs":"https://www.rottentomatoes.com/celebrity/danielle_brooks","image":"https://resizing.flixster.com/KhnY5vsfjM0vtw0cZL3aNxXbeUE=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/765589_v9_bc.jpg"},{"@type":"Person","name":"Freddie Stroma","sameAs":"https://www.rottentomatoes.com/celebrity/freddie_stroma","image":"https://resizing.flixster.com/Yk2eiDCtamfmNlK-xMa7nmEw_Po=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/GNLZZGG00283ZZD.jpg"},{"@type":"Person","name":"Chukwudi Iwuji","sameAs":"https://www.rottentomatoes.com/celebrity/chukwudi_iwuji","image":"https://resizing.flixster.com/uNAFlG9dNMjJwyMbPDiCsbjkX8I=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/565157_v9_ba.jpg"},{"@type":"Person","name":"Jennifer Holland","sameAs":"https://www.rottentomatoes.com/celebrity/jennifer_holland","image":"https://resizing.flixster.com/-xeYAf0O7fGIQHRx_YkL7vnaMMg=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/331642_v9_bb.jpg"},{"@type":"Person","name":"Steve Agee","sameAs":"https://www.rottentomatoes.com/celebrity/steve_agee","image":"https://resizing.flixster.com/YprPSg0SXNIqq-Wy4UEz4ovBnOw=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/223358_v9_bd.jpg"}],"aggregateRating":{"@type":"AggregateRating","bestRating":"100","description":"The Tomatometer rating โ€“ based on the published opinions of hundreds of film and television critics โ€“ is a trusted measurement of movie and TV programming quality for millions of moviegoers. It represents the percentage of professional critic reviews that are positive for a given film or television show.","name":"Tomatometer","ratingCount":82,"ratingValue":"99","reviewCount":82,"worstRating":"0"},"dateCreated":"2025-08-21","description":"Discover reviews, ratings, and trailers for Peacemaker: Season 2 on Rotten Tomatoes. Stay updated with critic and audience scores today!","episode":[{"@type":"TVEpisode","episodeNumber":"1","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e01","name":"The Ties That Grind","description":"While Peacemaker attempts to join the Justice Gang, Harcourt struggles to find work, and Economos takes on a challenging new assignment.","dateCreated":"2025-08-21"},{"@type":"TVEpisode","episodeNumber":"2","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e02","name":"A Man Is Only as Good as His Bird","description":"As Economos clashes with his new handler, Peacemaker must deal with the consequences of his actions in the alternate dimension.","dateCreated":"2025-08-28"},{"@type":"TVEpisode","episodeNumber":"3","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e03","name":"Another Rick Up My Sleeve","description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","dateCreated":"2025-09-04"},{"@type":"TVEpisode","episodeNumber":"4","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e04","name":"Need I Say Door","description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","dateCreated":"2025-09-11"},{"@type":"TVEpisode","episodeNumber":"5","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e05","name":"Back to the Suture","description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","dateCreated":"2025-09-18"},{"@type":"TVEpisode","episodeNumber":"6","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e06","name":"Ignorance is Chris","description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","dateCreated":"2025-09-25"},{"@type":"TVEpisode","episodeNumber":"7","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e07","description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","dateCreated":"2025-10-02"},{"@type":"TVEpisode","episodeNumber":"8","url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/e08","description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","dateCreated":"2025-10-09"}],"genre":["Comedy","Action"],"image":"https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==","name":"Season 2","partOfSeries":{"@type":"TVSeries","name":"Peacemaker","startDate":"2022-01-13","url":"https://www.rottentomatoes.com/tv/peacemaker_2022"},"producer":[{"@type":"Person","name":"James Gunn","sameAs":"https://www.rottentomatoes.com/celebrity/james_gunn","image":"https://images.fandango.com/cms/assets/b0cefeb0-b6a8-11ed-81d8-51a487a38835--poster-default-thumbnail.jpg"},{"@type":"Person","name":"Peter Safran","sameAs":"https://www.rottentomatoes.com/celebrity/peter_safran","image":"https://images.fandango.com/cms/assets/b0cefeb0-b6a8-11ed-81d8-51a487a38835--poster-default-thumbnail.jpg"}],"url":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02","video":{"@type":"VideoObject","thumbnailUrl":"https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg","name":"Peacemaker: Season 2 Trailer - Weeks Ahead","duration":"1:39","sourceOrganization":"MPX","uploadDate":"2025-08-28T16:36:57","description":"","contentUrl":"https://www.rottentomatoes.com/tv/peacemaker_2022/s02/videos/nTePljVEct61"}}</script> 111 + 112 + 113 + <link rel="manifest" href="https://www.rottentomatoes.com/assets/pizza-pie/manifest/manifest.json" /> 114 + 115 + <link rel="apple-touch-icon" 116 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-60.jpg" /> 117 + <link rel="apple-touch-icon" sizes="152x152" 118 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-152.jpg" /> 119 + <link rel="apple-touch-icon" sizes="167x167" 120 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-167.jpg" /> 121 + <link rel="apple-touch-icon" sizes="180x180" 122 + href="https://www.rottentomatoes.com/assets/pizza-pie/head-assets/images/apple-touch-icon-180.jpg" /> 123 + 124 + 125 + <!-- iOS Smart Banner --> 126 + <meta name="apple-itunes-app" content="app-id=6673916573, app-argument=https://www.rottentomatoes.com/"> 127 + 128 + 129 + 130 + 131 + 132 + 133 + <meta name="google-site-verification" content="VPPXtECgUUeuATBacnqnCm4ydGO99reF-xgNklSbNbc" /> 134 + 135 + 136 + <meta name="msvalidate.01" content="034F16304017CA7DCF45D43850915323" /> 137 + <meta name="theme-color" content="#FA320A"> 138 + 139 + <!-- DNS prefetch --> 140 + <meta http-equiv="x-dns-prefetch-control" content="on"> 141 + 142 + <link rel="dns-prefetch" href="//www.rottentomatoes.com" /> 143 + 144 + 145 + <link rel="preconnect" href="//www.rottentomatoes.com" /> 146 + 147 + 148 + 149 + 150 + <link rel="stylesheet" href="/assets/pizza-pie/stylesheets/bundles/layouts/default.b6077682d41.css" /> 151 + 152 + 153 + 154 + 155 + <link rel="preload" href="/assets/pizza-pie/stylesheets/bundles/pages/tvSeason.e90e54fbbb0.css" as="style" 156 + onload="this.onload=null;this.rel='stylesheet'" /> 157 + 158 + 159 + <script> 160 + window.RottenTomatoes = {}; 161 + window.RTLocals = {}; 162 + window.nunjucksPrecompiled = {}; 163 + window.__RT__ = {}; 164 + </script> 165 + 166 + 167 + 168 + <script src="https://cdn.jwplayer.com/libraries/U8MHzHHR.js"></script> 169 + <script src="https://sb.scorecardresearch.com/c2/plugins/streamingtag_plugin_jwplayer.js"></script> 170 + 171 + 172 + 173 + 174 + 175 + <script>!function (e) { var n = "https://s.go-mpulse.net/boomerang/"; if ("False" == "True") e.BOOMR_config = e.BOOMR_config || {}, e.BOOMR_config.PageParams = e.BOOMR_config.PageParams || {}, e.BOOMR_config.PageParams.pci = !0, n = "https://s2.go-mpulse.net/boomerang/"; if (window.BOOMR_API_key = "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9", function () { function e() { if (!o) { var e = document.createElement("script"); e.id = "boomr-scr-as", e.src = window.BOOMR.url, e.async = !0, i.parentNode.appendChild(e), o = !0 } } function t(e) { o = !0; var n, t, a, r, d = document, O = window; if (window.BOOMR.snippetMethod = e ? "if" : "i", t = function (e, n) { var t = d.createElement("script"); t.id = n || "boomr-if-as", t.src = window.BOOMR.url, BOOMR_lstart = (new Date).getTime(), e = e || d.body, e.appendChild(t) }, !window.addEventListener && window.attachEvent && navigator.userAgent.match(/MSIE [67]\./)) return window.BOOMR.snippetMethod = "s", void t(i.parentNode, "boomr-async"); a = document.createElement("IFRAME"), a.src = "about:blank", a.title = "", a.role = "presentation", a.loading = "eager", r = (a.frameElement || a).style, r.width = 0, r.height = 0, r.border = 0, r.display = "none", i.parentNode.appendChild(a); try { O = a.contentWindow, d = O.document.open() } catch (_) { n = document.domain, a.src = "javascript:var d=document.open();d.domain='" + n + "';void(0);", O = a.contentWindow, d = O.document.open() } if (n) d._boomrl = function () { this.domain = n, t() }, d.write("<bo" + "dy onload='document._boomrl();'>"); else if (O._boomrl = function () { t() }, O.addEventListener) O.addEventListener("load", O._boomrl, !1); else if (O.attachEvent) O.attachEvent("onload", O._boomrl); d.close() } function a(e) { window.BOOMR_onload = e && e.timeStamp || (new Date).getTime() } if (!window.BOOMR || !window.BOOMR.version && !window.BOOMR.snippetExecuted) { window.BOOMR = window.BOOMR || {}, window.BOOMR.snippetStart = (new Date).getTime(), window.BOOMR.snippetExecuted = !0, window.BOOMR.snippetVersion = 12, window.BOOMR.url = n + "4RDDZ-2Z6GP-RRNMC-PYEUL-SK6K9"; var i = document.currentScript || document.getElementsByTagName("script")[0], o = !1, r = document.createElement("link"); if (r.relList && "function" == typeof r.relList.supports && r.relList.supports("preload") && "as" in r) window.BOOMR.snippetMethod = "p", r.href = window.BOOMR.url, r.rel = "preload", r.as = "script", r.addEventListener("load", e), r.addEventListener("error", function () { t(!0) }), setTimeout(function () { if (!o) t(!0) }, 3e3), BOOMR_lstart = (new Date).getTime(), i.parentNode.appendChild(r); else t(!1); if (window.addEventListener) window.addEventListener("load", a, !1); else if (window.attachEvent) window.attachEvent("onload", a) } }(), "".length > 0) if (e && "performance" in e && e.performance && "function" == typeof e.performance.setResourceTimingBufferSize) e.performance.setResourceTimingBufferSize(); !function () { if (BOOMR = e.BOOMR || {}, BOOMR.plugins = BOOMR.plugins || {}, !BOOMR.plugins.AK) { var n = "" == "true" ? 1 : 0, t = "", a = "eyd6zaauaeceajqacqcoyaaaevul3mep-f-a8182a08c-clienttons-s.akamaihd.net", i = "false" == "true" ? 2 : 1, o = { "ak.v": "39", "ak.cp": "1839344", "ak.ai": parseInt("1226367", 10), "ak.ol": "0", "ak.cr": 19, "ak.ipv": 6, "ak.proto": "h2", "ak.rid": "301a8e1c", "ak.r": 43885, "ak.a2": n, "ak.m": "dsca", "ak.n": "essl", "ak.bpcip": "2607:ec80:1401:440::", "ak.cport": 63193, "ak.gh": "23.199.45.20", "ak.quicv": "", "ak.tlsv": "tls1.3", "ak.0rtt": "", "ak.0rtt.ed": "", "ak.csrc": "-", "ak.acc": "", "ak.t": "1757261967", "ak.ak": "hOBiQwZUYzCg5VSAfCLimQ==ntUWb5wnRu6lt7Cbim0g4JNC0/ih9jlSOVTOOvHF5Ib49FleuDTLiBZtZs2c1+Y951ArMkVkvsjvdqe/amTFR0ODR3UKUgt+dr9I2Baxnr/2QXVqS168VfWbq3m5cyCJQAKuCLaoKSBsp5kGIj8vHcp61Ef1l5YlDWFrf/xl+gB+pnirvlyJ9s0bGxW2qDhKWeXYA9kUrRoVDldyiPVDUQquWWn234g1j+wMxq4wCdEVwBxK/haGHmMGN2mAm5X4rgUogJKHLQMvNQpuZaPTDoduN54Uy3piEtjFPaxEILb9jLhoJyhIsLum3/VAHrbucgxHEq8S+81KRp6Hyt8IeH0iZnic7or+2T/nFmRbXcoEaowMnKn3BC6TOUv2SIbK8INpCzzUvlhelrP40BEiYnfCcZLbcDg3OgKFdTlcZ0g=", "ak.pv": "3", "ak.dpoabenc": "", "ak.tf": i }; if ("" !== t) o["ak.ruds"] = t; var r = { i: !1, av: function (n) { var t = "http.initiator"; if (n && (!n[t] || "spa_hard" === n[t])) o["ak.feo"] = void 0 !== e.aFeoApplied ? 1 : 0, BOOMR.addVar(o) }, rv: function () { var e = ["ak.bpcip", "ak.cport", "ak.cr", "ak.csrc", "ak.gh", "ak.ipv", "ak.m", "ak.n", "ak.ol", "ak.proto", "ak.quicv", "ak.tlsv", "ak.0rtt", "ak.0rtt.ed", "ak.r", "ak.acc", "ak.t", "ak.tf"]; BOOMR.removeVar(e) } }; BOOMR.plugins.AK = { akVars: o, akDNSPreFetchDomain: a, init: function () { if (!r.i) { var e = BOOMR.subscribe; e("before_beacon", r.av, null, null), e("onbeacon", r.rv, null, null), r.i = !0 } return this }, is_complete: function () { return !0 } } } }() }(window);</script> 176 + </head> 177 + 178 + <body class="body no-touch js-mptd-layout" data-AdsGlobalSkinTakeoverManager="body" data-SearchResultsNavManager="body"> 179 + <cookie-manager></cookie-manager> 180 + <device-inspection-manager 181 + endpoint="https://www.rottentomatoes.com/napi/device/inspection"></device-inspection-manager> 182 + 183 + <user-activity-manager profiles-features-enabled="false"></user-activity-manager> 184 + <user-identity-manager profiles-features-enabled="false"></user-identity-manager> 185 + <ad-unit-manager></ad-unit-manager> 186 + 187 + <auth-initiate-manager profiles-username-enabled="false" data-ArtiManager="authInitiateManager" 188 + data-WatchlistButtonManager="authInitiateManager:createAccount"> 189 + </auth-initiate-manager> 190 + <auth-profile-manager data-AuthInitiateManager="authProfileManager"></auth-profile-manager> 191 + <auth-validation-manager data-AuthInitiateManager="authValidation"></auth-validation-manager> 192 + <overlay-base data-AuthInitiateManager="overlayBase:close" data-PagePollsIndexManager="authOverlay:close" hidden> 193 + <overlay-flows data-AuthInitiateManager="overlayFlows" slot="content"> 194 + <action-icon slot="close" class="auth-overlay__icon-button auth-overlay__icon-button--close" aria-label="Close" 195 + data-qa="close-overlay-btn" icon="close"></action-icon> 196 + 197 + </overlay-flows> 198 + </overlay-base> 199 + 200 + <notification-alert data-AuthInitiateManager="authSuccess" animate hidden> 201 + <rt-icon icon="check-circled"></rt-icon> 202 + <span>Signed in</span> 203 + </notification-alert> 204 + 205 + <div id="auth-templates" data-AuthInitiateManager="authTemplates"> 206 + <template slot="screens" id="account-create-username-screen"> 207 + <account-create-username-screen data-qa="account-create-username-screen"> 208 + <input-label slot="input-username" state="default" data-qa="username-input-label"> 209 + <label slot="label" for="create-username-input">Username</label> 210 + <input slot="input" id="create-username-input" type="text" placeholder="Username" data-qa="username-input" /> 211 + </input-label> 212 + <rt-button disabled slot="btn-continue" shape="pill" data-qa="continue-btn">Continue</rt-button> 213 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 214 + By joining, you agree to the <rt-link href="/policies/terms-and-policies" target="_blank" 215 + data-qa="terms-policies-link">Terms and Policies</rt-link> and 216 + the <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 217 + data-qa="privacy-policy-link">Privacy Policy</rt-link> and to receive email from 218 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 219 + Brands</rt-link>. 220 + </rt-text> 221 + </account-create-username-screen> 222 + </template> 223 + 224 + <template slot="screens" id="account-email-change-screen"> 225 + <account-email-change-screen data-qa="account-email-change-screen" email="user@email.com"> 226 + <input-label class="new-email-input" state="default" slot="new-email-input" data-qa="email-input-label"> 227 + <label slot="label" for="newEmail">Enter new email</label> 228 + <input slot="input" name="newEmail" type="text" placeholder="Enter new email" autocomplete="off" 229 + data-qa="email-input"></input> 230 + </input-label> 231 + <rt-button slot="submit-button" disabled shape="pill" data-qa="submit-btn">Submit</rt-button> 232 + <rt-text class="terms-and-policies" slot="terms-and-policies" size="0.75"> 233 + By joining, you agree to the 234 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link">Terms and 235 + Policies</rt-link> 236 + and <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 237 + data-qa="privacy-policy-link">Privacy Policy</rt-link> 238 + and to receive email from the 239 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link">Fandango Media 240 + Brands</rt-link>. 241 + </rt-text> 242 + </account-email-change-screen> 243 + </template> 244 + 245 + <template slot="screens" id="account-email-change-success-screen"> 246 + <account-email-change-success-screen data-qa="login-create-success-screen"> 247 + <rt-text slot="message" size="1.5" style="--fontWeight: var(--franklinGothicDemi);">Email change 248 + successful</rt-text> 249 + <rt-text slot="submessage">You are signed out for your security. </br> Please sign in again.</rt-text> 250 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 251 + height="105" /> 252 + </account-email-change-success-screen> 253 + </template> 254 + 255 + <template slot="screens" id="account-password-change-screen"> 256 + <account-password-change-screen data-qa="account-password-change-screen"> 257 + <input-label state="default" slot="input-password-existing"> 258 + <label slot="label" for="password-existing">Existing password</label> 259 + <input slot="input" name="password-existing" type="password" placeholder="Enter existing password" 260 + autocomplete="off"></input> 261 + </input-label> 262 + <input-label state="default" slot="input-password-new"> 263 + <label slot="label" for="password-new">New password</label> 264 + <input slot="input" name="password-new" type="password" placeholder="Enter new password" 265 + autocomplete="off"></input> 266 + </input-label> 267 + <rt-button disabled shape="pill" slot="submit-button">Submit</rt-button> 268 + </account-password-change-screen> 269 + </template> 270 + 271 + <template slot="screens" id="account-password-change-updating-screen"> 272 + <login-success-screen data-qa="account-password-change-updating-screen" hidebanner> 273 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 274 + Updating your password... 275 + </rt-text> 276 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 277 + height="105" /> 278 + </login-success-screen> 279 + </template> 280 + <template slot="screens" id="account-password-change-success-screen"> 281 + <login-success-screen data-qa="account-password-change-success-screen" hidebanner> 282 + <rt-text slot="status" size="1.5" style="--fontWeight: var(--franklinGothicDemi);"> 283 + Success! 284 + </rt-text> 285 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 286 + height="105" /> 287 + </login-success-screen> 288 + </template> 289 + <template slot="screens" id="account-verifying-email-screen"> 290 + <account-verifying-email-screen data-qa="account-verifying-email-screen"> 291 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-auth-verify.e74a69e9a77.svg" alt="email" /> 292 + <rt-text slot="status"> Verifying your email... </rt-text> 293 + <rt-button type="cta-large" href="/?authFlowScreen=loginStartScreen" slot="retryLink" size="0.875" 294 + style="--fontWeight: var(--franklinGothicMedium);" data-qa="retry-link"> 295 + Retry 296 + </rt-button> 297 + </account-verifying-email-screen> 298 + </template> 299 + <template slot="screens" id="cognito-loading"> 300 + <div> 301 + <loading-spinner id="cognito-auth-loading-spinner"></loading-spinner> 302 + <style> 303 + #cognito-auth-loading-spinner { 304 + font-size: 2rem; 305 + transform: translate(calc(100% - 1em), 250px); 306 + width: 50%; 307 + } 308 + </style> 309 + </div> 310 + </template> 311 + 312 + <template slot="screens" id="login-check-email-screen"> 313 + <login-check-email-screen data-qa="login-check-email-screen" email="user@email.com"> 314 + <rt-text class="note-text" size="1" slot="noteText"> 315 + Please open the email link from the same browser you initiated the change email process from. 316 + </rt-text> 317 + <rt-text slot="gotEmailMessage" size="0.875"> 318 + Didn't you get the email? 319 + </rt-text> 320 + <rt-button slot="resendEmailLink" size="0.875" type="cta-large" data-qa="resend-email-link"> 321 + Resend email 322 + </rt-button> 323 + <rt-link context="label" slot="troubleLoginLink" size="0.875" href="/reset-client" data-qa="reset-link">Having 324 + trouble logging in?</rt-link> 325 + 326 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 327 + By continuing, you agree to the 328 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 329 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 330 + and the 331 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 332 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 333 + and to receive email from 334 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 335 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 336 + </rt-text> 337 + </login-check-email-screen> 338 + </template> 339 + 340 + <template slot="screens" id="login-error-screen"> 341 + <login-error-screen data-qa="login-error"> 342 + <rt-text slot="header" size="1.5" context="heading" data-qa="header"> 343 + Something went wrong... 344 + </rt-text> 345 + <rt-text slot="description1" size="1" context="label" data-qa="description1"> 346 + Please try again. 347 + </rt-text> 348 + <img slot="image" src="/assets/pizza-pie/images/icons/cognito-error.c55e509a7fd.svg" /> 349 + <rt-text hidden slot="description2" size="1" context="label" data-qa="description2"></rt-text> 350 + <rt-link slot="ctaLink" hidden context="label" size="0.875" data-qa="retry-link">Retry</rt-link> 351 + </login-error-screen> 352 + </template> 353 + 354 + <template slot="screens" id="login-enter-password-screen"> 355 + <login-enter-password-screen data-qa="login-enter-password-screen"> 356 + <rt-text slot="title" size="1.5" style="--fontWeight: var(--franklinGothicMedium);"> 357 + Welcome back! 358 + </rt-text> 359 + <rt-text slot="username" data-qa="user-email"> 360 + username@email.com 361 + </rt-text> 362 + <input-label slot="inputPassword" state="default" data-qa="password-input-label"> 363 + <label slot="label" for="pass">Password</label> 364 + <input slot="input" id="pass" type="password" placeholder="Password" autocomplete="off" 365 + data-qa="password-input"></input> 366 + </input-label> 367 + <rt-button disabled slot="continueButton" type="cta-large" data-qa="continue-btn"> 368 + Continue 369 + </rt-button> 370 + <rt-button slot="emailLoginButton" theme="light" shape="pill" data-qa="send-email-btn"> 371 + Send email to verify 372 + </rt-button> 373 + <rt-link slot="forgotPasswordLink" theme="light" data-qa="forgot-password-link">Forgot password</rt-link> 374 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 375 + By continuing, you agree to the 376 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 377 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 378 + and the 379 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 380 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 381 + and to receive email from 382 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 383 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 384 + </rt-text> 385 + </login-enter-password-screen> 386 + </template> 387 + 388 + <template slot="screens" id="login-start-screen"> 389 + <login-start-screen data-qa="login-start-screen"> 390 + <input-label slot="inputEmail" state="default" data-qa="email-input-label"> 391 + <label slot="label" for="login-email-input">Email address</label> 392 + <input slot="input" autocomplete="username" id="login-email-input" placeholder="Email address" type="text" 393 + data-qa="email-input" /> 394 + </input-label> 395 + <rt-button disabled slot="emailLoginButton" type="cta-large" data-qa="continue-btn"> 396 + Continue 397 + </rt-button> 398 + <rt-button slot="googleLoginButton" shape="pill" theme="light" 399 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="google-login-btn" data-type="google"> 400 + <div class="social-login-btn-content"> 401 + <img height="16px" width="16px" src="/assets/pizza-pie/images/vendor/google/google_logo.28d9eb28faa.svg" /> 402 + Continue with Google 403 + </div> 404 + </rt-button> 405 + 406 + <rt-button slot="appleLoginButton" shape="pill" theme="light" 407 + style="--buttonHeight: 52px; --borderRadius: 32px;" data-qa="apple-login-btn" data-type="apple"> 408 + <div class="social-login-btn-content"> 409 + <rt-icon size="1" icon="apple"></rt-icon> 410 + Continue with apple 411 + </div> 412 + </rt-button> 413 + 414 + <rt-link slot="resetLink" class="reset-link" context="label" size="0.875" href="/reset-client" 415 + data-qa="reset-link"> 416 + Having trouble logging in? 417 + </rt-link> 418 + <rt-text class="terms-and-policies" slot="termsAndPolicies" size="0.75"> 419 + By continuing, you agree to the 420 + <rt-link href="/policies/terms-and-policies" target="_blank" data-qa="terms-policies-link" 421 + style="--textColor: var(--blueLink);">Terms and Policies</rt-link> 422 + and the 423 + <rt-link href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" 424 + data-qa="privacy-policy-link" style="--textColor: var(--blueLink);">Privacy Policy</rt-link> 425 + and to receive email from 426 + <rt-link href="https://www.fandango.com/about-us" target="_blank" data-qa="about-fandango-link" 427 + style="--textColor: var(--blueLink);">Fandango Media Brands</rt-link>. 428 + </rt-text> 429 + </login-start-screen> 430 + </template> 431 + 432 + <template slot="screens" id="login-success-screen"> 433 + <login-success-screen data-qa="login-success-screen"> 434 + <rt-text slot="status" size="1.5"> 435 + Login successful! 436 + </rt-text> 437 + <img slot="icon" src="/assets/pizza-pie/images/icons/cognito-success.3a3d5f32fab.svg" width="111" 438 + height="105" /> 439 + </login-success-screen> 440 + </template> 441 + <template slot="screens" id="cognito-opt-in-us"> 442 + <auth-optin-screen data-qa="auth-opt-in-screen"> 443 + <div slot="newsletter-text"> 444 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 445 + </div> 446 + <img slot="image" class="image" 447 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 448 + alt="Rotten Tomatoes Newsletter">> 449 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 450 + </h2> 451 + <ul slot="options"> 452 + <li class="icon-item">Upcoming Movies and TV shows</li> 453 + <li class="icon-item">Rotten Tomatoes Podcast</li> 454 + <li class="icon-item">Media News + More</li> 455 + </ul> 456 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 457 + Sign me up 458 + </rt-button> 459 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 460 + No thanks 461 + </rt-button> 462 + <p slot="foot-note"> 463 + By clicking "Sign Me Up," you are agreeing to receive occasional emails and communications from Fandango Media 464 + (Fandango, Vudu, and Rotten Tomatoes) and consenting to Fandango's 465 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" class="optin-link" target="_blank" 466 + rel="noopener" data-qa="auth-name-screen-privacy-policy-link">Privacy Policy</a> 467 + and 468 + <a href="/policies/terms-and-policies" class="optin-link" target="_blank" rel="noopener" 469 + data-qa="auth-name-screen-privacy-policy-link">Terms and Policies</a>. 470 + Please allow 10 business days for your account to reflect your preferences. 471 + </p> 472 + </auth-optin-screen> 473 + </template> 474 + <template slot="screens" id="cognito-opt-in-foreign"> 475 + <auth-optin-screen data-qa="auth-opt-in-screen"> 476 + <div slot="newsletter-text"> 477 + <h2 class="cognito-optin-form__header unset">Let's keep in touch!</h2> 478 + </div> 479 + <img slot="image" class="image" 480 + src="https://images.fandango.com/cms/assets/97c33f00-313f-11ee-9aaf-6762c75465cf--newsletter.png" 481 + alt="Rotten Tomatoes Newsletter">> 482 + <h2 slot="sub-title" class="subTitle unset">Sign up for the Rotten Tomatoes newsletter to get weekly updates on: 483 + </h2> 484 + <ul slot="options"> 485 + <li class="icon-item">Upcoming Movies and TV shows</li> 486 + <li class="icon-item">Rotten Tomatoes Podcast</li> 487 + <li class="icon-item">Media News + More</li> 488 + </ul> 489 + <rt-button slot="opt-in-button" data-qa="auth-opt-in-screen-opt-in-btn"> 490 + Sign me up 491 + </rt-button> 492 + <rt-button slot="opt-out-button" class="button--outline" data-qa="auth-opt-in-screen-opt-out-btn"> 493 + No thanks 494 + </rt-button> 495 + </auth-optin-screen> 496 + </template> 497 + <template slot="screens" id="cognito-opt-in-success"> 498 + <auth-verify-screen> 499 + <rt-icon icon="check-circled" slot="icon"></rt-icon> 500 + <p class="h3" slot="status">OK, got it!</p> 501 + </auth-verify-screen> 502 + </template> 503 + 504 + </div> 505 + 506 + 507 + <div id="emptyPlaceholder"></div> 508 + 509 + 510 + 511 + <script ASYNC src="//assets.adobedtm.com/launch-EN549327edc13e414a9beb5d61bfd9aac6.min.js"></script> 512 + 513 + 514 + 515 + <div id="main" class="container rt-layout__body"> 516 + <a href="#main-page-content" class="skip-link">Skip to Main Content</a> 517 + 518 + 519 + 520 + <div id="header_and_leaderboard"> 521 + <div id="top_leaderboard_wrapper" class="leaderboard_wrapper "> 522 + <ad-unit hidden unit-display="desktop" unit-type="topbanner" adjust-height> 523 + <div slot="ad-inject"></div> 524 + </ad-unit> 525 + 526 + <ad-unit hidden unit-display="mobile" unit-type="mbanner"> 527 + <div slot="ad-inject"></div> 528 + </ad-unit> 529 + </div> 530 + </div> 531 + 532 + 533 + <rt-header-manager></rt-header-manager> 534 + 535 + <rt-header aria-label="navigation bar" class="navbar" data-qa="header-nav-bar" 536 + data-AdsGlobalNavTakeoverManager="header" id="header-main" skeleton="panel"> 537 + 538 + 539 + <button aria-label="Open aRTi" class="arti-mobile" data-ArtiManager="btnArti:click" slot="arti-mobile"> 540 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 541 + </button> 542 + 543 + 544 + <div slot="mobile-header-nav"> 545 + <rt-button id="mobile-header-nav-btn" data-RtHeaderManager="mobileHeaderNavBtn:click" size="1.6" 546 + style="--backgroundColor: transparent; --backgroundColorHover: transparent; --buttonPadding: 0 10px 4px;"> 547 + &#9776; 548 + </rt-button> 549 + <mobile-header-nav id="mobile-header-nav" data-RtHeaderManager="mobileHeaderNav"> 550 + <rt-img slot="logoImage" alt="Rotten Tomatoes" fetchpriority="high" 551 + src="/assets/pizza-pie/images/rt-tomato-logo.20c3bdbc97b.svg"></rt-img> 552 + <div slot="menusCss"></div> 553 + <div slot="menus"></div> 554 + </mobile-header-nav> 555 + </div> 556 + 557 + <a class="logo-wrap" data-AdsGlobalNavTakeoverManager="logoLink" data-SearchResultsNavManager="rtNavLogo" href="/" 558 + id="navbar" slot="logo"> 559 + <img alt="Rotten Tomatoes" data-qa="header-logo" data-AdsGlobalNavTakeoverManager="logo" 560 + src="/assets/pizza-pie/images/rtlogo.9b892cff3fd.png" fetchpriority="high" /> 561 + 562 + <div class="hide"> 563 + <ad-unit hidden unit-display="desktop,mobile" unit-type="logorepeat" unit-targeting="ploc=rtlogo;"> 564 + <div slot="ad-inject"></div> 565 + </ad-unit> 566 + </div> 567 + </a> 568 + 569 + <search-results-nav-manager></search-results-nav-manager> 570 + 571 + <search-results-nav data-adobe-id="global-nav-search" data-SearchResultsNavManager="search" slot="search" 572 + skeleton="chip"> 573 + <search-results-controls data-SearchResultsNavManager="searchControls" slot="controls"> 574 + <input aria-label="Search" data-AdsGlobalNavTakeoverManager="searchInput" 575 + data-SearchResultsNavManager="inputText:click,input,keydown" data-qa="search-input" placeholder="Search" 576 + slot="search-input" type="text" /> 577 + <rt-button class="search-clear" data-qa="search-clear" data-AdsGlobalNavTakeoverManager="searchClearBtn" 578 + data-SearchResultsNavManager="clearBtn:click" size="0.875" slot="search-clear" theme="transparent"> 579 + <rt-icon icon="close"></rt-icon> 580 + </rt-button> 581 + <rt-link class="search-submit" aria-label="Submit search" data-qa="search-submit" 582 + data-AdsGlobalNavTakeoverManager="searchSubmitBtn" data-SearchResultsNavManager="submitBtn:click" 583 + href="/search" size="0.875" slot="search-submit"> 584 + <rt-icon icon="search"></rt-icon> 585 + </rt-link> 586 + <rt-button class="search-cancel" data-qa="search-cancel" data-AdsGlobalNavTakeoverManager="searchCancelBtn" 587 + data-SearchResultsNavManager="cancelBtn:click" size="0.875" slot="search-cancel" theme="transparent"> 588 + Cancel 589 + </rt-button> 590 + </search-results-controls> 591 + 592 + <search-results aria-expanded="false" class="hide" data-SearchResultsNavManager="searchResults" slot="results"> 593 + </search-results> 594 + </search-results-nav> 595 + 596 + <ul slot="nav-links"> 597 + <li> 598 + <a href="/about" data-qa="header:link-whats-tmeter" data-AdsGlobalNavTakeoverManager="text"> 599 + About Rotten Tomatoes&reg; 600 + </a> 601 + </li> 602 + <li> 603 + <a href="/critics" data-qa="header:link-critics-home" data-AdsGlobalNavTakeoverManager="text"> 604 + Critics 605 + </a> 606 + </li> 607 + <li data-RtHeaderManager="loginLink"> 608 + <ul> 609 + <li> 610 + <button id="masthead-show-login-btn" class="js-cognito-signin button--link" 611 + data-AuthInitiateManager="btnSignIn:click" data-qa="header:login-btn" 612 + data-AdsGlobalNavTakeoverManager="text"> 613 + Login/signup 614 + </button> 615 + </li> 616 + </ul> 617 + </li> 618 + <li class="hide" data-RtHeaderManager="userItem:keydown,keyup,mouseenter" data-qa="header:user"> 619 + <a class="masthead-user-link" data-RtHeaderManager="navUserlink:focus" rel="nofollow" 620 + data-qa="user-profile-link"> 621 + <img data-RtHeaderManager="navUserImg" data-qa="user-profile-thumb"> 622 + <p data-AdsGlobalNavTakeoverManager="text" data-RtHeaderManager="navUserFirstName" 623 + data-qa="user-profile-name"></p> 624 + <rt-icon data-AdsGlobalNavTakeoverManager="text" icon="down-dir" image> 625 + </rt-icon> 626 + </a> 627 + <rt-header-user-info class="hide" data-RtHeaderManager="userInfo:focusout,mouseleave"> 628 + <a data-qa="user-stats-profile-pic" href="" rel="nofollow" slot="imageExpanded" tabindex="-1"> 629 + <img src="" width="40" alt=""> 630 + </a> 631 + <a slot="fullName" rel="nofollow" href="" class="username" data-qa="user-stats-name"></a> 632 + <a slot="wts" rel="nofollow" href="" class="wts-count-block" data-qa="user-stats-wts"> 633 + <rt-icon icon="plus" data-qa="user-stats-ratings-count"></rt-icon> 634 + <span class="count" data-qa="user-stats-wts-count"></span> 635 + &nbsp;Wants to See 636 + </a> 637 + <a slot="rating" rel="nofollow" href="" class="rating-count-block" data-qa="user-stats-ratings"> 638 + <rt-icon icon="star" data-qa="user-stats-ratings-count"></rt-icon> 639 + <span class="count"></span> 640 + &nbsp;Ratings 641 + </a> 642 + 643 + <a slot="profileLink" rel="nofollow" class="dropdown-link" href="" 644 + data-qa="user-stats-profile-link">Profile</a> 645 + <a slot="accountLink" rel="nofollow" class="dropdown-link" href="/user/account" 646 + data-qa="user-stats-account-link">Account</a> 647 + <a slot="logoutLink" class="dropdown-link" data-RtHeaderManager="logoutLink:click" href="#logout" 648 + data-qa="user-stats-logout-link">Log Out</a> 649 + </rt-header-user-info> 650 + </li> 651 + </ul> 652 + 653 + <rt-header-nav slot="nav-dropdowns"> 654 + 655 + <button aria-label="Open aRTi" class="arti-desktop" data-ArtiManager="btnArti:click" slot="arti-desktop"> 656 + <img alt="arti" src="/assets/pizza-pie/images/arti.041d204c4a4.svg" /> 657 + </button> 658 + 659 + <rt-header-nav-item slot="movies" data-qa="masthead:movies-dvds"> 660 + <a class="unset" slot="link" href="/browse/movies_in_theaters/sort:popular" 661 + data-qa="masthead:movies-dvds-link" data-AdsGlobalNavTakeoverManager="text"> 662 + Movies 663 + </a> 664 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="movies-menu"> 665 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-in-theaters"> 666 + <p slot="title" class="h4" data-qa="movies-in-theaters-main-link"><a class="unset" 667 + href="/browse/movies_in_theaters/sort:popular">Movies in theaters</a></p> 668 + <ul slot="links"> 669 + <li data-qa="in-theaters-item"> 670 + <a href="/browse/movies_in_theaters/sort:newest" data-qa="opening-this-week-link">Opening This 671 + Week</a> 672 + </li> 673 + <li data-qa="in-theaters-item"> 674 + <a href="/browse/movies_in_theaters/sort:top_box_office" data-qa="top-box-office-link">Top Box 675 + Office</a> 676 + </li> 677 + <li data-qa="in-theaters-item"> 678 + <a href="/browse/movies_coming_soon/" data-qa="coming-soon-link">Coming Soon to Theaters</a> 679 + </li> 680 + <li data-qa="in-theaters-item"> 681 + <a href="/browse/movies_in_theaters/critics:certified_fresh~sort:popular" 682 + data-qa="certified-fresh-link">Certified Fresh Movies</a> 683 + </li> 684 + </ul> 685 + </rt-header-nav-item-dropdown-list> 686 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-on-dvd-streaming"> 687 + <p slot="title" class="h4" data-qa="dvd-streaming-main-link"><a class="unset" 688 + href="/browse/movies_at_home">Movies at Home</a></p> 689 + <ul slot="links"> 690 + 691 + <li data-qa="movies-at-home-item"> 692 + <a href="/browse/movies_at_home/affiliates:fandango-at-home" data-qa="fandango-at-home-link">Fandango 693 + at Home</a> 694 + </li> 695 + 696 + <li data-qa="movies-at-home-item"> 697 + <a href="/browse/movies_at_home/affiliates:peacock" data-qa="peacock-link">Peacock</a> 698 + </li> 699 + 700 + <li data-qa="movies-at-home-item"> 701 + <a href="/browse/movies_at_home/affiliates:netflix" data-qa="netflix-link">Netflix</a> 702 + </li> 703 + 704 + <li data-qa="movies-at-home-item"> 705 + <a href="/browse/movies_at_home/affiliates:apple-tv-plus" data-qa="apple-tv-link">Apple TV+</a> 706 + </li> 707 + 708 + <li data-qa="movies-at-home-item"> 709 + <a href="/browse/movies_at_home/affiliates:prime-video" data-qa="prime-video-link">Prime Video</a> 710 + </li> 711 + 712 + <li data-qa="movies-at-home-item"> 713 + <a href="/browse/movies_at_home/sort:popular" data-qa="most-popular-streaming-movies-link">Most 714 + Popular Streaming movies</a> 715 + </li> 716 + 717 + <li data-qa="movies-at-home-item"> 718 + <a href="/browse/movies_at_home/critics:certified_fresh" 719 + data-qa="certified-fresh-movies-link">Certified Fresh movies</a> 720 + </li> 721 + 722 + <li data-qa="movies-at-home-item"> 723 + <a href="/browse/movies_at_home" data-qa="browse-all-link">Browse all</a> 724 + </li> 725 + 726 + </ul> 727 + </rt-header-nav-item-dropdown-list> 728 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-movies-more"> 729 + <p slot="title" class="h4">More</p> 730 + <ul slot="links"> 731 + <li data-qa="what-to-watch-item"> 732 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch" class="what-to-watch" 733 + data-qa="what-to-watch-link">What to Watch<rt-badge>New</rt-badge></a> 734 + </li> 735 + </ul> 736 + </rt-header-nav-item-dropdown-list> 737 + 738 + <rt-header-nav-item-dropdown-list slot="column" cfp> 739 + <p slot="title" class="h4">Certified fresh picks</p> 740 + <ul slot="links" class="cfp-wrap" data-qa="header-certified-fresh-picks" 741 + data-curation="rt-nav-list-cf-picks"> 742 + 743 + <li data-qa="cert-fresh-item"> 744 + 745 + <a class="cfp-tile" href="/m/twinless" data-qa="cert-fresh-link"> 746 + <tile-dynamic data-qa="tile"> 747 + <rt-img alt="Twinless poster image" slot="image" 748 + src="https://resizing.flixster.com/j7lw2KeY9_XyfZQdqRZGku7_9C8=/206x305/v2/https://resizing.flixster.com/uxoeWz7uWmeYIV94_SzEV_osqe4=/fit-in/180x240/v2/https://resizing.flixster.com/VlylB3xT2RIYmRivMx37O3yD76Q=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" 749 + loading="lazy"></rt-img> 750 + <div slot="caption" data-track="scores"> 751 + <div class="score-wrap"> 752 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 753 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 754 + </div> 755 + <span class="p--small">Twinless</span> 756 + <span class="sr-only">Link to Twinless</span> 757 + </div> 758 + </tile-dynamic> 759 + </a> 760 + </li> 761 + 762 + 763 + <li data-qa="cert-fresh-item"> 764 + 765 + <a class="cfp-tile" href="/m/hamilton_2020" data-qa="cert-fresh-link"> 766 + <tile-dynamic data-qa="tile"> 767 + <rt-img alt="Hamilton poster image" slot="image" 768 + src="https://resizing.flixster.com/1woquJmQfEhWCZtm7GcH0NMHsYA=/206x305/v2/https://resizing.flixster.com/PeAJ5ZpF5qB98ZiX6ixNDCgW2P0=/fit-in/180x240/v2/https://resizing.flixster.com/VmBvlTk8-z7pQvDZXTgSdj93WDE=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" 769 + loading="lazy"></rt-img> 770 + <div slot="caption" data-track="scores"> 771 + <div class="score-wrap"> 772 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 773 + <rt-text class="critics-score" size="1" context="label">98%</rt-text> 774 + </div> 775 + <span class="p--small">Hamilton</span> 776 + <span class="sr-only">Link to Hamilton</span> 777 + </div> 778 + </tile-dynamic> 779 + </a> 780 + </li> 781 + 782 + 783 + <li data-qa="cert-fresh-item"> 784 + 785 + <a class="cfp-tile" href="/m/the_thursday_murder_club" data-qa="cert-fresh-link"> 786 + <tile-dynamic data-qa="tile"> 787 + <rt-img alt="The Thursday Murder Club poster image" slot="image" 788 + src="https://resizing.flixster.com/jeeldFGcfSMgG09ey5VB7TCFiek=/206x305/v2/https://resizing.flixster.com/9LXDkCzIBBNEiPURkB9t6VefF5Q=/fit-in/180x240/v2/https://resizing.flixster.com/rwdeR5xIiN0k7SWr6yXdnmb6zP8=/ems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" 789 + loading="lazy"></rt-img> 790 + <div slot="caption" data-track="scores"> 791 + <div class="score-wrap"> 792 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 793 + <rt-text class="critics-score" size="1" context="label">76%</rt-text> 794 + </div> 795 + <span class="p--small">The Thursday Murder Club</span> 796 + <span class="sr-only">Link to The Thursday Murder Club</span> 797 + </div> 798 + </tile-dynamic> 799 + </a> 800 + </li> 801 + 802 + </ul> 803 + </rt-header-nav-item-dropdown-list> 804 + 805 + </rt-header-nav-item-dropdown> 806 + </rt-header-nav-item> 807 + 808 + <rt-header-nav-item slot="tv" data-qa="masthead:tv"> 809 + <a class="unset" slot="link" href="/browse/tv_series_browse/sort:popular" data-qa="masthead:tv-link" 810 + data-AdsGlobalNavTakeoverManager="text"> 811 + Tv shows 812 + </a> 813 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="tv-menu"> 814 + 815 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list1"> 816 + <p slot="title" class="h4" data-curation="rt-hp-text-list-3"> 817 + New TV Tonight 818 + </p> 819 + <ul slot="links" class="score-list-wrap"> 820 + 821 + <li data-qa="list-item"> 822 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 823 + <div class="score-wrap"> 824 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 825 + 826 + <rt-text class="critics-score" context="label" size="1" 827 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 828 + 829 + </div> 830 + <span> 831 + 832 + Task: Season 1 833 + 834 + </span> 835 + </a> 836 + </li> 837 + 838 + <li data-qa="list-item"> 839 + <a class="score-list-item" href="/tv/the_walking_dead_daryl_dixon/s03" data-qa="list-item-link"> 840 + <div class="score-wrap"> 841 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 842 + 843 + <rt-text class="critics-score" context="label" size="1" 844 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 845 + 846 + </div> 847 + <span> 848 + 849 + The Walking Dead: Daryl Dixon: Season 3 850 + 851 + </span> 852 + </a> 853 + </li> 854 + 855 + <li data-qa="list-item"> 856 + <a class="score-list-item" href="/tv/the_crow_girl/s01" data-qa="list-item-link"> 857 + <div class="score-wrap"> 858 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 859 + 860 + <rt-text class="critics-score" context="label" size="1" 861 + style="--lineHeight: 1; --letterSpacing: 0.016em;">80%</rt-text> 862 + 863 + </div> 864 + <span> 865 + 866 + The Crow Girl: Season 1 867 + 868 + </span> 869 + </a> 870 + </li> 871 + 872 + <li data-qa="list-item"> 873 + <a class="score-list-item" href="/tv/only_murders_in_the_building/s05" data-qa="list-item-link"> 874 + <div class="score-wrap"> 875 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 876 + 877 + <rt-text class="critics-score-empty" context="label" size="1" 878 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 879 + 880 + </div> 881 + <span> 882 + 883 + Only Murders in the Building: Season 5 884 + 885 + </span> 886 + </a> 887 + </li> 888 + 889 + <li data-qa="list-item"> 890 + <a class="score-list-item" href="/tv/the_girlfriend/s01" data-qa="list-item-link"> 891 + <div class="score-wrap"> 892 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 893 + 894 + <rt-text class="critics-score-empty" context="label" size="1" 895 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 896 + 897 + </div> 898 + <span> 899 + 900 + The Girlfriend: Season 1 901 + 902 + </span> 903 + </a> 904 + </li> 905 + 906 + <li data-qa="list-item"> 907 + <a class="score-list-item" href="/tv/aka_charlie_sheen/s01" data-qa="list-item-link"> 908 + <div class="score-wrap"> 909 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 910 + 911 + <rt-text class="critics-score-empty" context="label" size="1" 912 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 913 + 914 + </div> 915 + <span> 916 + 917 + aka Charlie Sheen: Season 1 918 + 919 + </span> 920 + </a> 921 + </li> 922 + 923 + <li data-qa="list-item"> 924 + <a class="score-list-item" href="/tv/wizards_beyond_waverly_place/s02" data-qa="list-item-link"> 925 + <div class="score-wrap"> 926 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 927 + 928 + <rt-text class="critics-score-empty" context="label" size="1" 929 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 930 + 931 + </div> 932 + <span> 933 + 934 + Wizards Beyond Waverly Place: Season 2 935 + 936 + </span> 937 + </a> 938 + </li> 939 + 940 + <li data-qa="list-item"> 941 + <a class="score-list-item" href="/tv/seen_and_heard_the_history_of_black_television/s01" 942 + data-qa="list-item-link"> 943 + <div class="score-wrap"> 944 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 945 + 946 + <rt-text class="critics-score-empty" context="label" size="1" 947 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 948 + 949 + </div> 950 + <span> 951 + 952 + Seen &amp; Heard: the History of Black Television: Season 1 953 + 954 + </span> 955 + </a> 956 + </li> 957 + 958 + <li data-qa="list-item"> 959 + <a class="score-list-item" href="/tv/the_fragrant_flower_blooms_with_dignity/s01" 960 + data-qa="list-item-link"> 961 + <div class="score-wrap"> 962 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 963 + 964 + <rt-text class="critics-score-empty" context="label" size="1" 965 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 966 + 967 + </div> 968 + <span> 969 + 970 + The Fragrant Flower Blooms With Dignity: Season 1 971 + 972 + </span> 973 + </a> 974 + </li> 975 + 976 + <li data-qa="list-item"> 977 + <a class="score-list-item" href="/tv/guts_and_glory/s01" data-qa="list-item-link"> 978 + <div class="score-wrap"> 979 + <score-icon-critics certified="false" sentiment="empty" size="1"></score-icon-critics> 980 + 981 + <rt-text class="critics-score-empty" context="label" size="1" 982 + style="--textColor: var(--grayLight4); --lineHeight: 1; --letterSpacing: 0.2em;">--</rt-text> 983 + 984 + </div> 985 + <span> 986 + 987 + Guts &amp; Glory: Season 1 988 + 989 + </span> 990 + </a> 991 + </li> 992 + 993 + </ul> 994 + <a class="a--short" data-qa="tv-list1-view-all-link" href="/browse/tv_series_browse/sort:newest" 995 + slot="view-all-link"> 996 + View All 997 + </a> 998 + </rt-header-nav-item-dropdown-list> 999 + 1000 + 1001 + 1002 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-list2"> 1003 + <p slot="title" class="h4" data-curation="rt-hp-text-list-2"> 1004 + Most Popular TV on RT 1005 + </p> 1006 + <ul slot="links" class="score-list-wrap"> 1007 + 1008 + <li data-qa="list-item"> 1009 + <a class="score-list-item" href="/tv/the_paper_2025/s01" data-qa="list-item-link"> 1010 + <div class="score-wrap"> 1011 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1012 + 1013 + <rt-text class="critics-score" context="label" size="1" 1014 + style="--lineHeight: 1; --letterSpacing: 0.016em;">83%</rt-text> 1015 + 1016 + </div> 1017 + <span> 1018 + 1019 + The Paper: Season 1 1020 + 1021 + </span> 1022 + </a> 1023 + </li> 1024 + 1025 + <li data-qa="list-item"> 1026 + <a class="score-list-item" href="/tv/dexter_resurrection/s01" data-qa="list-item-link"> 1027 + <div class="score-wrap"> 1028 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1029 + 1030 + <rt-text class="critics-score" context="label" size="1" 1031 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1032 + 1033 + </div> 1034 + <span> 1035 + 1036 + Dexter: Resurrection: Season 1 1037 + 1038 + </span> 1039 + </a> 1040 + </li> 1041 + 1042 + <li data-qa="list-item"> 1043 + <a class="score-list-item" href="/tv/alien_earth/s01" data-qa="list-item-link"> 1044 + <div class="score-wrap"> 1045 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1046 + 1047 + <rt-text class="critics-score" context="label" size="1" 1048 + style="--lineHeight: 1; --letterSpacing: 0.016em;">95%</rt-text> 1049 + 1050 + </div> 1051 + <span> 1052 + 1053 + Alien: Earth: Season 1 1054 + 1055 + </span> 1056 + </a> 1057 + </li> 1058 + 1059 + <li data-qa="list-item"> 1060 + <a class="score-list-item" href="/tv/task/s01" data-qa="list-item-link"> 1061 + <div class="score-wrap"> 1062 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1063 + 1064 + <rt-text class="critics-score" context="label" size="1" 1065 + style="--lineHeight: 1; --letterSpacing: 0.016em;">89%</rt-text> 1066 + 1067 + </div> 1068 + <span> 1069 + 1070 + Task: Season 1 1071 + 1072 + </span> 1073 + </a> 1074 + </li> 1075 + 1076 + <li data-qa="list-item"> 1077 + <a class="score-list-item" href="/tv/wednesday/s02" data-qa="list-item-link"> 1078 + <div class="score-wrap"> 1079 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1080 + 1081 + <rt-text class="critics-score" context="label" size="1" 1082 + style="--lineHeight: 1; --letterSpacing: 0.016em;">87%</rt-text> 1083 + 1084 + </div> 1085 + <span> 1086 + 1087 + Wednesday: Season 2 1088 + 1089 + </span> 1090 + </a> 1091 + </li> 1092 + 1093 + <li data-qa="list-item"> 1094 + <a class="score-list-item" href="/tv/peacemaker_2022/s02" data-qa="list-item-link"> 1095 + <div class="score-wrap"> 1096 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1097 + 1098 + <rt-text class="critics-score" context="label" size="1" 1099 + style="--lineHeight: 1; --letterSpacing: 0.016em;">99%</rt-text> 1100 + 1101 + </div> 1102 + <span> 1103 + 1104 + Peacemaker: Season 2 1105 + 1106 + </span> 1107 + </a> 1108 + </li> 1109 + 1110 + <li data-qa="list-item"> 1111 + <a class="score-list-item" href="/tv/the_terminal_list_dark_wolf/s01" data-qa="list-item-link"> 1112 + <div class="score-wrap"> 1113 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1114 + 1115 + <rt-text class="critics-score" context="label" size="1" 1116 + style="--lineHeight: 1; --letterSpacing: 0.016em;">73%</rt-text> 1117 + 1118 + </div> 1119 + <span> 1120 + 1121 + The Terminal List: Dark Wolf: Season 1 1122 + 1123 + </span> 1124 + </a> 1125 + </li> 1126 + 1127 + <li data-qa="list-item"> 1128 + <a class="score-list-item" href="/tv/hostage_2025/s01" data-qa="list-item-link"> 1129 + <div class="score-wrap"> 1130 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1131 + 1132 + <rt-text class="critics-score" context="label" size="1" 1133 + style="--lineHeight: 1; --letterSpacing: 0.016em;">82%</rt-text> 1134 + 1135 + </div> 1136 + <span> 1137 + 1138 + Hostage: Season 1 1139 + 1140 + </span> 1141 + </a> 1142 + </li> 1143 + 1144 + <li data-qa="list-item"> 1145 + <a class="score-list-item" href="/tv/chief_of_war/s01" data-qa="list-item-link"> 1146 + <div class="score-wrap"> 1147 + <score-icon-critics certified="true" sentiment="positive" size="1"></score-icon-critics> 1148 + 1149 + <rt-text class="critics-score" context="label" size="1" 1150 + style="--lineHeight: 1; --letterSpacing: 0.016em;">93%</rt-text> 1151 + 1152 + </div> 1153 + <span> 1154 + 1155 + Chief of War: Season 1 1156 + 1157 + </span> 1158 + </a> 1159 + </li> 1160 + 1161 + <li data-qa="list-item"> 1162 + <a class="score-list-item" href="/tv/irish_blood/s01" data-qa="list-item-link"> 1163 + <div class="score-wrap"> 1164 + <score-icon-critics certified="false" sentiment="positive" size="1"></score-icon-critics> 1165 + 1166 + <rt-text class="critics-score" context="label" size="1" 1167 + style="--lineHeight: 1; --letterSpacing: 0.016em;">100%</rt-text> 1168 + 1169 + </div> 1170 + <span> 1171 + 1172 + Irish Blood: Season 1 1173 + 1174 + </span> 1175 + </a> 1176 + </li> 1177 + 1178 + </ul> 1179 + <a class="a--short" data-qa="tv-list2-view-all-link" href="/browse/tv_series_browse/sort:popular?" 1180 + slot="view-all-link"> 1181 + View All 1182 + </a> 1183 + </rt-header-nav-item-dropdown-list> 1184 + 1185 + 1186 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-tv-more"> 1187 + <p slot="title" class="h4">More</p> 1188 + <ul slot="links"> 1189 + <li> 1190 + <a href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" class="what-to-watch" 1191 + data-qa="what-to-watch-link-tv"> 1192 + What to Watch<rt-badge>New</rt-badge> 1193 + </a> 1194 + </li> 1195 + <li> 1196 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-best-link"> 1197 + <span>Best TV Shows</span> 1198 + </a> 1199 + </li> 1200 + <li> 1201 + <a href="/browse/tv_series_browse/sort:popular" data-qa="tv-popular-link"> 1202 + <span>Most Popular TV</span> 1203 + </a> 1204 + </li> 1205 + <li> 1206 + <a href="/browse/tv_series_browse/affiliates:fandango-at-home" data-qa="tv-fandango-at-home-link"> 1207 + <span>Fandango at Home</span> 1208 + </a> 1209 + </li> 1210 + <li> 1211 + <a href="/browse/tv_series_browse/affiliates:peacock" data-qa="tv-peacock-link"> 1212 + <span>Peacock</span> 1213 + </a> 1214 + </li> 1215 + <li> 1216 + <a href="/browse/tv_series_browse/affiliates:paramount-plus" data-qa="tv-paramount-link"> 1217 + <span>Paramount+</span> 1218 + </a> 1219 + </li> 1220 + <li> 1221 + <a href="/browse/tv_series_browse/affiliates:netflix" data-qa="tv-netflix-link"> 1222 + <span>Netflix</span> 1223 + </a> 1224 + </li> 1225 + <li> 1226 + <a href="/browse/tv_series_browse/affiliates:prime-video" data-qa="tv-prime-video-link"> 1227 + <span>Prime Video</span> 1228 + </a> 1229 + </li> 1230 + <li> 1231 + <a href="/browse/tv_series_browse/affiliates:apple-tv-plus" data-qa="tv-apple-tv-plus-link"> 1232 + <span>Apple TV+</span> 1233 + </a> 1234 + </li> 1235 + </ul> 1236 + </rt-header-nav-item-dropdown-list> 1237 + 1238 + 1239 + <rt-header-nav-item-dropdown-list slot="column" cfp data-qa="header-certified-fresh-pick"> 1240 + <p slot="title" class="h4"> 1241 + Certified fresh pick 1242 + </p> 1243 + <ul slot="links" class="cfp-wrap" data-curation="rt-nav-list-cf-picks"> 1244 + <li> 1245 + 1246 + <a class="cfp-tile" href="/tv/the_paper_2025/s01" data-qa="cert-fresh-link"> 1247 + <tile-dynamic data-qa="tile"> 1248 + <rt-img alt="The Paper: Season 1 poster image" slot="image" 1249 + src="https://resizing.flixster.com/yFijQcjPYUWUelgmiZLHgkXU7hw=/206x305/v2/https://resizing.flixster.com/DFkkHf5pEVX_apKtIQZcoEvI6RU=/fit-in/180x240/v2/https://resizing.flixster.com/texEZJLAG-KcVpfCdkT2R1t4cmE=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" 1250 + loading="lazy"></rt-img> 1251 + <div slot="caption" data-track="scores"> 1252 + <div class="score-wrap"> 1253 + <score-icon-critics certified sentiment="positive" size="1"></score-icon-critics> 1254 + <rt-text class="critics-score" size="1" context="label">83%</rt-text> 1255 + </div> 1256 + <span class="p--small">The Paper: Season 1</span> 1257 + <span class="sr-only">Link to The Paper: Season 1</span> 1258 + </div> 1259 + </tile-dynamic> 1260 + </a> 1261 + </li> 1262 + </ul> 1263 + </rt-header-nav-item-dropdown-list> 1264 + 1265 + </rt-header-nav-item-dropdown> 1266 + </rt-header-nav-item> 1267 + 1268 + <rt-header-nav-item slot="shop"> 1269 + <a class="unset" id="appLink" slot="link" href="https://editorial.rottentomatoes.com/article/app/" 1270 + target="_blank" data-qa="masthead:app-link" data-AdsGlobalNavTakeoverManager="text"> 1271 + RT App 1272 + <temporary-display slot="temporary-display" key="app" element="#appLink" event="click"> 1273 + <rt-badge hidden>New</rt-badge> 1274 + </temporary-display> 1275 + </a> 1276 + </rt-header-nav-item> 1277 + 1278 + <rt-header-nav-item slot="news" data-qa="masthead:news"> 1279 + <a class="unset" slot="link" href="https://editorial.rottentomatoes.com/" data-qa="masthead:news-link" 1280 + data-AdsGlobalNavTakeoverManager="text"> 1281 + News 1282 + </a> 1283 + <rt-header-nav-item-dropdown aria-expanded="false" slot="dropdown" data-qa="news-menu"> 1284 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-columns"> 1285 + <p slot="title" class="h4">Columns</p> 1286 + <ul slot="links"> 1287 + <li data-qa="column-item"> 1288 + <a href="https://editorial.rottentomatoes.com/all-time-lists/" data-pageheader="All-Time Lists" 1289 + data-qa="column-link"> 1290 + All-Time Lists 1291 + </a> 1292 + </li> 1293 + <li data-qa="column-item"> 1294 + <a href="https://editorial.rottentomatoes.com/binge-guide/" data-pageheader="Binge Guide" 1295 + data-qa="column-link"> 1296 + Binge Guide 1297 + </a> 1298 + </li> 1299 + <li data-qa="column-item"> 1300 + <a href="https://editorial.rottentomatoes.com/comics-on-tv/" data-pageheader="Comics on TV" 1301 + data-qa="column-link"> 1302 + Comics on TV 1303 + </a> 1304 + </li> 1305 + <li data-qa="column-item"> 1306 + <a href="https://editorial.rottentomatoes.com/countdown/" data-pageheader="Countdown" 1307 + data-qa="column-link"> 1308 + Countdown 1309 + </a> 1310 + </li> 1311 + <li data-qa="column-item"> 1312 + <a href="https://editorial.rottentomatoes.com/five-favorite-films/" 1313 + data-pageheader="Five Favorite Films" data-qa="column-link"> 1314 + Five Favorite Films 1315 + </a> 1316 + </li> 1317 + <li data-qa="column-item"> 1318 + <a href="https://editorial.rottentomatoes.com/video-interviews/" data-pageheader="Video Interviews" 1319 + data-qa="column-link"> 1320 + Video Interviews 1321 + </a> 1322 + </li> 1323 + <li data-qa="column-item"> 1324 + <a href="https://editorial.rottentomatoes.com/weekend-box-office/" 1325 + data-pageheader="Weekend Box Office" data-qa="column-link">Weekend Box Office 1326 + </a> 1327 + </li> 1328 + <li data-qa="column-item"> 1329 + <a href="https://editorial.rottentomatoes.com/weekly-ketchup/" data-pageheader="Weekly Ketchup" 1330 + data-qa="column-link"> 1331 + Weekly Ketchup 1332 + </a> 1333 + </li> 1334 + <li data-qa="column-item"> 1335 + <a href="https://editorial.rottentomatoes.com/what-to-watch/" data-pageheader="What to Watch" 1336 + data-qa="column-link"> 1337 + What to Watch 1338 + </a> 1339 + </li> 1340 + </ul> 1341 + </rt-header-nav-item-dropdown-list> 1342 + 1343 + 1344 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-guides"> 1345 + <p slot="title" class="h4">Guides</p> 1346 + <ul slot="links" class="news-wrap"> 1347 + 1348 + <li data-qa="guides-item"> 1349 + <a class="news-tile" href="https://editorial.rottentomatoes.com/guide/best-football-movies/" 1350 + data-qa="news-link"> 1351 + <tile-dynamic data-qa="tile" orientation="landscape"> 1352 + <rt-img alt="59 Best Football Movies, Ranked by Tomatometer poster image" slot="image" 1353 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/09/600EssentialFootballMovies.png" 1354 + loading="lazy"></rt-img> 1355 + <div slot="caption"> 1356 + <p>59 Best Football Movies, Ranked by Tomatometer</p> 1357 + <span class="sr-only">Link to 59 Best Football Movies, Ranked by Tomatometer</span> 1358 + </div> 1359 + </tile-dynamic> 1360 + </a> 1361 + </li> 1362 + 1363 + <li data-qa="guides-item"> 1364 + <a class="news-tile" 1365 + href="https://editorial.rottentomatoes.com/guide/best-new-rom-coms-romance-movies/" 1366 + data-qa="news-link"> 1367 + <tile-dynamic data-qa="tile" orientation="landscape"> 1368 + <rt-img alt="50 Best New Rom-Coms and Romance Movies poster image" slot="image" 1369 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Best_New_Romcoms600.jpg" 1370 + loading="lazy"></rt-img> 1371 + <div slot="caption"> 1372 + <p>50 Best New Rom-Coms and Romance Movies</p> 1373 + <span class="sr-only">Link to 50 Best New Rom-Coms and Romance Movies</span> 1374 + </div> 1375 + </tile-dynamic> 1376 + </a> 1377 + </li> 1378 + 1379 + </ul> 1380 + <a class="a--short" data-qa="guides-view-all-link" href="https://editorial.rottentomatoes.com/countdown/" 1381 + slot="view-all-link"> 1382 + View All 1383 + </a> 1384 + </rt-header-nav-item-dropdown-list> 1385 + 1386 + 1387 + 1388 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-hubs"> 1389 + <p slot="title" class="h4">Hubs</p> 1390 + <ul slot="links" class="news-wrap"> 1391 + 1392 + <li data-qa="hubs-item"> 1393 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/what-to-watch/" 1394 + data-qa="news-link"> 1395 + <tile-dynamic data-qa="tile" orientation="landscape"> 1396 + <rt-img alt="What to Watch: In Theaters and On Streaming poster image" slot="image" 1397 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/05/RT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" 1398 + loading="lazy"></rt-img> 1399 + <div slot="caption"> 1400 + <p>What to Watch: In Theaters and On Streaming</p> 1401 + <span class="sr-only">Link to What to Watch: In Theaters and On Streaming</span> 1402 + </div> 1403 + </tile-dynamic> 1404 + </a> 1405 + </li> 1406 + 1407 + <li data-qa="hubs-item"> 1408 + <a class="news-tile" href="https://editorial.rottentomatoes.com/rt-hub/awards-tour/" 1409 + data-qa="news-link"> 1410 + <tile-dynamic data-qa="tile" orientation="landscape"> 1411 + <rt-img alt="Awards Tour poster image" slot="image" 1412 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2023/02/RT_AwardsTour_Thumbnail_600x314.jpg" 1413 + loading="lazy"></rt-img> 1414 + <div slot="caption"> 1415 + <p>Awards Tour</p> 1416 + <span class="sr-only">Link to Awards Tour</span> 1417 + </div> 1418 + </tile-dynamic> 1419 + </a> 1420 + </li> 1421 + 1422 + </ul> 1423 + <a class="a--short" data-qa="hubs-view-all-link" href="https://editorial.rottentomatoes.com/rt-hubs/" 1424 + slot="view-all-link"> 1425 + View All 1426 + </a> 1427 + </rt-header-nav-item-dropdown-list> 1428 + 1429 + 1430 + 1431 + <rt-header-nav-item-dropdown-list slot="column" data-qa="header-news-rt-news"> 1432 + <p slot="title" class="h4">RT News</p> 1433 + <ul slot="links" class="news-wrap"> 1434 + 1435 + <li data-qa="rt-news-item"> 1436 + <a class="news-tile" 1437 + href="https://editorial.rottentomatoes.com/article/new-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more/" 1438 + data-qa="news-link"> 1439 + <tile-dynamic data-qa="tile" orientation="landscape"> 1440 + <rt-img 1441 + alt="New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More poster image" 1442 + slot="image" 1443 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/New_Streaming_September_2025-Rep.jpg" 1444 + loading="lazy"></rt-img> 1445 + <div slot="caption"> 1446 + <p>New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, 1447 + Disney+ and More</p> 1448 + <span class="sr-only">Link to New Movies and Shows Streaming in September: What to watch on 1449 + Netflix, Prime Video, HBO Max, Disney+ and More</span> 1450 + </div> 1451 + </tile-dynamic> 1452 + </a> 1453 + </li> 1454 + 1455 + <li data-qa="rt-news-item"> 1456 + <a class="news-tile" 1457 + href="https://editorial.rottentomatoes.com/article/the-conjuring-last-rites-first-reviews/" 1458 + data-qa="news-link"> 1459 + <tile-dynamic data-qa="tile" orientation="landscape"> 1460 + <rt-img 1461 + alt="<em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off poster image" 1462 + slot="image" 1463 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/09/Conjuring_Last_Rites_Reviews-Rep.jpg" 1464 + loading="lazy"></rt-img> 1465 + <div slot="caption"> 1466 + <p><em>The Conjuring: Last Rites</em> First Reviews: A Frightful, Fitting Send-off</p> 1467 + <span class="sr-only">Link to <em>The Conjuring: Last Rites</em> First Reviews: A Frightful, 1468 + Fitting Send-off</span> 1469 + </div> 1470 + </tile-dynamic> 1471 + </a> 1472 + </li> 1473 + 1474 + </ul> 1475 + <a class="a--short" data-qa="rt-news-view-all-link" href="https://editorial.rottentomatoes.com/news/" 1476 + slot="view-all-link"> 1477 + View All 1478 + </a> 1479 + </rt-header-nav-item-dropdown-list> 1480 + 1481 + </rt-header-nav-item-dropdown> 1482 + </rt-header-nav-item> 1483 + 1484 + <rt-header-nav-item slot="showtimes"> 1485 + <a class="unset" slot="link" href="https://www.fandango.com/movies-in-theaters?a=13036" target="_blank" 1486 + rel="noopener" data-qa="masthead:tickets-showtimes-link" data-AdsGlobalNavTakeoverManager="text"> 1487 + Showtimes 1488 + </a> 1489 + </rt-header-nav-item> 1490 + </rt-header-nav> 1491 + 1492 + </rt-header> 1493 + 1494 + <ads-global-nav-takeover-manager></ads-global-nav-takeover-manager> 1495 + <section class="trending-bar"> 1496 + 1497 + 1498 + <ad-unit hidden id="trending_bar_ad" unit-display="desktop" unit-type="trendinggraphic"> 1499 + <div slot="ad-inject"></div> 1500 + </ad-unit> 1501 + <div id="trending-bar-start" class="trending-list-wrap" data-qa="trending-bar"> 1502 + <ul class="list-inline trending-bar__list" data-curation="rt-nav-trending" data-qa="trending-bar-list"> 1503 + <li class="trending-bar__header">Trending on RT</li> 1504 + 1505 + <li><a class="trending-bar__link" 1506 + href="https://editorial.rottentomatoes.com/article/2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores/" 1507 + data-qa="trending-bar-item"> Emmy Noms </a></li> 1508 + 1509 + <li><a class="trending-bar__link" 1510 + href="https://editorial.rottentomatoes.com/article/movie-re-releases-calendar/" 1511 + data-qa="trending-bar-item"> Re-Release Calendar </a></li> 1512 + 1513 + <li><a class="trending-bar__link" 1514 + href="https://editorial.rottentomatoes.com/article/renewed-and-cancelled-tv-shows-2025/" 1515 + data-qa="trending-bar-item"> Renewed and Cancelled TV </a></li> 1516 + 1517 + <li><a class="trending-bar__link" href="https://editorial.rottentomatoes.com/article/app/" 1518 + data-qa="trending-bar-item"> The Rotten Tomatoes App </a></li> 1519 + 1520 + </ul> 1521 + <div class="trending-bar__social" data-qa="trending-bar-social-list"> 1522 + <social-media-icons theme="light" size="14"></social-media-icons> 1523 + </div> 1524 + </div> 1525 + </section> 1526 + 1527 + 1528 + 1529 + 1530 + <main id="main_container" class="container rt-layout__content"> 1531 + <div id="main-page-content"> 1532 + 1533 + 1534 + 1535 + 1536 + <div id="tv-season-overview" data-HeroModulesManager="overviewWrap"> 1537 + <watchlist-button-manager></watchlist-button-manager> 1538 + 1539 + <div id="hero-wrap" data-AdUnitManager="heroWrap" data-AdsMediaScorecardManager="heroWrap" 1540 + data-HeroModulesManager="heroWrap"> 1541 + 1542 + <nav class="tv-navigation" skeleton="box" data-TvNavigationManager="tvNavigation" 1543 + data-HeroModulesManager="tvNavigation"> 1544 + <rt-link data-TvNavigationManager="prevLink" href="/tv/peacemaker_2022" size="0.875"> 1545 + <rt-icon icon="left-chevron"></rt-icon> Series Page 1546 + </rt-link> 1547 + 1548 + <tv-navigation-manager> 1549 + <script data-json="tvNavigation" 1550 + type="application/json">{"returnLink":{"href":"/tv/peacemaker_2022","text":"Series Page"},"seasons":[{"href":"/tv/peacemaker_2022/s01","isSelected":false,"text":"Season 1","value":"Season 1"},{"href":"/tv/peacemaker_2022/s02","isSelected":true,"text":"Season 2","value":"Season 2"}]}</script> 1551 + </tv-navigation-manager> 1552 + 1553 + <div class="dropdown-actions"> 1554 + <div class="seasons-wrap"> 1555 + <rt-button data-TvNavigationManager="seasonsBtn:click,keydown" size="0.8755" skeleton="panel" 1556 + theme="simplified"> 1557 + Season -- 1558 + </rt-button> 1559 + 1560 + <dropdown-menu data-HeroModulesManager="tvNavMenu:close,open" 1561 + data-TvNavigationManager="seasonsMenu:close" name="seasonsMenu" hidden> 1562 + 1563 + <rt-link href="/tv/peacemaker_2022/s01" isselected="false" size="1" slot="option" context="label"> 1564 + <dropdown-option ellipsis value="Season 1"> 1565 + Season 1 1566 + </dropdown-option> 1567 + </rt-link> 1568 + 1569 + <rt-link href="/tv/peacemaker_2022/s02" isselected="true" size="1" slot="option" context="label"> 1570 + <dropdown-option ellipsis value="Season 2"> 1571 + Season 2 1572 + </dropdown-option> 1573 + </rt-link> 1574 + 1575 + </dropdown-menu> 1576 + </div> 1577 + 1578 + <div class="episodes-wrap"> 1579 + <rt-button data-TvNavigationManager="episodesBtn:click,keydown" size="0.8755" skeleton="panel" 1580 + theme="simplified"> 1581 + Episode -- 1582 + </rt-button> 1583 + 1584 + <dropdown-menu data-HeroModulesManager="tvNavMenu:close,open" 1585 + data-TvNavigationManager="episodesMenu:close" name="episodesMenu" hidden> 1586 + 1587 + </dropdown-menu> 1588 + </div> 1589 + </div> 1590 + </nav> 1591 + 1592 + 1593 + <div aria-labelledby="media-hero-label" class="media-hero-wrap" skeleton="panel" data-adobe-id="media-hero" 1594 + data-qa="section:media-hero" data-HeroModulesManager="mediaHeroWrap"> 1595 + <h1 class="unset" id="media-hero-label"> 1596 + <sr-text> Season 2 &ndash; Peacemaker </sr-text> 1597 + </h1> 1598 + 1599 + <media-hero averagecolor="33,54,15" mediatype="TvSeason" scrolly="0" scrollystart="0" 1600 + data-AdsMediaScorecardManager="mediaHero" data-HeroModulesManager="mediaHero:collapse"> 1601 + <rt-button slot="iconicVideoCta" theme="transparent" data-content-type="PROMO" 1602 + data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" data-mpx-id="2447231043621" 1603 + data-public-id="nTePljVEct61" data-title="Season 2 &ndash; Peacemaker" data-type="TvSeason" 1604 + data-VideoPlayerOverlayManager="btnVideo:click"><sr-text>Play trailer</sr-text></rt-button> 1605 + 1606 + <rt-text slot="iconicVideoRuntime" size="0.75">1:39</rt-text> 1607 + 1608 + <rt-img slot="iconic" alt="Main image for Season 2 &amp;ndash; Peacemaker" fallbacktheme="iconic" 1609 + fetchpriority="high" 1610 + src="https://resizing.flixster.com/bvZfzyIQHc8UI0CJS9UdOdRXC7w=/375x210/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg,https://resizing.flixster.com/2jGm07y7TAmgwksV1KSg9Xsogtg=/620x336/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg"></rt-img> 1611 + 1612 + 1613 + <img slot="poster" alt="Poster for " fetchpriority="high" 1614 + src="https://resizing.flixster.com/kNXWRTdmL5I0O6L6XKMfIje7Qaw=/68x102/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==" /> 1615 + 1616 + 1617 + <rt-text slot="title" size="1.25,1.75" context="heading">Season 2 &ndash; Peacemaker</rt-text> 1618 + <rt-text slot="episodeTitle" size="1,1.5" context="label"></rt-text> 1619 + 1620 + 1621 + <rt-text slot="metadataProp" context="label" size="0.875">Next Ep Thu Sep 11</rt-text> 1622 + 1623 + 1624 + 1625 + <rt-text slot="metadataGenre" size="0.875">Comedy</rt-text> 1626 + 1627 + <rt-text slot="metadataGenre" size="0.875">Action</rt-text> 1628 + 1629 + 1630 + <rt-button slot="trailerCta" shape="pill" theme="light" data-content-type="PROMO" 1631 + data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" data-mpx-id="2447231043621" 1632 + data-public-id="nTePljVEct61" data-title="Season 2 &ndash; Peacemaker" data-type="TvSeason" 1633 + data-VideoPlayerOverlayManager="btnVideo:click"><rt-icon icon="play"></rt-icon> 1634 + <sr-text>Play</sr-text> Trailer </rt-button> 1635 + 1636 + <watchlist-button slot="watchlistCta" emsid="76add34d-b98d-34b5-9e0f-2eac74d2ab10" mediatype="TvSeason" 1637 + mediatitle="Season 2 &ndash; Peacemaker" state="unchecked" theme="transparent-lighttext" 1638 + data-HeroModulesManager="mediaHeroWatchlistBtn" data-WatchlistButtonManager="watchlistButton:click"> 1639 + <span slot="text">Watchlist</span> 1640 + </watchlist-button> 1641 + 1642 + <watchlist-button slot="mobileWatchlistCta" emsid="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 1643 + mediatype="TvSeason" mediatitle="Season 2 &ndash; Peacemaker" state="unchecked" 1644 + data-HeroModulesManager="mediaHeroWatchlistBtn" 1645 + data-WatchlistButtonManager="watchlistButton:click"></watchlist-button> 1646 + 1647 + <div slot="desktopVideos" data-HeroModulesManager="mediaHeroVideos"></div> 1648 + 1649 + <rt-button slot="collapsedPrimaryCta" hidden shape="pill" theme="simplified" 1650 + data-AdsMediaScorecardManager="collapsedPrimaryCta" 1651 + data-HeroModulesManager="mediaHeroCta:click"></rt-button> 1652 + 1653 + <watchlist-button slot="collapsedWatchlistCta" emsid="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 1654 + mediatype="TvSeason" mediatitle="Season 2 &ndash; Peacemaker" state="unchecked" 1655 + theme="transparent-lighttext" data-HeroModulesManager="mediaHeroWatchlistBtn" 1656 + data-WatchlistButtonManager="watchlistButton:click"> 1657 + <span slot="text">Watchlist</span> 1658 + </watchlist-button> 1659 + 1660 + <score-icon-critics slot="collapsedCriticsIcon" size="2.5"></score-icon-critics> 1661 + <rt-text slot="collapsedCriticsScore" context="label" size="1.375"></rt-text> 1662 + <rt-link slot="collapsedCriticsLink" size="0.75"></rt-link> 1663 + <rt-text slot="collapsedCriticsLabel" size="0.75">Tomatometer</rt-text> 1664 + 1665 + <score-icon-audience slot="collapsedAudienceIcon" size="2.5"></score-icon-audience> 1666 + <rt-text slot="collapsedAudienceScore" context="label" size="1.375"></rt-text> 1667 + <rt-link slot="collapsedAudienceLink" size="0.75"></rt-link> 1668 + <rt-text slot="collapsedAudienceLabel" size="0.75">Popcornmeter</rt-text> 1669 + </media-hero> 1670 + 1671 + <script id="media-hero-json" data-json="mediaHero" type="application/json"> 1672 + {"averageColorHsl":"33,54,15","iconic":{"srcDesktop":"https://resizing.flixster.com/2jGm07y7TAmgwksV1KSg9Xsogtg=/620x336/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg","srcMobile":"https://resizing.flixster.com/bvZfzyIQHc8UI0CJS9UdOdRXC7w=/375x210/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg"},"content":{"episodeTitle":"","metadataGenres":["Comedy","Action"],"metadataProps":["Next Ep Thu Sep 11"],"posterSrc":"https://resizing.flixster.com/kNXWRTdmL5I0O6L6XKMfIje7Qaw=/68x102/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==","title":"Season 2 &ndash; Peacemaker","primaryVideo":{"contentType":"PROMO","durationInSeconds":"99.933","mpxId":"2447231043621","publicId":"nTePljVEct61","thumbnail":{"url":"https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg"},"title":"Peacemaker: Season 2 Trailer - Weeks Ahead","runtime":"1:39"}}} 1673 + </script> 1674 + </div> 1675 + 1676 + 1677 + 1678 + <hero-modules-manager> 1679 + <script data-json="vanity" 1680 + type="application/json">{"emsId":"76add34d-b98d-34b5-9e0f-2eac74d2ab10","href":"/tv/peacemaker_2022/s02","lifecycleWindow":{"date":"2025-09-11","lifecycle":"AIRING"},"title":"Season 2","type":"tvSeason","value":"s02","parents":[{"emsId":"c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed","href":"/tv/peacemaker_2022","title":"Peacemaker","type":"tvSeries","value":"peacemaker_2022"}],"mediaType":"TvSeason"}</script> 1681 + </hero-modules-manager> 1682 + </div> 1683 + 1684 + <div id="main-wrap"> 1685 + <div id="modules-wrap" data-curation="drawer"> 1686 + 1687 + <div class="media-scorecard no-border" data-adobe-id="media-scorecard" data-qa="section:media-scorecard"> 1688 + <media-scorecard hideaudiencescore="false" skeleton="panel" 1689 + data-AdsMediaScorecardManager="mediaScorecard" data-HeroModulesManager="mediaScorecard"> 1690 + <rt-img alt="poster image" loading="lazy" slot="posterImage" 1691 + src="https://resizing.flixster.com/icqaMuFdXKqmN8qur-dfG4I-hWs=/206x305/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw=="></rt-img> 1692 + <rt-button slot="criticsScoreIcon" data-MediaScorecardManager="overlayOpen:click" theme="transparent"> 1693 + <score-icon-critics certified="true" sentiment="POSITIVE" size="2.5"></score-icon-critics> 1694 + </rt-button> 1695 + <rt-text slot="criticsScore" context="label" role="button" size="1.375" 1696 + data-MediaScorecardManager="overlayOpen:click">99%</rt-text> 1697 + <rt-text slot="criticsScoreType" class="critics-score-type" role="button" size="0.75" 1698 + data-MediaScorecardManager="overlayOpen:click">Tomatometer</rt-text> 1699 + <rt-link slot="criticsReviews" size="0.75" href="/tv/peacemaker_2022/s02/reviews"> 1700 + 82 Reviews 1701 + </rt-link> 1702 + 1703 + <rt-button slot="audienceScoreIcon" data-MediaScorecardManager="overlayOpen:click" 1704 + theme="transparent"> 1705 + <score-icon-audience certified="false" size="2.5" sentiment="POSITIVE"></score-icon-audience> 1706 + </rt-button> 1707 + <rt-text slot="audienceScore" context="label" role="button" size="1.375" 1708 + data-MediaScorecardManager="overlayOpen:click">80%</rt-text> 1709 + <rt-text slot="audienceScoreType" class="audience-score-type" role="button" size="0.75" 1710 + data-MediaScorecardManager="overlayOpen:click">Popcornmeter</rt-text> 1711 + <rt-link slot="audienceReviews" size="0.75" href="/tv/peacemaker_2022/s02/reviews?type=user"> 1712 + 1,000+ Ratings 1713 + </rt-link> 1714 + 1715 + <div slot="description" data-AdsMediaScorecardManager="description"> 1716 + <drawer-more maxlines="2" skeleton="panel" status="closed" style="--display: flex; gap: 4px;"> 1717 + <rt-text slot="content" size="1"> 1718 + A man fights for peace at any cost, no matter how many people he has to kill to get it. 1719 + </rt-text> 1720 + <rt-link slot="ctaOpen"> 1721 + <rt-icon icon="down-open"></rt-icon> 1722 + </rt-link> 1723 + <rt-link slot="ctaClose"> 1724 + <rt-icon icon="up-open"></rt-icon> 1725 + </rt-link> 1726 + </drawer-more> 1727 + </div> 1728 + 1729 + 1730 + <affiliate-icon data-AdsMediaScorecardManager="affiliateIcon" icon="max-us" 1731 + slot="affiliateIcon"></affiliate-icon> 1732 + <!-- --> 1733 + <rt-img data-AdsMediaScorecardManager="affiliateIconCustom" slot="affiliateIconCustom" hidden> 1734 + </rt-img> 1735 + <rt-text context="label" data-AdsMediaScorecardManager="affiliatePrimaryText" size="1" 1736 + slot="affiliatePrimaryText">Watch on Max</rt-text> 1737 + <rt-text data-AdsMediaScorecardManager="affiliateSecondaryText" size="0.75" 1738 + slot="affiliateSecondaryText"></rt-text> 1739 + <rt-button arialabel="Stream Peacemaker &mdash; Season 2 on Max" 1740 + href="https://max.prf.hn/click/camref:1100lqRUT?cmp=rt_leaderboard" rel="noopener" shape="pill" 1741 + slot="affiliateCtaBtn" style="--backgroundColor: #3478C1; --textColor: #FFFFFF;" target="_blank" 1742 + theme="simplified" data-AdsMediaScorecardManager="affiliateCtaBtn" 1743 + data-HeroModulesManager="mediaScorecardCta:click"> 1744 + Stream Now 1745 + </rt-button> 1746 + <div slot="adImpressions"></div> 1747 + 1748 + </media-scorecard> 1749 + 1750 + <media-scorecard-manager> 1751 + <script id="media-scorecard-json" data-json="mediaScorecard" type="application/json"> 1752 + {"audienceScore":{"averageRating":"4.1","bandedRatingCount":"1,000+ Ratings","likedCount":937,"notLikedCount":235,"reviewCount":330,"score":"80","scoreType":"ALL","sentiment":"POSITIVE","certified":false,"reviewsPageUrl":"/tv/peacemaker_2022/s02/reviews?type=user","scorePercent":"80%","title":"Popcornmeter"},"criticsScore":{"averageRating":"8.00","certified":true,"likedCount":81,"notLikedCount":1,"ratingCount":82,"reviewCount":82,"score":"99","sentiment":"POSITIVE","reviewsPageUrl":"/tv/peacemaker_2022/s02/reviews","scorePercent":"99%","title":"Tomatometer"},"criticReviewHref":"/critics/self-submission/tvSeason/76add34d-b98d-34b5-9e0f-2eac74d2ab10","cta":{"affiliate":"max-us","buttonStyle":{"backgroundColor":"#3478C1","textColor":"#FFFFFF"},"buttonText":"Stream Now","buttonAnnouncement":"Stream Peacemaker &mdash; Season 2 on Max","buttonUrl":"https://max.prf.hn/click/camref:1100lqRUT?cmp=rt_leaderboard","icon":"max-us","windowDate":"","windowText":"Watch on Max"},"description":"A man fights for peace at any cost, no matter how many people he has to kill to get it.","hideAudienceScore":false,"overlay":{"audienceAll":{"averageRating":"4.1","bandedRatingCount":"1,000+ Ratings","likedCount":937,"notLikedCount":235,"reviewCount":330,"score":"80","scoreType":"ALL","sentiment":"POSITIVE","certified":false,"reviewsPageUrl":"/tv/peacemaker_2022/s02/reviews?type=user","scorePercent":"80%","title":"Popcornmeter","scoreLinkUrl":"/tv/peacemaker_2022/s02/reviews?type=user"},"audienceTitle":"Popcornmeter","audienceVerified":{"bandedRatingCount":"0 Verified Ratings","likedCount":0,"notLikedCount":0,"reviewCount":0,"scoreType":"VERIFIED","certified":false,"title":"Popcornmeter","scoreLinkUrl":"/tv/peacemaker_2022/s02/reviews?type=verified_audience"},"criticsAll":{"averageRating":"8.00","certified":true,"likedCount":81,"notLikedCount":1,"ratingCount":82,"reviewCount":82,"score":"99","sentiment":"POSITIVE","reviewsPageUrl":"/tv/peacemaker_2022/s02/reviews","scorePercent":"99%","title":"Tomatometer","scoreLinkUrl":"/tv/peacemaker_2022/s02/reviews","scoreLinkText":"82 Reviews"},"criticsTitle":"Tomatometer","criticsTop":{"averageRating":"7.20","certified":true,"likedCount":12,"notLikedCount":1,"ratingCount":13,"reviewCount":13,"score":"92","sentiment":"POSITIVE","reviewsPageUrl":"/tv/peacemaker_2022/s02/reviews","scorePercent":"92%","title":"Tomatometer","scoreLinkUrl":"/tv/peacemaker_2022/s02/reviews?type=top_critics","scoreLinkText":"13 Top Critic Reviews"},"hasAudienceAll":true,"hasAudienceVerified":false,"hasCriticsAll":true,"hasCriticsTop":true,"mediaType":"TvSeason","showScoreDetailsAudience":true,"learnMoreUrl":"https://editorial.rottentomatoes.com/article/introducing-verified-audience-score/"},"primaryImageUrl":"https://resizing.flixster.com/icqaMuFdXKqmN8qur-dfG4I-hWs=/206x305/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw=="} 1753 + </script> 1754 + </media-scorecard-manager> 1755 + </div> 1756 + 1757 + 1758 + <section class="modules-nav" data-ModulesNavigationManager="navWrap"> 1759 + <modules-navigation-manager></modules-navigation-manager> 1760 + 1761 + <nav> 1762 + <modules-navigation-carousel skeleton="panel" tilewidth="auto" 1763 + data-ModulesNavigationManager="navCarousel"> 1764 + 1765 + 1766 + 1767 + 1768 + 1769 + 1770 + <a slot="tile" href="#where-to-watch"> 1771 + <rt-tab data-ModulesNavigationManager="navTab">Where to Watch</rt-tab> 1772 + </a> 1773 + 1774 + 1775 + 1776 + <a slot="tile" href="#what-to-know"> 1777 + <rt-tab data-ModulesNavigationManager="navTab">What to Know</rt-tab> 1778 + </a> 1779 + 1780 + 1781 + 1782 + 1783 + 1784 + 1785 + 1786 + <a slot="tile" href="#critics-reviews"> 1787 + <rt-tab data-ModulesNavigationManager="navTab">Reviews</rt-tab> 1788 + </a> 1789 + 1790 + 1791 + 1792 + 1793 + 1794 + 1795 + 1796 + <a slot="tile" href="#cast-and-crew"> 1797 + <rt-tab data-ModulesNavigationManager="navTab">Cast &amp; Crew</rt-tab> 1798 + </a> 1799 + 1800 + 1801 + 1802 + <a slot="tile" href="#episodes"> 1803 + <rt-tab data-ModulesNavigationManager="navTab">Episodes</rt-tab> 1804 + </a> 1805 + 1806 + 1807 + 1808 + <a slot="tile" href="#more-like-this"> 1809 + <rt-tab data-ModulesNavigationManager="navTab">More Like This</rt-tab> 1810 + </a> 1811 + 1812 + 1813 + 1814 + <a slot="tile" href="#news-and-guides"> 1815 + <rt-tab data-ModulesNavigationManager="navTab">Related News</rt-tab> 1816 + </a> 1817 + 1818 + 1819 + 1820 + <a slot="tile" href="#videos"> 1821 + <rt-tab data-ModulesNavigationManager="navTab">Videos</rt-tab> 1822 + </a> 1823 + 1824 + 1825 + 1826 + <a slot="tile" href="#photos"> 1827 + <rt-tab data-ModulesNavigationManager="navTab">Photos</rt-tab> 1828 + </a> 1829 + 1830 + 1831 + 1832 + 1833 + 1834 + 1835 + 1836 + <a slot="tile" href="#media-info"> 1837 + <rt-tab data-ModulesNavigationManager="navTab">Media Info</rt-tab> 1838 + </a> 1839 + 1840 + 1841 + </modules-navigation-carousel> 1842 + </nav> 1843 + </section> 1844 + 1845 + 1846 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1847 + 1848 + <div id="where-to-watch" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1849 + 1850 + 1851 + 1852 + <section aria-labelledby="where-to-watch-label" class="where-to-watch" data-adobe-id="where-to-watch" 1853 + data-qa="section:where-to-watch"> 1854 + <div class="header-wrap"> 1855 + <h2 class="unset" id="where-to-watch-label"> 1856 + <rt-text context="heading" size="1.25" style="--textTransform: capitalize;">Where to 1857 + Watch</rt-text> 1858 + </h2> 1859 + <h3 class="unset"> 1860 + <rt-text context="heading" size="0.75" 1861 + style="--textColor: var(--grayDark4); --letterSpacing: 1px; --textTransform: capitalize;"> 1862 + Peacemaker &mdash; Season 2 1863 + </rt-text> 1864 + </h3> 1865 + </div> 1866 + 1867 + <where-to-watch-manager> 1868 + <script id="where-to-watch-json" data-json="whereToWatch" type="application/json"> 1869 + {"affiliates":[{"icon":"max-us","url":"https://max.prf.hn/click/camref:1100lqRUT?cmp=rt_where_to_watch","isSponsoredLink":true,"text":"Max"}],"affiliatesText":"Watch Peacemaker &mdash; Season 2 with a subscription on Max.","justWatchMediaType":"show","seasonNumber":"2","showtimesUrl":"","releaseYear":"2022","tarsSlug":"rt-affiliates-sort-order","title":"Peacemaker &mdash; Season 2"} 1870 + </script> 1871 + </where-to-watch-manager> 1872 + 1873 + <div hidden data-WhereToWatchManager="jwContainer"></div> 1874 + <div hidden data-WhereToWatchManager="w2wContainer"> 1875 + <carousel-slider data-curation="rt-affiliates-sort-order" gap="15px" skeleton="panel" 1876 + tile-width="80px" exclude-page-indicators> 1877 + 1878 + 1879 + <where-to-watch-meta affiliate="max-us" data-qa="affiliate-item" 1880 + href="https://max.prf.hn/click/camref:1100lqRUT?cmp=rt_where_to_watch" issponsoredlink="true" 1881 + skeleton="panel" slot="tile"> 1882 + <where-to-watch-bubble image="max-us" slot="bubble" tabindex="-1"></where-to-watch-bubble> 1883 + <span slot="license">Max</span> 1884 + <span slot="coverage"></span> 1885 + </where-to-watch-meta> 1886 + 1887 + </carousel-slider> 1888 + 1889 + <p class="affiliates-text">Watch Peacemaker &mdash; Season 2 with a subscription on Max. </p> 1890 + </div> 1891 + </section> 1892 + 1893 + </div> 1894 + 1895 + 1896 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1897 + 1898 + <div id="what-to-know" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1899 + 1900 + 1901 + 1902 + <section aria-labelledby="what-to-know-label" class="what-to-know" data-adobe-id="what-to-know" 1903 + data-qa="section:what-to-know"> 1904 + <div class="header-wrap"> 1905 + <rt-text context="heading" size="0.75" 1906 + style="--textColor: var(--grayDark4); --letterSpacing: 1px;--textTransform: capitalize;"> 1907 + Peacemaker &mdash; Season 2 1908 + </rt-text> 1909 + <h2 class="unset" id="what-to-know-label"> 1910 + <rt-text context="heading" size="1.25" style="--textTransform: capitalize;">What to Know</rt-text> 1911 + </h2> 1912 + </div> 1913 + 1914 + <div class="content"> 1915 + 1916 + 1917 + 1918 + 1919 + <div id="critics-consensus" class="consensus"> 1920 + <rt-text context="heading"> 1921 + <score-icon-critics certified="true" sentiment="POSITIVE" size="1"></score-icon-critics> 1922 + Critics Consensus 1923 + </rt-text> 1924 + <p><em>Peacemaker</em>'s second season goes multidimensional while still maintaining a singular 1925 + focus on emotional stakes, seamlessly transporting this outrageous antihero into a fresh 1926 + cinematic universe.</p> 1927 + <a href="/tv/peacemaker_2022/s02/reviews">Read Critics Reviews</a> 1928 + </div> 1929 + 1930 + 1931 + 1932 + 1933 + 1934 + </div> 1935 + </section> 1936 + 1937 + </div> 1938 + 1939 + 1940 + <ad-unit hidden unit-display="desktop" unit-type="opbannerone"> 1941 + <div slot="ad-inject" class="banner-ad"></div> 1942 + </ad-unit> 1943 + 1944 + 1945 + <ad-unit hidden unit-display="mobile" unit-type="interscroller" no-retry 1946 + data-AdUnitManager="adUnit:interscrollerinstantiated"> 1947 + <aside slot="ad-inject" class="center mobile-interscroller"></aside> 1948 + </ad-unit> 1949 + 1950 + 1951 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 1952 + 1953 + <div id="critics-reviews" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 1954 + 1955 + 1956 + 1957 + <section aria-labelledby="critics-reviews-label" class="critics-reviews" data-adobe-id="critics-reviews" 1958 + data-qa="section:critics-reviews"> 1959 + <div class="header-wrap"> 1960 + <h2 class="unset" id="critics-reviews-label"> 1961 + <rt-text size="1.25" context="heading" data-qa="title">Critics Reviews</rt-text> 1962 + </h2> 1963 + <rt-button arialabel="Critics Reviews" data-qa="view-all-link" 1964 + href="/tv/peacemaker_2022/s02/reviews" shape="pill" size="0.875" 1965 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 1966 + theme="light"> 1967 + View More (82) 1968 + </rt-button> 1969 + </div> 1970 + 1971 + <div class="content-wrap"> 1972 + <carousel-slider tile-width="80%,45%" skeleton="panel" data-qa="carousel"> 1973 + 1974 + 1975 + <media-review-card-critic slot="tile" istopreview="true" data-qa="critic-review-tile"> 1976 + <rt-link aria-hidden="true" href="/critics/craig-mathieson" slot="displayImage" 1977 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 1978 + <img 1979 + src="https://resizing.flixster.com/srE4lzd1NPKRCAex2t-o3qKCZ_I=/fit-in/128x128/v2/https://resizing.flixster.com/EebuNkttDjHuP0eJJntXvIB0Vsk=/128x128/v1.YzszMzA2O2o7MjAzNDA7MjA0ODszMDA7MzAw" 1980 + alt="Critic's profile" /> 1981 + </rt-link> 1982 + <rt-link href="/critics/craig-mathieson" slot="displayName" 1983 + style="--textColor: var(--grayDark2)" data-qa="critic-link"> 1984 + <rt-text context="label" size="0.875" 1985 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 1986 + Craig Mathieson 1987 + </rt-text> 1988 + </rt-link> 1989 + <rt-link href="/critics/source/2041" slot="publicationName" 1990 + style="--textColor: var(--grayDark2)" data-qa="source-link"> 1991 + <rt-text size="0.75"> 1992 + The Age (Australia) 1993 + </rt-text> 1994 + </rt-link> 1995 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 1996 + <rt-text size="0.875" slot="content" data-qa="review-text"> 1997 + Dimensional travel, vengeful relatives and spurts of bloody violence set the tone for a 1998 + series that remains a cartoonish change of pace. 1999 + </rt-text> 2000 + </drawer-more> 2001 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2002 + </score-icon-critics> 2003 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2004 + <span>Rated: 3/5</span> 2005 + </rt-text> 2006 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2007 + <span> Aug 28, 2025 </span> 2008 + </rt-text> 2009 + <rt-link 2010 + href="https://www.theage.com.au/culture/tv-and-radio/it-s-implausible-and-ludicrous-but-this-netflix-thriller-is-held-together-by-a-terrific-performance-20250822-p5mp0a.html" 2011 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2012 + Review</rt-link> 2013 + </media-review-card-critic> 2014 + 2015 + <media-review-card-critic slot="tile" istopreview="true" data-qa="critic-review-tile"> 2016 + <rt-link aria-hidden="true" href="/critics/graeme-virtue" slot="displayImage" 2017 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2018 + <img 2019 + src="https://images.fandango.com/cms/assets/5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png" 2020 + alt="Critic's profile" /> 2021 + </rt-link> 2022 + <rt-link href="/critics/graeme-virtue" slot="displayName" style="--textColor: var(--grayDark2)" 2023 + data-qa="critic-link"> 2024 + <rt-text context="label" size="0.875" 2025 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2026 + Graeme Virtue 2027 + </rt-text> 2028 + </rt-link> 2029 + <rt-link href="/critics/source/205" slot="publicationName" style="--textColor: var(--grayDark2)" 2030 + data-qa="source-link"> 2031 + <rt-text size="0.75"> 2032 + Guardian 2033 + </rt-text> 2034 + </rt-link> 2035 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2036 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2037 + Gunn clearly loved these damaged characters enough to carry them over to his shiny new 2038 + universe, but he is also never afraid to put them through the wringer. It makes even the 2039 + tiniest victories in their lives feel momentous. 2040 + </rt-text> 2041 + </drawer-more> 2042 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2043 + </score-icon-critics> 2044 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2045 + <span>Rated: 4/5</span> 2046 + </rt-text> 2047 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2048 + <span> Aug 25, 2025 </span> 2049 + </rt-text> 2050 + <rt-link 2051 + href="https://www.theguardian.com/tv-and-radio/2025/aug/23/peacemaker-season-two-review-the-orgy-scene-feels-like-a-tv-first" 2052 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2053 + Review</rt-link> 2054 + </media-review-card-critic> 2055 + 2056 + <media-review-card-critic slot="tile" istopreview="true" data-qa="critic-review-tile"> 2057 + <rt-link aria-hidden="true" href="/critics/sam-adams" slot="displayImage" 2058 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2059 + <img 2060 + src="https://resizing.flixster.com/uK77X4Dq-KlH0QD9rPlgcBuqvpo=/fit-in/128x128/v2/https://resizing.flixster.com/69Az0Lkh0DgEFbanVrfrUIgEkEU=/128x128/v1.YzsxMDAwMDAzMzc3O2o7MjAzOTQ7MjA0ODs0NDg4OzQzNDM" 2061 + alt="Critic's profile" /> 2062 + </rt-link> 2063 + <rt-link href="/critics/sam-adams" slot="displayName" style="--textColor: var(--grayDark2)" 2064 + data-qa="critic-link"> 2065 + <rt-text context="label" size="0.875" 2066 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2067 + Sam Adams 2068 + </rt-text> 2069 + </rt-link> 2070 + <rt-link href="/critics/source/419" slot="publicationName" style="--textColor: var(--grayDark2)" 2071 + data-qa="source-link"> 2072 + <rt-text size="0.75"> 2073 + Slate 2074 + </rt-text> 2075 + </rt-link> 2076 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2077 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2078 + Like the first season, the second season of Peacemaker risks stretching too few jokes over 2079 + too many hoursโ€”even if sometimes the joke going on for too long is the joke. But itโ€™s also 2080 + strangely fascinating. 2081 + </rt-text> 2082 + </drawer-more> 2083 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2084 + </score-icon-critics> 2085 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2086 + <span></span> 2087 + </rt-text> 2088 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2089 + <span> Aug 25, 2025 </span> 2090 + </rt-text> 2091 + <rt-link 2092 + href="https://slate.com/culture/2025/08/peacemaker-season-2-superman-2025-james-gunn-hbo-max.html" 2093 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2094 + Review</rt-link> 2095 + </media-review-card-critic> 2096 + 2097 + <media-review-card-critic slot="tile" istopreview="false" data-qa="critic-review-tile"> 2098 + <rt-link aria-hidden="true" href="/critics/david-craig" slot="displayImage" 2099 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2100 + <img 2101 + src="https://images.fandango.com/cms/assets/5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png" 2102 + alt="Critic's profile" /> 2103 + </rt-link> 2104 + <rt-link href="/critics/david-craig" slot="displayName" style="--textColor: var(--grayDark2)" 2105 + data-qa="critic-link"> 2106 + <rt-text context="label" size="0.875" 2107 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2108 + David Craig 2109 + </rt-text> 2110 + </rt-link> 2111 + <rt-link href="/critics/source/2290" slot="publicationName" 2112 + style="--textColor: var(--grayDark2)" data-qa="source-link"> 2113 + <rt-text size="0.75"> 2114 + Radio Times 2115 + </rt-text> 2116 + </rt-link> 2117 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2118 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2119 + From the opening dance number, it&#39;s an enormous amount of fun that carefully balances 2120 + its surreal pleasures with impactful character-led moments โ€“ and plenty of unexpected 2121 + twists. 2122 + </rt-text> 2123 + </drawer-more> 2124 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2125 + </score-icon-critics> 2126 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2127 + <span>Rated: 4/5</span> 2128 + </rt-text> 2129 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2130 + <span> Aug 30, 2025 </span> 2131 + </rt-text> 2132 + <rt-link href="https://www.radiotimes.com/tv/sci-fi/peacemaker-season-2-review/" 2133 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2134 + Review</rt-link> 2135 + </media-review-card-critic> 2136 + 2137 + <media-review-card-critic slot="tile" istopreview="false" data-qa="critic-review-tile"> 2138 + <rt-link aria-hidden="true" href="/critics/alex-maidy" slot="displayImage" 2139 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2140 + <img 2141 + src="https://resizing.flixster.com/MFK0dnw8QU4wEbVsa7vgkOQixvA=/fit-in/128x128/v2/https://resizing.flixster.com/4FX6vSszdhdJXA0VeDjGk6plUQU=/128x128/v1.YzszMzk5O2o7MjAzNDA7MjA0ODszMDA7MzAw" 2142 + alt="Critic's profile" /> 2143 + </rt-link> 2144 + <rt-link href="/critics/alex-maidy" slot="displayName" style="--textColor: var(--grayDark2)" 2145 + data-qa="critic-link"> 2146 + <rt-text context="label" size="0.875" 2147 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2148 + Alex Maidy 2149 + </rt-text> 2150 + </rt-link> 2151 + <rt-link href="/critics/source/573" slot="publicationName" style="--textColor: var(--grayDark2)" 2152 + data-qa="source-link"> 2153 + <rt-text size="0.75"> 2154 + JoBlo&#39;s Movie Network 2155 + </rt-text> 2156 + </rt-link> 2157 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2158 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2159 + While I do not suffer from bird blindness, I can say that Peacemaker soars with the ducks. 2160 + </rt-text> 2161 + </drawer-more> 2162 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2163 + </score-icon-critics> 2164 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2165 + <span>Rated: 9/10</span> 2166 + </rt-text> 2167 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2168 + <span> Aug 28, 2025 </span> 2169 + </rt-text> 2170 + <rt-link 2171 + href="https://www.joblo.com/peacemaker-season-2-tv-review-james-gunn-and-john-cena-reunite-for-a-brutal-and-fun-soft-reboot-into-the-dcu/" 2172 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2173 + Review</rt-link> 2174 + </media-review-card-critic> 2175 + 2176 + <media-review-card-critic slot="tile" istopreview="false" data-qa="critic-review-tile"> 2177 + <rt-link aria-hidden="true" href="/critics/joel-keller" slot="displayImage" 2178 + style="--textColor: var(--grayDark2)" tabindex="-1" data-qa="critic-picture"> 2179 + <img 2180 + src="https://images.fandango.com/cms/assets/5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png" 2181 + alt="Critic's profile" /> 2182 + </rt-link> 2183 + <rt-link href="/critics/joel-keller" slot="displayName" style="--textColor: var(--grayDark2)" 2184 + data-qa="critic-link"> 2185 + <rt-text context="label" size="0.875" 2186 + style="--lineHeight: 1.25; --textColor: var(--grayDark3);"> 2187 + Joel Keller 2188 + </rt-text> 2189 + </rt-link> 2190 + <rt-link href="/critics/source/2701" slot="publicationName" 2191 + style="--textColor: var(--grayDark2)" data-qa="source-link"> 2192 + <rt-text size="0.75"> 2193 + Decider 2194 + </rt-text> 2195 + </rt-link> 2196 + <drawer-more maxlines="6" skeleton="panel" slot="reviewQuote" status="closed"> 2197 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2198 + Peacemaker continues to be a funny but emotional superhero drama, with a surprisingly 2199 + effective performance by Cena at its center, with a fun-to-watch ensemble around him. 2200 + </rt-text> 2201 + </drawer-more> 2202 + <score-icon-critics sentiment="POSITIVE" size="1" slot="scoreIcon" verticalalign="sub"> 2203 + </score-icon-critics> 2204 + <rt-text size="0.75" slot="originalScore" style="--textColor: #62686F" data-qa="review-rating"> 2205 + <span></span> 2206 + </rt-text> 2207 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2208 + <span> Aug 25, 2025 </span> 2209 + </rt-text> 2210 + <rt-link href="https://decider.com/2025/08/21/peacemaker-season-2-hbo-max-review/" 2211 + slot="editorialUrl" size="0.875" target="_blank" data-qa="full-review-link">Full 2212 + Review</rt-link> 2213 + </media-review-card-critic> 2214 + 2215 + <tile-view-more aspect="fill" background="mediaHero" slot="tile"> 2216 + <rt-button href="/tv/peacemaker_2022/s02/reviews" shape="pill" theme="transparent-lighttext"> 2217 + Read all reviews 2218 + </rt-button> 2219 + </tile-view-more> 2220 + </carousel-slider> 2221 + </div> 2222 + </section> 2223 + 2224 + </div> 2225 + 2226 + 2227 + 2228 + 2229 + <section aria-labelledby="audience-reviews-label" class="audience-reviews" 2230 + data-adobe-id="audience-reviews" data-qa="section:audience-reviews"> 2231 + <div class="header-wrap"> 2232 + <h2 class="unset" id="audience-reviews-label"> 2233 + <rt-text size="1.25" context="heading" data-qa="title">Audience Reviews</rt-text> 2234 + </h2> 2235 + <rt-button arialabel="Audience Reviews" class="" data-qa="view-all-link" 2236 + href="/tv/peacemaker_2022/s02/reviews?type=user" shape="pill" size="0.875" 2237 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2238 + theme="light"> 2239 + View More (330) 2240 + </rt-button> 2241 + </div> 2242 + 2243 + <div class="content-wrap"> 2244 + <carousel-slider tile-width="80%,45%" skeleton="panel" data-qa="carousel"> 2245 + 2246 + <media-review-card-audience slot="tile" isverifiedreview="false" data-qa="audience-review-tile"> 2247 + <rt-link context="label" 2248 + href="/profiles/L2LHQkcloTPnTolIpYFABto4hvvCZqhWGunaCGju99CAYixdirosyLCmmCyXu1lC2WSzDHPPCJeHq8sWoFb2hg1svlhqrhnrSBRFM9Fv4tL8" 2249 + size="0.875" slot="displayName" style="--letterSpacing: 1px; --textColor: var(--grayDark3);" 2250 + data-qa="user-name"> 2251 + Andres G 2252 + </rt-link> 2253 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2254 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2255 + No es mala pero tampoco no es una de las mejores series como dice la critica 2256 + </rt-text> 2257 + </drawer-more> 2258 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2259 + <span aria-hidden="true">Rated 3.5/5 Stars &bull;&nbsp;</span> 2260 + <sr-text>Rated 3.5 out of 5 stars</sr-text> 2261 + </rt-text> 2262 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2263 + <span>09/07/25</span> 2264 + </rt-text> 2265 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2266 + data-rating-id="0c9c0287-f018-4c40-9eba-187b1bd08e78" size="0.875" slot="fullReviewBtn" 2267 + data-qa="full-review-btn"> 2268 + Full Review 2269 + </rt-link> 2270 + </media-review-card-audience> 2271 + 2272 + <media-review-card-audience slot="tile" isverifiedreview="false" data-qa="audience-review-tile"> 2273 + <rt-link context="label" 2274 + href="/profiles/1K0Tevfx1fpAixzs6Psdjf2mIQQC2vTgjFJPTB6SNNC2xiB8IzYIWvfvvCkaIJ0uK2FnyCzzCbXu9JUnGsBnHG4SOrfbnukxcxpTplcAVFjr" 2275 + size="0.875" slot="displayName" style="--letterSpacing: 1px; --textColor: var(--grayDark3);" 2276 + data-qa="user-name"> 2277 + Jude C 2278 + </rt-link> 2279 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2280 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2281 + Absolute-cinema, it&#39;s too bad we can&#39;t see peacemaker though 2282 + </rt-text> 2283 + </drawer-more> 2284 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2285 + <span aria-hidden="true">Rated 5/5 Stars &bull;&nbsp;</span> 2286 + <sr-text>Rated 5 out of 5 stars</sr-text> 2287 + </rt-text> 2288 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2289 + <span>09/07/25</span> 2290 + </rt-text> 2291 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2292 + data-rating-id="2e3b3a6a-4748-4d87-8588-0e13b2c9f56f" size="0.875" slot="fullReviewBtn" 2293 + data-qa="full-review-btn"> 2294 + Full Review 2295 + </rt-link> 2296 + </media-review-card-audience> 2297 + 2298 + <media-review-card-audience slot="tile" isverifiedreview="false" data-qa="audience-review-tile"> 2299 + <rt-link context="label" 2300 + href="/profiles/RkbsJQIovuYyFnRS2bUWRHByHAACVQtlMtB4Fl2hnnCx6iQVSD9HvwuZZC6viXKFRXFlPuGGCvNFPaILkIZ2fY4FKxu9GiZLI9ySWNikyiWO" 2301 + size="0.875" slot="displayName" style="--letterSpacing: 1px; --textColor: var(--grayDark3);" 2302 + data-qa="user-name"> 2303 + ลukasz S 2304 + </rt-link> 2305 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2306 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2307 + 2308 + 2309 + 2310 + 2311 + 2312 + 2313 + 2314 + 2315 + 2316 + 2317 + 2318 + 2319 + 2320 + Good 2321 + 2322 + 2323 + 2324 + 2325 + </rt-text> 2326 + </drawer-more> 2327 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2328 + <span aria-hidden="true">Rated 5/5 Stars &bull;&nbsp;</span> 2329 + <sr-text>Rated 5 out of 5 stars</sr-text> 2330 + </rt-text> 2331 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2332 + <span>09/06/25</span> 2333 + </rt-text> 2334 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2335 + data-rating-id="7dc00af0-0d3c-4f70-9080-2c6482151b67" size="0.875" slot="fullReviewBtn" 2336 + data-qa="full-review-btn"> 2337 + Full Review 2338 + </rt-link> 2339 + </media-review-card-audience> 2340 + 2341 + <media-review-card-audience slot="tile" isverifiedreview="false" data-qa="audience-review-tile"> 2342 + <rt-link context="label" 2343 + href="/profiles/0x6umbFAQuYLSnpiGgS6ji4bseeCaAuk8szYTdLIyyCk4izaioaIjns44CK1F1aFZeTDefvvCvwtkBhNPcNos0rhDpULQuzlf4xuwdu1NIg8" 2344 + size="0.875" slot="displayName" style="--letterSpacing: 1px; --textColor: var(--grayDark3);" 2345 + data-qa="user-name"> 2346 + Fernando N 2347 + </rt-link> 2348 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2349 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2350 + Essa segunda temporada estรก me surpreendendo positivamente, a quรญmica dos personagens estรฃo 2351 + incrรญveis, cenas de aรงรฃo perfeitas e as participaรงรตes surpreendentes 2352 + </rt-text> 2353 + </drawer-more> 2354 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2355 + <span aria-hidden="true">Rated 5/5 Stars &bull;&nbsp;</span> 2356 + <sr-text>Rated 5 out of 5 stars</sr-text> 2357 + </rt-text> 2358 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2359 + <span>09/06/25</span> 2360 + </rt-text> 2361 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2362 + data-rating-id="cf1c9119-24f9-4cfe-8e43-103aba7c899b" size="0.875" slot="fullReviewBtn" 2363 + data-qa="full-review-btn"> 2364 + Full Review 2365 + </rt-link> 2366 + </media-review-card-audience> 2367 + 2368 + <media-review-card-audience slot="tile" isverifiedreview="false" data-qa="audience-review-tile"> 2369 + <rt-link context="label" 2370 + href="/profiles/MlqtDxizBCpKHPQFrQfbjuxWFXXCNxsz4CJAhAlHLLCVJi9dSMRHvaFQQCMjt6jiKDFBGIZZCMgfAnH8KslqtadHVRiZBHlBhmdIPxCNPuOJ" 2371 + size="0.875" slot="displayName" style="--letterSpacing: 1px; --textColor: var(--grayDark3);" 2372 + data-qa="user-name"> 2373 + Shan V 2374 + </rt-link> 2375 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2376 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2377 + starting to introduce old characters like theyre somehow important to the DCU, thge comedy 2378 + puts me off and reminds me of the beginnings of Marvel shows where they started out good then 2379 + went to crap. 2380 + </rt-text> 2381 + </drawer-more> 2382 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2383 + <span aria-hidden="true">Rated 0.5/5 Stars &bull;&nbsp;</span> 2384 + <sr-text>Rated 0.5 out of 5 stars</sr-text> 2385 + </rt-text> 2386 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2387 + <span>09/07/25</span> 2388 + </rt-text> 2389 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2390 + data-rating-id="6b5b496f-f34c-4a9f-84ae-68bed827c3fb" size="0.875" slot="fullReviewBtn" 2391 + data-qa="full-review-btn"> 2392 + Full Review 2393 + </rt-link> 2394 + </media-review-card-audience> 2395 + 2396 + <media-review-card-audience slot="tile" isverifiedreview="false" data-qa="audience-review-tile"> 2397 + <rt-link context="label" 2398 + href="/profiles/kOBhdziqwfJjf9eSb0SxJIBpiDDCKPulVIpGcoGirrCZqiWgFNVI9NhggCXDFv9s18uKbIPPCKOHvNfRoFAwsbKtmwI90IwAuJ0FPZTWmT8y" 2399 + size="0.875" slot="displayName" style="--letterSpacing: 1px; --textColor: var(--grayDark3);" 2400 + data-qa="user-name"> 2401 + Zubair A 2402 + </rt-link> 2403 + <drawer-more maxlines="4" skeleton="panel" slot="reviewQuote" status="closed"> 2404 + <rt-text size="0.875" slot="content" data-qa="review-text"> 2405 + With Gunn at the helm, the mission continues: flawless action, killer music, and jokes that 2406 + hit like a helmet-beam. Fabulous doesn&#39;t even cover it. 2407 + </rt-text> 2408 + </drawer-more> 2409 + <rt-text size="0.75" slot="originalScore" data-qa="review-rating"> 2410 + <span aria-hidden="true">Rated 5/5 Stars &bull;&nbsp;</span> 2411 + <sr-text>Rated 5 out of 5 stars</sr-text> 2412 + </rt-text> 2413 + <rt-text size="0.75" slot="createDate" style="--textColor: #62686F" data-qa="review-date"> 2414 + <span>09/05/25</span> 2415 + </rt-text> 2416 + <rt-link data-MediaAudienceReviewsManager="fullReviewBtn:click" 2417 + data-rating-id="62b62ce6-5eb3-4a5a-a0b9-d94e47069a0d" size="0.875" slot="fullReviewBtn" 2418 + data-qa="full-review-btn"> 2419 + Full Review 2420 + </rt-link> 2421 + </media-review-card-audience> 2422 + 2423 + <tile-view-more aspect="fill" background="mediaHero" slot="tile"> 2424 + <rt-button href="/tv/peacemaker_2022/s02/reviews?type=user" shape="pill" 2425 + theme="transparent-lighttext"> 2426 + Read all reviews 2427 + </rt-button> 2428 + </tile-view-more> 2429 + </carousel-slider> 2430 + 2431 + </div> 2432 + 2433 + <media-audience-reviews-manager> 2434 + <script type="application/json" 2435 + data-json="reviewsData">{"audienceScore":{"reviewCount":330,"score":"80","sentiment":"POSITIVE","certified":false,"scorePercent":"80%"},"criticsScore":{"certified":true,"score":"99","sentiment":"POSITIVE","scorePercent":"99%"},"emptyMessage":"There are no Audience reviews for Peacemaker &mdash; Season 2 yet.","linkCss":"","partial":"pages/_shared/mediaAudienceReviewsCarousel.html","ratingsData":{"emsId":"76add34d-b98d-34b5-9e0f-2eac74d2ab10","isPreRelease":false},"reviews":[{"displayDate":"09/07/25","displayName":"Andres G","isVerified":false,"ratingId":"0c9c0287-f018-4c40-9eba-187b1bd08e78","ratingRange":"Rated 3.5/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 3.5 out of 5 stars","review":"No es mala pero tampoco no es una de las mejores series como dice la critica","userAccountLink":"/profiles/L2LHQkcloTPnTolIpYFABto4hvvCZqhWGunaCGju99CAYixdirosyLCmmCyXu1lC2WSzDHPPCJeHq8sWoFb2hg1svlhqrhnrSBRFM9Fv4tL8"},{"displayDate":"09/07/25","displayName":"Jude C","isVerified":false,"ratingId":"2e3b3a6a-4748-4d87-8588-0e13b2c9f56f","ratingRange":"Rated 5/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 5 out of 5 stars","review":"Absolute-cinema, it's too bad we can't see peacemaker though ","userAccountLink":"/profiles/1K0Tevfx1fpAixzs6Psdjf2mIQQC2vTgjFJPTB6SNNC2xiB8IzYIWvfvvCkaIJ0uK2FnyCzzCbXu9JUnGsBnHG4SOrfbnukxcxpTplcAVFjr"},{"displayDate":"09/06/25","displayName":"ลukasz S","isVerified":false,"ratingId":"7dc00af0-0d3c-4f70-9080-2c6482151b67","ratingRange":"Rated 5/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 5 out of 5 stars","review":"\n\n\n\n\n\n\n\n\n\n\n\n\nGood\n\n\n\n","userAccountLink":"/profiles/RkbsJQIovuYyFnRS2bUWRHByHAACVQtlMtB4Fl2hnnCx6iQVSD9HvwuZZC6viXKFRXFlPuGGCvNFPaILkIZ2fY4FKxu9GiZLI9ySWNikyiWO"},{"displayDate":"09/06/25","displayName":"Fernando N","isVerified":false,"ratingId":"cf1c9119-24f9-4cfe-8e43-103aba7c899b","ratingRange":"Rated 5/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 5 out of 5 stars","review":"Essa segunda temporada estรก me surpreendendo positivamente, a quรญmica dos personagens estรฃo incrรญveis, cenas de aรงรฃo perfeitas e as participaรงรตes surpreendentes ","userAccountLink":"/profiles/0x6umbFAQuYLSnpiGgS6ji4bseeCaAuk8szYTdLIyyCk4izaioaIjns44CK1F1aFZeTDefvvCvwtkBhNPcNos0rhDpULQuzlf4xuwdu1NIg8"},{"displayDate":"09/07/25","displayName":"Shan V","isVerified":false,"ratingId":"6b5b496f-f34c-4a9f-84ae-68bed827c3fb","ratingRange":"Rated 0.5/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 0.5 out of 5 stars","review":"starting to introduce old characters like theyre somehow important to the DCU, thge comedy puts me off and reminds me of the beginnings of Marvel shows where they started out good then went to crap.","userAccountLink":"/profiles/MlqtDxizBCpKHPQFrQfbjuxWFXXCNxsz4CJAhAlHLLCVJi9dSMRHvaFQQCMjt6jiKDFBGIZZCMgfAnH8KslqtadHVRiZBHlBhmdIPxCNPuOJ"},{"displayDate":"09/05/25","displayName":"Zubair A","isVerified":false,"ratingId":"62b62ce6-5eb3-4a5a-a0b9-d94e47069a0d","ratingRange":"Rated 5/5 Stars &bull;&nbsp;","ratingRangeA11y":"Rated 5 out of 5 stars","review":"With Gunn at the helm, the mission continues: flawless action, killer music, and jokes that hit like a helmet-beam. Fabulous doesn't even cover it.","userAccountLink":"/profiles/kOBhdziqwfJjf9eSb0SxJIBpiDDCKPulVIpGcoGirrCZqiWgFNVI9NhggCXDFv9s18uKbIPPCKOHvNfRoFAwsbKtmwI90IwAuJ0FPZTWmT8y"}],"reviewCount":330,"reviewsUrl":"/tv/peacemaker_2022/s02/reviews?type=user","title":"Peacemaker &mdash; Season 2","viewMoreText":"View More (330)"}</script> 2436 + </media-audience-reviews-manager> 2437 + </section> 2438 + 2439 + 2440 + 2441 + <section aria-labelledby="rate-and-review-label" class="rate-and-review" data-adobe-id="rate-and-review" 2442 + data-qa="section:rate-and-review"> 2443 + <rate-and-review-module-manager> 2444 + <script data-json="rateAndReviewModule" 2445 + type="application/json">{"emsId":"76add34d-b98d-34b5-9e0f-2eac74d2ab10","releaseDate":"Sep 11, 2025","mediaType":"tvSeason","title":"Peacemaker &mdash; Season 2"}</script> 2446 + </rate-and-review-module-manager> 2447 + 2448 + <div class="header-wrap"> 2449 + <rt-text context="heading" size="0.75" 2450 + style="--textColor: #62686F; --letterSpacing: 1px; --textTransform: capitalize;"> 2451 + Peacemaker &mdash; Season 2 2452 + </rt-text> 2453 + <h2 class="unset" id="rate-and-review-label"> 2454 + <rt-text size="1.25" context="heading">My Rating</rt-text> 2455 + </h2> 2456 + </div> 2457 + 2458 + <div class="content"> 2459 + <rate-and-review-module data-RateAndReviewModuleManager="rateAndReviewModule" skeleton="panel" 2460 + status="unrated"> 2461 + <rating-stars-group data-RateAndReviewModuleManager="stars:changed" 2462 + data-RateAndReviewOverlayManager="moduleStars" aria-labelledby="ratingStarsLabel" is-selectable 2463 + size="2.75,2" slot="rating"> 2464 + </rating-stars-group> 2465 + <rating-descriptions context="label" data-RateAndReviewModuleManager="ratingDescriptions" size="1" 2466 + slot="description" hidden></rating-descriptions> 2467 + <drawer-more maxlines="2" slot="review-quote" status="closed"> 2468 + <rt-text data-RateAndReviewModuleManager="userReview" 2469 + data-RateAndReviewOverlayManager="moduleReview" size="0.875" slot="content"></rt-text> 2470 + <rt-link slot="ctaOpen" size="0.875" context="label">Read More</rt-link> 2471 + <rt-link slot="ctaClose" size="0.875" context="label">Read Less</rt-link> 2472 + </drawer-more> 2473 + 2474 + <rt-button data-RateAndReviewModuleManager="rateBtn:click" shape="pill" size="1" slot="cta-rate"> 2475 + POST RATING </rt-button> 2476 + <rt-button data-RateAndReviewModuleManager="writeReviewBtn:click" size="1" slot="cta-review" 2477 + theme="transparent"> WRITE A REVIEW </rt-button> 2478 + <rt-button data-RateAndReviewModuleManager="editReviewBtn:click" size="1" slot="cta-edit" 2479 + theme="transparent"> EDIT REVIEW </rt-button> 2480 + </rate-and-review-module> 2481 + </div> 2482 + 2483 + <rate-and-review-overlay-manager 2484 + data-RateAndReviewModuleManager="overlayManager:error,success"></rate-and-review-overlay-manager> 2485 + </section> 2486 + 2487 + 2488 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2489 + 2490 + <div id="cast-and-crew" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2491 + 2492 + 2493 + 2494 + <section aria-labelledby="cast-and-crew-label" class="cast-and-crew" data-adobe-id="cast-and-crew" 2495 + data-qa="section:cast-and-crew"> 2496 + <div class="header-wrap"> 2497 + <h2 class="unset" id="cast-and-crew-label"> 2498 + <rt-text size="1.25" context="heading" data-qa="title">Cast & Crew</rt-text> 2499 + </h2> 2500 + <rt-button arialabel="Cast and Crew" data-qa="view-all-link" 2501 + href="/tv/peacemaker_2022/s02/cast-and-crew" shape="pill" size="0.875" 2502 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2503 + theme="light"> 2504 + View All 2505 + </rt-button> 2506 + </div> 2507 + 2508 + <div class="content-wrap"> 2509 + 2510 + 2511 + <a href="/celebrity/john_cena" data-qa="person-item"> 2512 + <tile-dynamic skeleton="panel"> 2513 + <rt-img alt="John Cena thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2514 + src="https://resizing.flixster.com/qFr2ZK1qYDkqSmM5eT3nz_n6E_g=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/487578_v9_ba.jpg"></rt-img> 2515 + <div slot="insetText" aria-label="John Cena, Peacemaker"> 2516 + <p class="name" data-qa="person-name">John Cena</p> 2517 + <p class="role" data-qa="person-role">Peacemaker</p> 2518 + </div> 2519 + </tile-dynamic> 2520 + </a> 2521 + 2522 + <a href="/celebrity/danielle_brooks" data-qa="person-item"> 2523 + <tile-dynamic skeleton="panel"> 2524 + <rt-img alt="Danielle Brooks thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2525 + src="https://resizing.flixster.com/KhnY5vsfjM0vtw0cZL3aNxXbeUE=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/765589_v9_bc.jpg"></rt-img> 2526 + <div slot="insetText" aria-label="Danielle Brooks, Leota Adebayo"> 2527 + <p class="name" data-qa="person-name">Danielle Brooks</p> 2528 + <p class="role" data-qa="person-role">Leota Adebayo</p> 2529 + </div> 2530 + </tile-dynamic> 2531 + </a> 2532 + 2533 + <a href="/celebrity/freddie_stroma" data-qa="person-item"> 2534 + <tile-dynamic skeleton="panel"> 2535 + <rt-img alt="Freddie Stroma thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2536 + src="https://resizing.flixster.com/Yk2eiDCtamfmNlK-xMa7nmEw_Po=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/GNLZZGG00283ZZD.jpg"></rt-img> 2537 + <div slot="insetText" aria-label="Freddie Stroma, Vigilante"> 2538 + <p class="name" data-qa="person-name">Freddie Stroma</p> 2539 + <p class="role" data-qa="person-role">Vigilante</p> 2540 + </div> 2541 + </tile-dynamic> 2542 + </a> 2543 + 2544 + <a href="/celebrity/chukwudi_iwuji" data-qa="person-item"> 2545 + <tile-dynamic skeleton="panel"> 2546 + <rt-img alt="Chukwudi Iwuji thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2547 + src="https://resizing.flixster.com/uNAFlG9dNMjJwyMbPDiCsbjkX8I=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/565157_v9_ba.jpg"></rt-img> 2548 + <div slot="insetText" aria-label="Chukwudi Iwuji, Clemson Murn"> 2549 + <p class="name" data-qa="person-name">Chukwudi Iwuji</p> 2550 + <p class="role" data-qa="person-role">Clemson Murn</p> 2551 + </div> 2552 + </tile-dynamic> 2553 + </a> 2554 + 2555 + <a href="/celebrity/jennifer_holland" data-qa="person-item"> 2556 + <tile-dynamic skeleton="panel"> 2557 + <rt-img alt="Jennifer Holland thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2558 + src="https://resizing.flixster.com/-xeYAf0O7fGIQHRx_YkL7vnaMMg=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/331642_v9_bb.jpg"></rt-img> 2559 + <div slot="insetText" aria-label="Jennifer Holland, Emilia Harcourt"> 2560 + <p class="name" data-qa="person-name">Jennifer Holland</p> 2561 + <p class="role" data-qa="person-role">Emilia Harcourt</p> 2562 + </div> 2563 + </tile-dynamic> 2564 + </a> 2565 + 2566 + <a href="/celebrity/steve_agee" data-qa="person-item"> 2567 + <tile-dynamic skeleton="panel"> 2568 + <rt-img alt="Steve Agee thumbnail image" aria-hidden="true" loading="lazy" slot="image" 2569 + src="https://resizing.flixster.com/YprPSg0SXNIqq-Wy4UEz4ovBnOw=/100x120/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/223358_v9_bd.jpg"></rt-img> 2570 + <div slot="insetText" aria-label="Steve Agee, John Economos"> 2571 + <p class="name" data-qa="person-name">Steve Agee</p> 2572 + <p class="role" data-qa="person-role">John Economos</p> 2573 + </div> 2574 + </tile-dynamic> 2575 + </a> 2576 + 2577 + </div> 2578 + 2579 + </section> 2580 + 2581 + </div> 2582 + 2583 + 2584 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2585 + 2586 + <div id="episodes" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2587 + 2588 + 2589 + 2590 + 2591 + <section aria-labelledby="episodes-label" class="episodes" data-adobe-id="episodes" 2592 + data-qa="section:episodes"> 2593 + <div class="header-wrap"> 2594 + <h2 class="unset" id="episodes-label"> 2595 + <rt-text size="1.25" context="heading" data-qa="title">Episodes</rt-text> 2596 + </h2> 2597 + </div> 2598 + 2599 + <div class="content-wrap"> 2600 + <carousel-slider tile-width="240px" skeleton="panel" data-qa="carousel"> 2601 + 2602 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e01" skeleton="panel" 2603 + data-qa="episode-tile"> 2604 + <rt-img 2605 + src="https://resizing.flixster.com/ADuuwJmNs1LzDj9ZWi3mBkG5mHA=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317941_e_h10_aa.jpg" 2606 + alt="Episode 1 video still" slot="image" aria-hidden="true"></rt-img> 2607 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 1</rt-text> 2608 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Aired Aug 21, 2025</rt-text> 2609 + <rt-text size="1" context="label" slot="title" data-qa="episode-title">The Ties That 2610 + Grind</rt-text> 2611 + <rt-text size="0.875" slot="description" data-qa="episode-description">While Peacemaker attempts 2612 + to join the Justice Gang, Harcourt struggles to find work, and Economos takes on a challenging 2613 + new assignment.</rt-text> 2614 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2615 + Details <rt-icon icon="right-chevron"></rt-icon> 2616 + </rt-text> 2617 + </tile-episode> 2618 + 2619 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e02" skeleton="panel" 2620 + data-qa="episode-tile"> 2621 + <rt-img 2622 + src="https://resizing.flixster.com/6rSe6JCrjz0NuuMSQfEO3pCsr40=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317945_e_h8_aa.jpg" 2623 + alt="Episode 2 video still" slot="image" aria-hidden="true"></rt-img> 2624 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 2</rt-text> 2625 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Aired Aug 28, 2025</rt-text> 2626 + <rt-text size="1" context="label" slot="title" data-qa="episode-title">A Man Is Only as Good as 2627 + His Bird</rt-text> 2628 + <rt-text size="0.875" slot="description" data-qa="episode-description">As Economos clashes with 2629 + his new handler, Peacemaker must deal with the consequences of his actions in the alternate 2630 + dimension.</rt-text> 2631 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2632 + Details <rt-icon icon="right-chevron"></rt-icon> 2633 + </rt-text> 2634 + </tile-episode> 2635 + 2636 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e03" skeleton="panel" 2637 + data-qa="episode-tile"> 2638 + <rt-img 2639 + src="https://resizing.flixster.com/sNxCjYecSXn3aStn3ym5vaqmXDI=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg" 2640 + alt="Episode 3 video still" slot="image" aria-hidden="true"></rt-img> 2641 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 3</rt-text> 2642 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Aired Sep 4, 2025</rt-text> 2643 + <rt-text size="1" context="label" slot="title" data-qa="episode-title">Another Rick Up My 2644 + Sleeve</rt-text> 2645 + <rt-text size="0.875" slot="description" data-qa="episode-description">A man fights for peace at 2646 + any cost, no matter how many people he has to kill to get it.</rt-text> 2647 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2648 + Details <rt-icon icon="right-chevron"></rt-icon> 2649 + </rt-text> 2650 + </tile-episode> 2651 + 2652 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e04" skeleton="panel" 2653 + data-qa="episode-tile"> 2654 + <rt-img 2655 + src="https://resizing.flixster.com/sNxCjYecSXn3aStn3ym5vaqmXDI=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg" 2656 + alt="Episode 4 video still" slot="image" aria-hidden="true"></rt-img> 2657 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 4</rt-text> 2658 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Airs Thu Sep 11</rt-text> 2659 + <rt-text size="1" context="label" slot="title" data-qa="episode-title">Need I Say Door</rt-text> 2660 + <rt-text size="0.875" slot="description" data-qa="episode-description">A man fights for peace at 2661 + any cost, no matter how many people he has to kill to get it.</rt-text> 2662 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2663 + Details <rt-icon icon="right-chevron"></rt-icon> 2664 + </rt-text> 2665 + </tile-episode> 2666 + 2667 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e05" skeleton="panel" 2668 + data-qa="episode-tile"> 2669 + <rt-img 2670 + src="https://resizing.flixster.com/sNxCjYecSXn3aStn3ym5vaqmXDI=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg" 2671 + alt="Episode 5 video still" slot="image" aria-hidden="true"></rt-img> 2672 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 5</rt-text> 2673 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Airs Thu Sep 18</rt-text> 2674 + <rt-text size="1" context="label" slot="title" data-qa="episode-title">Back to the 2675 + Suture</rt-text> 2676 + <rt-text size="0.875" slot="description" data-qa="episode-description">A man fights for peace at 2677 + any cost, no matter how many people he has to kill to get it.</rt-text> 2678 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2679 + Details <rt-icon icon="right-chevron"></rt-icon> 2680 + </rt-text> 2681 + </tile-episode> 2682 + 2683 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e06" skeleton="panel" 2684 + data-qa="episode-tile"> 2685 + <rt-img 2686 + src="https://resizing.flixster.com/sNxCjYecSXn3aStn3ym5vaqmXDI=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg" 2687 + alt="Episode 6 video still" slot="image" aria-hidden="true"></rt-img> 2688 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 6</rt-text> 2689 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Airs Thu Sep 25</rt-text> 2690 + <rt-text size="1" context="label" slot="title" data-qa="episode-title">Ignorance is 2691 + Chris</rt-text> 2692 + <rt-text size="0.875" slot="description" data-qa="episode-description">A man fights for peace at 2693 + any cost, no matter how many people he has to kill to get it.</rt-text> 2694 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2695 + Details <rt-icon icon="right-chevron"></rt-icon> 2696 + </rt-text> 2697 + </tile-episode> 2698 + 2699 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e07" skeleton="panel" 2700 + data-qa="episode-tile"> 2701 + <rt-img 2702 + src="https://resizing.flixster.com/sNxCjYecSXn3aStn3ym5vaqmXDI=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg" 2703 + alt="Episode 7 video still" slot="image" aria-hidden="true"></rt-img> 2704 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 7</rt-text> 2705 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Airs Thu Oct 2</rt-text> 2706 + <rt-text size="1" context="label" slot="title" data-qa="episode-title"></rt-text> 2707 + <rt-text size="0.875" slot="description" data-qa="episode-description">A man fights for peace at 2708 + any cost, no matter how many people he has to kill to get it.</rt-text> 2709 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2710 + Details <rt-icon icon="right-chevron"></rt-icon> 2711 + </rt-text> 2712 + </tile-episode> 2713 + 2714 + <tile-episode slot="tile" href="/tv/peacemaker_2022/s02/e08" skeleton="panel" 2715 + data-qa="episode-tile"> 2716 + <rt-img 2717 + src="https://resizing.flixster.com/sNxCjYecSXn3aStn3ym5vaqmXDI=/370x208/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg" 2718 + alt="Episode 8 video still" slot="image" aria-hidden="true"></rt-img> 2719 + <rt-text size="0.75" context="label" slot="episode" data-qa="episode-label">Episode 8</rt-text> 2720 + <rt-text size="0.75" slot="airDate" data-qa="episode-air-date">Airs Thu Oct 9</rt-text> 2721 + <rt-text size="1" context="label" slot="title" data-qa="episode-title"></rt-text> 2722 + <rt-text size="0.875" slot="description" data-qa="episode-description">A man fights for peace at 2723 + any cost, no matter how many people he has to kill to get it.</rt-text> 2724 + <rt-text size="0.875" context="label" slot="details" data-qa="episode-details"> 2725 + Details <rt-icon icon="right-chevron"></rt-icon> 2726 + </rt-text> 2727 + </tile-episode> 2728 + 2729 + </carousel-slider> 2730 + </div> 2731 + </section> 2732 + 2733 + </div> 2734 + 2735 + 2736 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2737 + 2738 + <div id="more-like-this" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2739 + 2740 + 2741 + 2742 + <section aria-labelledby="more-like-this-label" class="more-like-this" data-adobe-id="more-like-this" 2743 + data-qa="section:more-like-this"> 2744 + <div class="header-wrap"> 2745 + <div class="link-wrap"> 2746 + <h3 class="unset" id="more-like-this-label"> 2747 + <rt-text size="1.25" context="heading"> 2748 + More Like This 2749 + </rt-text> 2750 + </h3> 2751 + <rt-button arialabel="Popular TV on Streaming" data-qa="view-all-link" 2752 + href="/browse/tv_series_browse/sort:popular" shape="pill" size="0.875" 2753 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2754 + theme="light"> 2755 + View All 2756 + </rt-button> 2757 + </div> 2758 + </div> 2759 + 2760 + <div class="content-wrap"> 2761 + <carousel-slider skeleton="panel" tile-width="140px" gap="15px"> 2762 + 2763 + <tile-poster-card slot="tile"> 2764 + <rt-link slot="primaryImage" href="/tv/twisted_metal" tabindex="-1"> 2765 + <sr-text>Twisted Metal</sr-text> 2766 + <rt-img loading="" 2767 + src="https://resizing.flixster.com/MtyzaFnLaDY2B3SeRCOm91EwADE=/206x305/v2/https://resizing.flixster.com/mAAW4s6Bzl9wVHeH6GYXImTQFYY=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvNWNlYzRjODUtYzU0OS00NzJhLTk5NmQtOTgwOTg1MTlkYWJjLmpwZw==" 2768 + alt="Twisted Metal poster"></rt-img> 2769 + </rt-link> 2770 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2771 + verticalalign="sub"></score-icon-critics> 2772 + <rt-text slot="criticsScore" size="0.9" context="label"> 2773 + 79% 2774 + </rt-text> 2775 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2776 + slot="audienceIcon"></score-icon-audience> 2777 + <rt-text slot="audienceScore" size="0.9" context="label"> 2778 + 88% 2779 + </rt-text> 2780 + <rt-link slot="title" href="/tv/twisted_metal" size="0.85" context="label"> 2781 + Twisted Metal 2782 + </rt-link> 2783 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2784 + emsid="80499e3c-a069-3e48-9d23-5b72d9f58079" mediatype="TvSeries" mediatitle="Twisted Metal" 2785 + slot="watchlistButton" state="unchecked"> 2786 + <span slot="text">Watchlist</span> 2787 + </watchlist-button> 2788 + 2789 + <rt-button data-content-type="PROMO" data-disable-ads="" 2790 + data-ems-id="80499e3c-a069-3e48-9d23-5b72d9f58079" data-mpx-id="2438157891760" 2791 + data-position="1" data-public-id="sGoBrIyuO6Gy" data-title="Twisted Metal: Season 2 Trailer" 2792 + data-track="poster" data-type="TvSeries" data-VideoPlayerOverlayManager="btnVideo:click" 2793 + data-video-list="" slot="trailerButton" size="0.875" theme="transparent"> 2794 + <rt-icon icon="play"></rt-icon> 2795 + <span>TRAILER</span> 2796 + <sr-text> for Twisted Metal</sr-text> 2797 + </rt-button> 2798 + 2799 + </tile-poster-card> 2800 + 2801 + <tile-poster-card slot="tile"> 2802 + <rt-link slot="primaryImage" href="/tv/comrade_detective" tabindex="-1"> 2803 + <sr-text>Comrade Detective</sr-text> 2804 + <rt-img loading="" 2805 + src="https://resizing.flixster.com/L44TL1O_i8N47QRPZ1DpAjipU78=/206x305/v2/https://resizing.flixster.com/sUXscZBjGl80M7C8wEX9qISu3Ls=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvUlRUVjI1OTA1OC53ZWJw" 2806 + alt="Comrade Detective poster"></rt-img> 2807 + </rt-link> 2808 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2809 + verticalalign="sub"></score-icon-critics> 2810 + <rt-text slot="criticsScore" size="0.9" context="label"> 2811 + 85% 2812 + </rt-text> 2813 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2814 + slot="audienceIcon"></score-icon-audience> 2815 + <rt-text slot="audienceScore" size="0.9" context="label"> 2816 + 88% 2817 + </rt-text> 2818 + <rt-link slot="title" href="/tv/comrade_detective" size="0.85" context="label"> 2819 + Comrade Detective 2820 + </rt-link> 2821 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2822 + emsid="bcb4d43d-3dbc-3da9-8051-51454a471ea1" mediatype="TvSeries" 2823 + mediatitle="Comrade Detective" slot="watchlistButton" state="unchecked"> 2824 + <span slot="text">Watchlist</span> 2825 + </watchlist-button> 2826 + 2827 + </tile-poster-card> 2828 + 2829 + <tile-poster-card slot="tile"> 2830 + <rt-link slot="primaryImage" href="/tv/saul_of_the_mole_men" tabindex="-1"> 2831 + <sr-text>Saul of the Mole Men</sr-text> 2832 + <rt-img loading="" 2833 + src="https://resizing.flixster.com/vvIDMwPetdv8iLBHM9DCici60ag=/206x305/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p284327_b_v8_ab.jpg" 2834 + alt="Saul of the Mole Men poster"></rt-img> 2835 + </rt-link> 2836 + <score-icon-critics certified="false" sentiment="NEGATIVE" size="1" slot="criticsIcon" 2837 + verticalalign="sub"></score-icon-critics> 2838 + <rt-text slot="criticsScore" size="0.9" context="label"> 2839 + 17% 2840 + </rt-text> 2841 + <score-icon-audience certified="false" sentiment="" size="1" 2842 + slot="audienceIcon"></score-icon-audience> 2843 + <rt-text slot="audienceScore" size="0.9" context="label"> 2844 + % 2845 + </rt-text> 2846 + <rt-link slot="title" href="/tv/saul_of_the_mole_men" size="0.85" context="label"> 2847 + Saul of the Mole Men 2848 + </rt-link> 2849 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2850 + emsid="19f88158-8f52-3e02-b11e-89f20b21eb4e" mediatype="TvSeries" 2851 + mediatitle="Saul of the Mole Men" slot="watchlistButton" state="unchecked"> 2852 + <span slot="text">Watchlist</span> 2853 + </watchlist-button> 2854 + 2855 + </tile-poster-card> 2856 + 2857 + <tile-poster-card slot="tile"> 2858 + <rt-link slot="primaryImage" href="/tv/somebody_somewhere" tabindex="-1"> 2859 + <sr-text>Somebody Somewhere</sr-text> 2860 + <rt-img loading="" 2861 + src="https://resizing.flixster.com/TJvPpdNIt4ic6QlG5Kwgkf80PZo=/206x305/v2/https://resizing.flixster.com/v8tcpv_dwS6GbygTvvUXubTn9_w=/ems.cHJkLWVtcy1hc3NldHMvdHZzZXJpZXMvNTNiNTUwMzUtMzQyNi00NGM3LTkzNTgtMjU0NzU2MGU4NmE4LmpwZw==" 2862 + alt="Somebody Somewhere poster"></rt-img> 2863 + </rt-link> 2864 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2865 + verticalalign="sub"></score-icon-critics> 2866 + <rt-text slot="criticsScore" size="0.9" context="label"> 2867 + 100% 2868 + </rt-text> 2869 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2870 + slot="audienceIcon"></score-icon-audience> 2871 + <rt-text slot="audienceScore" size="0.9" context="label"> 2872 + 93% 2873 + </rt-text> 2874 + <rt-link slot="title" href="/tv/somebody_somewhere" size="0.85" context="label"> 2875 + Somebody Somewhere 2876 + </rt-link> 2877 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2878 + emsid="5cddaabc-0c8d-3e41-b44b-c44487f54cc9" mediatype="TvSeries" 2879 + mediatitle="Somebody Somewhere" slot="watchlistButton" state="unchecked"> 2880 + <span slot="text">Watchlist</span> 2881 + </watchlist-button> 2882 + 2883 + <rt-button data-content-type="PROMO" data-disable-ads="" 2884 + data-ems-id="5cddaabc-0c8d-3e41-b44b-c44487f54cc9" data-mpx-id="2378416707669" 2885 + data-position="4" data-public-id="wnDPGb8gSEC7" 2886 + data-title="Somebody Somewhere: Season 3 Trailer" data-track="poster" data-type="TvSeries" 2887 + data-VideoPlayerOverlayManager="btnVideo:click" data-video-list="" slot="trailerButton" 2888 + size="0.875" theme="transparent"> 2889 + <rt-icon icon="play"></rt-icon> 2890 + <span>TRAILER</span> 2891 + <sr-text> for Somebody Somewhere</sr-text> 2892 + </rt-button> 2893 + 2894 + </tile-poster-card> 2895 + 2896 + <tile-poster-card slot="tile"> 2897 + <rt-link slot="primaryImage" href="/tv/south_side" tabindex="-1"> 2898 + <sr-text>South Side</sr-text> 2899 + <rt-img loading="" src="none" alt="South Side poster"></rt-img> 2900 + </rt-link> 2901 + <score-icon-critics certified="false" sentiment="POSITIVE" size="1" slot="criticsIcon" 2902 + verticalalign="sub"></score-icon-critics> 2903 + <rt-text slot="criticsScore" size="0.9" context="label"> 2904 + 100% 2905 + </rt-text> 2906 + <score-icon-audience certified="false" sentiment="POSITIVE" size="1" 2907 + slot="audienceIcon"></score-icon-audience> 2908 + <rt-text slot="audienceScore" size="0.9" context="label"> 2909 + 92% 2910 + </rt-text> 2911 + <rt-link slot="title" href="/tv/south_side" size="0.85" context="label"> 2912 + South Side 2913 + </rt-link> 2914 + <watchlist-button data-WatchlistButtonManager="watchlistButton:click" 2915 + emsid="6942346f-6675-39af-945a-1c6c6d526cef" mediatype="TvSeries" mediatitle="South Side" 2916 + slot="watchlistButton" state="unchecked"> 2917 + <span slot="text">Watchlist</span> 2918 + </watchlist-button> 2919 + 2920 + <rt-button data-content-type="PROMO" data-disable-ads="" 2921 + data-ems-id="6942346f-6675-39af-945a-1c6c6d526cef" data-mpx-id="2130332739528" 2922 + data-position="5" data-public-id="RFlaFZLoP7L5" data-title="South Side: Season 3 Trailer" 2923 + data-track="poster" data-type="TvSeries" data-VideoPlayerOverlayManager="btnVideo:click" 2924 + data-video-list="" slot="trailerButton" size="0.875" theme="transparent"> 2925 + <rt-icon icon="play"></rt-icon> 2926 + <span>TRAILER</span> 2927 + <sr-text> for South Side</sr-text> 2928 + </rt-button> 2929 + 2930 + </tile-poster-card> 2931 + 2932 + 2933 + <tile-poster-card skeleton="panel" slot="tile" tabindex="-1"> 2934 + <tile-view-more aspect="posterCard" background="collage" slot="primaryImage"> 2935 + </tile-view-more> 2936 + <rt-text slot="title" size="0.85" context="label">Discover more movies and TV shows.</rt-text> 2937 + <rt-button href="/browse/tv_series_browse/sort:popular" slot="watchlistButton" shape="pill" 2938 + size="0.875" theme="transparent-darktext" aria-label="View More Popular TV on Streaming"> 2939 + View More 2940 + </rt-button> 2941 + </tile-poster-card> 2942 + </carousel-slider> 2943 + </div> 2944 + </section> 2945 + 2946 + </div> 2947 + 2948 + 2949 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 2950 + 2951 + <div id="news-and-guides" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 2952 + 2953 + 2954 + 2955 + <section aria-labelledby="news-and-guides-label" class="news-and-guides" data-adobe-id="news-and-guides" 2956 + data-qa="section:news-and-guides"> 2957 + <div class="header-wrap"> 2958 + <div class="link-wrap"> 2959 + <h2 class="unset" id="news-and-guides-label"> 2960 + <rt-text size="1.25" style="--textTransform: capitalize;" context="heading" 2961 + data-qa="title">Related TV News</rt-text> 2962 + </h2> 2963 + <rt-button arialabel="Related TV News" data-qa="view-all-link" 2964 + href="https://editorial.rottentomatoes.com/more-related-content/?relatedtvseasonid=76add34d-b98d-34b5-9e0f-2eac74d2ab10" 2965 + shape="pill" size="0.875" 2966 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 2967 + theme="light"> 2968 + View All 2969 + </rt-button> 2970 + </div> 2971 + </div> 2972 + 2973 + <div class="content-wrap"> 2974 + <carousel-slider tile-width="80%,240px" skeleton="panel" data-qa="carousel"> 2975 + 2976 + <a slot="tile" 2977 + href="https://editorial.rottentomatoes.com/article/what-to-expect-in-peacemaker-season-2/" 2978 + data-qa="article"> 2979 + <tile-dynamic orientation="landscape" skeleton="panel"> 2980 + <rt-img slot="image" 2981 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Peacemaker_S2_Preview-Rep.jpg" 2982 + loading="lazy"></rt-img> 2983 + <drawer-more slot="caption" maxlines="2" status="closed"> 2984 + <rt-text slot="content" size="1" context="label" data-qa="article-title">What To Expect In 2985 + <em>Peacemaker</em>: Season 2</rt-text> 2986 + </drawer-more> 2987 + </tile-dynamic> 2988 + </a> 2989 + 2990 + <a slot="tile" 2991 + href="https://editorial.rottentomatoes.com/article/peacemaker-season-2-first-reviews/" 2992 + data-qa="article"> 2993 + <tile-dynamic orientation="landscape" skeleton="panel"> 2994 + <rt-img slot="image" 2995 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/08/Peacemaker_S2_Reviews-Rep.jpg" 2996 + loading="lazy"></rt-img> 2997 + <drawer-more slot="caption" maxlines="2" status="closed"> 2998 + <rt-text slot="content" size="1" context="label" 2999 + data-qa="article-title"><em>Peacemaker</em>: Season 2 First Reviews: Even Better Than the 3000 + First Season</rt-text> 3001 + </drawer-more> 3002 + </tile-dynamic> 3003 + </a> 3004 + 3005 + <a slot="tile" 3006 + href="https://editorial.rottentomatoes.com/article/6-tv-and-streaming-shows-you-should-binge-watch-in-august-2025/" 3007 + data-qa="article"> 3008 + <tile-dynamic orientation="landscape" skeleton="panel"> 3009 + <rt-img slot="image" 3010 + src="https://editorial.rottentomatoes.com/wp-content/uploads/2025/07/600KingOfTheHill.jpg" 3011 + loading="lazy"></rt-img> 3012 + <drawer-more slot="caption" maxlines="2" status="closed"> 3013 + <rt-text slot="content" size="1" context="label" data-qa="article-title">6 TV and Streaming 3014 + Shows You Should Binge-Watch in August</rt-text> 3015 + </drawer-more> 3016 + </tile-dynamic> 3017 + </a> 3018 + 3019 + </carousel-slider> 3020 + </div> 3021 + </section> 3022 + 3023 + </div> 3024 + 3025 + 3026 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 3027 + 3028 + <div id="videos" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 3029 + 3030 + 3031 + 3032 + <section aria-labelledby="videos-carousel-label" class="videos-carousel" data-adobe-id="videos-carousel" 3033 + data-qa="section:videos-carousel"> 3034 + <div class="header-wrap"> 3035 + <div class="link-wrap"> 3036 + <h2 class="unset" data-qa="videos-section-title" id="videos-carousel-label"> 3037 + <rt-text size="1.25" context="heading">Videos</rt-text> 3038 + </h2> 3039 + <rt-button arialabel=" videos" data-qa="videos-view-all-link" 3040 + href="/tv/peacemaker_2022/s02/videos" shape="pill" size="0.875" 3041 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 3042 + theme="light"> 3043 + View All 3044 + </rt-button> 3045 + </div> 3046 + <h3 class="unset"> 3047 + <rt-text context="heading" size="0.75" 3048 + style="--letterSpacing: 1px; --textColor: var(--grayDark4); --textTransform: capitalize;"> 3049 + Peacemaker &mdash; Season 2 3050 + </rt-text> 3051 + </h3> 3052 + </div> 3053 + 3054 + <carousel-slider tile-width="80%,240px" data-VideosCarouselManager="carousel" skeleton="panel" 3055 + data-qa="videos-carousel"> 3056 + 3057 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3058 + <rt-img slot="image" fallbacktheme="iconic" loading="" 3059 + src="https://resizing.flixster.com/VXMtl5AJHPunHrflqzrZ6NFP9Pg=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/590/227/thumb_35B8F85D-E0B5-42E6-983D-064D4B953DB2.jpg" 3060 + alt="Setting up the DCU in &#39;Peacemaker&#39; Season 2"></rt-img> 3061 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3062 + data-mpx-id="2447675459785" data-public-id="P47wMJdbExRa" data-type="TvSeason" 3063 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3064 + data-qa="video-trailer-play-btn"> 3065 + <span class="sr-only">Setting up the DCU in &#39;Peacemaker&#39; Season 2</span> 3066 + </rt-button> 3067 + 3068 + <drawer-more slot="caption" maxlines="2" status="closed"> 3069 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Setting up the DCU 3070 + in &#39;Peacemaker&#39; Season 2</rt-text> 3071 + </drawer-more> 3072 + 3073 + <rt-badge slot="imageInsetLabel" theme="gray"> 3074 + 1:06 3075 + </rt-badge> 3076 + </tile-video> 3077 + 3078 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3079 + <rt-img slot="image" fallbacktheme="iconic" loading="" 3080 + src="https://resizing.flixster.com/Q9pHL0plKwChI7M2x8OIXc4tTmY=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/166/403/thumb_47CFBBB8-95A3-4634-8B02-581F2C757D98.jpg" 3081 + alt="Peacemaker: Season 2 Trailer - Weeks Ahead"></rt-img> 3082 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3083 + data-mpx-id="2447231043621" data-public-id="nTePljVEct61" data-type="TvSeason" 3084 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3085 + data-qa="video-trailer-play-btn"> 3086 + <span class="sr-only">Peacemaker: Season 2 Trailer - Weeks Ahead</span> 3087 + </rt-button> 3088 + 3089 + <drawer-more slot="caption" maxlines="2" status="closed"> 3090 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 3091 + Trailer - Weeks Ahead</rt-text> 3092 + </drawer-more> 3093 + 3094 + <rt-badge slot="imageInsetLabel" theme="gray"> 3095 + 1:39 3096 + </rt-badge> 3097 + </tile-video> 3098 + 3099 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3100 + <rt-img slot="image" fallbacktheme="iconic" loading="" 3101 + src="https://resizing.flixster.com/xwQEohhLNSYlXEPpuV8X_yi_hwc=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/206/519/thumb_2CDEC1BA-4D54-4C43-B824-2101B8C0A29D.jpg" 3102 + alt="Peacemaker: Season 2 Opening Title Sequence"></rt-img> 3103 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3104 + data-mpx-id="2446199363799" data-public-id="evKz2_ikqufb" data-type="TvSeason" 3105 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3106 + data-qa="video-trailer-play-btn"> 3107 + <span class="sr-only">Peacemaker: Season 2 Opening Title Sequence</span> 3108 + </rt-button> 3109 + 3110 + <drawer-more slot="caption" maxlines="2" status="closed"> 3111 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 3112 + Opening Title Sequence</rt-text> 3113 + </drawer-more> 3114 + 3115 + <rt-badge slot="imageInsetLabel" theme="gray"> 3116 + 1:44 3117 + </rt-badge> 3118 + </tile-video> 3119 + 3120 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3121 + <rt-img slot="image" fallbacktheme="iconic" loading="" 3122 + src="https://resizing.flixster.com/Xzrp5pHl-edpsJO7vPi4qyvliTE=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/20/983/thumb_4C16B48F-A4A5-4574-BA92-74DDB42BA687.jpg" 3123 + alt="James Gunn on Setting Up the DCU in &#39;Peacemaker&#39; Season 2"></rt-img> 3124 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3125 + data-mpx-id="2446004803886" data-public-id="TkqRtSTVgnbQ" data-type="TvSeason" 3126 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3127 + data-qa="video-trailer-play-btn"> 3128 + <span class="sr-only">James Gunn on Setting Up the DCU in &#39;Peacemaker&#39; Season 2</span> 3129 + </rt-button> 3130 + 3131 + <drawer-more slot="caption" maxlines="2" status="closed"> 3132 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">James Gunn on 3133 + Setting Up the DCU in &#39;Peacemaker&#39; Season 2</rt-text> 3134 + </drawer-more> 3135 + 3136 + <rt-badge slot="imageInsetLabel" theme="gray"> 3137 + 6:22 3138 + </rt-badge> 3139 + </tile-video> 3140 + 3141 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3142 + <rt-img slot="image" fallbacktheme="iconic" loading="" 3143 + src="https://resizing.flixster.com/uHrBotX26H8cgnZBr_y9pQrDfik=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/959/599/thumb_AE4DD3A1-45A3-463E-8C12-F066951D541A.jpg" 3144 + alt="Peacemaker: Season 2 Red Band Trailer"></rt-img> 3145 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3146 + data-mpx-id="2444841539922" data-public-id="LulHILmxo0GT" data-type="TvSeason" 3147 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3148 + data-qa="video-trailer-play-btn"> 3149 + <span class="sr-only">Peacemaker: Season 2 Red Band Trailer</span> 3150 + </rt-button> 3151 + 3152 + <drawer-more slot="caption" maxlines="2" status="closed"> 3153 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Peacemaker: Season 2 3154 + Red Band Trailer</rt-text> 3155 + </drawer-more> 3156 + 3157 + <rt-badge slot="imageInsetLabel" theme="gray"> 3158 + 1:50 3159 + </rt-badge> 3160 + </tile-video> 3161 + 3162 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3163 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3164 + src="https://resizing.flixster.com/RMadHxyLW7kRTN9v-8qX6O1J1Xc=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/232/199/thumb_2df88d50-6d52-11f0-94b5-022bbbb30d69.jpg" 3165 + alt="&quot;The Action is RAW&quot; in Peacemaker"></rt-img> 3166 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3167 + data-mpx-id="2441931331754" data-public-id="oIlPPGDZ6QFL" data-type="TvSeason" 3168 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3169 + data-qa="video-trailer-play-btn"> 3170 + <span class="sr-only">&quot;The Action is RAW&quot; in Peacemaker</span> 3171 + </rt-button> 3172 + 3173 + <drawer-more slot="caption" maxlines="2" status="closed"> 3174 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">&quot;The Action is 3175 + RAW&quot; in Peacemaker</rt-text> 3176 + </drawer-more> 3177 + 3178 + <rt-badge slot="imageInsetLabel" theme="gray"> 3179 + 0:40 3180 + </rt-badge> 3181 + </tile-video> 3182 + 3183 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3184 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3185 + src="https://resizing.flixster.com/dMSMK3JXt3jKxRn8NrBPVCF1PAA=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/231/222/thumb_43a9e00b-6d51-11f0-94b5-022bbbb30d69.jpg" 3186 + alt="Who is the Best Dancer of the Peacemaker Cast?"></rt-img> 3187 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3188 + data-mpx-id="2441930307547" data-public-id="UoDWEtXCKY3z" data-type="TvSeason" 3189 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3190 + data-qa="video-trailer-play-btn"> 3191 + <span class="sr-only">Who is the Best Dancer of the Peacemaker Cast?</span> 3192 + </rt-button> 3193 + 3194 + <drawer-more slot="caption" maxlines="2" status="closed"> 3195 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Who is the Best 3196 + Dancer of the Peacemaker Cast?</rt-text> 3197 + </drawer-more> 3198 + 3199 + <rt-badge slot="imageInsetLabel" theme="gray"> 3200 + 0:37 3201 + </rt-badge> 3202 + </tile-video> 3203 + 3204 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3205 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3206 + src="https://resizing.flixster.com/fGPwOoH4zfWppKW5ek_DOu19_Xs=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/228/795/thumb_49a4c021-6d50-11f0-94b5-022bbbb30d69.jpg" 3207 + alt="The Peacemaker Cast Chaotically Answering Questions at Comic-Con"></rt-img> 3208 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3209 + data-mpx-id="2441927747862" data-public-id="Hrjp79IuY8Xc" data-type="TvSeason" 3210 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3211 + data-qa="video-trailer-play-btn"> 3212 + <span class="sr-only">The Peacemaker Cast Chaotically Answering Questions at Comic-Con</span> 3213 + </rt-button> 3214 + 3215 + <drawer-more slot="caption" maxlines="2" status="closed"> 3216 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">The Peacemaker Cast 3217 + Chaotically Answering Questions at Comic-Con</rt-text> 3218 + </drawer-more> 3219 + 3220 + <rt-badge slot="imageInsetLabel" theme="gray"> 3221 + 0:35 3222 + </rt-badge> 3223 + </tile-video> 3224 + 3225 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3226 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3227 + src="https://resizing.flixster.com/7QkPu9-3aC8vNURefGfPXhs_aos=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/225/367/thumb_64f2bff7-6cd6-11f0-94b5-022bbbb30d69.jpg" 3228 + alt="Which Peacemaker Cast Trains the Most?"></rt-img> 3229 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3230 + data-mpx-id="2441924163802" data-public-id="p6gq9KoxjIy3" data-type="TvSeason" 3231 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3232 + data-qa="video-trailer-play-btn"> 3233 + <span class="sr-only">Which Peacemaker Cast Trains the Most?</span> 3234 + </rt-button> 3235 + 3236 + <drawer-more slot="caption" maxlines="2" status="closed"> 3237 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">Which Peacemaker 3238 + Cast Trains the Most?</rt-text> 3239 + </drawer-more> 3240 + 3241 + <rt-badge slot="imageInsetLabel" theme="gray"> 3242 + 1:03 3243 + </rt-badge> 3244 + </tile-video> 3245 + 3246 + <tile-video skeleton="panel" slot="tile" data-qa="video-item"> 3247 + <rt-img slot="image" fallbacktheme="iconic" loading="lazy" 3248 + src="https://resizing.flixster.com/RAosXaJ6r3usacVXZxPcQnljAq8=/270x160/v2/https://statcdn.fandango.com/MPX/image/NBCU_Fandango/722/515/thumb_272BCC1C-0440-4916-A769-AFCD1706047D.jpg" 3249 + alt="John Cena on His Superman CAMEO"></rt-img> 3250 + <rt-button theme="transparent" data-ems-id="76add34d-b98d-34b5-9e0f-2eac74d2ab10" 3251 + data-mpx-id="2441371715987" data-public-id="OE0x6E5VPuGQ" data-type="TvSeason" 3252 + data-VideoPlayerOverlayManager="btnVideo:click" slot="imageAction" 3253 + data-qa="video-trailer-play-btn"> 3254 + <span class="sr-only">John Cena on His Superman CAMEO</span> 3255 + </rt-button> 3256 + 3257 + <drawer-more slot="caption" maxlines="2" status="closed"> 3258 + <rt-text slot="content" size="1" context="label" data-qa="video-item-title">John Cena on His 3259 + Superman CAMEO</rt-text> 3260 + </drawer-more> 3261 + 3262 + <rt-badge slot="imageInsetLabel" theme="gray"> 3263 + 0:39 3264 + </rt-badge> 3265 + </tile-video> 3266 + 3267 + <tile-view-more aspect="landscape" background="mediaHero" slot="tile"> 3268 + <rt-button href="/tv/peacemaker_2022/s02/videos" shape="pill" theme="transparent-lighttext"> 3269 + View more videos 3270 + </rt-button> 3271 + </tile-view-more> 3272 + </carousel-slider> 3273 + </section> 3274 + 3275 + </div> 3276 + 3277 + 3278 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 3279 + 3280 + <div id="photos" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 3281 + 3282 + 3283 + 3284 + <section aria-labelledby="photos-carousel-label" class="photos-carousel" data-adobe-id="photos-carousel" 3285 + data-qa="section:photos-carousel"> 3286 + <div class="header-wrap"> 3287 + <div class="link-wrap"> 3288 + <h2 class="unset" id="photos-carousel-label"> 3289 + <rt-text size="1.25" context="heading">Photos</rt-text> 3290 + </h2> 3291 + <rt-button arialabel="Peacemaker &mdash; Season 2 photos" data-qa="photos-view-all-link" 3292 + href="/tv/peacemaker_2022/s02/pictures" shape="pill" size="0.875" 3293 + style="--buttonPadding: 6px 24px;--backgroundColor: var(--grayLight1);--borderColor: transparent;--letterSpacing: 1px;" 3294 + theme="light"> 3295 + View All 3296 + </rt-button> 3297 + </div> 3298 + <h3 class="unset"> 3299 + <rt-text context="label" size="0.75" style="--textColor: var(--grayDark4);"> 3300 + Peacemaker &mdash; Season 2 3301 + </rt-text> 3302 + </h3> 3303 + </div> 3304 + 3305 + <carousel-slider tile-width="80%,240px" skeleton="panel"> 3306 + 3307 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3308 + <span class="sr-only"></span> 3309 + 3310 + 3311 + 3312 + <rt-img slot="image" loading="" 3313 + src="https://resizing.flixster.com/aYP8sS3MeHqIi7UB7CxcM7l8cnI=/fit-in/352x330/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==,https://resizing.flixster.com/hQfmEHhCDArIWR697_2cL8dyEeY=/fit-in/705x460/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==" 3314 + alt="Peacemaker &amp;mdash; Season 2 photo 1"></rt-img> 3315 + </tile-photo> 3316 + 3317 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3318 + <span class="sr-only"></span> 3319 + 3320 + 3321 + 3322 + <rt-img slot="image" loading="" 3323 + src="https://resizing.flixster.com/DRQvcw1LVxWuAdBlV0VnBC4biVg=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h9_aa.jpg,https://resizing.flixster.com/N68GZ9kea8OaNmRYUvnhmnoGyz4=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h9_aa.jpg" 3324 + alt="Peacemaker &amp;mdash; Season 2 photo 2"></rt-img> 3325 + </tile-photo> 3326 + 3327 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3328 + <span class="sr-only"></span> 3329 + 3330 + 3331 + 3332 + <rt-img slot="image" loading="" 3333 + src="https://resizing.flixster.com/OqHcKlrfhRfnfjOd6-de39um0Pg=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_v10_aa.jpg,https://resizing.flixster.com/Ck_we47bpcheYGfm4DspUvqCjXA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_v10_aa.jpg" 3334 + alt="Peacemaker &amp;mdash; Season 2 photo 3"></rt-img> 3335 + </tile-photo> 3336 + 3337 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3338 + <span class="sr-only"></span> 3339 + 3340 + 3341 + 3342 + <rt-img slot="image" loading="" 3343 + src="https://resizing.flixster.com/B14xZt1JRPCgEqEA4fhGzfIhf0g=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h8_aa.jpg,https://resizing.flixster.com/A6W_i7si2yuFTF58CVundvm0IWs=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h8_aa.jpg" 3344 + alt="Peacemaker &amp;mdash; Season 2 photo 4"></rt-img> 3345 + </tile-photo> 3346 + 3347 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3348 + <span class="sr-only">Peacemaker</span> 3349 + 3350 + 3351 + 3352 + <rt-img slot="image" loading="" 3353 + src="https://resizing.flixster.com/7XyiXhn9BvpEhslyQpBn9hnXFr8=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h9_aa.jpg,https://resizing.flixster.com/31A9AIs1ehVt4dSwvr3oIq1P7J0=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h9_aa.jpg" 3354 + alt="Peacemaker"></rt-img> 3355 + </tile-photo> 3356 + 3357 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3358 + <span class="sr-only">Peacemaker</span> 3359 + 3360 + 3361 + 3362 + <rt-img slot="image" loading="lazy" 3363 + src="https://resizing.flixster.com/BUCSSlBKkuZW7VLv3TBVqaOQ1zg=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v9_aa.jpg,https://resizing.flixster.com/U46-rgA8JKxNatvWQXOk2-75az0=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v9_aa.jpg" 3364 + alt="Peacemaker"></rt-img> 3365 + </tile-photo> 3366 + 3367 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3368 + <span class="sr-only">Peacemaker</span> 3369 + 3370 + 3371 + 3372 + <rt-img slot="image" loading="lazy" 3373 + src="https://resizing.flixster.com/JiJ_5M6yk4RwL_eH8tnQn9m39tI=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v8_aa.jpg,https://resizing.flixster.com/3bicZDYLXsHZV-OzWHo6IVenCc4=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v8_aa.jpg" 3374 + alt="Peacemaker"></rt-img> 3375 + </tile-photo> 3376 + 3377 + <tile-photo data-PhotosCarouselManager="tilePhoto:click" slot="tile" skeleton="panel"> 3378 + <span class="sr-only">Peacemaker</span> 3379 + 3380 + 3381 + 3382 + <rt-img slot="image" loading="lazy" 3383 + src="https://resizing.flixster.com/0twCfBybv6oYrFbstg0CuOgDgew=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg,https://resizing.flixster.com/vm58l9EGV6aj90uTvHW8usYGsrA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg" 3384 + alt="Peacemaker"></rt-img> 3385 + </tile-photo> 3386 + 3387 + <tile-view-more aspect="square,landscape" background="mediaHero" slot="tile"> 3388 + <rt-button href="/tv/peacemaker_2022/s02/pictures" shape="pill" theme="transparent-lighttext" 3389 + aria-label="View more Peacemaker &mdash; Season 2 photos"> 3390 + View more photos 3391 + </rt-button> 3392 + </tile-view-more> 3393 + </carousel-slider> 3394 + 3395 + <photos-carousel-manager> 3396 + <script id="photosCarousel" type="application/json" hidden> 3397 + {"title":"Peacemaker &mdash; Season 2","images":[{"aspectRatio":"ASPECT_RATIO_2_3","height":"1920","width":"1296","imageUrl":"https://resizing.flixster.com/hQfmEHhCDArIWR697_2cL8dyEeY=/fit-in/705x460/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==","imageUrlMobile":"https://resizing.flixster.com/aYP8sS3MeHqIi7UB7CxcM7l8cnI=/fit-in/352x330/v2/https://resizing.flixster.com/J-WXxwHSdv6w7VHxcCrPdebOvUA=/ems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vNmE4MmUxOWItNGY5Yy00YzY0LTk5ODktZDY1MGEzZjdmZDFhLmpwZw==","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_4_3","height":"1080","width":"1440","imageUrl":"https://resizing.flixster.com/N68GZ9kea8OaNmRYUvnhmnoGyz4=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h9_aa.jpg","imageUrlMobile":"https://resizing.flixster.com/DRQvcw1LVxWuAdBlV0VnBC4biVg=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h9_aa.jpg","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_3_4","height":"2048","width":"1536","imageUrl":"https://resizing.flixster.com/Ck_we47bpcheYGfm4DspUvqCjXA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_v10_aa.jpg","imageUrlMobile":"https://resizing.flixster.com/OqHcKlrfhRfnfjOd6-de39um0Pg=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_v10_aa.jpg","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_16_9","height":"2160","width":"3840","imageUrl":"https://resizing.flixster.com/A6W_i7si2yuFTF58CVundvm0IWs=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h8_aa.jpg","imageUrlMobile":"https://resizing.flixster.com/B14xZt1JRPCgEqEA4fhGzfIhf0g=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_b_h8_aa.jpg","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_4_3","caption":"Peacemaker","height":"1080","width":"1440","imageUrl":"https://resizing.flixster.com/31A9AIs1ehVt4dSwvr3oIq1P7J0=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h9_aa.jpg","imageUrlMobile":"https://resizing.flixster.com/7XyiXhn9BvpEhslyQpBn9hnXFr8=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h9_aa.jpg","imageLoading":""},{"aspectRatio":"ASPECT_RATIO_3_4","caption":"Peacemaker","height":"1440","width":"1080","imageUrl":"https://resizing.flixster.com/U46-rgA8JKxNatvWQXOk2-75az0=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v9_aa.jpg","imageUrlMobile":"https://resizing.flixster.com/BUCSSlBKkuZW7VLv3TBVqaOQ1zg=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v9_aa.jpg","imageLoading":"lazy"},{"aspectRatio":"ASPECT_RATIO_2_3","caption":"Peacemaker","height":"1440","width":"960","imageUrl":"https://resizing.flixster.com/3bicZDYLXsHZV-OzWHo6IVenCc4=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v8_aa.jpg","imageUrlMobile":"https://resizing.flixster.com/JiJ_5M6yk4RwL_eH8tnQn9m39tI=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_v8_aa.jpg","imageLoading":"lazy"},{"aspectRatio":"ASPECT_RATIO_16_9","caption":"Peacemaker","height":"1080","width":"1920","imageUrl":"https://resizing.flixster.com/vm58l9EGV6aj90uTvHW8usYGsrA=/fit-in/705x460/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg","imageUrlMobile":"https://resizing.flixster.com/0twCfBybv6oYrFbstg0CuOgDgew=/fit-in/352x330/v2/https://resizing.flixster.com/-XZAfHZM39UwaGJIFWKAE8fS0ak=/v3/t/assets/p30317930_i_h10_aa.jpg","imageLoading":"lazy"}],"picturesPageUrl":"/tv/peacemaker_2022/s02/pictures"} 3398 + </script> 3399 + </photos-carousel-manager> 3400 + </section> 3401 + 3402 + </div> 3403 + 3404 + 3405 + <ad-unit hidden unit-display="mobile" unit-type="mboxadtwo" show-ad-link> 3406 + <div slot="ad-inject" class="rectangle_ad mobile center"></div> 3407 + </ad-unit> 3408 + 3409 + 3410 + <ad-unit hidden unit-display="desktop" unit-type="opbannertwo"> 3411 + <div slot="ad-inject" class="banner-ad"></div> 3412 + </ad-unit> 3413 + 3414 + 3415 + <div class="modules-layout" tabindex="-1" data-ModulesNavigationManager="content:focusin"> 3416 + 3417 + <div id="media-info" class="dom-anchor" data-ModulesNavigationManager="domAnchor"></div> 3418 + 3419 + 3420 + 3421 + <section aria-labelledby="media-info-label" class="media-info" data-adobe-id="media-info" 3422 + data-qa="section:media-info"> 3423 + <div class="header-wrap"> 3424 + <h2 class="unset" id="media-info-label"> 3425 + <rt-text context="heading" size="1.25" style="--textTransform: capitalize;" data-qa="title"> 3426 + Season Info 3427 + </rt-text> 3428 + </h2> 3429 + </div> 3430 + 3431 + <div class="content-wrap"> 3432 + 3433 + 3434 + <dl> 3435 + 3436 + <div class="category-wrap" data-qa="item"> 3437 + <dt class="key"> 3438 + <rt-text class="key" size="0.875" data-qa="item-label">Executive Producer</rt-text> 3439 + </dt> 3440 + <dd data-qa="item-value-group"> 3441 + 3442 + <rt-link href="/celebrity/james_gunn" data-qa="item-value">James Gunn</rt-link><rt-text 3443 + class="delimiter">, </rt-text> 3444 + 3445 + <rt-link href="/celebrity/peter_safran" data-qa="item-value">Peter Safran</rt-link><rt-text 3446 + class="delimiter">, </rt-text> 3447 + 3448 + <rt-link href="/celebrity/john_cena" data-qa="item-value">John Cena</rt-link> 3449 + 3450 + </dd> 3451 + </div> 3452 + 3453 + <div class="category-wrap" data-qa="item"> 3454 + <dt class="key"> 3455 + <rt-text class="key" size="0.875" data-qa="item-label">Screenwriter</rt-text> 3456 + </dt> 3457 + <dd data-qa="item-value-group"> 3458 + 3459 + <rt-link href="/celebrity/james_gunn" data-qa="item-value">James Gunn</rt-link> 3460 + 3461 + </dd> 3462 + </div> 3463 + 3464 + <div class="category-wrap" data-qa="item"> 3465 + <dt class="key"> 3466 + <rt-text class="key" size="0.875" data-qa="item-label">Network</rt-text> 3467 + </dt> 3468 + <dd data-qa="item-value-group"> 3469 + 3470 + <rt-text data-qa="item-value">HBO Max</rt-text> 3471 + 3472 + </dd> 3473 + </div> 3474 + 3475 + <div class="category-wrap" data-qa="item"> 3476 + <dt class="key"> 3477 + <rt-text class="key" size="0.875" data-qa="item-label">Rating</rt-text> 3478 + </dt> 3479 + <dd data-qa="item-value-group"> 3480 + 3481 + <rt-text data-qa="item-value">TV-MA</rt-text> 3482 + 3483 + </dd> 3484 + </div> 3485 + 3486 + <div class="category-wrap" data-qa="item"> 3487 + <dt class="key"> 3488 + <rt-text class="key" size="0.875" data-qa="item-label">Genre</rt-text> 3489 + </dt> 3490 + <dd data-qa="item-value-group"> 3491 + 3492 + <rt-link href="/browse/tv_series_browse/genres:comedy" 3493 + data-qa="item-value">Comedy</rt-link><rt-text class="delimiter">, </rt-text> 3494 + 3495 + <rt-link href="/browse/tv_series_browse/genres:action" data-qa="item-value">Action</rt-link> 3496 + 3497 + </dd> 3498 + </div> 3499 + 3500 + <div class="category-wrap" data-qa="item"> 3501 + <dt class="key"> 3502 + <rt-text class="key" size="0.875" data-qa="item-label">Original Language</rt-text> 3503 + </dt> 3504 + <dd data-qa="item-value-group"> 3505 + 3506 + <rt-text data-qa="item-value">English</rt-text> 3507 + 3508 + </dd> 3509 + </div> 3510 + 3511 + <div class="category-wrap" data-qa="item"> 3512 + <dt class="key"> 3513 + <rt-text class="key" size="0.875" data-qa="item-label">Release Date</rt-text> 3514 + </dt> 3515 + <dd data-qa="item-value-group"> 3516 + 3517 + <rt-text data-qa="item-value">Aug 21, 2025</rt-text> 3518 + 3519 + </dd> 3520 + </div> 3521 + 3522 + </dl> 3523 + </div> 3524 + </section> 3525 + 3526 + </div> 3527 + 3528 + 3529 + </div> 3530 + 3531 + <div id="sidebar-wrap"> 3532 + <div data-adobe-id="discovery-sidebar" data-DiscoverySidebarManager="sticky"> 3533 + <discovery-sidebar-manager> 3534 + <script data-json="discoverySidebarJSON" type="application/json">{"mediaType":"tvSeason"}</script> 3535 + </discovery-sidebar-manager> 3536 + <discovery-sidebar skeleton="panel" data-DiscoverySidebarManager="sidebar"></discovery-sidebar> 3537 + 3538 + <ad-unit data-DiscoverySidebarManager="ad:instantiated" unit-display="desktop" unit-type="topmulti" 3539 + show-ad-link> 3540 + <div slot="ad-inject"></div> 3541 + </ad-unit> 3542 + </div> 3543 + </div> 3544 + 3545 + 3546 + <script id="curation-json" 3547 + type="application/json">{"emsId":"76add34d-b98d-34b5-9e0f-2eac74d2ab10","emsIdTvss":"c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed","rtId":"9072906","rtIdTvsn":"9072906","rtIdTvss":"16913","tvSeriesEmsId":"c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed","type":"tvSeason"}</script> 3548 + 3549 + </div> 3550 + </div> 3551 + 3552 + 3553 + <overlay-base data-MediaAudienceReviewsManager="overlay" hidden> 3554 + <!-- do not remove content slot preset --> 3555 + <div slot="content"> 3556 + <media-review-full-audience> 3557 + <rt-button data-MediaAudienceReviewsManager="overlayClose:click" size="1" slot="close" 3558 + theme="transparent"> 3559 + <rt-icon icon="close"></rt-icon> 3560 + </rt-button> 3561 + </media-review-full-audience> 3562 + </div> 3563 + </overlay-base> 3564 + 3565 + 3566 + <tool-tip data-MediaScorecardManager="tipCritics" hidden> 3567 + <rt-button slot="btnClose" data-MediaScorecardManager="tipCriticsClose:click" theme="transparent" size="1.5"> 3568 + <rt-icon icon="close" image="true"></rt-icon> 3569 + </rt-button> 3570 + <div data-MediaScorecardManager="tipCriticsContent"></div> 3571 + </tool-tip> 3572 + 3573 + <tool-tip class="component" data-MediaScorecardManager="tipAudience" hidden> 3574 + <rt-button slot="btnClose" data-MediaScorecardManager="tipAudienceClose:click" theme="transparent" size="1.5"> 3575 + <rt-icon icon="close" image="true"></rt-icon> 3576 + </rt-button> 3577 + <div data-MediaScorecardManager="tipAudienceContent"></div> 3578 + </tool-tip> 3579 + 3580 + <overlay-base data-MediaScorecardManager="overlay:close" hidden> 3581 + <!-- do not remove content slot preset --> 3582 + <div slot="content"></div> 3583 + </overlay-base> 3584 + 3585 + <overlay-base data-JwPlayerManager="overlayBase:close" data-VideoPlayerOverlayManager="overlayBase:close,open" 3586 + hidden> 3587 + <video-player-overlay class="video-overlay-wrap" data-qa="video-overlay" 3588 + data-VideoPlayerOverlayManager="videoPlayerOverlay:unmute" slot="content"> 3589 + <rt-button data-JwPlayerManager="unmuteBtn:click" slot="unmuteBtn" theme="light"> 3590 + <rt-icon icon="volume-mute-fill"></rt-icon> 3591 + &ensp; Tap to Unmute 3592 + </rt-button> 3593 + <div slot="header"> 3594 + <button class="unset transparent" data-VideoPlayerOverlayManager="btnOverlayClose:click" 3595 + data-qa="video-close-btn"> 3596 + <rt-icon icon="close"> 3597 + <span class="sr-only">Close video</span> 3598 + </rt-icon> 3599 + </button> 3600 + <a class="cta-btn header-cta button hide">See Details</a> 3601 + </div> 3602 + 3603 + <div slot="content"></div> 3604 + 3605 + <a slot="footer" class="cta-btn footer-cta button hide">See Details</a> 3606 + </video-player-overlay> 3607 + </overlay-base> 3608 + 3609 + <div id="video-overlay-player" hidden></div> 3610 + 3611 + <video-player-overlay-manager></video-player-overlay-manager> 3612 + <jw-player-manager data-AdsVideoSpotlightManager="jwPlayerManager:playlistItem,ready,remove" 3613 + data-VideoPlayerOverlayManager="jwPlayerManager:playlistItem,pause,ready,relatedClose,relatedOpen"> 3614 + </jw-player-manager> 3615 + 3616 + <overlay-base data-PhotosCarouselManager="overlayBase:close" hidden> 3617 + <photos-carousel-overlay data-PhotosCarouselManager="photosOverlay:sliderBtnClick" slot="content"> 3618 + <rt-button data-PhotosCarouselManager="closeBtn:click" slot="closeBtn" theme="transparent"> 3619 + <rt-icon icon="close"></rt-icon> 3620 + </rt-button> 3621 + </photos-carousel-overlay> 3622 + </overlay-base> 3623 + <overlay-base data-RateAndReviewOverlayManager="overlayBase:close" hidden noclickoutside> 3624 + <div slot="content"></div> 3625 + </overlay-base> 3626 + 3627 + <toast-notification data-RateAndReviewOverlayManager="toast" aria-live="polite" hidden> 3628 + <rt-icon slot="icon" icon="check-circled" image size="1"></rt-icon> 3629 + <rt-text slot="message" data-RateAndReviewOverlayManager="toastMessage" context="label" size="0.875">- 3630 + -</rt-text> 3631 + <rt-button slot="close" theme="transparent"> 3632 + <rt-icon icon="close" image size="1"></rt-icon> 3633 + </rt-button> 3634 + </toast-notification> 3635 + 3636 + 3637 + <ads-media-scorecard-manager></ads-media-scorecard-manager> 3638 + 3639 + </div> 3640 + 3641 + <back-to-top hidden></back-to-top> 3642 + </main> 3643 + 3644 + <ad-unit hidden unit-display="desktop" unit-type="bottombanner"> 3645 + <div slot="ad-inject" class="sleaderboard_wrapper"></div> 3646 + </ad-unit> 3647 + 3648 + <ads-global-skin-takeover-manager></ads-global-skin-takeover-manager> 3649 + 3650 + <footer-manager></footer-manager> 3651 + <footer class="footer container" data-PagePicturesManager="footer"> 3652 + 3653 + <mobile-app-desktop-footer env="production" hidden></mobile-app-desktop-footer> 3654 + 3655 + 3656 + <div class="footer__content-desktop-block" data-qa="footer:section"> 3657 + <div class="footer__content-group"> 3658 + <ul class="footer__links-list"> 3659 + <li class="footer__links-list-item"> 3660 + <a href="/help_desk" data-qa="footer:link-helpdesk">Help</a> 3661 + </li> 3662 + <li class="footer__links-list-item"> 3663 + <a href="/about" data-qa="footer:link-about">About Rotten Tomatoes</a> 3664 + </li> 3665 + <li id="footer-feedback" class="footer__links-list-item" data-qa="footer-feedback-desktop"> 3666 + 3667 + </li> 3668 + </ul> 3669 + </div> 3670 + <div class="footer__content-group"> 3671 + <ul class="footer__links-list"> 3672 + <li class="footer__links-list-item"> 3673 + <a href="/critics/criteria" data-qa="footer:link-critic-submission">Critic Submission</a> 3674 + </li> 3675 + <li class="footer__links-list-item"> 3676 + <a href="/help_desk/licensing" data-qa="footer:link-licensing">Licensing</a> 3677 + </li> 3678 + <li class="footer__links-list-item"> 3679 + <a href="https://together.nbcuni.com/advertise/?utm_source=rotten_tomatoes&amp;utm_medium=referral&amp;utm_campaign=property_ad_pages&amp;utm_content=footer" 3680 + target="_blank" rel="noopener" data-qa="footer:link-ads">Advertise With Us</a> 3681 + </li> 3682 + <li class="footer__links-list-item"> 3683 + <a href="//www.fandango.com/careers" target="_blank" rel="noopener" 3684 + data-qa="footer:link-careers">Careers</a> 3685 + </li> 3686 + </ul> 3687 + </div> 3688 + <div class="footer__content-group footer__newsletter-block"> 3689 + <p class="h3 footer__content-group-title"> 3690 + <rt-icon icon="mail" size="1.25" style="fill:#fff"></rt-icon>&ensp;Join the Newsletter 3691 + </p> 3692 + <p class="footer__newsletter-copy">Get the freshest reviews, news, and more delivered right to your inbox!</p> 3693 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-desktop"> 3694 + Join The Newsletter 3695 + </rt-button> 3696 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 3697 + rel="noopener"> 3698 + Join The Newsletter 3699 + </a> 3700 + </div> 3701 + <div class="footer__content-group footer__social-block" data-qa="footer:social"> 3702 + <p class="h3 footer__content-group-title">Follow Us</p> 3703 + <social-media-icons theme="light" size="20"></social-media-icons> 3704 + </div> 3705 + </div> 3706 + 3707 + <div class="footer__content-mobile-block" data-qa="mfooter:section"> 3708 + <div class="footer__content-group"> 3709 + <div class="mobile-app-cta-wrap"> 3710 + 3711 + <mobile-app-cta env="production" showandroid="false" showios="true" hidden></mobile-app-cta> 3712 + </div> 3713 + 3714 + <p class="footer__copyright-legal" data-qa="mfooter:copyright"> 3715 + <rt-text size="0.75">Copyright &copy; Fandango. All rights reserved.</rt-text> 3716 + </p> 3717 + <p> 3718 + <rt-button shape="pill" data-FooterManager="btnNewsLetter:click" data-qa="footer-newsletter-mobile">Join The 3719 + Newsletter</rt-button> 3720 + </p> 3721 + <a data-FooterManager="linkNewsLetter" class="button footer__newsletter-btn hide" target="_blank" 3722 + rel="noopener">Join The Newsletter</a> 3723 + 3724 + <ul class="footer__links-list list-inline"> 3725 + <li class="footer__links-list-item"> 3726 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 3727 + data-qa="mfooter:link-privacy-policy"> 3728 + Privacy Policy 3729 + </a> 3730 + </li> 3731 + <li class="footer__links-list-item"> 3732 + <a href="/policies/terms-and-policies" data-qa="mfooter:link-terms-policies">Terms and Policies</a> 3733 + </li> 3734 + <li class="footer__links-list-item"> 3735 + <img data-FooterManager="iconCCPA" 3736 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 3737 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 3738 + <!-- OneTrust Cookies Settings button start --> 3739 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings mobile" 3740 + data-qa="footer-cookie-settings-mobile">Cookie Settings</a> 3741 + <!-- OneTrust Cookies Settings button end --> 3742 + </li> 3743 + <li class="footer__links-list-item"> 3744 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 3745 + rel="noopener" data-qa="mfooter:link-california-notice">California Notice</a> 3746 + </li> 3747 + <li class="footer__links-list-item"> 3748 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 3749 + rel="noopener" data-qa="mfooter:link-adChoices">Ad Choices</a> 3750 + </li> 3751 + <li id="footer-feedback-mobile" class="footer__links-list-item" data-qa="footer-feedback-mobile"> 3752 + 3753 + </li> 3754 + <li class="footer__links-list-item"> 3755 + <a href="/faq#accessibility" data-qa="mfooter:link-accessibility">Accessibility</a> 3756 + </li> 3757 + </ul> 3758 + </div> 3759 + </div> 3760 + <div class="footer__copyright"> 3761 + <ul class="footer__links-list list-inline list-inline--separator" data-qa="footer:links-list-privacy"> 3762 + <li class="footer__links-list-item version" data-qa="footer:version"> 3763 + <span>V3.1</span> 3764 + </li> 3765 + <li class="footer__links-list-item"> 3766 + <a href="https://www.nbcuniversalprivacy.com/fandango-privacy-policy" target="_blank" rel="noopener" 3767 + data-qa="footer:link-privacy-policy"> 3768 + Privacy Policy 3769 + </a> 3770 + </li> 3771 + <li class="footer__links-list-item"> 3772 + <a href="/policies/terms-and-policies" data-qa="footer:link-terms-policies">Terms and Policies</a> 3773 + </li> 3774 + <li class="footer__links-list-item"> 3775 + <img data-FooterManager="iconCCPA" 3776 + src="https://images.fandango.com/cms/assets/266533e0-7afb-11ed-83f2-4f600722b564--privacyoptions.svg" 3777 + class="footer__ccpa-icon" loading="lazy" alt="CCPA icon" /> 3778 + <!-- OneTrust Cookies Settings button start --> 3779 + <a href="javascript:void(0)" id="ot-sdk-btn" class="ot-sdk-show-settings" 3780 + data-qa="footer-cookie-settings-desktop">Cookie Settings</a> 3781 + <!-- OneTrust Cookies Settings button end --> 3782 + </li> 3783 + <li class="footer__links-list-item"> 3784 + <a href="https://www.nbcuniversalprivacy.com/privacy/california-consumer-privacy-act" target="_blank" 3785 + rel="noopener" data-qa="footer:link-california-notice">California Notice</a> 3786 + </li> 3787 + <li class="footer__links-list-item"> 3788 + <a href="https://www.nbcuniversalprivacy.com/privacy/cookies#accordionheader2" target="_blank" 3789 + rel="noopener" data-qa="footer:link-adChoices">Ad Choices</a> 3790 + </li> 3791 + <li class="footer__links-list-item"> 3792 + <a href="/faq#accessibility" data-qa="footer:link-accessibility">Accessibility</a> 3793 + </li> 3794 + </ul> 3795 + <span class="footer__copyright-legal" data-qa="footer:copyright"> 3796 + Copyright &copy; Fandango. A Division of 3797 + <a href="https://www.nbcuniversal.com" target="_blank" rel="noopener" 3798 + data-qa="footer:link-nbcuniversal">NBCUniversal</a>. 3799 + All rights reserved. 3800 + </span> 3801 + </div> 3802 + </footer> 3803 + 3804 + </div> 3805 + 3806 + 3807 + <iframe-container hidden data-ArtiManager="iframeContainer:close,resize" 3808 + data-iframe-src="https://arti.rottentomatoes.com?theme=iframe" theme="widget"> 3809 + <span slot="logo"><img src="/assets/pizza-pie/images/arti.041d204c4a4.svg" alt="Logo"></img><span>beta</span></span> 3810 + <rt-button aria-label="New chat" data-ArtiManager="btnNewChat:click" id="artiNewChatButton" slot="optBtns" 3811 + theme="transparent" title="New chat"> 3812 + <rt-icon icon="new-chat" size="1.25" image></rt-icon> 3813 + </rt-button> 3814 + </iframe-container> 3815 + <arti-manager></arti-manager> 3816 + 3817 + 3818 + 3819 + 3820 + <script type="text/javascript"> 3821 + (function (root) { 3822 + /* -- Data -- */ 3823 + root.RottenTomatoes || (root.RottenTomatoes = {}); 3824 + root.RottenTomatoes.context || (root.RottenTomatoes.context = {}); 3825 + root.RottenTomatoes.context.resetCookies = ["AMCVS_8CF467C25245AE3F0A490D4C%40AdobeOrg", "AMCV_8CF467C25245AE3F0A490D4C%40AdobeOrg", "WRIgnore", "WRUIDAWS", "__CT_Data", "__gads", "_admrla", "_awl", "_cs_c", "_cs_id", "_cs_mk", "_cs_s", "_fbp", "_ga", "_gat_gtmTracker", "_gid", "aam_uuid", "akamai_generated_location", "auth_token", "auth_user", "auth_client", "check", "cognito", "fblo_326803741017", "fbm_326803741017", "fbsr_326803741017", "gpv_Page", "id_token", "is_auth", "loginPlatform", "mbox", "notice_behavior", "optimizelyBuckets", "optimizelyEndUserId", "optimizelyPendingLogEvents", "optimizelySegments", "s_cc", "s_dayslastvisit", "s_dayslastvisit_s", "s_invisit", "s_prevPage", "s_sq", "s_vnum", "cognito", "fbm_326803741017", "fbsr_326803741017", "id_token", "JSESSIONID", "QSI_HistorySession", "QSI_SI_8up4dWDOtjAg0hn_intercept", "_ALGOLIA", "__Host-color-scheme", "__Host-theme-options", "__host_color_scheme", "__host_theme_options", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "_chartbeat4", "_chartbeat5", "_sp_id.47f3", "_sp_ses.47f3", "_v__chartbeat3", "adops_master_kvs", "akacd_RTReplatform", "algoliaUT", "cognito", "cl_duid", "fbsr_326803741017", "id_token", "mps_uuid", "session_id", "_admrla", "_awl", "_ga", "_gid", "aam_uuid", "cognito", "fbm_326803741017", "id_token", "_cb", "_cb_ls", "_cb_svref", "_chartbeat2", "adops_master_kvs", "cognito", "id_token", "krg_crb", "krg_uid", "mps_uuid"]; 3826 + root.Fandango || (root.Fandango = {}); 3827 + root.Fandango.dtmData = { "webVersion": "node", "rtVersion": 3.1, "loggedInStatus": "", "customerId": "", "pageName": "trailers" }; 3828 + root.RottenTomatoes.context.video = { "file": "https:\u002F\u002Flink.theplatform.com\u002Fs\u002FNGweTC\u002Fmedia\u002F2pzVnJjkcs18?formats=MPEG-DASH+widevine,M3U+appleHlsEncryption,M3U+none,MPEG-DASH+none,MPEG4,MP3", "type": "hls", "description": "Doris (Lulu Wilson) subtly hints at her plans for Mikey (Parker Mack).", "image": "https:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F300\u002F146\u002Fthumb_04E6645A-8AA7-42B4-8F0B-64F1F55FEF08.jpg", "isRedBand": false, "mediaid": "1013925955554", "mpxId": "1013925955554", "publicId": "2pzVnJjkcs18", "title": "Ouija: Origin of Evil: Official Clip - Creepy Little Sister", "default": false, "label": "0", "duration": "1:50", "durationInSeconds": "110.027", "emsMediaType": "Movie", "emsId": "6d73f951-119d-3a36-8eba-ab319447e477", "overviewPageUrl": "\u002Fm\u002Fouija_origin_of_evil", "videoPageUrl": "\u002Fm\u002Fouija_origin_of_evil\u002Fvideos\u002F2pzVnJjkcs18", "videoType": "CLIP", "adobeDataLayer": { "content": { "id": "fandango_1013925955554", "length": "110.027", "type": "vod", "player_name": "jw", "sdk_version": "web: 6.51.0", "channel": "movie", "originator": "universal pictures", "name": "ouija: origin of evil: official clip - creepy little sister", "rating": "not adult", "stream_type": "video" }, "media_params": { "genre": "horror, mystery & thriller", "show_type": 2 } }, "comscore": { "labelmapping": "c3=\"rottentomatoes.com\", ns_st_st=\"Rotten Tomatoes\", ns_st_pu=\"Universal Pictures\", ns_st_pr=\"Ouija: Origin of Evil\", ns_st_sn=\"*null\", ns_st_en=\"*null\", ns_st_ge=\"Horror,Mystery & Thriller\", ns_st_ia=\"0\", ns_st_ce=\"0\", ns_st_ddt=\"2016\", ns_st_tdt=\"2016\"" }, "thumbnail": "https:\u002F\u002Fresizing.flixster.com\u002FerVt9qj9-5hR_PQXuQCOJtouGW4=\u002F270x160\u002Fv2\u002Fhttps:\u002F\u002Fstatcdn.fandango.com\u002FMPX\u002Fimage\u002FNBCU_Fandango\u002F300\u002F146\u002Fthumb_04E6645A-8AA7-42B4-8F0B-64F1F55FEF08.jpg" }; 3829 + root.RottenTomatoes.context.videoClipsJson = { "count": 12 }; 3830 + root.RottenTomatoes.criticPage = { "vanity": "henry-goldblatt", "type": "tv", "typeDisplayName": "TV", "totalReviews": "", "criticID": "15036" }; 3831 + root.RottenTomatoes.context.review = { "mediaType": "movie", "title": "A Few Days of Respite", "emsId": "c2c97ea5-fd07-3901-a487-778c022eb4f2", "type": "all", "sort": undefined, "reviewsCount": 0, "pageInfo": undefined, "reviewerDefaultImg": "https:\u002F\u002Fimages.fandango.com\u002Fcms\u002Fassets\u002F5b6ff500-1663-11ec-ae31-05a670d2d590--rtactordefault.png", "reviewerDefaultImgWidth": "100" }; 3832 + root.RottenTomatoes.context.useCursorPagination = true; 3833 + root.RottenTomatoes.context.verifiedTooltip = undefined; 3834 + root.RottenTomatoes.context.layout = { "header": { "movies": { "moviesAtHome": { "tarsSlug": "rt-nav-movies-at-home", "linkList": [{ "header": "Fandango at Home", "slug": "fandango-at-home-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:fandango-at-home" }, { "header": "Peacock", "slug": "peacock-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:peacock" }, { "header": "Netflix", "slug": "netflix-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:netflix" }, { "header": "Apple TV+", "slug": "apple-tv-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:apple-tv-plus" }, { "header": "Prime Video", "slug": "prime-video-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Faffiliates:prime-video" }, { "header": "Most Popular Streaming movies", "slug": "most-popular-streaming-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, { "header": "Certified Fresh movies", "slug": "certified-fresh-movies-link", "url": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh" }, { "header": "Browse all", "slug": "browse-all-link", "url": "\u002Fbrowse\u002Fmovies_at_home" }] } }, "editorial": { "guides": { "posts": [{ "ID": 161109, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F09\u002F600EssentialFootballMovies.png" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-football-movies\u002F", "status": "publish", "title": "59 Best Football Movies, Ranked by Tomatometer", "type": "guide" }, { "ID": 253470, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FBest_New_Romcoms600.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fguide\u002Fbest-new-rom-coms-romance-movies\u002F", "status": "publish", "title": "50 Best New Rom-Coms and Romance Movies", "type": "guide" }], "title": "Guides", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F" }, "hubs": { "posts": [{ "ID": 237626, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F05\u002FRT_WTW_Generic_2023_Thumbnail_600x314_021623.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fwhat-to-watch\u002F", "status": "publish", "title": "What to Watch: In Theaters and On Streaming", "type": "rt-hub" }, { "ID": 140214, "author": 12, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2023\u002F02\u002FRT_AwardsTour_Thumbnail_600x314.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hub\u002Fawards-tour\u002F", "status": "publish", "title": "Awards Tour", "type": "rt-hub" }], "title": "Hubs", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Frt-hubs\u002F" }, "news": { "posts": [{ "ID": 273082, "author": 79, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F08\u002FNew_Streaming_September_2025-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fnew-movies-and-shows-streaming-in-september-2025-what-to-watch-on-netflix-prime-video-hbo-max-disney-and-more\u002F", "status": "publish", "title": "New Movies and Shows Streaming in September: What to watch on Netflix, Prime Video, HBO Max, Disney+ and More", "type": "article" }, { "ID": 273326, "author": 669, "featured_image": { "source": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwp-content\u002Fuploads\u002F2025\u002F09\u002FConjuring_Last_Rites_Reviews-Rep.jpg" }, "link": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fthe-conjuring-last-rites-first-reviews\u002F", "status": "publish", "title": "\u003Cem\u003EThe Conjuring: Last Rites\u003C\u002Fem\u003E First Reviews: A Frightful, Fitting Send-off", "type": "article" }], "title": "RT News", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fnews\u002F" } }, "trendingTarsSlug": "rt-nav-trending", "trending": [{ "header": "Emmy Noms", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002F2025-emmys-ballot-complete-with-tomatometer-and-popcornmeter-scores\u002F" }, { "header": "Re-Release Calendar", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fmovie-re-releases-calendar\u002F" }, { "header": "Renewed and Cancelled TV", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Frenewed-and-cancelled-tv-shows-2025\u002F" }, { "header": "The Rotten Tomatoes App ", "url": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Farticle\u002Fapp\u002F" }], "certifiedMedia": { "certifiedFreshTvSeason": { "header": null, "media": { "url": "\u002Ftv\u002Fthe_paper_2025\u002Fs01", "name": "The Paper: Season 1", "score": 83, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FyFijQcjPYUWUelgmiZLHgkXU7hw=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FDFkkHf5pEVX_apKtIQZcoEvI6RU=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FtexEZJLAG-KcVpfCdkT2R1t4cmE=\u002Fems.cHJkLWVtcy1hc3NldHMvdHZzZWFzb24vYTM3OWM2MTctN2M3Ny00MjdhLTk4NDUtODE5ZWUwMWExNGRhLnBuZw==" }, "tarsSlug": "rt-nav-list-cf-picks" }, "certifiedFreshMovieInTheater": { "header": null, "media": { "url": "\u002Fm\u002Ftwinless", "name": "Twinless", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002Fj7lw2KeY9_XyfZQdqRZGku7_9C8=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FuxoeWz7uWmeYIV94_SzEV_osqe4=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVlylB3xT2RIYmRivMx37O3yD76Q=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2ZlNDQ1MGQ5LTFjN2QtNDIwNC04NWE1LTM5NGM4N2U5ZTgzYy5qcGc=" } }, "certifiedFreshMovieInTheater4": { "header": null, "media": { "url": "\u002Fm\u002Fhamilton_2020", "name": "Hamilton", "score": 98, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002F1woquJmQfEhWCZtm7GcH0NMHsYA=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FPeAJ5ZpF5qB98ZiX6ixNDCgW2P0=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FVmBvlTk8-z7pQvDZXTgSdj93WDE=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzLzkzY2IxZjFkLTE1NjEtNDQ4Yi05NDY3LTcxNzFmMDVhMDczNi5qcGc=" } }, "certifiedFreshMovieAtHome": { "header": null, "media": { "url": "\u002Fm\u002Fthe_thursday_murder_club", "name": "The Thursday Murder Club", "score": 76, "posterImg": "https:\u002F\u002Fresizing.flixster.com\u002FjeeldFGcfSMgG09ey5VB7TCFiek=\u002F206x305\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002F9LXDkCzIBBNEiPURkB9t6VefF5Q=\u002Ffit-in\u002F180x240\u002Fv2\u002Fhttps:\u002F\u002Fresizing.flixster.com\u002FrwdeR5xIiN0k7SWr6yXdnmb6zP8=\u002Fems.cHJkLWVtcy1hc3NldHMvbW92aWVzL2EzYWFkZWJiLWE5N2MtNDc3MS1iMDRlLTk0YWVlYzI5M2UxZS5qcGc=" } }, "tarsSlug": "rt-nav-list-cf-picks" }, "tvLists": { "newTvTonight": { "tarsSlug": "rt-hp-text-list-3", "title": "New TV Tonight", "shows": [{ "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "The Walking Dead: Daryl Dixon: Season 3", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_walking_dead_daryl_dixon\u002Fs03" }, { "title": "The Crow Girl: Season 1", "tomatometer": { "tomatometer": 80, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_crow_girl\u002Fs01" }, { "title": "Only Murders in the Building: Season 5", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fonly_murders_in_the_building\u002Fs05" }, { "title": "The Girlfriend: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_girlfriend\u002Fs01" }, { "title": "aka Charlie Sheen: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Faka_charlie_sheen\u002Fs01" }, { "title": "Wizards Beyond Waverly Place: Season 2", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fwizards_beyond_waverly_place\u002Fs02" }, { "title": "Seen & Heard: the History of Black Television: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fseen_and_heard_the_history_of_black_television\u002Fs01" }, { "title": "The Fragrant Flower Blooms With Dignity: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_fragrant_flower_blooms_with_dignity\u002Fs01" }, { "title": "Guts & Glory: Season 1", "tomatometer": { "tomatometer": null, "sentiment": "empty", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fguts_and_glory\u002Fs01" }] }, "mostPopularTvOnRt": { "tarsSlug": "rt-hp-text-list-2", "title": "Most Popular TV on RT", "shows": [{ "title": "The Paper: Season 1", "tomatometer": { "tomatometer": 83, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fthe_paper_2025\u002Fs01" }, { "title": "Dexter: Resurrection: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fdexter_resurrection\u002Fs01" }, { "title": "Alien: Earth: Season 1", "tomatometer": { "tomatometer": 95, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Falien_earth\u002Fs01" }, { "title": "Task: Season 1", "tomatometer": { "tomatometer": 89, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Ftask\u002Fs01" }, { "title": "Wednesday: Season 2", "tomatometer": { "tomatometer": 87, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fwednesday\u002Fs02" }, { "title": "Peacemaker: Season 2", "tomatometer": { "tomatometer": 99, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fpeacemaker_2022\u002Fs02" }, { "title": "The Terminal List: Dark Wolf: Season 1", "tomatometer": { "tomatometer": 73, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Fthe_terminal_list_dark_wolf\u002Fs01" }, { "title": "Hostage: Season 1", "tomatometer": { "tomatometer": 82, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fhostage_2025\u002Fs01" }, { "title": "Chief of War: Season 1", "tomatometer": { "tomatometer": 93, "sentiment": "positive", "certified": true }, "tvPageUrl": "\u002Ftv\u002Fchief_of_war\u002Fs01" }, { "title": "Irish Blood: Season 1", "tomatometer": { "tomatometer": 100, "sentiment": "positive", "certified": false }, "tvPageUrl": "\u002Ftv\u002Firish_blood\u002Fs01" }] } } }, "links": { "moviesInTheaters": { "certifiedFresh": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fcritics:certified_fresh~sort:popular", "comingSoon": "\u002Fbrowse\u002Fmovies_coming_soon\u002F", "openingThisWeek": "\u002Fbrowse\u002Fmovies_in_theaters\u002Fsort:newest", "title": "\u002Fbrowse\u002Fmovies_in_theaters", "topBoxOffice": "\u002Fbrowse\u002Fmovies_in_theaters" }, "onDvdAndStreaming": { "all": "\u002Fbrowse\u002Fmovies_at_home\u002F", "certifiedFresh": "\u002Fbrowse\u002Fmovies_at_home\u002Fcritics:certified_fresh", "title": "\u002Fbrowse\u002Fmovies_at_home\u002F", "top": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular" }, "moreMovies": { "topMovies": "\u002Fbrowse\u002Fmovies_at_home\u002Fsort:popular", "trailers": "\u002Ftrailers" }, "tvTonight": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:newest", "tvPopular": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "moreTv": { "topTv": "\u002Fbrowse\u002Ftv_series_browse\u002Fsort:popular", "certifiedFresh": "\u002Fbrowse\u002Ftv_series_browse\u002Fcritics:fresh" }, "editorial": { "allTimeLists": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fall-time-lists\u002F", "bingeGuide": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fbinge-guide\u002F", "comicsOnTv": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcomics-on-tv\u002F", "countdown": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fcountdown\u002F", "fiveFavoriteFilms": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Ffive-favorite-films\u002F", "videoInterviews": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fvideo-interviews\u002F", "weekendBoxOffice": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekend-box-office\u002F", "weeklyKetchup": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fweekly-ketchup\u002F", "whatToWatch": "https:\u002F\u002Feditorial.rottentomatoes.com\u002Fwhat-to-watch\u002F" }, "advertisingFooter": "https:\u002F\u002Ftogether.nbcuni.com\u002Fadvertise\u002F?utm_source=rotten_tomatoes&utm_medium=referral&utm_campaign=property_ad_pages&utm_content=footer", "californiaNotice": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcalifornia-consumer-privacy-act", "careers": "\u002F\u002Fwww.fandango.com\u002Fcareers", "cookieManagement": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Fprivacy\u002Fcookies#accordionheader2", "fandangoAbout": "https:\u002F\u002Fwww.fandango.com\u002Fabout-us", "privacyPolicy": "https:\u002F\u002Fwww.nbcuniversalprivacy.com\u002Ffandango-privacy-policy", "termsPolicies": "\u002Fpolicies\u002Fterms-and-policies" } }; 3835 + root.RottenTomatoes.thirdParty = { "chartBeat": { "auth": "64558", "domain": "rottentomatoes.com" }, "mpx": { "accountPid": "NGweTC", "playerPid": "y__7B0iQTi4P", "playerPidPDK6": "pdk6_y__7B0iQTi4P", "accountId": "2474312077" }, "algoliaSearch": { "aId": "79FRDP12PN", "sId": "175588f6e5f8319b27702e4cc4013561" }, "cognito": { "upId": "us-west-2_4L0ZX4b1U", "clientId": "7pu48v8i2n25t4vhes0edck31c" } }; 3836 + root.RottenTomatoes.serviceWorker = { "isServiceWokerOn": true }; 3837 + root.__RT__ || (root.__RT__ = {}); 3838 + root.__RT__.featureFlags = { "adsCarouselHP": false, "adsCarouselHPSlug": "rt-sponsored-carousel-list-mcdonalds-hp", "adsCarouselOP": false, "adsCarouselOPSlug": "rt-sponsored-carousel-list-mcdonalds-op", "adsMockDLP": false, "adsPages": "none", "adsSponsoredOverrideOP": true, "adsSponsoredOverrideOPSlugs": "rt-sponsored-override-op-starz", "adsVideoSpotlightHP": false, "appleSigninEnabled": true, "artiEnabled": true, "authPasswordEnabled": true, "authVerboseLogs": false, "bypassCriticValidationEnabled": false, "castAndCrewEnabled": true, "cookieConsentServiceEnabled": false, "crssoEnabled": false, "editorialApiDisabled": false, "faqUpdatesEnabled": true, "legacyBridge": true, "logVerboseEnabled": false, "mobileAppAndroid": "https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.rottentomatoes.android", "mobileAppIos": "https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Frotten-tomatoes-movies-tv\u002Fid6673916573", "mobileAppIosMeta": "app-id=6673916573, app-argument=https:\u002F\u002Fwww.rottentomatoes.com\u002F", "mobileNavEnabled": true, "oneTrustJwtApiUrl": "https:\u002F\u002Fonetrustjwt.services.fandango.com", "oneTrustJwtServiceEnabled": false, "pageJsonEnabled": false, "profilesFeaturesEnabled": false, "profilesUsernameEnabled": false, "redesignMediaHeroEnabled": true, "redesignMoreLikeThis": true, "redesignSortTable": true, "trafficAndroidEnabled": false, "trafficSafariEnabled": true, "userMigrationEnabled": true, "versantFreewheelEnabled": false, "versantMpsDomain": "app.mps.vsnt.net", "versantMpsEnabled": false, "versantOneTrustScriptBlock": "\u003C!-- OneTrust Cookies Consent Notice start for rottentomatoes.com --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fconsent\u002F01978557-1604-76a7-ad7c-18216757cf52-test\u002FotSDKStub.js\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" data-domain-script=\"01978557-1604-76a7-ad7c-18216757cf52-test\" integrity=\"sha384-Exfxdyaw5OnsUlHEKlNlz7OwgVCyLlitAtJsDmSNh3LeLlCjWXos3X\u002FCMNUbQ\u002FgA\" crossorigin=\"anonymous\" \u003E\u003C\u002Fscript\u003E \u003Cscript type=\"text\u002Fjavascript\"\u003E function OptanonWrapper() { if (OnetrustActiveGroups.includes('7')) { document.querySelector('search-results-nav-manager')?.setAlgoliaInsightUserToken?.(); } } \u003C\u002Fscript\u003E \u003C!-- OneTrust Cookies Consent Notice end for rottentomatoes.com --\u003E \u003C!-- OneTrust IAB US Privacy (USP) --\u003E \u003Cscript src=\"https:\u002F\u002Fcdn.cookielaw.org\u002Fopt-out\u002FotCCPAiab.js\" id=\"privacyCookie\" type=\"text\u002Fjavascript\" charset=\"UTF-8\" ccpa-opt-out-ids=\"USP\" ccpa-opt-out-geo=\"US\" ccpa-opt-out-lspa=\"false\"\u003E\u003C\u002Fscript\u003E \u003C!-- OneTrust IAB US Privacy (USP) end --\u003E", "videoGeoFencingEnabled": true }; 3839 + root.RottenTomatoes.context.adsMockDLP = false; 3840 + root.RottenTomatoes.context.req = { "params": { "vanity": "peacemaker_2022", "tvSeason": "s02" }, "query": {}, "route": {}, "url": "\u002Ftv\u002Fpeacemaker_2022\u002Fs02", "secure": false, "buildVersion": undefined }; 3841 + root.RottenTomatoes.context.config = {}; 3842 + root.BK = { "PageName": "http:\u002F\u002Fwww.rottentomatoes.com\u002Ftv\u002Fpeacemaker_2022\u002Fs02", "SiteID": 37528, "SiteSection": "tv", "TvSeriesTitle": "Peacemaker", "TvSeriesId": "c06d0b8a-9ae4-33f6-beb0-d29cb62dd7ed" }; 3843 + root.RottenTomatoes.dtmData = { "customerId": "", "loggedInStatus": "", "rtVersion": 3.1, "webVersion": "node", "emsID": "76add34d-b98d-34b5-9e0f-2eac74d2ab10", "Season Title": "Season 2", "Series Title": "Peacemaker", "pageName": "rt | tv | season | Peacemaker | Season 2", "titleGenre": "Comedy", "titleId": "76add34d-b98d-34b5-9e0f-2eac74d2ab10", "titleName": "Peacemaker", "titleType": "Tv" }; 3844 + root.RottenTomatoes.context.gptSite = "tv"; 3845 + 3846 + }(this)); 3847 + </script> 3848 + 3849 + <script fetchpriority="high" src="/assets/pizza-pie/javascripts/bundles/roma/preload.18bcfff8e54.js"></script> 3850 + 3851 + <script src="/assets/pizza-pie/javascripts/bundles/roma/vendors.a4cc402b78a.js"></script> 3852 + 3853 + <script src="/assets/pizza-pie/javascripts/bundles/roma/default.24dc1977289.js"></script> 3854 + 3855 + 3856 + <script async data-SearchResultsNavManager="script:load" 3857 + src="https://cdn.jsdelivr.net/npm/algoliasearch@4/dist/algoliasearch-lite.umd.js"> 3858 + </script> 3859 + <script src="/assets/pizza-pie/javascripts/templates/roma/searchNav.a3288ea5efe.js"></script> 3860 + <script src="/assets/pizza-pie/javascripts/bundles/roma/searchNav.6a836b4ca81.js"></script> 3861 + 3862 + 3863 + 3864 + <script src="/assets/pizza-pie/javascripts/templates/pages/tvSeason/index.3aa173d4c0f.js"></script> 3865 + 3866 + <script src="/assets/pizza-pie/javascripts/bundles/pages/tvSeason/index.bd374ef0595.js"></script> 3867 + 3868 + 3869 + 3870 + 3871 + <script> 3872 + if (window.mps && typeof window.mps.writeFooter === 'function') { 3873 + window.mps.writeFooter(); 3874 + } 3875 + </script> 3876 + 3877 + 3878 + 3879 + 3880 + 3881 + <script> 3882 + window._satellite && _satellite.pageBottom(); 3883 + </script> 3884 + 3885 + 3886 + </body> 3887 + 3888 + </html>
-305
internal/ui/book_list.go
··· 1 - package ui 2 - 3 - import ( 4 - "context" 5 - "fmt" 6 - "io" 7 - "os" 8 - "strings" 9 - "time" 10 - 11 - tea "github.com/charmbracelet/bubbletea" 12 - "github.com/charmbracelet/huh" 13 - "github.com/charmbracelet/lipgloss" 14 - "github.com/stormlightlabs/noteleaf/internal/models" 15 - "github.com/stormlightlabs/noteleaf/internal/repo" 16 - "github.com/stormlightlabs/noteleaf/internal/services" 17 - ) 18 - 19 - // BookListOptions configures the book list UI behavior 20 - type BookListOptions struct { 21 - // Output destination (stdout for interactive, buffer for testing) 22 - Output io.Writer 23 - // Input source (stdin for interactive, strings reader for testing) 24 - Input io.Reader 25 - // Enable static mode (no interactive components) 26 - Static bool 27 - } 28 - 29 - // BookList handles book search and selection UI 30 - type BookList struct { 31 - service services.APIService 32 - repo *repo.BookRepository 33 - opts BookListOptions 34 - } 35 - 36 - // NewBookList creates a new book list UI component 37 - func NewBookList(service services.APIService, repo *repo.BookRepository, opts BookListOptions) *BookList { 38 - if opts.Output == nil { 39 - opts.Output = os.Stdout 40 - } 41 - if opts.Input == nil { 42 - opts.Input = os.Stdin 43 - } 44 - return &BookList{ 45 - service: service, 46 - repo: repo, 47 - opts: opts, 48 - } 49 - } 50 - 51 - type searchModel struct { 52 - query string 53 - results []*models.Book 54 - selected int 55 - searching bool 56 - err error 57 - service services.APIService 58 - repo *repo.BookRepository 59 - opts BookListOptions 60 - currentPage int 61 - totalResults int 62 - confirmed bool 63 - addedBook *models.Book 64 - } 65 - 66 - type searchMsg []*models.Book 67 - type errorMsg error 68 - type bookAddedMsg *models.Book 69 - 70 - func (m searchModel) Init() tea.Cmd { 71 - return m.searchBooks(m.query) 72 - } 73 - 74 - func (m searchModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { 75 - switch msg := msg.(type) { 76 - case tea.KeyMsg: 77 - switch msg.String() { 78 - case "ctrl+c", "q", "esc": 79 - return m, tea.Quit 80 - case "up", "k": 81 - if m.selected > 0 { 82 - m.selected-- 83 - } 84 - case "down", "j": 85 - if m.selected < len(m.results)-1 { 86 - m.selected++ 87 - } 88 - case "enter": 89 - if len(m.results) > 0 && m.selected < len(m.results) { 90 - return m, m.addBook(m.results[m.selected]) 91 - } 92 - case "n": 93 - if !m.searching && len(m.results) > 0 && m.currentPage*10 < m.totalResults { 94 - m.currentPage++ 95 - return m, m.searchBooks(m.query) 96 - } 97 - case "p": 98 - if !m.searching && m.currentPage > 1 { 99 - m.currentPage-- 100 - return m, m.searchBooks(m.query) 101 - } 102 - } 103 - case searchMsg: 104 - m.results = []*models.Book(msg) 105 - m.searching = false 106 - m.selected = 0 107 - case errorMsg: 108 - m.err = error(msg) 109 - m.searching = false 110 - case bookAddedMsg: 111 - m.addedBook = (*models.Book)(msg) 112 - m.confirmed = true 113 - return m, tea.Tick(2*time.Second, func(t time.Time) tea.Msg { 114 - return tea.Quit() 115 - }) 116 - } 117 - return m, nil 118 - } 119 - 120 - func (m searchModel) View() string { 121 - var s strings.Builder 122 - 123 - style := lipgloss.NewStyle().Foreground(lipgloss.Color("86")) 124 - titleStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("205")).Bold(true) 125 - selectedStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("212")).Bold(true) 126 - 127 - s.WriteString(titleStyle.Render(fmt.Sprintf("Search Results for: %s", m.query))) 128 - s.WriteString("\n\n") 129 - 130 - if m.searching { 131 - s.WriteString("Searching...") 132 - return s.String() 133 - } 134 - 135 - if m.err != nil { 136 - s.WriteString(fmt.Sprintf("Error: %s", m.err)) 137 - return s.String() 138 - } 139 - 140 - if len(m.results) == 0 { 141 - s.WriteString("No books found") 142 - return s.String() 143 - } 144 - 145 - if m.confirmed && m.addedBook != nil { 146 - s.WriteString(fmt.Sprintf("โœ“ Added book: %s", m.addedBook.Title)) 147 - if m.addedBook.Author != "" { 148 - s.WriteString(fmt.Sprintf(" by %s", m.addedBook.Author)) 149 - } 150 - return s.String() 151 - } 152 - 153 - for i, book := range m.results { 154 - prefix := " " 155 - if i == m.selected { 156 - prefix = "> " 157 - } 158 - 159 - line := fmt.Sprintf("%s%s", prefix, book.Title) 160 - if book.Author != "" { 161 - line += fmt.Sprintf(" by %s", book.Author) 162 - } 163 - 164 - if i == m.selected { 165 - s.WriteString(selectedStyle.Render(line)) 166 - } else { 167 - s.WriteString(style.Render(line)) 168 - } 169 - s.WriteString("\n") 170 - } 171 - 172 - s.WriteString("\n") 173 - s.WriteString("Use โ†‘/โ†“ to navigate, Enter to select, q to quit") 174 - if m.currentPage*10 < m.totalResults { 175 - s.WriteString(", n for next page") 176 - } 177 - if m.currentPage > 1 { 178 - s.WriteString(", p for previous page") 179 - } 180 - 181 - return s.String() 182 - } 183 - 184 - func (m searchModel) searchBooks(query string) tea.Cmd { 185 - return func() tea.Msg { 186 - results, err := m.service.Search(context.Background(), query, m.currentPage, 10) 187 - if err != nil { 188 - return errorMsg(err) 189 - } 190 - 191 - books := make([]*models.Book, 0, len(results)) 192 - for _, result := range results { 193 - if book, ok := (*result).(*models.Book); ok { 194 - books = append(books, book) 195 - } 196 - } 197 - 198 - return searchMsg(books) 199 - } 200 - } 201 - 202 - func (m searchModel) addBook(book *models.Book) tea.Cmd { 203 - return func() tea.Msg { 204 - if _, err := m.repo.Create(context.Background(), book); err != nil { 205 - return errorMsg(fmt.Errorf("failed to add book: %w", err)) 206 - } 207 - return bookAddedMsg(book) 208 - } 209 - } 210 - 211 - // SearchAndSelect searches for books with the given query and allows selection 212 - func (bl *BookList) SearchAndSelect(ctx context.Context, query string) error { 213 - if bl.opts.Static { 214 - return bl.staticSelect(ctx, query) 215 - } 216 - 217 - model := searchModel{ 218 - query: query, 219 - searching: true, 220 - service: bl.service, 221 - repo: bl.repo, 222 - opts: bl.opts, 223 - currentPage: 1, 224 - } 225 - 226 - program := tea.NewProgram(model, tea.WithInput(bl.opts.Input), tea.WithOutput(bl.opts.Output)) 227 - 228 - _, err := program.Run() 229 - return err 230 - } 231 - 232 - func (bl *BookList) staticSelect(ctx context.Context, query string) error { 233 - results, err := bl.service.Search(ctx, query, 1, 10) 234 - if err != nil { 235 - fmt.Fprintf(bl.opts.Output, "Error: %s\n", err) 236 - return err 237 - } 238 - 239 - fmt.Fprintf(bl.opts.Output, "Search Results for: %s\n\n", query) 240 - 241 - if len(results) == 0 { 242 - fmt.Fprintf(bl.opts.Output, "No books found\n") 243 - return nil 244 - } 245 - 246 - for i, result := range results { 247 - if book, ok := (*result).(*models.Book); ok { 248 - fmt.Fprintf(bl.opts.Output, "[%d] %s", i+1, book.Title) 249 - if book.Author != "" { 250 - fmt.Fprintf(bl.opts.Output, " by %s", book.Author) 251 - } 252 - fmt.Fprintf(bl.opts.Output, "\n") 253 - } 254 - } 255 - 256 - if len(results) > 0 { 257 - if book, ok := (*results[0]).(*models.Book); ok { 258 - if bl.repo != nil { 259 - if _, err := bl.repo.Create(ctx, book); err != nil { 260 - fmt.Fprintf(bl.opts.Output, "Error adding book: %s\n", err) 261 - return err 262 - } 263 - } 264 - fmt.Fprintf(bl.opts.Output, "โœ“ Added book: %s", book.Title) 265 - if book.Author != "" { 266 - fmt.Fprintf(bl.opts.Output, " by %s", book.Author) 267 - } 268 - fmt.Fprintf(bl.opts.Output, "\n") 269 - } 270 - } 271 - 272 - return nil 273 - } 274 - 275 - // InteractiveSearch provides an interactive search interface 276 - func (bl *BookList) InteractiveSearch(ctx context.Context) error { 277 - if bl.opts.Static { 278 - return bl.staticSearch(ctx) 279 - } 280 - 281 - var query string 282 - form := huh.NewForm( 283 - huh.NewGroup( 284 - huh.NewInput(). 285 - Title("Search for books"). 286 - Placeholder("Enter book title or author"). 287 - Value(&query), 288 - ), 289 - ) 290 - 291 - if err := form.WithTheme(huh.ThemeCharm()).Run(); err != nil { 292 - return err 293 - } 294 - 295 - if strings.TrimSpace(query) == "" { 296 - return fmt.Errorf("search query cannot be empty") 297 - } 298 - 299 - return bl.SearchAndSelect(ctx, query) 300 - } 301 - 302 - func (bl *BookList) staticSearch(ctx context.Context) error { 303 - fmt.Fprintf(bl.opts.Output, "Search for books: test query\n") 304 - return bl.staticSelect(ctx, "test query") 305 - }
+210
internal/ui/book_list_adapter.go
··· 1 + package ui 2 + 3 + import ( 4 + "context" 5 + "fmt" 6 + "io" 7 + "strings" 8 + 9 + "github.com/stormlightlabs/noteleaf/internal/models" 10 + "github.com/stormlightlabs/noteleaf/internal/repo" 11 + "github.com/stormlightlabs/noteleaf/internal/utils" 12 + ) 13 + 14 + // BookRecord adapts models.Book to work with DataList 15 + type BookRecord struct { 16 + *models.Book 17 + } 18 + 19 + func (b *BookRecord) GetField(name string) any { 20 + switch name { 21 + case "id": 22 + return b.ID 23 + case "title": 24 + return b.Title 25 + case "author": 26 + return b.Author 27 + case "status": 28 + return b.Status 29 + case "progress": 30 + return b.Progress 31 + case "pages": 32 + return b.Pages 33 + case "rating": 34 + return b.Rating 35 + case "notes": 36 + return b.Notes 37 + case "added": 38 + return b.Added 39 + case "started": 40 + return b.Started 41 + case "finished": 42 + return b.Finished 43 + default: 44 + return "" 45 + } 46 + } 47 + 48 + func (b *BookRecord) GetTitle() string { 49 + return b.Title 50 + } 51 + 52 + func (b *BookRecord) GetDescription() string { 53 + var parts []string 54 + 55 + if b.Author != "" { 56 + parts = append(parts, "by "+b.Author) 57 + } 58 + 59 + if b.Status != "" { 60 + parts = append(parts, utils.Titlecase(b.Status)) 61 + } 62 + 63 + if b.Pages > 0 { 64 + parts = append(parts, fmt.Sprintf("%d pages", b.Pages)) 65 + } 66 + 67 + if b.Progress > 0 && b.Progress < 100 { 68 + parts = append(parts, fmt.Sprintf("%d%%", b.Progress)) 69 + } 70 + 71 + return strings.Join(parts, " โ€ข ") 72 + } 73 + 74 + func (b *BookRecord) GetFilterValue() string { 75 + // Make books searchable by title, author, and notes 76 + searchable := []string{b.Title, b.Author, b.Notes} 77 + return strings.Join(searchable, " ") 78 + } 79 + 80 + // BookDataSource adapts BookRepository to work with DataList 81 + type BookDataSource struct { 82 + repo utils.TestBookRepository 83 + status string 84 + } 85 + 86 + func (b *BookDataSource) Load(ctx context.Context, opts ListOptions) ([]ListItem, error) { 87 + repoOpts := repo.BookListOptions{} 88 + 89 + if b.status != "" { 90 + repoOpts.Status = b.status 91 + } 92 + 93 + if opts.Search != "" { 94 + // Simple search in title/author (could be enhanced) 95 + repoOpts.Search = opts.Search 96 + } 97 + 98 + if opts.Limit > 0 { 99 + repoOpts.Limit = opts.Limit 100 + } 101 + 102 + books, err := b.repo.List(ctx, repoOpts) 103 + if err != nil { 104 + return nil, err 105 + } 106 + 107 + items := make([]ListItem, len(books)) 108 + for i, book := range books { 109 + items[i] = &BookRecord{Book: book} 110 + } 111 + 112 + return items, nil 113 + } 114 + 115 + func (b *BookDataSource) Count(ctx context.Context, opts ListOptions) (int, error) { 116 + // For simplicity, load all and count (could be optimized) 117 + items, err := b.Load(ctx, opts) 118 + if err != nil { 119 + return 0, err 120 + } 121 + return len(items), nil 122 + } 123 + 124 + func (b *BookDataSource) Search(ctx context.Context, query string, opts ListOptions) ([]ListItem, error) { 125 + // Set search in options and use regular Load 126 + opts.Search = query 127 + return b.Load(ctx, opts) 128 + } 129 + 130 + // formatBookForView formats a book for detailed viewing 131 + func formatBookForView(book *models.Book) string { 132 + var content strings.Builder 133 + 134 + content.WriteString(fmt.Sprintf("# %s\n\n", book.Title)) 135 + 136 + if book.Author != "" { 137 + content.WriteString(fmt.Sprintf("**Author:** %s\n", book.Author)) 138 + } 139 + 140 + if book.Status != "" { 141 + content.WriteString(fmt.Sprintf("**Status:** %s\n", utils.Titlecase(book.Status))) 142 + } 143 + 144 + if book.Progress > 0 { 145 + content.WriteString(fmt.Sprintf("**Progress:** %d%%\n", book.Progress)) 146 + } 147 + 148 + if book.Pages > 0 { 149 + content.WriteString(fmt.Sprintf("**Pages:** %d\n", book.Pages)) 150 + } 151 + 152 + if book.Rating > 0 { 153 + content.WriteString(fmt.Sprintf("**Rating:** %.1f/5\n", book.Rating)) 154 + } 155 + 156 + content.WriteString(fmt.Sprintf("**Added:** %s\n", book.Added.Format("2006-01-02 15:04"))) 157 + 158 + if book.Started != nil { 159 + content.WriteString(fmt.Sprintf("**Started:** %s\n", book.Started.Format("2006-01-02 15:04"))) 160 + } 161 + 162 + if book.Finished != nil { 163 + content.WriteString(fmt.Sprintf("**Finished:** %s\n", book.Finished.Format("2006-01-02 15:04"))) 164 + } 165 + 166 + if book.Notes != "" { 167 + content.WriteString(fmt.Sprintf("\n**Notes:**\n%s\n", book.Notes)) 168 + } 169 + 170 + return content.String() 171 + } 172 + 173 + // NewBookDataList creates a new DataList for browsing books 174 + func NewBookDataList(repo utils.TestBookRepository, opts DataListOptions, status string) *DataList { 175 + if opts.Title == "" { 176 + opts.Title = "Books" 177 + } 178 + 179 + // Enable search functionality 180 + opts.ShowSearch = true 181 + opts.Searchable = true 182 + 183 + // Set up view handler for book details 184 + if opts.ViewHandler == nil { 185 + opts.ViewHandler = func(item ListItem) string { 186 + if bookRecord, ok := item.(*BookRecord); ok { 187 + return formatBookForView(bookRecord.Book) 188 + } 189 + return "Unable to display book" 190 + } 191 + } 192 + 193 + source := &BookDataSource{ 194 + repo: repo, 195 + status: status, 196 + } 197 + 198 + return NewDataList(source, opts) 199 + } 200 + 201 + // NewBookListFromList creates a BookList-compatible interface using DataList 202 + func NewBookListFromList(repo utils.TestBookRepository, output io.Writer, input io.Reader, static bool, status string) *DataList { 203 + opts := DataListOptions{ 204 + Output: output, 205 + Input: input, 206 + Static: static, 207 + Title: "Books", 208 + } 209 + return NewBookDataList(repo, opts, status) 210 + }
+364
internal/ui/book_list_adapter_test.go
··· 1 + package ui 2 + 3 + import ( 4 + "bytes" 5 + "context" 6 + "fmt" 7 + "strings" 8 + "testing" 9 + "time" 10 + 11 + "github.com/stormlightlabs/noteleaf/internal/models" 12 + "github.com/stormlightlabs/noteleaf/internal/repo" 13 + ) 14 + 15 + type mockBookRepository struct { 16 + books []*models.Book 17 + err error 18 + } 19 + 20 + func (m *mockBookRepository) List(ctx context.Context, options repo.BookListOptions) ([]*models.Book, error) { 21 + if m.err != nil { 22 + return nil, m.err 23 + } 24 + 25 + var filtered []*models.Book 26 + for _, book := range m.books { 27 + if options.Status != "" && book.Status != options.Status { 28 + continue 29 + } 30 + 31 + if options.Search != "" && !strings.Contains(strings.ToLower(book.Title), strings.ToLower(options.Search)) { 32 + continue 33 + } 34 + 35 + filtered = append(filtered, book) 36 + 37 + if options.Limit > 0 && len(filtered) >= options.Limit { 38 + break 39 + } 40 + } 41 + 42 + return filtered, nil 43 + } 44 + 45 + func TestBookAdapter(t *testing.T) { 46 + now := time.Now() 47 + book := &models.Book{ 48 + ID: 1, 49 + Title: "Test Book", 50 + Author: "Test Author", 51 + Status: "reading", 52 + Progress: 45, 53 + Pages: 250, 54 + Rating: 4.5, 55 + Notes: "Great book so far", 56 + Added: now, 57 + Started: &now, 58 + } 59 + 60 + t.Run("BookRecord", func(t *testing.T) { 61 + record := &BookRecord{Book: book} 62 + 63 + t.Run("GetField", func(t *testing.T) { 64 + tests := []struct { 65 + field string 66 + expected any 67 + name string 68 + }{ 69 + {"id", int64(1), "should return book ID"}, 70 + {"title", "Test Book", "should return book title"}, 71 + {"author", "Test Author", "should return book author"}, 72 + {"status", "reading", "should return book status"}, 73 + {"progress", 45, "should return book progress"}, 74 + {"pages", 250, "should return page count"}, 75 + {"rating", 4.5, "should return rating"}, 76 + {"notes", "Great book so far", "should return notes"}, 77 + {"added", now, "should return added time"}, 78 + {"started", &now, "should return started time"}, 79 + {"unknown", "", "should return empty string for unknown field"}, 80 + } 81 + 82 + for _, tt := range tests { 83 + t.Run(tt.name, func(t *testing.T) { 84 + result := record.GetField(tt.field) 85 + 86 + switch expected := tt.expected.(type) { 87 + case time.Time: 88 + if resultTime, ok := result.(time.Time); !ok || !resultTime.Equal(expected) { 89 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 90 + } 91 + case *time.Time: 92 + resultPtr, ok := result.(*time.Time) 93 + if !ok || (expected == nil && resultPtr != nil) || (expected != nil && (resultPtr == nil || !resultPtr.Equal(*expected))) { 94 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 95 + } 96 + default: 97 + if result != tt.expected { 98 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 99 + } 100 + } 101 + }) 102 + } 103 + }) 104 + 105 + t.Run("ListItem methods", func(t *testing.T) { 106 + if record.GetTitle() != "Test Book" { 107 + t.Errorf("GetTitle() = %q, want 'Test Book'", record.GetTitle()) 108 + } 109 + 110 + description := record.GetDescription() 111 + if !strings.Contains(description, "Test Author") { 112 + t.Errorf("GetDescription() should contain author, got: %s", description) 113 + } 114 + if !strings.Contains(description, "Reading") { 115 + t.Errorf("GetDescription() should contain status, got: %s", description) 116 + } 117 + if !strings.Contains(description, "250 pages") { 118 + t.Errorf("GetDescription() should contain page count, got: %s", description) 119 + } 120 + if !strings.Contains(description, "45%") { 121 + t.Errorf("GetDescription() should contain progress, got: %s", description) 122 + } 123 + 124 + filterValue := record.GetFilterValue() 125 + if !strings.Contains(filterValue, "Test Book") || !strings.Contains(filterValue, "Test Author") { 126 + t.Errorf("GetFilterValue() should contain title and author, got: %s", filterValue) 127 + } 128 + if !strings.Contains(filterValue, "Great book so far") { 129 + t.Errorf("GetFilterValue() should contain notes, got: %s", filterValue) 130 + } 131 + }) 132 + 133 + t.Run("Model interface", func(t *testing.T) { 134 + if record.GetID() != 1 { 135 + t.Errorf("GetID() = %d, want 1", record.GetID()) 136 + } 137 + 138 + if record.GetTableName() != "books" { 139 + t.Errorf("GetTableName() = %q, want 'books'", record.GetTableName()) 140 + } 141 + }) 142 + }) 143 + 144 + t.Run("BookDataSource", func(t *testing.T) { 145 + books := []*models.Book{ 146 + { 147 + ID: 1, 148 + Title: "Go Programming", 149 + Author: "John Doe", 150 + Status: "reading", 151 + }, 152 + { 153 + ID: 2, 154 + Title: "Python Guide", 155 + Author: "Jane Smith", 156 + Status: "queued", 157 + }, 158 + { 159 + ID: 3, 160 + Title: "Advanced Go", 161 + Author: "Bob Johnson", 162 + Status: "finished", 163 + }, 164 + } 165 + 166 + t.Run("Load", func(t *testing.T) { 167 + repo := &mockBookRepository{books: books} 168 + source := &BookDataSource{repo: repo} 169 + 170 + items, err := source.Load(context.Background(), ListOptions{}) 171 + if err != nil { 172 + t.Fatalf("Load() failed: %v", err) 173 + } 174 + 175 + if len(items) != 3 { 176 + t.Errorf("Load() returned %d items, want 3", len(items)) 177 + } 178 + 179 + if items[0].GetTitle() != "Go Programming" { 180 + t.Errorf("First item title = %q, want 'Go Programming'", items[0].GetTitle()) 181 + } 182 + }) 183 + 184 + t.Run("Load with status filter", func(t *testing.T) { 185 + repo := &mockBookRepository{books: books} 186 + source := &BookDataSource{repo: repo, status: "reading"} 187 + 188 + items, err := source.Load(context.Background(), ListOptions{}) 189 + if err != nil { 190 + t.Fatalf("Load() failed: %v", err) 191 + } 192 + 193 + if len(items) != 1 { 194 + t.Errorf("Load() with status filter returned %d items, want 1", len(items)) 195 + } 196 + if items[0].GetTitle() != "Go Programming" { 197 + t.Errorf("Filtered item title = %q, want 'Go Programming'", items[0].GetTitle()) 198 + } 199 + }) 200 + 201 + t.Run("Search", func(t *testing.T) { 202 + repo := &mockBookRepository{books: books} 203 + source := &BookDataSource{repo: repo} 204 + 205 + items, err := source.Search(context.Background(), "Python", ListOptions{}) 206 + if err != nil { 207 + t.Fatalf("Search() failed: %v", err) 208 + } 209 + 210 + if len(items) != 1 { 211 + t.Errorf("Search() returned %d items, want 1", len(items)) 212 + } 213 + if items[0].GetTitle() != "Python Guide" { 214 + t.Errorf("Search result title = %q, want 'Python Guide'", items[0].GetTitle()) 215 + } 216 + }) 217 + 218 + t.Run("Load error", func(t *testing.T) { 219 + testErr := fmt.Errorf("test error") 220 + repo := &mockBookRepository{err: testErr} 221 + source := &BookDataSource{repo: repo} 222 + 223 + if _, err := source.Load(context.Background(), ListOptions{}); err != testErr { 224 + t.Errorf("Load() error = %v, want %v", err, testErr) 225 + } 226 + }) 227 + 228 + t.Run("Count", func(t *testing.T) { 229 + repo := &mockBookRepository{books: books} 230 + source := &BookDataSource{repo: repo} 231 + 232 + count, err := source.Count(context.Background(), ListOptions{}) 233 + if err != nil { 234 + t.Fatalf("Count() failed: %v", err) 235 + } 236 + 237 + if count != 3 { 238 + t.Errorf("Count() = %d, want 3", count) 239 + } 240 + }) 241 + 242 + t.Run("Count error", func(t *testing.T) { 243 + testErr := fmt.Errorf("test error") 244 + repo := &mockBookRepository{err: testErr} 245 + source := &BookDataSource{repo: repo} 246 + 247 + _, err := source.Count(context.Background(), ListOptions{}) 248 + if err != testErr { 249 + t.Errorf("Count() error = %v, want %v", err, testErr) 250 + } 251 + }) 252 + }) 253 + 254 + t.Run("NewBookDataList", func(t *testing.T) { 255 + repo := &mockBookRepository{ 256 + books: []*models.Book{ 257 + { 258 + ID: 1, 259 + Title: "Test Book", 260 + Author: "Test Author", 261 + Status: "reading", 262 + }, 263 + }, 264 + } 265 + 266 + opts := DataListOptions{ 267 + Output: &bytes.Buffer{}, 268 + Input: strings.NewReader("q\n"), 269 + Static: true, 270 + } 271 + 272 + list := NewBookDataList(repo, opts, "") 273 + if list == nil { 274 + t.Fatal("NewBookDataList() returned nil") 275 + } 276 + 277 + err := list.Browse(context.Background()) 278 + if err != nil { 279 + t.Errorf("Browse() failed: %v", err) 280 + } 281 + }) 282 + 283 + t.Run("NewBookListFromList", func(t *testing.T) { 284 + repo := &mockBookRepository{ 285 + books: []*models.Book{ 286 + { 287 + ID: 1, 288 + Title: "Test Book", 289 + Author: "Test Author", 290 + Status: "reading", 291 + }, 292 + }, 293 + } 294 + 295 + output := &bytes.Buffer{} 296 + input := strings.NewReader("q\n") 297 + 298 + list := NewBookListFromList(repo, output, input, true, "") 299 + if list == nil { 300 + t.Fatal("NewBookListFromList() returned nil") 301 + } 302 + 303 + err := list.Browse(context.Background()) 304 + if err != nil { 305 + t.Errorf("Browse() failed: %v", err) 306 + } 307 + 308 + outputStr := output.String() 309 + if !strings.Contains(outputStr, "Books") { 310 + t.Error("Output should contain 'Books' title") 311 + } 312 + if !strings.Contains(outputStr, "Test Book") { 313 + t.Error("Output should contain book title") 314 + } 315 + }) 316 + 317 + t.Run("Format Book for View", func(t *testing.T) { 318 + now := time.Now() 319 + started := now.Add(-time.Hour) 320 + 321 + book := &models.Book{ 322 + ID: 1, 323 + Title: "Test Book Title", 324 + Author: "Test Author", 325 + Status: "reading", 326 + Progress: 75, 327 + Pages: 250, 328 + Rating: 4.5, 329 + Notes: "This is a great book with detailed explanations.", 330 + Added: now, 331 + Started: &started, 332 + } 333 + 334 + result := formatBookForView(book) 335 + 336 + if !strings.Contains(result, "Test Book Title") { 337 + t.Error("Formatted view should contain book title") 338 + } 339 + if !strings.Contains(result, "Test Author") { 340 + t.Error("Formatted view should contain author") 341 + } 342 + if !strings.Contains(result, "Reading") { 343 + t.Error("Formatted view should contain status") 344 + } 345 + if !strings.Contains(result, "75%") { 346 + t.Error("Formatted view should contain progress") 347 + } 348 + if !strings.Contains(result, "250") { 349 + t.Error("Formatted view should contain page count") 350 + } 351 + if !strings.Contains(result, "4.5/5") { 352 + t.Error("Formatted view should contain rating") 353 + } 354 + if !strings.Contains(result, "Added:") { 355 + t.Error("Formatted view should contain added date") 356 + } 357 + if !strings.Contains(result, "Started:") { 358 + t.Error("Formatted view should contain started date") 359 + } 360 + if !strings.Contains(result, "great book with detailed") { 361 + t.Error("Formatted view should contain notes") 362 + } 363 + }) 364 + }
-304
internal/ui/book_list_test.go
··· 1 - package ui 2 - 3 - import ( 4 - "bytes" 5 - "context" 6 - "errors" 7 - "fmt" 8 - "strings" 9 - "testing" 10 - 11 - "github.com/stormlightlabs/noteleaf/internal/models" 12 - ) 13 - 14 - // MockBookService implements services.APIService for testing 15 - type MockBookService struct { 16 - searchResults []*models.Model 17 - searchError error 18 - getResult *models.Model 19 - getError error 20 - } 21 - 22 - func (m *MockBookService) Search(ctx context.Context, query string, page, limit int) ([]*models.Model, error) { 23 - if m.searchError != nil { 24 - return nil, m.searchError 25 - } 26 - return m.searchResults, nil 27 - } 28 - 29 - func (m *MockBookService) Get(ctx context.Context, id string) (*models.Model, error) { 30 - if m.getError != nil { 31 - return nil, m.getError 32 - } 33 - return m.getResult, nil 34 - } 35 - 36 - func (m *MockBookService) Check(ctx context.Context) error { return nil } 37 - func (m *MockBookService) Close() error { return nil } 38 - 39 - func TestBookList(t *testing.T) { 40 - t.Run("Options", func(t *testing.T) { 41 - t.Run("default options", func(t *testing.T) { 42 - opts := BookListOptions{} 43 - if opts.Static { 44 - t.Error("StaticMode should default to false") 45 - } 46 - }) 47 - 48 - t.Run("static mode enabled", func(t *testing.T) { 49 - var buf bytes.Buffer 50 - opts := BookListOptions{ 51 - Output: &buf, 52 - Static: true, 53 - } 54 - 55 - if !opts.Static { 56 - t.Error("StaticMode should be enabled") 57 - } 58 - if opts.Output != &buf { 59 - t.Error("Output should be set to buffer") 60 - } 61 - }) 62 - }) 63 - 64 - t.Run("Search & Select errors", func(t *testing.T) { 65 - t.Run("service search error", func(t *testing.T) { 66 - service := &MockBookService{ 67 - searchError: errors.New("API error"), 68 - } 69 - 70 - var buf bytes.Buffer 71 - 72 - bl := &BookList{ 73 - service: service, 74 - repo: nil, 75 - opts: BookListOptions{ 76 - Output: &buf, 77 - Static: true, 78 - }, 79 - } 80 - 81 - err := bl.staticSelect(context.Background(), "test query") 82 - if err == nil { 83 - t.Fatal("Expected error, got nil") 84 - } 85 - 86 - output := buf.String() 87 - if !strings.Contains(output, "Error: API error") { 88 - t.Error("Error message not displayed") 89 - } 90 - }) 91 - 92 - t.Run("no results found", func(t *testing.T) { 93 - service := &MockBookService{ 94 - searchResults: []*models.Model{}, 95 - } 96 - 97 - var buf bytes.Buffer 98 - 99 - bl := &BookList{ 100 - service: service, 101 - repo: nil, 102 - opts: BookListOptions{ 103 - Output: &buf, 104 - Static: true, 105 - }, 106 - } 107 - 108 - err := bl.staticSelect(context.Background(), "nonexistent") 109 - if err != nil { 110 - t.Fatalf("searchAndSelectStatic failed: %v", err) 111 - } 112 - 113 - output := buf.String() 114 - if !strings.Contains(output, "No books found") { 115 - t.Error("No results message not displayed") 116 - } 117 - }) 118 - 119 - t.Run("successful search display", func(t *testing.T) { 120 - book1 := &models.Book{Title: "Test Book 1", Author: "Test Author 1"} 121 - book2 := &models.Book{Title: "Test Book 2", Author: "Test Author 2"} 122 - 123 - var model1 models.Model = book1 124 - var model2 models.Model = book2 125 - 126 - service := &MockBookService{ 127 - searchResults: []*models.Model{&model1, &model2}, 128 - } 129 - 130 - var buf bytes.Buffer 131 - 132 - bl := &BookList{ 133 - service: service, 134 - // Skip repo operations for this test 135 - // repo: nil, 136 - opts: BookListOptions{ 137 - Output: &buf, 138 - Static: true, 139 - }, 140 - } 141 - 142 - results, err := bl.service.Search(context.Background(), "test query", 1, 10) 143 - if err != nil { 144 - t.Fatalf("Search failed: %v", err) 145 - } 146 - 147 - _, err = bl.opts.Output.Write([]byte("Search Results for: test query\n\n")) 148 - if err != nil { 149 - t.Fatal(err) 150 - } 151 - 152 - for i, result := range results { 153 - if book, ok := (*result).(*models.Book); ok { 154 - line := []byte{} 155 - line = append(line, fmt.Sprintf("[%d] %s", i+1, book.Title)...) 156 - if book.Author != "" { 157 - line = append(line, fmt.Sprintf(" by %s", book.Author)...) 158 - } 159 - line = append(line, '\n') 160 - _, err = bl.opts.Output.Write(line) 161 - if err != nil { 162 - t.Fatal(err) 163 - } 164 - } 165 - } 166 - 167 - output := buf.String() 168 - 169 - if !strings.Contains(output, "Search Results for: test query") { 170 - t.Error("Search results title not found") 171 - } 172 - if !strings.Contains(output, "Test Book 1 by Test Author 1") { 173 - t.Error("First book not displayed") 174 - } 175 - if !strings.Contains(output, "Test Book 2 by Test Author 2") { 176 - t.Error("Second book not displayed") 177 - } 178 - }) 179 - }) 180 - 181 - t.Run("Interactive search", func(t *testing.T) { 182 - t.Run("static mode interactive search", func(t *testing.T) { 183 - book1 := &models.Book{Title: "Interactive Book", Author: "Interactive Author"} 184 - var model1 models.Model = book1 185 - 186 - service := &MockBookService{ 187 - searchResults: []*models.Model{&model1}, 188 - } 189 - 190 - var buf bytes.Buffer 191 - 192 - bl := &BookList{ 193 - service: service, 194 - repo: nil, 195 - opts: BookListOptions{ 196 - Output: &buf, 197 - Static: true, 198 - }, 199 - } 200 - 201 - err := bl.staticSearch(context.Background()) 202 - if err != nil { 203 - t.Fatalf("InteractiveSearch failed: %v", err) 204 - } 205 - 206 - output := buf.String() 207 - 208 - if !strings.Contains(output, "Search for books: test query") { 209 - t.Error("Search prompt not displayed") 210 - } 211 - }) 212 - }) 213 - 214 - t.Run("View model", func(t *testing.T) { 215 - service := &MockBookService{} 216 - 217 - t.Run("searching state", func(t *testing.T) { 218 - model := searchModel{ 219 - query: "test", 220 - searching: true, 221 - service: service, 222 - repo: nil, 223 - } 224 - 225 - view := model.View() 226 - if !strings.Contains(view, "Searching...") { 227 - t.Error("Searching message not displayed") 228 - } 229 - }) 230 - 231 - t.Run("error state", func(t *testing.T) { 232 - model := searchModel{ 233 - query: "test", 234 - err: errors.New("test error"), 235 - service: service, 236 - repo: nil, 237 - } 238 - 239 - view := model.View() 240 - if !strings.Contains(view, "Error: test error") { 241 - t.Error("Error message not displayed") 242 - } 243 - }) 244 - 245 - t.Run("no results", func(t *testing.T) { 246 - model := searchModel{ 247 - query: "test", 248 - results: []*models.Book{}, 249 - service: service, 250 - repo: nil, 251 - } 252 - 253 - view := model.View() 254 - if !strings.Contains(view, "No books found") { 255 - t.Error("No results message not displayed") 256 - } 257 - }) 258 - 259 - t.Run("with results", func(t *testing.T) { 260 - model := searchModel{ 261 - query: "test", 262 - results: []*models.Book{ 263 - {Title: "Book 1", Author: "Author 1"}, 264 - {Title: "Book 2", Author: "Author 2"}, 265 - }, 266 - selected: 0, 267 - service: service, 268 - repo: nil, 269 - } 270 - 271 - view := model.View() 272 - if !strings.Contains(view, "Search Results for: test") { 273 - t.Error("Search results title not displayed") 274 - } 275 - if !strings.Contains(view, "Book 1 by Author 1") { 276 - t.Error("First book not displayed") 277 - } 278 - if !strings.Contains(view, "Book 2 by Author 2") { 279 - t.Error("Second book not displayed") 280 - } 281 - if !strings.Contains(view, "Use โ†‘/โ†“ to navigate") { 282 - t.Error("Navigation instructions not displayed") 283 - } 284 - }) 285 - 286 - t.Run("confirmed state", func(t *testing.T) { 287 - book := &models.Book{Title: "Added Book", Author: "Added Author"} 288 - model := searchModel{ 289 - query: "test", 290 - confirmed: true, 291 - addedBook: book, 292 - results: []*models.Book{book}, 293 - service: service, 294 - repo: nil, 295 - } 296 - 297 - view := model.View() 298 - expected := "โœ“ Added book: Added Book by Added Author" 299 - if !strings.Contains(view, expected) { 300 - t.Errorf("Confirmation message not displayed correctly.\nExpected: %q\nActual: %q", expected, view) 301 - } 302 - }) 303 - }) 304 - }
+7
internal/ui/colors.go
··· 8 8 "image/color" 9 9 "slices" 10 10 11 + "github.com/charmbracelet/lipgloss" 11 12 "github.com/lucasb-eyer/go-colorful" 13 + ) 14 + 15 + var ( 16 + TitleColorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("212")).Bold(true) 17 + SelectedColorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("0")).Background(lipgloss.Color("212")) 18 + HeaderColorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color("240")).Bold(true) 12 19 ) 13 20 14 21 var _ color.Color = Key(0)
-6
internal/ui/data_list_test.go
··· 311 311 312 312 t.Run("Model", func(t *testing.T) { 313 313 t.Run("initial model state", func(t *testing.T) { 314 - source := &MockListSource{items: createMockItems()} 315 - keys := DefaultDataListKeys() 316 - 317 314 model := dataListModel{ 318 - source: source, 319 315 opts: DataListOptions{ 320 316 Title: "Test", 321 317 }, 322 - keys: keys, 323 - help: help.New(), 324 318 loading: true, 325 319 } 326 320
+11 -44
internal/ui/data_table_test.go
··· 18 18 fields map[string]any 19 19 } 20 20 21 - func (m MockDataRecord) GetID() int64 { 22 - return 1 // Mock ID 23 - } 24 - 25 - func (m MockDataRecord) SetID(id int64) { 26 - // Mock - no-op 27 - } 28 - 29 - func (m MockDataRecord) GetTableName() string { 30 - return "mock_records" 31 - } 32 - 33 - func (m MockDataRecord) GetCreatedAt() time.Time { 34 - return time.Time{} // Mock - zero time 35 - } 36 - 37 - func (m MockDataRecord) SetCreatedAt(t time.Time) { 38 - // Mock - no-op 39 - } 40 - 41 - func (m MockDataRecord) GetUpdatedAt() time.Time { 42 - return time.Time{} // Mock - zero time 43 - } 44 - 45 - func (m MockDataRecord) SetUpdatedAt(t time.Time) { 46 - // Mock - no-op 47 - } 48 - 49 - func (m MockDataRecord) GetField(name string) any { 50 - return m.fields[name] 51 - } 21 + func (m MockDataRecord) GetID() int64 { return 1 } 22 + func (m MockDataRecord) SetID(id int64) {} 23 + func (m MockDataRecord) GetTableName() string { return "mock_records" } 24 + func (m MockDataRecord) GetCreatedAt() time.Time { return time.Time{} } 25 + func (m MockDataRecord) SetCreatedAt(t time.Time) {} 26 + func (m MockDataRecord) GetUpdatedAt() time.Time { return time.Time{} } 27 + func (m MockDataRecord) SetUpdatedAt(t time.Time) {} 28 + func (m MockDataRecord) GetField(name string) any { return m.fields[name] } 52 29 53 30 func NewMockRecord(id int64, fields map[string]any) MockDataRecord { 54 - return MockDataRecord{ 55 - fields: fields, 56 - } 31 + return MockDataRecord{fields: fields} 57 32 } 58 33 59 34 type MockDataSource struct { ··· 299 274 300 275 t.Run("Model", func(t *testing.T) { 301 276 t.Run("initial model state", func(t *testing.T) { 302 - source := &MockDataSource{records: createMockRecords()} 303 - keys := DefaultDataTableKeys() 304 - 305 277 model := dataTableModel{ 306 - source: source, 307 278 opts: DataTableOptions{ 308 279 Fields: createTestFields(), 309 280 }, 310 - keys: keys, 311 - help: help.New(), 312 281 loading: true, 313 282 } 314 283 ··· 907 876 908 877 t.Run("Field", func(t *testing.T) { 909 878 t.Run("field without formatter", func(t *testing.T) { 910 - field := Field{Name: "test", Title: "Test", Width: 10} 879 + field := Field{Name: "test"} 911 880 912 881 record := NewMockRecord(1, map[string]interface{}{ 913 882 "test": "value", ··· 923 892 924 893 t.Run("field with formatter", func(t *testing.T) { 925 894 field := Field{ 926 - Name: "test", 927 - Title: "Test", 928 - Width: 10, 895 + Name: "test", 929 896 Formatter: func(v interface{}) string { 930 897 return strings.ToUpper(fmt.Sprintf("%v", v)) 931 898 },
-318
internal/ui/note_list.go
··· 1 - package ui 2 - 3 - import ( 4 - "context" 5 - "fmt" 6 - "io" 7 - "os" 8 - "strings" 9 - 10 - tea "github.com/charmbracelet/bubbletea" 11 - "github.com/charmbracelet/glamour" 12 - "github.com/charmbracelet/lipgloss" 13 - "github.com/stormlightlabs/noteleaf/internal/models" 14 - "github.com/stormlightlabs/noteleaf/internal/repo" 15 - ) 16 - 17 - // NoteListOptions configures the note list UI behavior 18 - type NoteListOptions struct { 19 - // Output destination (stdout for interactive, buffer for testing) 20 - Output io.Writer 21 - // Input source (stdin for interactive, strings reader for testing) 22 - Input io.Reader 23 - // Enable static mode (no interactive components) 24 - Static bool 25 - // Show archived notes 26 - ShowArchived bool 27 - // Filter by tags 28 - Tags []string 29 - } 30 - 31 - // NoteList handles note browsing and viewing UI 32 - type NoteList struct { 33 - repo *repo.NoteRepository 34 - opts NoteListOptions 35 - } 36 - 37 - // NewNoteList creates a new note list UI component 38 - func NewNoteList(repo *repo.NoteRepository, opts NoteListOptions) *NoteList { 39 - if opts.Output == nil { 40 - opts.Output = os.Stdout 41 - } 42 - if opts.Input == nil { 43 - opts.Input = os.Stdin 44 - } 45 - return &NoteList{repo: repo, opts: opts} 46 - } 47 - 48 - type noteListModel struct { 49 - notes []*models.Note 50 - selected int 51 - viewing bool 52 - viewContent string 53 - err error 54 - repo *repo.NoteRepository 55 - opts NoteListOptions 56 - currentPage int 57 - } 58 - 59 - type notesLoadedMsg []*models.Note 60 - type noteViewMsg string 61 - type errorNoteMsg error 62 - 63 - func (m noteListModel) Init() tea.Cmd { 64 - return m.loadNotes() 65 - } 66 - 67 - func (m noteListModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { 68 - switch msg := msg.(type) { 69 - case tea.KeyMsg: 70 - if m.viewing { 71 - switch msg.String() { 72 - case "q", "esc", "backspace": 73 - m.viewing = false 74 - m.viewContent = "" 75 - return m, nil 76 - } 77 - return m, nil 78 - } 79 - 80 - switch msg.String() { 81 - case "ctrl+c", "q": 82 - return m, tea.Quit 83 - case "up", "k": 84 - if m.selected > 0 { 85 - m.selected-- 86 - } 87 - case "down", "j": 88 - if m.selected < len(m.notes)-1 { 89 - m.selected++ 90 - } 91 - case "enter", "v": 92 - if len(m.notes) > 0 && m.selected < len(m.notes) { 93 - return m, m.viewNote(m.notes[m.selected]) 94 - } 95 - case "r": 96 - return m, m.loadNotes() 97 - } 98 - case notesLoadedMsg: 99 - m.notes = []*models.Note(msg) 100 - case noteViewMsg: 101 - m.viewContent = string(msg) 102 - m.viewing = true 103 - case errorNoteMsg: 104 - m.err = error(msg) 105 - } 106 - return m, nil 107 - } 108 - 109 - func (m noteListModel) View() string { 110 - var s strings.Builder 111 - 112 - style := lipgloss.NewStyle().Foreground(lipgloss.Color("86")) 113 - titleStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("205")).Bold(true) 114 - selectedStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("212")).Bold(true) 115 - headerStyle := lipgloss.NewStyle().Foreground(lipgloss.Color("39")).Bold(true) 116 - 117 - if m.viewing { 118 - s.WriteString(m.viewContent) 119 - s.WriteString("\n\n") 120 - s.WriteString(style.Render("Press q/esc/backspace to return to list")) 121 - return s.String() 122 - } 123 - 124 - s.WriteString(titleStyle.Render("Notes")) 125 - s.WriteString("\n\n") 126 - 127 - if m.err != nil { 128 - s.WriteString(fmt.Sprintf("Error: %s", m.err)) 129 - return s.String() 130 - } 131 - 132 - if len(m.notes) == 0 { 133 - s.WriteString("No notes found") 134 - s.WriteString("\n\n") 135 - s.WriteString(style.Render("Press r to refresh, q to quit")) 136 - return s.String() 137 - } 138 - 139 - headerLine := fmt.Sprintf("%-4s %-30s %-20s %-15s", "ID", "Title", "Tags", "Modified") 140 - s.WriteString(headerStyle.Render(headerLine)) 141 - s.WriteString("\n") 142 - s.WriteString(headerStyle.Render(strings.Repeat("โ”€", 70))) 143 - s.WriteString("\n") 144 - 145 - for i, note := range m.notes { 146 - prefix := " " 147 - if i == m.selected { 148 - prefix = "> " 149 - } 150 - 151 - title := note.Title 152 - if len(title) > 28 { 153 - title = title[:25] + "..." 154 - } 155 - 156 - tags := "" 157 - if len(note.Tags) > 0 { 158 - tags = strings.Join(note.Tags, ", ") 159 - if len(tags) > 18 { 160 - tags = tags[:15] + "..." 161 - } 162 - } 163 - 164 - modified := note.Modified.Format("2006-01-02 15:04") 165 - 166 - line := fmt.Sprintf("%s%-4d %-30s %-20s %-15s", 167 - prefix, note.ID, title, tags, modified) 168 - 169 - if i == m.selected { 170 - s.WriteString(selectedStyle.Render(line)) 171 - } else { 172 - s.WriteString(style.Render(line)) 173 - } 174 - s.WriteString("\n") 175 - } 176 - 177 - s.WriteString("\n") 178 - s.WriteString(style.Render("Use โ†‘/โ†“ to navigate, Enter/v to view, r to refresh, q to quit")) 179 - 180 - return s.String() 181 - } 182 - 183 - func (m noteListModel) loadNotes() tea.Cmd { 184 - return func() tea.Msg { 185 - opts := repo.NoteListOptions{ 186 - Tags: m.opts.Tags, 187 - } 188 - if !m.opts.ShowArchived { 189 - archived := false 190 - opts.Archived = &archived 191 - } 192 - 193 - notes, err := m.repo.List(context.Background(), opts) 194 - if err != nil { 195 - return errorNoteMsg(err) 196 - } 197 - 198 - return notesLoadedMsg(notes) 199 - } 200 - } 201 - 202 - func (m noteListModel) viewNote(note *models.Note) tea.Cmd { 203 - return func() tea.Msg { 204 - renderer, err := glamour.NewTermRenderer( 205 - glamour.WithAutoStyle(), 206 - glamour.WithWordWrap(80), 207 - ) 208 - if err != nil { 209 - return errorNoteMsg(fmt.Errorf("failed to create markdown renderer: %w", err)) 210 - } 211 - 212 - content := m.formatNoteForView(note) 213 - rendered, err := renderer.Render(content) 214 - if err != nil { 215 - return errorNoteMsg(fmt.Errorf("failed to render markdown: %w", err)) 216 - } 217 - 218 - return noteViewMsg(rendered) 219 - } 220 - } 221 - 222 - func (m noteListModel) formatNoteForView(note *models.Note) string { 223 - var content strings.Builder 224 - 225 - content.WriteString("# " + note.Title + "\n\n") 226 - 227 - if len(note.Tags) > 0 { 228 - content.WriteString("**Tags:** ") 229 - for i, tag := range note.Tags { 230 - if i > 0 { 231 - content.WriteString(", ") 232 - } 233 - content.WriteString("`" + tag + "`") 234 - } 235 - content.WriteString("\n\n") 236 - } 237 - 238 - content.WriteString("**Created:** " + note.Created.Format("2006-01-02 15:04") + "\n") 239 - content.WriteString("**Modified:** " + note.Modified.Format("2006-01-02 15:04") + "\n\n") 240 - content.WriteString("---\n\n") 241 - 242 - noteContent := strings.TrimSpace(note.Content) 243 - if !strings.HasPrefix(noteContent, "# ") { 244 - content.WriteString(noteContent) 245 - } else { 246 - lines := strings.Split(noteContent, "\n") 247 - if len(lines) > 1 { 248 - content.WriteString(strings.Join(lines[1:], "\n")) 249 - } 250 - } 251 - 252 - return content.String() 253 - } 254 - 255 - // Browse opens an interactive TUI for navigating and viewing notes 256 - func (nl *NoteList) Browse(ctx context.Context) error { 257 - if nl.opts.Static { 258 - return nl.staticList(ctx) 259 - } 260 - 261 - model := noteListModel{ 262 - repo: nl.repo, 263 - opts: nl.opts, 264 - currentPage: 1, 265 - } 266 - 267 - program := tea.NewProgram(model, tea.WithInput(nl.opts.Input), tea.WithOutput(nl.opts.Output)) 268 - 269 - _, err := program.Run() 270 - return err 271 - } 272 - 273 - func (nl *NoteList) staticList(ctx context.Context) error { 274 - opts := repo.NoteListOptions{ 275 - Tags: nl.opts.Tags, 276 - } 277 - if !nl.opts.ShowArchived { 278 - archived := false 279 - opts.Archived = &archived 280 - } 281 - 282 - notes, err := nl.repo.List(ctx, opts) 283 - if err != nil { 284 - fmt.Fprintf(nl.opts.Output, "Error: %s\n", err) 285 - return err 286 - } 287 - 288 - fmt.Fprintf(nl.opts.Output, "Notes\n\n") 289 - 290 - if len(notes) == 0 { 291 - fmt.Fprintf(nl.opts.Output, "No notes found\n") 292 - return nil 293 - } 294 - 295 - fmt.Fprintf(nl.opts.Output, "%-4s %-30s %-20s %-15s\n", "ID", "Title", "Tags", "Modified") 296 - fmt.Fprintf(nl.opts.Output, "%s\n", strings.Repeat("โ”€", 70)) 297 - 298 - for _, note := range notes { 299 - title := note.Title 300 - if len(title) > 28 { 301 - title = title[:25] + "..." 302 - } 303 - 304 - tags := "" 305 - if len(note.Tags) > 0 { 306 - tags = strings.Join(note.Tags, ", ") 307 - if len(tags) > 18 { 308 - tags = tags[:15] + "..." 309 - } 310 - } 311 - 312 - modified := note.Modified.Format("2006-01-02 15:04") 313 - 314 - fmt.Fprintf(nl.opts.Output, "%-4d %-30s %-20s %-15s\n", note.ID, title, tags, modified) 315 - } 316 - 317 - return nil 318 - }
+206
internal/ui/note_list_adapter.go
··· 1 + package ui 2 + 3 + import ( 4 + "context" 5 + "io" 6 + "strings" 7 + 8 + "github.com/charmbracelet/glamour" 9 + "github.com/stormlightlabs/noteleaf/internal/models" 10 + "github.com/stormlightlabs/noteleaf/internal/repo" 11 + "github.com/stormlightlabs/noteleaf/internal/utils" 12 + ) 13 + 14 + // NoteRecord adapts models.Note to work with DataList (since notes work better as a list than table) 15 + type NoteRecord struct { 16 + *models.Note 17 + } 18 + 19 + func (n *NoteRecord) GetField(name string) any { 20 + switch name { 21 + case "id": 22 + return n.ID 23 + case "title": 24 + return n.Title 25 + case "content": 26 + return n.Content 27 + case "tags": 28 + return n.Tags 29 + case "archived": 30 + return n.Archived 31 + case "created": 32 + return n.Created 33 + case "modified": 34 + return n.Modified 35 + case "file_path": 36 + return n.FilePath 37 + default: 38 + return "" 39 + } 40 + } 41 + 42 + func (n *NoteRecord) GetTitle() string { 43 + return n.Title 44 + } 45 + 46 + func (n *NoteRecord) GetDescription() string { 47 + // Create a short description from tags and modification time 48 + var parts []string 49 + 50 + if len(n.Tags) > 0 { 51 + parts = append(parts, strings.Join(n.Tags, ", ")) 52 + } 53 + 54 + parts = append(parts, "Modified: "+n.Modified.Format("2006-01-02 15:04")) 55 + 56 + return strings.Join(parts, " โ€ข ") 57 + } 58 + 59 + func (n *NoteRecord) GetFilterValue() string { 60 + // Make notes searchable by title, content, and tags 61 + searchable := []string{n.Title, n.Content} 62 + searchable = append(searchable, n.Tags...) 63 + return strings.Join(searchable, " ") 64 + } 65 + 66 + // NoteDataSource adapts NoteRepository to work with DataList 67 + type NoteDataSource struct { 68 + repo utils.TestNoteRepository 69 + showArchived bool 70 + tags []string 71 + } 72 + 73 + func (n *NoteDataSource) Load(ctx context.Context, opts ListOptions) ([]ListItem, error) { 74 + repoOpts := repo.NoteListOptions{ 75 + Tags: n.tags, 76 + } 77 + 78 + if !n.showArchived { 79 + archived := false 80 + repoOpts.Archived = &archived 81 + } 82 + 83 + // Apply search filter if provided 84 + if opts.Search != "" { 85 + repoOpts.Content = opts.Search // Search in content 86 + } 87 + 88 + if opts.Limit > 0 { 89 + repoOpts.Limit = opts.Limit 90 + } 91 + 92 + notes, err := n.repo.List(ctx, repoOpts) 93 + if err != nil { 94 + return nil, err 95 + } 96 + 97 + items := make([]ListItem, len(notes)) 98 + for i, note := range notes { 99 + items[i] = &NoteRecord{Note: note} 100 + } 101 + 102 + return items, nil 103 + } 104 + 105 + func (n *NoteDataSource) Count(ctx context.Context, opts ListOptions) (int, error) { 106 + // For simplicity, load all and count (could be optimized with a separate Count method) 107 + items, err := n.Load(ctx, opts) 108 + if err != nil { 109 + return 0, err 110 + } 111 + return len(items), nil 112 + } 113 + 114 + func (n *NoteDataSource) Search(ctx context.Context, query string, opts ListOptions) ([]ListItem, error) { 115 + // Set search in options and use regular Load 116 + opts.Search = query 117 + return n.Load(ctx, opts) 118 + } 119 + 120 + // NewNoteDataList creates a new DataList for browsing notes 121 + func NewNoteDataList(repo utils.TestNoteRepository, opts DataListOptions, showArchived bool, tags []string) *DataList { 122 + if opts.Title == "" { 123 + opts.Title = "Notes" 124 + } 125 + 126 + // Enable search functionality for notes 127 + opts.ShowSearch = true 128 + opts.Searchable = true 129 + 130 + // Set up view handler for markdown rendering 131 + if opts.ViewHandler == nil { 132 + opts.ViewHandler = func(item ListItem) string { 133 + if noteRecord, ok := item.(*NoteRecord); ok { 134 + return formatNoteForView(noteRecord.Note) 135 + } 136 + return "Unable to display note" 137 + } 138 + } 139 + 140 + source := &NoteDataSource{ 141 + repo: repo, 142 + showArchived: showArchived, 143 + tags: tags, 144 + } 145 + 146 + return NewDataList(source, opts) 147 + } 148 + 149 + // NewNoteListFromList creates a NoteList-compatible interface using DataList 150 + func NewNoteListFromList(repo utils.TestNoteRepository, output io.Writer, input io.Reader, static bool, showArchived bool, tags []string) *DataList { 151 + opts := DataListOptions{ 152 + Output: output, 153 + Input: input, 154 + Static: static, 155 + Title: "Notes", 156 + } 157 + return NewNoteDataList(repo, opts, showArchived, tags) 158 + } 159 + 160 + // formatNoteForView formats a note for display (similar to original implementation) 161 + func formatNoteForView(note *models.Note) string { 162 + var content strings.Builder 163 + 164 + content.WriteString("# " + note.Title + "\n\n") 165 + 166 + if len(note.Tags) > 0 { 167 + content.WriteString("**Tags:** ") 168 + for i, tag := range note.Tags { 169 + if i > 0 { 170 + content.WriteString(", ") 171 + } 172 + content.WriteString("`" + tag + "`") 173 + } 174 + content.WriteString("\n\n") 175 + } 176 + 177 + content.WriteString("**Created:** " + note.Created.Format("2006-01-02 15:04") + "\n") 178 + content.WriteString("**Modified:** " + note.Modified.Format("2006-01-02 15:04") + "\n\n") 179 + content.WriteString("---\n\n") 180 + 181 + noteContent := strings.TrimSpace(note.Content) 182 + if !strings.HasPrefix(noteContent, "# ") { 183 + content.WriteString(noteContent) 184 + } else { 185 + lines := strings.Split(noteContent, "\n") 186 + if len(lines) > 1 { 187 + content.WriteString(strings.Join(lines[1:], "\n")) 188 + } 189 + } 190 + 191 + // Render markdown 192 + renderer, err := glamour.NewTermRenderer( 193 + glamour.WithAutoStyle(), 194 + glamour.WithWordWrap(80), 195 + ) 196 + if err != nil { 197 + return content.String() // Return unrendered if glamour fails 198 + } 199 + 200 + rendered, err := renderer.Render(content.String()) 201 + if err != nil { 202 + return content.String() // Return unrendered if rendering fails 203 + } 204 + 205 + return rendered 206 + }
+361
internal/ui/note_list_adapter_test.go
··· 1 + package ui 2 + 3 + import ( 4 + "bytes" 5 + "context" 6 + "fmt" 7 + "slices" 8 + "strings" 9 + "testing" 10 + "time" 11 + 12 + "github.com/stormlightlabs/noteleaf/internal/models" 13 + "github.com/stormlightlabs/noteleaf/internal/repo" 14 + ) 15 + 16 + type mockNoteRepository struct { 17 + notes []*models.Note 18 + err error 19 + } 20 + 21 + func (m *mockNoteRepository) List(ctx context.Context, options repo.NoteListOptions) ([]*models.Note, error) { 22 + if m.err != nil { 23 + return nil, m.err 24 + } 25 + 26 + var filtered []*models.Note 27 + for _, note := range m.notes { 28 + if options.Archived != nil && note.Archived != *options.Archived { 29 + continue 30 + } 31 + 32 + if len(options.Tags) > 0 { 33 + hasTag := false 34 + for _, filterTag := range options.Tags { 35 + if slices.Contains(note.Tags, filterTag) { 36 + hasTag = true 37 + break 38 + } 39 + } 40 + if !hasTag { 41 + continue 42 + } 43 + } 44 + 45 + // Filter by content search 46 + if options.Content != "" && !strings.Contains(note.Content, options.Content) { 47 + continue 48 + } 49 + 50 + filtered = append(filtered, note) 51 + 52 + if options.Limit > 0 && len(filtered) >= options.Limit { 53 + break 54 + } 55 + } 56 + 57 + return filtered, nil 58 + } 59 + 60 + func TestNoteAdapter(t *testing.T) { 61 + t.Run("NoteRecord", func(t *testing.T) { 62 + note := &models.Note{ 63 + ID: 1, 64 + Title: "Test Note", 65 + Content: "This is test content", 66 + Tags: []string{"work", "important"}, 67 + Archived: false, 68 + Created: time.Date(2023, 1, 1, 12, 0, 0, 0, time.UTC), 69 + Modified: time.Date(2023, 1, 2, 12, 0, 0, 0, time.UTC), 70 + FilePath: "/path/to/note.md", 71 + } 72 + record := &NoteRecord{Note: note} 73 + 74 + t.Run("GetField", func(t *testing.T) { 75 + tests := []struct { 76 + field string 77 + expected any 78 + name string 79 + }{ 80 + {"id", int64(1), "should return note ID"}, 81 + {"title", "Test Note", "should return note title"}, 82 + {"content", "This is test content", "should return note content"}, 83 + {"tags", []string{"work", "important"}, "should return note tags"}, 84 + {"archived", false, "should return archived status"}, 85 + {"unknown", "", "should return empty string for unknown field"}, 86 + } 87 + 88 + for _, tt := range tests { 89 + t.Run(tt.name, func(t *testing.T) { 90 + result := record.GetField(tt.field) 91 + // For slices, do a deep comparison 92 + if tags, ok := tt.expected.([]string); ok { 93 + resultTags, ok := result.([]string) 94 + if !ok || len(resultTags) != len(tags) { 95 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 96 + return 97 + } 98 + for i, tag := range tags { 99 + if resultTags[i] != tag { 100 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 101 + return 102 + } 103 + } 104 + } else if result != tt.expected { 105 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 106 + } 107 + }) 108 + } 109 + }) 110 + 111 + t.Run("ListItem methods", func(t *testing.T) { 112 + if record.GetTitle() != "Test Note" { 113 + t.Errorf("GetTitle() = %q, want 'Test Note'", record.GetTitle()) 114 + } 115 + 116 + description := record.GetDescription() 117 + if !strings.Contains(description, "work, important") { 118 + t.Errorf("GetDescription() should contain tags, got: %s", description) 119 + } 120 + if !strings.Contains(description, "2023-01-02 12:00") { 121 + t.Errorf("GetDescription() should contain modified time, got: %s", description) 122 + } 123 + 124 + filterValue := record.GetFilterValue() 125 + if !strings.Contains(filterValue, "Test Note") || !strings.Contains(filterValue, "work") { 126 + t.Errorf("GetFilterValue() should contain title and tags, got: %s", filterValue) 127 + } 128 + }) 129 + 130 + t.Run("Model interface", func(t *testing.T) { 131 + if record.GetID() != 1 { 132 + t.Errorf("GetID() = %d, want 1", record.GetID()) 133 + } 134 + 135 + if record.GetTableName() != "notes" { 136 + t.Errorf("GetTableName() = %q, want 'notes'", record.GetTableName()) 137 + } 138 + }) 139 + }) 140 + 141 + t.Run("NoteDataSource", func(t *testing.T) { 142 + notes := []*models.Note{ 143 + { 144 + ID: 1, 145 + Title: "Work Note", 146 + Content: "Work content", 147 + Tags: []string{"work"}, 148 + Archived: false, 149 + Created: time.Now(), 150 + Modified: time.Now(), 151 + }, 152 + { 153 + ID: 2, 154 + Title: "Personal Note", 155 + Content: "Personal content", 156 + Tags: []string{"personal"}, 157 + Archived: false, 158 + Created: time.Now(), 159 + Modified: time.Now(), 160 + }, 161 + { 162 + ID: 3, 163 + Title: "Archived Note", 164 + Content: "Archived content", 165 + Tags: []string{"old"}, 166 + Archived: true, 167 + Created: time.Now(), 168 + Modified: time.Now(), 169 + }, 170 + } 171 + 172 + t.Run("Load", func(t *testing.T) { 173 + repo := &mockNoteRepository{notes: notes} 174 + source := &NoteDataSource{repo: repo, showArchived: true} 175 + 176 + items, err := source.Load(context.Background(), ListOptions{}) 177 + if err != nil { 178 + t.Fatalf("Load() failed: %v", err) 179 + } 180 + 181 + if len(items) != 3 { 182 + t.Errorf("Load() returned %d items, want 3", len(items)) 183 + } 184 + 185 + // Check first item 186 + if items[0].GetTitle() != "Work Note" { 187 + t.Errorf("First item title = %q, want 'Work Note'", items[0].GetTitle()) 188 + } 189 + }) 190 + 191 + t.Run("Load with archived filter", func(t *testing.T) { 192 + repo := &mockNoteRepository{notes: notes} 193 + source := &NoteDataSource{repo: repo, showArchived: false} 194 + 195 + items, err := source.Load(context.Background(), ListOptions{}) 196 + if err != nil { 197 + t.Fatalf("Load() failed: %v", err) 198 + } 199 + 200 + if len(items) != 2 { 201 + t.Errorf("Load() with archived=false returned %d items, want 2", len(items)) 202 + } 203 + }) 204 + 205 + t.Run("Load with tag filter", func(t *testing.T) { 206 + repo := &mockNoteRepository{notes: notes} 207 + source := &NoteDataSource{repo: repo, showArchived: true, tags: []string{"work"}} 208 + 209 + items, err := source.Load(context.Background(), ListOptions{}) 210 + if err != nil { 211 + t.Fatalf("Load() failed: %v", err) 212 + } 213 + 214 + if len(items) != 1 { 215 + t.Errorf("Load() with tags filter returned %d items, want 1", len(items)) 216 + } 217 + if items[0].GetTitle() != "Work Note" { 218 + t.Errorf("Filtered item title = %q, want 'Work Note'", items[0].GetTitle()) 219 + } 220 + }) 221 + 222 + t.Run("Search", func(t *testing.T) { 223 + repo := &mockNoteRepository{notes: notes} 224 + source := &NoteDataSource{repo: repo, showArchived: true} 225 + 226 + items, err := source.Search(context.Background(), "Work", ListOptions{}) 227 + if err != nil { 228 + t.Fatalf("Search() failed: %v", err) 229 + } 230 + 231 + if len(items) != 1 { 232 + t.Errorf("Search() returned %d items, want 1", len(items)) 233 + } 234 + if items[0].GetTitle() != "Work Note" { 235 + t.Errorf("Search result title = %q, want 'Work Note'", items[0].GetTitle()) 236 + } 237 + }) 238 + 239 + t.Run("Load error", func(t *testing.T) { 240 + testErr := fmt.Errorf("test error") 241 + repo := &mockNoteRepository{err: testErr} 242 + source := &NoteDataSource{repo: repo} 243 + 244 + _, err := source.Load(context.Background(), ListOptions{}) 245 + if err != testErr { 246 + t.Errorf("Load() error = %v, want %v", err, testErr) 247 + } 248 + }) 249 + 250 + t.Run("Count", func(t *testing.T) { 251 + repo := &mockNoteRepository{notes: notes} 252 + source := &NoteDataSource{repo: repo, showArchived: true} 253 + 254 + count, err := source.Count(context.Background(), ListOptions{}) 255 + if err != nil { 256 + t.Fatalf("Count() failed: %v", err) 257 + } 258 + 259 + if count != 3 { 260 + t.Errorf("Count() = %d, want 3", count) 261 + } 262 + }) 263 + }) 264 + 265 + t.Run("NewNoteDataList", func(t *testing.T) { 266 + repo := &mockNoteRepository{ 267 + notes: []*models.Note{ 268 + { 269 + ID: 1, 270 + Title: "Test Note", 271 + Content: "Test content", 272 + Tags: []string{"test"}, 273 + Archived: false, 274 + Created: time.Now(), 275 + Modified: time.Now(), 276 + }, 277 + }, 278 + } 279 + 280 + opts := DataListOptions{ 281 + Output: &bytes.Buffer{}, 282 + Input: strings.NewReader("q\n"), 283 + Static: true, 284 + } 285 + 286 + list := NewNoteDataList(repo, opts, false, nil) 287 + if list == nil { 288 + t.Fatal("NewNoteDataList() returned nil") 289 + } 290 + 291 + err := list.Browse(context.Background()) 292 + if err != nil { 293 + t.Errorf("Browse() failed: %v", err) 294 + } 295 + }) 296 + 297 + t.Run("NewNoteListFromList", func(t *testing.T) { 298 + repo := &mockNoteRepository{ 299 + notes: []*models.Note{ 300 + { 301 + ID: 1, 302 + Title: "Test Note", 303 + Content: "Test content", 304 + Tags: []string{"test"}, 305 + Archived: false, 306 + Created: time.Now(), 307 + Modified: time.Now(), 308 + }, 309 + }, 310 + } 311 + 312 + output := &bytes.Buffer{} 313 + input := strings.NewReader("q\n") 314 + 315 + list := NewNoteListFromList(repo, output, input, true, false, nil) 316 + if list == nil { 317 + t.Fatal("NewNoteListFromList() returned nil") 318 + } 319 + 320 + err := list.Browse(context.Background()) 321 + if err != nil { 322 + t.Errorf("Browse() failed: %v", err) 323 + } 324 + 325 + outputStr := output.String() 326 + if !strings.Contains(outputStr, "Notes") { 327 + t.Error("Output should contain 'Notes' title") 328 + } 329 + if !strings.Contains(outputStr, "Test Note") { 330 + t.Error("Output should contain note title") 331 + } 332 + }) 333 + 334 + t.Run("Format Note for View", func(t *testing.T) { 335 + note := &models.Note{ 336 + ID: 1, 337 + Title: "Test Note", 338 + Content: "# Test Note\n\nThis is the content.", 339 + Tags: []string{"test", "example"}, 340 + Archived: false, 341 + Created: time.Date(2023, 1, 1, 12, 0, 0, 0, time.UTC), 342 + Modified: time.Date(2023, 1, 2, 12, 0, 0, 0, time.UTC), 343 + } 344 + 345 + result := formatNoteForView(note) 346 + 347 + // Check that it contains expected elements 348 + if !strings.Contains(result, "Test Note") { 349 + t.Error("Formatted view should contain note title") 350 + } 351 + if !strings.Contains(result, "test") { 352 + t.Error("Formatted view should contain tags") 353 + } 354 + if !strings.Contains(result, "2023-01-01") { 355 + t.Error("Formatted view should contain created date") 356 + } 357 + if !strings.Contains(result, "2023-01-02") { 358 + t.Error("Formatted view should contain modified date") 359 + } 360 + }) 361 + }
-292
internal/ui/note_list_test.go
··· 1 - package ui 2 - 3 - import ( 4 - "bytes" 5 - "context" 6 - "database/sql" 7 - "errors" 8 - "strings" 9 - "testing" 10 - "time" 11 - 12 - _ "github.com/mattn/go-sqlite3" 13 - "github.com/stormlightlabs/noteleaf/internal/models" 14 - "github.com/stormlightlabs/noteleaf/internal/repo" 15 - ) 16 - 17 - // newTestNoteRepo sets up an in-memory SQLite database and returns a [repo.NoteRepository]. 18 - func newTestNoteRepo(t *testing.T) (*repo.NoteRepository, func()) { 19 - t.Helper() 20 - 21 - db, err := sql.Open("sqlite3", ":memory:") 22 - if err != nil { 23 - t.Fatalf("Failed to open in-memory database: %v", err) 24 - } 25 - 26 - // Schema based on [models.Note] and observed errors 27 - createTableSQL := ` 28 - CREATE TABLE notes ( 29 - id INTEGER PRIMARY KEY AUTOINCREMENT, 30 - title TEXT NOT NULL, 31 - content TEXT, 32 - tags TEXT, 33 - created DATETIME NOT NULL, 34 - modified DATETIME NOT NULL, 35 - archived BOOLEAN NOT NULL DEFAULT 0, 36 - file_path TEXT 37 - );` 38 - if _, err := db.Exec(createTableSQL); err != nil { 39 - t.Fatalf("Failed to create notes table: %v", err) 40 - } 41 - 42 - noteRepo := repo.NewNoteRepository(db) 43 - 44 - cleanup := func() { 45 - db.Close() 46 - } 47 - 48 - return noteRepo, cleanup 49 - } 50 - 51 - func TestNoteListOptions(t *testing.T) { 52 - t.Run("default options", func(t *testing.T) { 53 - repo, cleanup := newTestNoteRepo(t) 54 - defer cleanup() 55 - 56 - nl := NewNoteList(repo, NoteListOptions{}) 57 - if nl.opts.Static { 58 - t.Error("Static should default to false") 59 - } 60 - }) 61 - 62 - t.Run("custom options", func(t *testing.T) { 63 - repo, cleanup := newTestNoteRepo(t) 64 - defer cleanup() 65 - 66 - var buf bytes.Buffer 67 - var in strings.Reader 68 - 69 - opts := NoteListOptions{ 70 - Output: &buf, 71 - Input: &in, 72 - Static: true, 73 - } 74 - 75 - nl := NewNoteList(repo, opts) 76 - 77 - if !nl.opts.Static { 78 - t.Error("Static should be true") 79 - } 80 - if nl.opts.Output != &buf { 81 - t.Error("Output should be set to buffer") 82 - } 83 - if nl.opts.Input != &in { 84 - t.Error("Input should be set to reader") 85 - } 86 - }) 87 - } 88 - 89 - func TestStaticList(t *testing.T) { 90 - ctx := context.Background() 91 - 92 - t.Run("no notes", func(t *testing.T) { 93 - repo, cleanup := newTestNoteRepo(t) 94 - defer cleanup() 95 - 96 - var buf bytes.Buffer 97 - nl := NewNoteList(repo, NoteListOptions{ 98 - Output: &buf, 99 - Static: true, 100 - }) 101 - 102 - err := nl.Browse(ctx) 103 - if err != nil { 104 - t.Fatalf("Browse failed: %v", err) 105 - } 106 - 107 - output := buf.String() 108 - if !strings.Contains(output, "No notes found") { 109 - t.Errorf("Expected 'No notes found', got %q", output) 110 - } 111 - }) 112 - 113 - t.Run("with notes", func(t *testing.T) { 114 - repo, cleanup := newTestNoteRepo(t) 115 - defer cleanup() 116 - 117 - // Create some instances of [models.Note] 118 - note1 := &models.Note{Title: "Test Note 1", Content: "Content 1", Tags: []string{"t1"}, Created: time.Now(), Modified: time.Now()} 119 - note2 := &models.Note{Title: "Test Note 2", Content: "Content 2", Tags: []string{"t2"}, Created: time.Now(), Modified: time.Now()} 120 - if _, err := repo.Create(ctx, note1); err != nil { 121 - t.Fatalf("Failed to create note: %v", err) 122 - } 123 - if _, err := repo.Create(ctx, note2); err != nil { 124 - t.Fatalf("Failed to create note: %v", err) 125 - } 126 - 127 - var buf bytes.Buffer 128 - nl := NewNoteList(repo, NoteListOptions{ 129 - Output: &buf, 130 - Static: true, 131 - }) 132 - 133 - err := nl.Browse(ctx) 134 - if err != nil { 135 - t.Fatalf("Browse failed: %v", err) 136 - } 137 - 138 - output := buf.String() 139 - if !strings.Contains(output, "Test Note 1") { 140 - t.Error("Output does not contain first note") 141 - } 142 - if !strings.Contains(output, "Test Note 2") { 143 - t.Error("Output does not contain second note") 144 - } 145 - if !strings.Contains(output, "t1") { 146 - t.Error("Output does not contain first note's tag") 147 - } 148 - }) 149 - 150 - t.Run("with archived notes", func(t *testing.T) { 151 - repo, cleanup := newTestNoteRepo(t) 152 - defer cleanup() 153 - 154 - note1 := &models.Note{Title: "Active Note", Created: time.Now(), Modified: time.Now()} 155 - note2 := &models.Note{Title: "Archived Note", Archived: true, Created: time.Now(), Modified: time.Now()} 156 - if _, err := repo.Create(ctx, note1); err != nil { 157 - t.Fatalf("Failed to create note: %v", err) 158 - } 159 - if _, err := repo.Create(ctx, note2); err != nil { 160 - t.Fatalf("Failed to create note: %v", err) 161 - } 162 - 163 - var buf bytes.Buffer 164 - nl := NewNoteList(repo, NoteListOptions{ 165 - Output: &buf, 166 - Static: true, 167 - ShowArchived: false, 168 - }) 169 - 170 - // Test with ShowArchived: false (default behavior) 171 - err := nl.Browse(ctx) 172 - if err != nil { 173 - t.Fatalf("Browse failed: %v", err) 174 - } 175 - 176 - output := buf.String() 177 - if !strings.Contains(output, "Active Note") { 178 - t.Error("Expected to see active note") 179 - } 180 - if strings.Contains(output, "Archived Note") { 181 - t.Error("Did not expect to see archived note") 182 - } 183 - 184 - buf.Reset() 185 - nl.opts.ShowArchived = true 186 - err = nl.Browse(ctx) 187 - if err != nil { 188 - t.Fatalf("Browse failed: %v", err) 189 - } 190 - 191 - output = buf.String() 192 - if !strings.Contains(output, "Active Note") { 193 - t.Error("Expected to see active note") 194 - } 195 - if !strings.Contains(output, "Archived Note") { 196 - t.Error("Expected to see archived note") 197 - } 198 - }) 199 - } 200 - 201 - func TestNoteListModelView(t *testing.T) { 202 - repo, cleanup := newTestNoteRepo(t) 203 - defer cleanup() 204 - 205 - opts := NoteListOptions{} 206 - 207 - t.Run("initial view", func(t *testing.T) { 208 - model := noteListModel{ 209 - repo: repo, 210 - opts: opts, 211 - notes: []*models.Note{}, 212 - } 213 - view := model.View() 214 - if !strings.Contains(view, "No notes found") { 215 - t.Errorf("Expected 'No notes found', got %q", view) 216 - } 217 - }) 218 - 219 - t.Run("error view", func(t *testing.T) { 220 - model := noteListModel{ 221 - repo: repo, 222 - opts: opts, 223 - err: errors.New("test error"), 224 - } 225 - view := model.View() 226 - if !strings.Contains(view, "Error: test error") { 227 - t.Errorf("Expected error message, got %q", view) 228 - } 229 - }) 230 - 231 - t.Run("with notes view", func(t *testing.T) { 232 - note := &models.Note{ID: 1, Title: "My Test Note", Tags: []string{"testing"}, Modified: time.Now()} 233 - model := noteListModel{ 234 - repo: repo, 235 - opts: opts, 236 - notes: []*models.Note{note}, 237 - selected: 0, 238 - } 239 - view := model.View() 240 - if !strings.Contains(view, "My Test Note") { 241 - t.Error("Expected to see note title") 242 - } 243 - if !strings.Contains(view, ">") { 244 - t.Error("Expected to see selection indicator") 245 - } 246 - }) 247 - 248 - t.Run("viewing note", func(t *testing.T) { 249 - model := noteListModel{ 250 - repo: repo, 251 - opts: opts, 252 - viewing: true, 253 - viewContent: "## My Note Content", 254 - } 255 - view := model.View() 256 - if !strings.Contains(view, "## My Note Content") { 257 - t.Error("Expected to see note content") 258 - } 259 - if !strings.Contains(view, "Press q/esc/backspace to return to list") { 260 - t.Error("Expected to see exit instructions") 261 - } 262 - }) 263 - } 264 - 265 - func TestFormatNoteForView(t *testing.T) { 266 - note := &models.Note{ 267 - Title: "My Note Title", 268 - Content: "This is the content.", 269 - Tags: []string{"go", "testing"}, 270 - Created: time.Date(2023, 1, 1, 12, 0, 0, 0, time.UTC), 271 - Modified: time.Date(2023, 1, 1, 13, 0, 0, 0, time.UTC), 272 - } 273 - 274 - m := noteListModel{} 275 - formatted := m.formatNoteForView(note) 276 - 277 - if !strings.Contains(formatted, "# My Note Title") { 278 - t.Error("Expected title markdown") 279 - } 280 - if !strings.Contains(formatted, "**Tags:** `go`, `testing`") { 281 - t.Error("Expected tags markdown") 282 - } 283 - if !strings.Contains(formatted, "**Created:** 2023-01-01 12:00") { 284 - t.Error("Expected created timestamp") 285 - } 286 - if !strings.Contains(formatted, "**Modified:** 2023-01-01 13:00") { 287 - t.Error("Expected modified timestamp") 288 - } 289 - if !strings.Contains(formatted, "This is the content.") { 290 - t.Error("Expected content") 291 - } 292 - }
+4 -3
internal/ui/task_edit.go
··· 13 13 tea "github.com/charmbracelet/bubbletea" 14 14 "github.com/charmbracelet/lipgloss" 15 15 "github.com/stormlightlabs/noteleaf/internal/models" 16 + "github.com/stormlightlabs/noteleaf/internal/utils" 16 17 ) 17 18 18 19 type TaskEditOptions struct { ··· 24 25 25 26 type TaskEditor struct { 26 27 task *models.Task 27 - repo TaskRepository 28 + repo utils.TestTaskRepository 28 29 opts TaskEditOptions 29 30 } 30 31 31 - func NewTaskEditor(task *models.Task, repo TaskRepository, opts TaskEditOptions) *TaskEditor { 32 + func NewTaskEditor(task *models.Task, repo utils.TestTaskRepository, opts TaskEditOptions) *TaskEditor { 32 33 if opts.Output == nil { 33 34 opts.Output = os.Stdout 34 35 } ··· 136 137 type taskEditModel struct { 137 138 task *models.Task 138 139 originalTask *models.Task 139 - repo TaskRepository 140 + repo utils.TestTaskRepository 140 141 opts TaskEditOptions 141 142 keys taskEditKeyMap 142 143 help help.Model
-519
internal/ui/task_list.go
··· 1 - package ui 2 - 3 - import ( 4 - "context" 5 - "fmt" 6 - "io" 7 - "os" 8 - "strings" 9 - 10 - "github.com/charmbracelet/bubbles/help" 11 - "github.com/charmbracelet/bubbles/key" 12 - tea "github.com/charmbracelet/bubbletea" 13 - "github.com/charmbracelet/lipgloss" 14 - "github.com/stormlightlabs/noteleaf/internal/models" 15 - "github.com/stormlightlabs/noteleaf/internal/repo" 16 - "github.com/stormlightlabs/noteleaf/internal/utils" 17 - ) 18 - 19 - var ( 20 - TitleColorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(Guac.Hex())).Bold(true) 21 - SelectedColorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(Salt.Hex())).Bold(true) 22 - HeaderColorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(Malibu.Hex())).Bold(true) 23 - StatusColorStyle = lipgloss.NewStyle().Foreground(lipgloss.Color(Julep.Hex())) 24 - ) 25 - 26 - // Key bindings for task list navigation 27 - type keyMap struct { 28 - Up key.Binding 29 - Down key.Binding 30 - Enter key.Binding 31 - View key.Binding 32 - Refresh key.Binding 33 - ToggleAll key.Binding 34 - MarkDone key.Binding 35 - Quit key.Binding 36 - Back key.Binding 37 - Help key.Binding 38 - Numbers []key.Binding 39 - } 40 - 41 - func (k keyMap) ShortHelp() []key.Binding { 42 - return []key.Binding{k.Up, k.Down, k.Enter, k.MarkDone, k.Help, k.Quit} 43 - } 44 - 45 - func (k keyMap) FullHelp() [][]key.Binding { 46 - return [][]key.Binding{ 47 - {k.Up, k.Down, k.Enter, k.View}, 48 - {k.MarkDone, k.Refresh, k.ToggleAll}, 49 - {k.Help, k.Quit, k.Back}, 50 - } 51 - } 52 - 53 - var keys = keyMap{ 54 - Up: key.NewBinding(key.WithKeys("up", "k"), key.WithHelp("โ†‘/k", "move up")), 55 - Down: key.NewBinding(key.WithKeys("down", "j"), key.WithHelp("โ†“/j", "move down")), 56 - Enter: key.NewBinding(key.WithKeys("enter"), key.WithHelp("enter", "view task")), 57 - View: key.NewBinding(key.WithKeys("v"), key.WithHelp("v", "view task")), 58 - Refresh: key.NewBinding(key.WithKeys("r"), key.WithHelp("r", "refresh")), 59 - ToggleAll: key.NewBinding(key.WithKeys("a"), key.WithHelp("a", "toggle all/pending")), 60 - MarkDone: key.NewBinding(key.WithKeys("d"), key.WithHelp("d", "mark done")), 61 - Quit: key.NewBinding(key.WithKeys("q", "ctrl+c"), key.WithHelp("q", "quit")), 62 - Back: key.NewBinding(key.WithKeys("esc", "backspace"), key.WithHelp("esc", "back")), 63 - Help: key.NewBinding(key.WithKeys("?"), key.WithHelp("?", "help")), 64 - Numbers: []key.Binding{ 65 - key.NewBinding(key.WithKeys("1"), key.WithHelp("1", "jump to task 1")), 66 - key.NewBinding(key.WithKeys("2"), key.WithHelp("2", "jump to task 2")), 67 - key.NewBinding(key.WithKeys("3"), key.WithHelp("3", "jump to task 3")), 68 - key.NewBinding(key.WithKeys("4"), key.WithHelp("4", "jump to task 4")), 69 - key.NewBinding(key.WithKeys("5"), key.WithHelp("5", "jump to task 5")), 70 - key.NewBinding(key.WithKeys("6"), key.WithHelp("6", "jump to task 6")), 71 - key.NewBinding(key.WithKeys("7"), key.WithHelp("7", "jump to task 7")), 72 - key.NewBinding(key.WithKeys("8"), key.WithHelp("8", "jump to task 8")), 73 - key.NewBinding(key.WithKeys("9"), key.WithHelp("9", "jump to task 9")), 74 - }, 75 - } 76 - 77 - // TaskRepository interface for dependency injection in tests 78 - type TaskRepository interface { 79 - List(ctx context.Context, opts repo.TaskListOptions) ([]*models.Task, error) 80 - Update(ctx context.Context, task *models.Task) error 81 - } 82 - 83 - // TaskListOptions configures the task list UI behavior 84 - type TaskListOptions struct { 85 - // Output destination (stdout for interactive, buffer for testing) 86 - Output io.Writer 87 - // Input source (stdin for interactive, strings reader for testing) 88 - Input io.Reader 89 - // Enable static mode (no interactive components) 90 - Static bool 91 - Status string 92 - Priority string 93 - Project string 94 - Context string 95 - ShowAll bool 96 - } 97 - 98 - // TaskList handles task browsing and viewing UI 99 - type TaskList struct { 100 - repo TaskRepository 101 - opts TaskListOptions 102 - } 103 - 104 - // NewTaskList creates a new task list UI component 105 - func NewTaskList(repo TaskRepository, opts TaskListOptions) *TaskList { 106 - if opts.Output == nil { 107 - opts.Output = os.Stdout 108 - } 109 - if opts.Input == nil { 110 - opts.Input = os.Stdin 111 - } 112 - return &TaskList{repo: repo, opts: opts} 113 - } 114 - 115 - type ( 116 - tasksLoadedMsg []*models.Task 117 - taskViewMsg string 118 - errorTaskMsg error 119 - ) 120 - 121 - type taskListModel struct { 122 - tasks []*models.Task 123 - selected int 124 - viewing bool 125 - viewContent string 126 - err error 127 - repo TaskRepository 128 - opts TaskListOptions 129 - showAll bool 130 - keys keyMap 131 - help help.Model 132 - showingHelp bool 133 - } 134 - 135 - func (m taskListModel) Init() tea.Cmd { 136 - return m.loadTasks() 137 - } 138 - 139 - func (m taskListModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) { 140 - switch msg := msg.(type) { 141 - case tea.KeyMsg: 142 - if m.showingHelp { 143 - switch { 144 - case key.Matches(msg, m.keys.Back) || key.Matches(msg, m.keys.Quit) || key.Matches(msg, m.keys.Help): 145 - m.showingHelp = false 146 - return m, nil 147 - } 148 - return m, nil 149 - } 150 - 151 - if m.viewing { 152 - switch { 153 - case key.Matches(msg, m.keys.Back) || key.Matches(msg, m.keys.Quit): 154 - m.viewing = false 155 - m.viewContent = "" 156 - return m, nil 157 - case key.Matches(msg, m.keys.Help): 158 - m.showingHelp = true 159 - return m, nil 160 - } 161 - return m, nil 162 - } 163 - 164 - switch { 165 - case key.Matches(msg, m.keys.Quit): 166 - return m, tea.Quit 167 - case key.Matches(msg, m.keys.Up): 168 - if m.selected > 0 { 169 - m.selected-- 170 - } 171 - case key.Matches(msg, m.keys.Down): 172 - if m.selected < len(m.tasks)-1 { 173 - m.selected++ 174 - } 175 - case key.Matches(msg, m.keys.Enter) || key.Matches(msg, m.keys.View): 176 - if len(m.tasks) > 0 && m.selected < len(m.tasks) { 177 - return m, m.viewTask(m.tasks[m.selected]) 178 - } 179 - case key.Matches(msg, m.keys.Refresh): 180 - return m, m.loadTasks() 181 - case key.Matches(msg, m.keys.ToggleAll): 182 - m.showAll = !m.showAll 183 - return m, m.loadTasks() 184 - case key.Matches(msg, m.keys.MarkDone): 185 - if len(m.tasks) > 0 && m.selected < len(m.tasks) { 186 - return m, m.markDone(m.tasks[m.selected]) 187 - } 188 - case key.Matches(msg, m.keys.Help): 189 - m.showingHelp = true 190 - return m, nil 191 - default: 192 - for i, numKey := range m.keys.Numbers { 193 - if key.Matches(msg, numKey) && i < len(m.tasks) { 194 - m.selected = i 195 - break 196 - } 197 - } 198 - } 199 - case tasksLoadedMsg: 200 - m.tasks = []*models.Task(msg) 201 - if m.selected >= len(m.tasks) && len(m.tasks) > 0 { 202 - m.selected = len(m.tasks) - 1 203 - } 204 - case taskViewMsg: 205 - m.viewContent = string(msg) 206 - m.viewing = true 207 - case errorTaskMsg: 208 - m.err = error(msg) 209 - } 210 - return m, nil 211 - } 212 - 213 - func (m taskListModel) View() string { 214 - var s strings.Builder 215 - 216 - style := lipgloss.NewStyle().Foreground(lipgloss.Color(Squid.Hex())) 217 - 218 - if m.showingHelp { 219 - return m.help.View(m.keys) 220 - } 221 - 222 - if m.viewing { 223 - s.WriteString(m.viewContent) 224 - s.WriteString("\n\n") 225 - s.WriteString(style.Render("Press q/esc/backspace to return to list, ? for help")) 226 - return s.String() 227 - } 228 - 229 - s.WriteString(TitleColorStyle.Render("Tasks")) 230 - if m.showAll { 231 - s.WriteString(" (showing all)") 232 - } else { 233 - s.WriteString(" (pending only)") 234 - } 235 - s.WriteString("\n\n") 236 - 237 - if m.err != nil { 238 - s.WriteString(fmt.Sprintf("Error: %s", m.err)) 239 - return s.String() 240 - } 241 - 242 - if len(m.tasks) == 0 { 243 - s.WriteString("No tasks found") 244 - s.WriteString("\n\n") 245 - s.WriteString(style.Render("Press r to refresh, q to quit")) 246 - return s.String() 247 - } 248 - 249 - headerLine := fmt.Sprintf(" %-4s %-40s %-10s %-10s %-15s", "ID", "Description", "Status", "Priority", "Project") 250 - s.WriteString(HeaderColorStyle.Render(headerLine)) 251 - s.WriteString("\n") 252 - s.WriteString(HeaderColorStyle.Render(strings.Repeat("โ”€", 80))) 253 - s.WriteString("\n") 254 - 255 - for i, task := range m.tasks { 256 - prefix := " " 257 - if i == m.selected { 258 - prefix = " > " 259 - } 260 - 261 - description := task.Description 262 - if len(description) > 38 { 263 - description = description[:35] + "..." 264 - } 265 - 266 - status := task.Status 267 - if len(status) > 8 { 268 - status = status[:8] 269 - } 270 - 271 - priority := task.Priority 272 - if priority == "" { 273 - priority = "-" 274 - } 275 - if len(priority) > 8 { 276 - priority = priority[:8] 277 - } 278 - 279 - project := task.Project 280 - if project == "" { 281 - project = "-" 282 - } 283 - if len(project) > 13 { 284 - project = project[:10] + "..." 285 - } 286 - 287 - priority = utils.Titlecase(priority) 288 - padded := fmt.Sprintf("%-10s", priority) 289 - var colored string 290 - switch strings.ToLower(task.Priority) { 291 - case "high", "urgent": 292 - colored = PriorityHigh.Render(padded) 293 - case "medium": 294 - colored = PriorityMedium.Render(padded) 295 - case "low": 296 - colored = PriorityLow.Render(padded) 297 - default: 298 - colored = padded 299 - } 300 - 301 - line := fmt.Sprintf("%s%-4d %-40s %-10s %s %-15s", prefix, task.ID, description, status, colored, project) 302 - 303 - if i == m.selected { 304 - s.WriteString(SelectedColorStyle.Render(line)) 305 - } else { 306 - if task.Status == "completed" { 307 - s.WriteString(StatusColorStyle.Render(line)) 308 - } else { 309 - s.WriteString(style.Render(line)) 310 - } 311 - } 312 - 313 - if len(task.Tags) > 0 && i == m.selected { 314 - s.WriteString(" @" + strings.Join(task.Tags, " @")) 315 - } 316 - 317 - s.WriteString("\n") 318 - } 319 - 320 - s.WriteString("\n") 321 - s.WriteString(m.help.View(m.keys)) 322 - 323 - return s.String() 324 - } 325 - 326 - func (m taskListModel) loadTasks() tea.Cmd { 327 - return func() tea.Msg { 328 - opts := repo.TaskListOptions{} 329 - showAll := m.showAll || m.opts.ShowAll 330 - 331 - if !showAll { 332 - opts.Status = "pending" 333 - } 334 - 335 - if m.opts.Status != "" { 336 - opts.Status = m.opts.Status 337 - } 338 - if m.opts.Priority != "" { 339 - opts.Priority = m.opts.Priority 340 - } 341 - if m.opts.Project != "" { 342 - opts.Project = m.opts.Project 343 - } 344 - 345 - opts.SortBy = "modified" 346 - opts.SortOrder = "DESC" 347 - opts.Limit = 50 348 - 349 - tasks, err := m.repo.List(context.Background(), opts) 350 - if err != nil { 351 - return errorTaskMsg(err) 352 - } 353 - 354 - return tasksLoadedMsg(tasks) 355 - } 356 - } 357 - 358 - func (m taskListModel) viewTask(task *models.Task) tea.Cmd { 359 - return func() tea.Msg { 360 - var content strings.Builder 361 - content.WriteString(fmt.Sprintf("# Task %d\n\n", task.ID)) 362 - content.WriteString(fmt.Sprintf("**UUID:** %s\n", task.UUID)) 363 - content.WriteString(fmt.Sprintf("**Description:** %s\n", task.Description)) 364 - content.WriteString(fmt.Sprintf("**Status:** %s\n", task.Status)) 365 - 366 - if task.Priority != "" { 367 - content.WriteString(fmt.Sprintf("**Priority:** %s\n", task.Priority)) 368 - } 369 - 370 - if task.Project != "" { 371 - content.WriteString(fmt.Sprintf("**Project:** %s\n", task.Project)) 372 - } 373 - 374 - if len(task.Tags) > 0 { 375 - content.WriteString(fmt.Sprintf("**Tags:** %s\n", strings.Join(task.Tags, ", "))) 376 - } 377 - 378 - if task.Due != nil { 379 - content.WriteString(fmt.Sprintf("**Due:** %s\n", task.Due.Format("2006-01-02 15:04"))) 380 - } 381 - 382 - content.WriteString(fmt.Sprintf("**Created:** %s\n", task.Entry.Format("2006-01-02 15:04"))) 383 - content.WriteString(fmt.Sprintf("**Modified:** %s\n", task.Modified.Format("2006-01-02 15:04"))) 384 - 385 - if task.Start != nil { 386 - content.WriteString(fmt.Sprintf("**Started:** %s\n", task.Start.Format("2006-01-02 15:04"))) 387 - } 388 - 389 - if task.End != nil { 390 - content.WriteString(fmt.Sprintf("**Completed:** %s\n", task.End.Format("2006-01-02 15:04"))) 391 - } 392 - 393 - if len(task.Annotations) > 0 { 394 - content.WriteString("\n**Annotations:**\n") 395 - for _, annotation := range task.Annotations { 396 - content.WriteString(fmt.Sprintf("- %s\n", annotation)) 397 - } 398 - } 399 - 400 - return taskViewMsg(content.String()) 401 - } 402 - } 403 - 404 - func (m taskListModel) markDone(task *models.Task) tea.Cmd { 405 - return func() tea.Msg { 406 - if task.Status == "completed" { 407 - return errorTaskMsg(fmt.Errorf("task already completed")) 408 - } 409 - 410 - task.Status = "completed" 411 - err := m.repo.Update(context.Background(), task) 412 - if err != nil { 413 - return errorTaskMsg(fmt.Errorf("failed to mark task done: %w", err)) 414 - } 415 - 416 - return m.loadTasks()() 417 - } 418 - } 419 - 420 - // Browse opens an interactive TUI for navigating and viewing tasks 421 - func (tl *TaskList) Browse(ctx context.Context) error { 422 - if tl.opts.Static { 423 - return tl.staticList(ctx) 424 - } 425 - 426 - model := taskListModel{ 427 - repo: tl.repo, 428 - opts: tl.opts, 429 - showAll: tl.opts.ShowAll, 430 - keys: keys, 431 - help: help.New(), 432 - } 433 - 434 - program := tea.NewProgram(model, tea.WithInput(tl.opts.Input), tea.WithOutput(tl.opts.Output)) 435 - 436 - _, err := program.Run() 437 - return err 438 - } 439 - 440 - func (tl *TaskList) staticList(ctx context.Context) error { 441 - opts := repo.TaskListOptions{} 442 - 443 - if !tl.opts.ShowAll { 444 - opts.Status = "pending" 445 - } 446 - 447 - if tl.opts.Status != "" { 448 - opts.Status = tl.opts.Status 449 - } 450 - if tl.opts.Priority != "" { 451 - opts.Priority = tl.opts.Priority 452 - } 453 - if tl.opts.Project != "" { 454 - opts.Project = tl.opts.Project 455 - } 456 - 457 - opts.SortBy = "modified" 458 - opts.SortOrder = "DESC" 459 - 460 - tasks, err := tl.repo.List(ctx, opts) 461 - if err != nil { 462 - fmt.Fprintf(tl.opts.Output, "Error: %s\n", err) 463 - return err 464 - } 465 - 466 - fmt.Fprintf(tl.opts.Output, "Tasks") 467 - if tl.opts.ShowAll { 468 - fmt.Fprintf(tl.opts.Output, " (showing all)") 469 - } else { 470 - fmt.Fprintf(tl.opts.Output, " (pending only)") 471 - } 472 - fmt.Fprintf(tl.opts.Output, "\n\n") 473 - 474 - if len(tasks) == 0 { 475 - fmt.Fprintf(tl.opts.Output, "No tasks found\n") 476 - return nil 477 - } 478 - 479 - fmt.Fprintf(tl.opts.Output, "%-4s %-40s %-10s %-10s %-15s\n", "ID", "Description", "Status", "Priority", "Project") 480 - fmt.Fprintf(tl.opts.Output, "%s\n", strings.Repeat("โ”€", 80)) 481 - 482 - for _, task := range tasks { 483 - description := task.Description 484 - if len(description) > 38 { 485 - description = description[:35] + "..." 486 - } 487 - 488 - status := task.Status 489 - if len(status) > 8 { 490 - status = status[:8] 491 - } 492 - 493 - priority := task.Priority 494 - if priority == "" { 495 - priority = "-" 496 - } 497 - if len(priority) > 8 { 498 - priority = priority[:8] 499 - } 500 - 501 - project := task.Project 502 - if project == "" { 503 - project = "-" 504 - } 505 - if len(project) > 13 { 506 - project = project[:10] + "..." 507 - } 508 - 509 - fmt.Fprintf(tl.opts.Output, "%-4d %-40s %-10s %-10s %-15s", task.ID, description, status, priority, project) 510 - 511 - if len(task.Tags) > 0 { 512 - fmt.Fprintf(tl.opts.Output, " @%s", strings.Join(task.Tags, " @")) 513 - } 514 - 515 - fmt.Fprintf(tl.opts.Output, "\n") 516 - } 517 - 518 - return nil 519 - }
+271
internal/ui/task_list_adapter.go
··· 1 + package ui 2 + 3 + import ( 4 + "context" 5 + "fmt" 6 + "io" 7 + "strings" 8 + "time" 9 + 10 + tea "github.com/charmbracelet/bubbletea" 11 + "github.com/stormlightlabs/noteleaf/internal/models" 12 + "github.com/stormlightlabs/noteleaf/internal/repo" 13 + "github.com/stormlightlabs/noteleaf/internal/utils" 14 + ) 15 + 16 + // TaskRecord adapts models.Task to work with DataTable 17 + type TaskRecord struct { 18 + *models.Task 19 + } 20 + 21 + func (t *TaskRecord) GetField(name string) any { 22 + switch name { 23 + case "id": 24 + return t.ID 25 + case "uuid": 26 + return t.UUID 27 + case "description": 28 + return t.Description 29 + case "status": 30 + return t.Status 31 + case "priority": 32 + return t.Priority 33 + case "project": 34 + return t.Project 35 + case "tags": 36 + return t.Tags 37 + case "due": 38 + return t.Due 39 + case "entry": 40 + return t.Entry 41 + case "start": 42 + return t.Start 43 + case "end": 44 + return t.End 45 + case "modified": 46 + return t.Modified 47 + case "annotations": 48 + return t.Annotations 49 + default: 50 + return "" 51 + } 52 + } 53 + 54 + // TaskDataSource adapts TaskRepository to work with DataTable 55 + type TaskDataSource struct { 56 + repo utils.TestTaskRepository 57 + showAll bool 58 + status string 59 + priority string 60 + project string 61 + } 62 + 63 + func (t *TaskDataSource) Load(ctx context.Context, opts DataOptions) ([]DataRecord, error) { 64 + repoOpts := repo.TaskListOptions{ 65 + SortBy: "modified", 66 + SortOrder: "DESC", 67 + Limit: 50, 68 + } 69 + 70 + if !t.showAll && t.status == "" { 71 + repoOpts.Status = "pending" 72 + } 73 + if t.status != "" { 74 + repoOpts.Status = t.status 75 + } 76 + if t.priority != "" { 77 + repoOpts.Priority = t.priority 78 + } 79 + if t.project != "" { 80 + repoOpts.Project = t.project 81 + } 82 + 83 + tasks, err := t.repo.List(ctx, repoOpts) 84 + if err != nil { 85 + return nil, err 86 + } 87 + 88 + records := make([]DataRecord, len(tasks)) 89 + for i, task := range tasks { 90 + records[i] = &TaskRecord{Task: task} 91 + } 92 + 93 + return records, nil 94 + } 95 + 96 + func (t *TaskDataSource) Count(ctx context.Context, opts DataOptions) (int, error) { 97 + records, err := t.Load(ctx, opts) 98 + if err != nil { 99 + return 0, err 100 + } 101 + return len(records), nil 102 + } 103 + 104 + func formatTaskForView(task *models.Task) string { 105 + var content strings.Builder 106 + content.WriteString(fmt.Sprintf("# Task %d\n\n", task.ID)) 107 + content.WriteString(fmt.Sprintf("**UUID:** %s\n", task.UUID)) 108 + content.WriteString(fmt.Sprintf("**Description:** %s\n", task.Description)) 109 + content.WriteString(fmt.Sprintf("**Status:** %s\n", task.Status)) 110 + 111 + if task.Priority != "" { 112 + content.WriteString(fmt.Sprintf("**Priority:** %s\n", task.Priority)) 113 + } 114 + 115 + if task.Project != "" { 116 + content.WriteString(fmt.Sprintf("**Project:** %s\n", task.Project)) 117 + } 118 + 119 + if len(task.Tags) > 0 { 120 + content.WriteString(fmt.Sprintf("**Tags:** %s\n", strings.Join(task.Tags, ", "))) 121 + } 122 + 123 + if task.Due != nil { 124 + content.WriteString(fmt.Sprintf("**Due:** %s\n", task.Due.Format("2006-01-02 15:04"))) 125 + } 126 + 127 + content.WriteString(fmt.Sprintf("**Created:** %s\n", task.Entry.Format("2006-01-02 15:04"))) 128 + content.WriteString(fmt.Sprintf("**Modified:** %s\n", task.Modified.Format("2006-01-02 15:04"))) 129 + 130 + if task.Start != nil { 131 + content.WriteString(fmt.Sprintf("**Started:** %s\n", task.Start.Format("2006-01-02 15:04"))) 132 + } 133 + 134 + if task.End != nil { 135 + content.WriteString(fmt.Sprintf("**Completed:** %s\n", task.End.Format("2006-01-02 15:04"))) 136 + } 137 + 138 + if len(task.Annotations) > 0 { 139 + content.WriteString("\n**Annotations:**\n") 140 + for _, annotation := range task.Annotations { 141 + content.WriteString(fmt.Sprintf("- %s\n", annotation)) 142 + } 143 + } 144 + 145 + return content.String() 146 + } 147 + 148 + func formatPriorityField(priority string) string { 149 + if priority == "" { 150 + return "-" 151 + } 152 + 153 + titlecase := utils.Titlecase(priority) 154 + padded := fmt.Sprintf("%-10s", titlecase) 155 + 156 + switch strings.ToLower(priority) { 157 + case "high", "urgent": 158 + return PriorityHigh.Render(padded) 159 + case "medium": 160 + return PriorityMedium.Render(padded) 161 + case "low": 162 + return PriorityLow.Render(padded) 163 + default: 164 + return padded 165 + } 166 + } 167 + 168 + // NewTaskDataTable creates a new DataTable for browsing tasks 169 + func NewTaskDataTable(repo utils.TestTaskRepository, opts DataTableOptions, showAll bool, status, priority, project string) *DataTable { 170 + if opts.Title == "" { 171 + title := "Tasks" 172 + if showAll { 173 + title += " (showing all)" 174 + } else { 175 + title += " (pending only)" 176 + } 177 + opts.Title = title 178 + } 179 + 180 + opts.Fields = []Field{ 181 + {Name: "id", Title: "ID", Width: 4}, 182 + {Name: "description", Title: "Description", Width: 40, 183 + Formatter: func(v any) string { 184 + desc := fmt.Sprintf("%v", v) 185 + if len(desc) > 38 { 186 + return desc[:35] + "..." 187 + } 188 + return desc 189 + }}, 190 + {Name: "status", Title: "Status", Width: 10, 191 + Formatter: func(v any) string { 192 + status := fmt.Sprintf("%v", v) 193 + if len(status) > 8 { 194 + return status[:8] 195 + } 196 + return status 197 + }}, 198 + {Name: "priority", Title: "Priority", Width: 10, 199 + Formatter: func(v any) string { 200 + priority := fmt.Sprintf("%v", v) 201 + return formatPriorityField(priority) 202 + }}, 203 + {Name: "project", Title: "Project", Width: 15, 204 + Formatter: func(v any) string { 205 + project := fmt.Sprintf("%v", v) 206 + if project == "" { 207 + return "-" 208 + } 209 + if len(project) > 13 { 210 + return project[:10] + "..." 211 + } 212 + return project 213 + }}, 214 + } 215 + 216 + if opts.ViewHandler == nil { 217 + opts.ViewHandler = func(record DataRecord) string { 218 + if taskRecord, ok := record.(*TaskRecord); ok { 219 + return formatTaskForView(taskRecord.Task) 220 + } 221 + return "Unable to display task" 222 + } 223 + } 224 + 225 + if len(opts.Actions) == 0 { 226 + opts.Actions = []Action{ 227 + { 228 + Key: "d", 229 + Description: "mark done", 230 + Handler: func(record DataRecord) tea.Cmd { 231 + return func() tea.Msg { 232 + if taskRecord, ok := record.(*TaskRecord); ok { 233 + if taskRecord.Status == "completed" { 234 + return dataErrorMsg(fmt.Errorf("task already completed")) 235 + } 236 + taskRecord.Status = "completed" 237 + taskRecord.End = &time.Time{} 238 + *taskRecord.End = time.Now() 239 + err := repo.Update(context.Background(), taskRecord.Task) 240 + if err != nil { 241 + return dataErrorMsg(err) 242 + } 243 + return dataLoadedMsg([]DataRecord{}) 244 + } 245 + return dataErrorMsg(fmt.Errorf("invalid task record")) 246 + } 247 + }, 248 + }, 249 + } 250 + } 251 + 252 + source := &TaskDataSource{ 253 + repo: repo, 254 + showAll: showAll, 255 + status: status, 256 + priority: priority, 257 + project: project, 258 + } 259 + 260 + return NewDataTable(source, opts) 261 + } 262 + 263 + // NewTaskListFromTable creates a TaskList-compatible interface using DataTable 264 + func NewTaskListFromTable(repo utils.TestTaskRepository, output io.Writer, input io.Reader, static bool, showAll bool, status, priority, project string) *DataTable { 265 + opts := DataTableOptions{ 266 + Output: output, 267 + Input: input, 268 + Static: static, 269 + } 270 + return NewTaskDataTable(repo, opts, showAll, status, priority, project) 271 + }
+447
internal/ui/task_list_adapter_test.go
··· 1 + package ui 2 + 3 + import ( 4 + "bytes" 5 + "context" 6 + "fmt" 7 + "strings" 8 + "testing" 9 + "time" 10 + 11 + "github.com/stormlightlabs/noteleaf/internal/models" 12 + "github.com/stormlightlabs/noteleaf/internal/repo" 13 + ) 14 + 15 + type mockTaskRepository struct { 16 + tasks []*models.Task 17 + err error 18 + } 19 + 20 + func (m *mockTaskRepository) List(ctx context.Context, options repo.TaskListOptions) ([]*models.Task, error) { 21 + if m.err != nil { 22 + return nil, m.err 23 + } 24 + 25 + var filtered []*models.Task 26 + for _, task := range m.tasks { 27 + if options.Status == "pending" && task.Status == "completed" { 28 + continue 29 + } else if options.Status != "" && options.Status != "pending" && task.Status != options.Status { 30 + continue 31 + } 32 + 33 + if options.Priority != "" && task.Priority != options.Priority { 34 + continue 35 + } 36 + 37 + if options.Project != "" && task.Project != options.Project { 38 + continue 39 + } 40 + 41 + filtered = append(filtered, task) 42 + 43 + if options.Limit > 0 && len(filtered) >= options.Limit { 44 + break 45 + } 46 + } 47 + 48 + return filtered, nil 49 + } 50 + 51 + func (m *mockTaskRepository) Update(ctx context.Context, task *models.Task) error { 52 + if m.err != nil { 53 + return m.err 54 + } 55 + for i, t := range m.tasks { 56 + if t.ID == task.ID { 57 + m.tasks[i] = task 58 + break 59 + } 60 + } 61 + return nil 62 + } 63 + 64 + func TestTaskAdapter(t *testing.T) { 65 + now := time.Now() 66 + task := &models.Task{ 67 + ID: 1, 68 + UUID: "test-uuid-123", 69 + Description: "Test task", 70 + Status: "todo", 71 + Priority: "high", 72 + Project: "work", 73 + Tags: []string{"urgent", "review"}, 74 + Entry: now, 75 + Modified: now.Add(time.Hour), 76 + Annotations: []string{"First note", "Second note"}, 77 + } 78 + 79 + t.Run("TaskRecord", func(t *testing.T) { 80 + record := &TaskRecord{Task: task} 81 + 82 + t.Run("GetField", func(t *testing.T) { 83 + tests := []struct { 84 + field string 85 + expected any 86 + name string 87 + }{ 88 + {"id", int64(1), "should return task ID"}, 89 + {"uuid", "test-uuid-123", "should return task UUID"}, 90 + {"description", "Test task", "should return task description"}, 91 + {"status", "todo", "should return task status"}, 92 + {"priority", "high", "should return task priority"}, 93 + {"project", "work", "should return task project"}, 94 + {"tags", []string{"urgent", "review"}, "should return task tags"}, 95 + {"entry", now, "should return entry time"}, 96 + {"modified", now.Add(time.Hour), "should return modified time"}, 97 + {"annotations", []string{"First note", "Second note"}, "should return annotations"}, 98 + {"unknown", "", "should return empty string for unknown field"}, 99 + } 100 + 101 + for _, tt := range tests { 102 + t.Run(tt.name, func(t *testing.T) { 103 + result := record.GetField(tt.field) 104 + 105 + switch expected := tt.expected.(type) { 106 + case []string: 107 + resultSlice, ok := result.([]string) 108 + if !ok || len(resultSlice) != len(expected) { 109 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 110 + return 111 + } 112 + for i, item := range expected { 113 + if resultSlice[i] != item { 114 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 115 + return 116 + } 117 + } 118 + case time.Time: 119 + if resultTime, ok := result.(time.Time); !ok || !resultTime.Equal(expected) { 120 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 121 + } 122 + default: 123 + if result != tt.expected { 124 + t.Errorf("GetField(%q) = %v, want %v", tt.field, result, tt.expected) 125 + } 126 + } 127 + }) 128 + } 129 + }) 130 + 131 + t.Run("Model interface", func(t *testing.T) { 132 + if record.GetID() != 1 { 133 + t.Errorf("GetID() = %d, want 1", record.GetID()) 134 + } 135 + 136 + if record.GetTableName() != "tasks" { 137 + t.Errorf("GetTableName() = %q, want 'tasks'", record.GetTableName()) 138 + } 139 + }) 140 + }) 141 + 142 + t.Run("TaskDataSource", func(t *testing.T) { 143 + tasks := []*models.Task{ 144 + { 145 + ID: 1, 146 + Description: "Todo task", 147 + Status: "todo", 148 + Priority: "high", 149 + Project: "work", 150 + Entry: now, 151 + Modified: now, 152 + }, 153 + { 154 + ID: 2, 155 + Description: "In progress task", 156 + Status: "in-progress", 157 + Priority: "medium", 158 + Project: "personal", 159 + Entry: now, 160 + Modified: now, 161 + }, 162 + { 163 + ID: 3, 164 + Description: "Completed task", 165 + Status: "completed", 166 + Priority: "low", 167 + Project: "work", 168 + Entry: now, 169 + Modified: now, 170 + }, 171 + } 172 + 173 + t.Run("Load", func(t *testing.T) { 174 + repo := &mockTaskRepository{tasks: tasks} 175 + source := &TaskDataSource{repo: repo, showAll: true} 176 + 177 + records, err := source.Load(context.Background(), DataOptions{}) 178 + if err != nil { 179 + t.Fatalf("Load() failed: %v", err) 180 + } 181 + 182 + if len(records) != 3 { 183 + t.Errorf("Load() returned %d records, want 3", len(records)) 184 + } 185 + 186 + if records[0].GetField("description") != "Todo task" { 187 + t.Errorf("First record description = %v, want 'Todo task'", records[0].GetField("description")) 188 + } 189 + }) 190 + 191 + t.Run("Load with pending filter", func(t *testing.T) { 192 + repo := &mockTaskRepository{tasks: tasks} 193 + source := &TaskDataSource{repo: repo, showAll: false} 194 + 195 + records, err := source.Load(context.Background(), DataOptions{}) 196 + if err != nil { 197 + t.Fatalf("Load() failed: %v", err) 198 + } 199 + 200 + if len(records) != 2 { 201 + t.Errorf("Load() with pending filter returned %d records, want 2", len(records)) 202 + } 203 + }) 204 + 205 + t.Run("Load with status filter", func(t *testing.T) { 206 + repo := &mockTaskRepository{tasks: tasks} 207 + source := &TaskDataSource{repo: repo, status: "completed"} 208 + 209 + records, err := source.Load(context.Background(), DataOptions{}) 210 + if err != nil { 211 + t.Fatalf("Load() failed: %v", err) 212 + } 213 + 214 + if len(records) != 1 { 215 + t.Errorf("Load() with status filter returned %d records, want 1", len(records)) 216 + } 217 + if records[0].GetField("status") != "completed" { 218 + t.Errorf("Filtered record status = %v, want 'completed'", records[0].GetField("status")) 219 + } 220 + }) 221 + 222 + t.Run("Load with priority filter", func(t *testing.T) { 223 + repo := &mockTaskRepository{tasks: tasks} 224 + source := &TaskDataSource{repo: repo, priority: "high", showAll: true} 225 + 226 + records, err := source.Load(context.Background(), DataOptions{}) 227 + if err != nil { 228 + t.Fatalf("Load() failed: %v", err) 229 + } 230 + 231 + if len(records) != 1 { 232 + t.Errorf("Load() with priority filter returned %d records, want 1", len(records)) 233 + } 234 + if records[0].GetField("priority") != "high" { 235 + t.Errorf("Filtered record priority = %v, want 'high'", records[0].GetField("priority")) 236 + } 237 + }) 238 + 239 + t.Run("Load with project filter", func(t *testing.T) { 240 + repo := &mockTaskRepository{tasks: tasks} 241 + source := &TaskDataSource{repo: repo, project: "work", showAll: true} 242 + 243 + records, err := source.Load(context.Background(), DataOptions{}) 244 + if err != nil { 245 + t.Fatalf("Load() failed: %v", err) 246 + } 247 + 248 + if len(records) != 2 { 249 + t.Errorf("Load() with project filter returned %d records, want 2", len(records)) 250 + } 251 + if records[0].GetField("project") != "work" { 252 + t.Errorf("Filtered record project = %v, want 'work'", records[0].GetField("project")) 253 + } 254 + }) 255 + 256 + t.Run("Load error", func(t *testing.T) { 257 + testErr := fmt.Errorf("test error") 258 + repo := &mockTaskRepository{err: testErr} 259 + source := &TaskDataSource{repo: repo} 260 + 261 + _, err := source.Load(context.Background(), DataOptions{}) 262 + if err != testErr { 263 + t.Errorf("Load() error = %v, want %v", err, testErr) 264 + } 265 + }) 266 + 267 + t.Run("Count", func(t *testing.T) { 268 + repo := &mockTaskRepository{tasks: tasks} 269 + source := &TaskDataSource{repo: repo, showAll: true} 270 + 271 + count, err := source.Count(context.Background(), DataOptions{}) 272 + if err != nil { 273 + t.Fatalf("Count() failed: %v", err) 274 + } 275 + 276 + if count != 3 { 277 + t.Errorf("Count() = %d, want 3", count) 278 + } 279 + }) 280 + 281 + t.Run("Count error", func(t *testing.T) { 282 + testErr := fmt.Errorf("test error") 283 + repo := &mockTaskRepository{err: testErr} 284 + source := &TaskDataSource{repo: repo} 285 + 286 + _, err := source.Count(context.Background(), DataOptions{}) 287 + if err != testErr { 288 + t.Errorf("Count() error = %v, want %v", err, testErr) 289 + } 290 + }) 291 + }) 292 + 293 + t.Run("NewTaskDataTable", func(t *testing.T) { 294 + repo := &mockTaskRepository{ 295 + tasks: []*models.Task{ 296 + { 297 + ID: 1, 298 + Description: "Test task", 299 + Status: "todo", 300 + Priority: "high", 301 + Project: "work", 302 + Entry: time.Now(), 303 + Modified: time.Now(), 304 + }, 305 + }, 306 + } 307 + 308 + opts := DataTableOptions{ 309 + Output: &bytes.Buffer{}, 310 + Input: strings.NewReader("q\n"), 311 + Static: true, 312 + } 313 + 314 + table := NewTaskDataTable(repo, opts, false, "", "", "") 315 + if table == nil { 316 + t.Fatal("NewTaskDataTable() returned nil") 317 + } 318 + 319 + err := table.Browse(context.Background()) 320 + if err != nil { 321 + t.Errorf("Browse() failed: %v", err) 322 + } 323 + }) 324 + 325 + t.Run("NewTaskListFromTable", func(t *testing.T) { 326 + repo := &mockTaskRepository{ 327 + tasks: []*models.Task{ 328 + { 329 + ID: 1, 330 + Description: "Test task", 331 + Status: "todo", 332 + Priority: "high", 333 + Project: "work", 334 + Entry: time.Now(), 335 + Modified: time.Now(), 336 + }, 337 + }, 338 + } 339 + 340 + output := &bytes.Buffer{} 341 + input := strings.NewReader("q\n") 342 + 343 + table := NewTaskListFromTable(repo, output, input, true, false, "", "", "") 344 + if table == nil { 345 + t.Fatal("NewTaskListFromTable() returned nil") 346 + } 347 + 348 + err := table.Browse(context.Background()) 349 + if err != nil { 350 + t.Errorf("Browse() failed: %v", err) 351 + } 352 + 353 + outputStr := output.String() 354 + if !strings.Contains(outputStr, "Tasks") { 355 + t.Error("Output should contain 'Tasks' title") 356 + } 357 + if !strings.Contains(outputStr, "Test task") { 358 + t.Error("Output should contain task description") 359 + } 360 + if !strings.Contains(outputStr, "pending only") { 361 + t.Error("Output should contain 'pending only' filter status") 362 + } 363 + }) 364 + 365 + t.Run("Format Task For View", func(t *testing.T) { 366 + now := time.Now() 367 + due := now.Add(24 * time.Hour) 368 + start := now.Add(-time.Hour) 369 + end := now.Add(time.Hour) 370 + 371 + task := &models.Task{ 372 + ID: 1, 373 + UUID: "test-uuid-123", 374 + Description: "Test task description", 375 + Status: "in-progress", 376 + Priority: "high", 377 + Project: "work", 378 + Tags: []string{"urgent", "review"}, 379 + Due: &due, 380 + Entry: now, 381 + Modified: now.Add(30 * time.Minute), 382 + Start: &start, 383 + End: &end, 384 + Annotations: []string{"First note", "Second note"}, 385 + } 386 + 387 + result := formatTaskForView(task) 388 + 389 + if !strings.Contains(result, "Task 1") { 390 + t.Error("Formatted view should contain task ID in title") 391 + } 392 + if !strings.Contains(result, "test-uuid-123") { 393 + t.Error("Formatted view should contain UUID") 394 + } 395 + if !strings.Contains(result, "Test task description") { 396 + t.Error("Formatted view should contain description") 397 + } 398 + if !strings.Contains(result, "in-progress") { 399 + t.Error("Formatted view should contain status") 400 + } 401 + if !strings.Contains(result, "high") { 402 + t.Error("Formatted view should contain priority") 403 + } 404 + if !strings.Contains(result, "work") { 405 + t.Error("Formatted view should contain project") 406 + } 407 + if !strings.Contains(result, "urgent, review") { 408 + t.Error("Formatted view should contain tags") 409 + } 410 + if !strings.Contains(result, "Due:") { 411 + t.Error("Formatted view should contain due date") 412 + } 413 + if !strings.Contains(result, "Started:") { 414 + t.Error("Formatted view should contain start time") 415 + } 416 + if !strings.Contains(result, "Completed:") { 417 + t.Error("Formatted view should contain end time") 418 + } 419 + if !strings.Contains(result, "First note") { 420 + t.Error("Formatted view should contain annotations") 421 + } 422 + }) 423 + 424 + t.Run("Format Priority Field", func(t *testing.T) { 425 + tests := []struct { 426 + priority string 427 + name string 428 + contains string // What the result should contain 429 + }{ 430 + {"", "empty priority", "-"}, 431 + {"high", "high priority", "High"}, 432 + {"urgent", "urgent priority", "Urgent"}, 433 + {"medium", "medium priority", "Medium"}, 434 + {"low", "low priority", "Low"}, 435 + {"unknown", "unknown priority", "Unknown"}, 436 + } 437 + 438 + for _, tt := range tests { 439 + t.Run(tt.name, func(t *testing.T) { 440 + result := formatPriorityField(tt.priority) 441 + if !strings.Contains(result, tt.contains) { 442 + t.Errorf("formatPriorityField(%q) = %q, should contain %q", tt.priority, result, tt.contains) 443 + } 444 + }) 445 + } 446 + }) 447 + }
-908
internal/ui/task_list_test.go
··· 1 - package ui 2 - 3 - import ( 4 - "bytes" 5 - "context" 6 - "errors" 7 - "fmt" 8 - "strings" 9 - "testing" 10 - "time" 11 - 12 - "github.com/charmbracelet/bubbles/help" 13 - tea "github.com/charmbracelet/bubbletea" 14 - "github.com/stormlightlabs/noteleaf/internal/models" 15 - "github.com/stormlightlabs/noteleaf/internal/repo" 16 - ) 17 - 18 - // MockTaskRepository implements TaskRepository interface for testing 19 - type MockTaskRepository struct { 20 - tasks []*models.Task 21 - listError error 22 - updateError error 23 - } 24 - 25 - func (m *MockTaskRepository) List(ctx context.Context, opts repo.TaskListOptions) ([]*models.Task, error) { 26 - if m.listError != nil { 27 - return nil, m.listError 28 - } 29 - 30 - var filteredTasks []*models.Task 31 - for _, task := range m.tasks { 32 - // Apply filters 33 - if opts.Status != "" && task.Status != opts.Status { 34 - continue 35 - } 36 - if opts.Priority != "" && task.Priority != opts.Priority { 37 - continue 38 - } 39 - if opts.Project != "" && task.Project != opts.Project { 40 - continue 41 - } 42 - if opts.Search != "" && !strings.Contains(strings.ToLower(task.Description), strings.ToLower(opts.Search)) { 43 - continue 44 - } 45 - filteredTasks = append(filteredTasks, task) 46 - } 47 - 48 - // Apply limit 49 - if opts.Limit > 0 && len(filteredTasks) > opts.Limit { 50 - filteredTasks = filteredTasks[:opts.Limit] 51 - } 52 - 53 - return filteredTasks, nil 54 - } 55 - 56 - func (m *MockTaskRepository) Update(ctx context.Context, task *models.Task) error { 57 - if m.updateError != nil { 58 - return m.updateError 59 - } 60 - // Update the task in our mock data 61 - for i, t := range m.tasks { 62 - if t.ID == task.ID { 63 - m.tasks[i] = task 64 - break 65 - } 66 - } 67 - return nil 68 - } 69 - 70 - // Create mock tasks for testing 71 - func createMockTasks() []*models.Task { 72 - now := time.Now() 73 - return []*models.Task{ 74 - { 75 - ID: 1, 76 - UUID: "uuid-1", 77 - Description: "Review quarterly report", 78 - Status: "pending", 79 - Priority: "high", 80 - Project: "work", 81 - Tags: []string{"urgent", "business"}, 82 - Entry: now.Add(-24 * time.Hour), 83 - Modified: now.Add(-12 * time.Hour), 84 - }, 85 - { 86 - ID: 2, 87 - UUID: "uuid-2", 88 - Description: "Plan vacation itinerary", 89 - Status: "pending", 90 - Priority: "medium", 91 - Project: "personal", 92 - Tags: []string{"travel"}, 93 - Entry: now.Add(-48 * time.Hour), 94 - Modified: now.Add(-6 * time.Hour), 95 - }, 96 - { 97 - ID: 3, 98 - UUID: "uuid-3", 99 - Description: "Fix authentication bug", 100 - Status: "completed", 101 - Priority: "high", 102 - Project: "development", 103 - Tags: []string{"bug", "security"}, 104 - Entry: now.Add(-72 * time.Hour), 105 - Modified: now.Add(-1 * time.Hour), 106 - End: &now, 107 - }, 108 - { 109 - ID: 4, 110 - UUID: "uuid-4", 111 - Description: "Read Clean Code book", 112 - Status: "pending", 113 - Priority: "low", 114 - Project: "learning", 115 - Tags: []string{"books", "development"}, 116 - Entry: now.Add(-96 * time.Hour), 117 - Modified: now.Add(-3 * time.Hour), 118 - }, 119 - } 120 - } 121 - 122 - func TestTaskListOptions(t *testing.T) { 123 - t.Run("default options", func(t *testing.T) { 124 - opts := TaskListOptions{} 125 - if opts.Static { 126 - t.Error("Static should default to false") 127 - } 128 - if opts.ShowAll { 129 - t.Error("ShowAll should default to false") 130 - } 131 - }) 132 - 133 - t.Run("custom options", func(t *testing.T) { 134 - var buf bytes.Buffer 135 - opts := TaskListOptions{ 136 - Output: &buf, 137 - Static: true, 138 - ShowAll: true, 139 - Status: "pending", 140 - Priority: "high", 141 - Project: "work", 142 - } 143 - 144 - if !opts.Static { 145 - t.Error("Static should be enabled") 146 - } 147 - if !opts.ShowAll { 148 - t.Error("ShowAll should be enabled") 149 - } 150 - if opts.Output != &buf { 151 - t.Error("Output should be set to buffer") 152 - } 153 - if opts.Status != "pending" { 154 - t.Error("Status filter not set correctly") 155 - } 156 - if opts.Priority != "high" { 157 - t.Error("Priority filter not set correctly") 158 - } 159 - if opts.Project != "work" { 160 - t.Error("Project filter not set correctly") 161 - } 162 - }) 163 - } 164 - 165 - func TestNewTaskList(t *testing.T) { 166 - repo := &MockTaskRepository{tasks: createMockTasks()} 167 - 168 - t.Run("with default options", func(t *testing.T) { 169 - tl := NewTaskList(repo, TaskListOptions{}) 170 - if tl == nil { 171 - t.Fatal("NewTaskList returned nil") 172 - } 173 - if tl.repo != repo { 174 - t.Error("Repository not set correctly") 175 - } 176 - if tl.opts.Output == nil { 177 - t.Error("Output should default to os.Stdout") 178 - } 179 - if tl.opts.Input == nil { 180 - t.Error("Input should default to os.Stdin") 181 - } 182 - }) 183 - 184 - t.Run("with custom options", func(t *testing.T) { 185 - var buf bytes.Buffer 186 - opts := TaskListOptions{ 187 - Output: &buf, 188 - Static: true, 189 - ShowAll: true, 190 - Priority: "high", 191 - } 192 - tl := NewTaskList(repo, opts) 193 - if tl.opts.Output != &buf { 194 - t.Error("Custom output not set") 195 - } 196 - if !tl.opts.Static { 197 - t.Error("Static mode not set") 198 - } 199 - if tl.opts.Priority != "high" { 200 - t.Error("Priority filter not set") 201 - } 202 - }) 203 - } 204 - 205 - func TestTaskListStaticMode(t *testing.T) { 206 - t.Run("successful static list", func(t *testing.T) { 207 - repo := &MockTaskRepository{tasks: createMockTasks()} 208 - var buf bytes.Buffer 209 - 210 - tl := NewTaskList(repo, TaskListOptions{ 211 - Output: &buf, 212 - Static: true, 213 - }) 214 - 215 - err := tl.Browse(context.Background()) 216 - if err != nil { 217 - t.Fatalf("Browse failed: %v", err) 218 - } 219 - 220 - output := buf.String() 221 - if !strings.Contains(output, "Tasks (pending only)") { 222 - t.Error("Title not displayed correctly") 223 - } 224 - if !strings.Contains(output, "Review quarterly report") { 225 - t.Error("First task not displayed") 226 - } 227 - if !strings.Contains(output, "Plan vacation itinerary") { 228 - t.Error("Second task not displayed") 229 - } 230 - if strings.Contains(output, "Fix authentication bug") { 231 - t.Error("Completed task should not be shown by default") 232 - } 233 - }) 234 - 235 - t.Run("static list with all tasks", func(t *testing.T) { 236 - repo := &MockTaskRepository{tasks: createMockTasks()} 237 - var buf bytes.Buffer 238 - 239 - tl := NewTaskList(repo, TaskListOptions{ 240 - Output: &buf, 241 - Static: true, 242 - ShowAll: true, 243 - }) 244 - 245 - err := tl.Browse(context.Background()) 246 - if err != nil { 247 - t.Fatalf("Browse failed: %v", err) 248 - } 249 - 250 - output := buf.String() 251 - if !strings.Contains(output, "Tasks (showing all)") { 252 - t.Error("All tasks title not displayed correctly") 253 - } 254 - if !strings.Contains(output, "Fix authentication bug") { 255 - t.Error("Completed task should be shown with --all") 256 - } 257 - }) 258 - 259 - t.Run("static list with filters", func(t *testing.T) { 260 - repo := &MockTaskRepository{tasks: createMockTasks()} 261 - var buf bytes.Buffer 262 - 263 - tl := NewTaskList(repo, TaskListOptions{ 264 - Output: &buf, 265 - Static: true, 266 - ShowAll: true, 267 - Priority: "high", 268 - }) 269 - 270 - err := tl.Browse(context.Background()) 271 - if err != nil { 272 - t.Fatalf("Browse failed: %v", err) 273 - } 274 - 275 - output := buf.String() 276 - if !strings.Contains(output, "Review quarterly report") { 277 - t.Error("High priority task not displayed") 278 - } 279 - if !strings.Contains(output, "Fix authentication bug") { 280 - t.Error("High priority completed task not displayed") 281 - } 282 - if strings.Contains(output, "Plan vacation itinerary") { 283 - t.Error("Medium priority task should not be displayed") 284 - } 285 - }) 286 - 287 - t.Run("static list with no results", func(t *testing.T) { 288 - repo := &MockTaskRepository{tasks: []*models.Task{}} 289 - var buf bytes.Buffer 290 - 291 - tl := NewTaskList(repo, TaskListOptions{ 292 - Output: &buf, 293 - Static: true, 294 - }) 295 - 296 - err := tl.Browse(context.Background()) 297 - if err != nil { 298 - t.Fatalf("Browse failed: %v", err) 299 - } 300 - 301 - output := buf.String() 302 - if !strings.Contains(output, "No tasks found") { 303 - t.Error("No tasks message not displayed") 304 - } 305 - }) 306 - 307 - t.Run("static list with repository error", func(t *testing.T) { 308 - repo := &MockTaskRepository{ 309 - listError: errors.New("database error"), 310 - } 311 - var buf bytes.Buffer 312 - 313 - tl := NewTaskList(repo, TaskListOptions{ 314 - Output: &buf, 315 - Static: true, 316 - }) 317 - 318 - err := tl.Browse(context.Background()) 319 - if err == nil { 320 - t.Fatal("Expected error, got nil") 321 - } 322 - 323 - output := buf.String() 324 - if !strings.Contains(output, "Error: database error") { 325 - t.Error("Error message not displayed") 326 - } 327 - }) 328 - } 329 - 330 - func TestTaskListModel(t *testing.T) { 331 - repo := &MockTaskRepository{tasks: createMockTasks()} 332 - 333 - t.Run("initial model state", func(t *testing.T) { 334 - model := taskListModel{ 335 - opts: TaskListOptions{ShowAll: false}, 336 - } 337 - 338 - if model.selected != 0 { 339 - t.Error("Initial selected should be 0") 340 - } 341 - if model.viewing { 342 - t.Error("Initial viewing should be false") 343 - } 344 - if model.showAll { 345 - t.Error("Initial showAll should be false") 346 - } 347 - }) 348 - 349 - t.Run("load tasks command", func(t *testing.T) { 350 - model := taskListModel{ 351 - keys: keys, 352 - help: help.New(), 353 - repo: repo, 354 - opts: TaskListOptions{ShowAll: false}, 355 - } 356 - 357 - cmd := model.loadTasks() 358 - if cmd == nil { 359 - t.Fatal("loadTasks should return a command") 360 - } 361 - 362 - msg := cmd() 363 - switch msg := msg.(type) { 364 - case tasksLoadedMsg: 365 - tasks := []*models.Task(msg) 366 - if len(tasks) != 3 { // Only pending tasks 367 - t.Errorf("Expected 3 pending tasks, got %d", len(tasks)) 368 - } 369 - case errorTaskMsg: 370 - t.Fatalf("Unexpected error: %v", error(msg)) 371 - default: 372 - t.Fatalf("Unexpected message type: %T", msg) 373 - } 374 - }) 375 - 376 - t.Run("load all tasks", func(t *testing.T) { 377 - model := taskListModel{ 378 - keys: keys, 379 - repo: repo, 380 - opts: TaskListOptions{ShowAll: true}, 381 - showAll: true, 382 - } 383 - 384 - cmd := model.loadTasks() 385 - msg := cmd() 386 - 387 - switch msg := msg.(type) { 388 - case tasksLoadedMsg: 389 - tasks := []*models.Task(msg) 390 - if len(tasks) != 4 { // All tasks 391 - t.Errorf("Expected 4 tasks, got %d", len(tasks)) 392 - } 393 - case errorTaskMsg: 394 - t.Fatalf("Unexpected error: %v", error(msg)) 395 - } 396 - }) 397 - 398 - t.Run("view task command", func(t *testing.T) { 399 - model := taskListModel{ 400 - keys: keys, 401 - help: help.New(), 402 - repo: repo, 403 - opts: TaskListOptions{}, 404 - } 405 - 406 - task := createMockTasks()[0] 407 - cmd := model.viewTask(task) 408 - if cmd == nil { 409 - t.Fatal("viewTask should return a command") 410 - } 411 - 412 - msg := cmd() 413 - switch msg := msg.(type) { 414 - case taskViewMsg: 415 - content := string(msg) 416 - if !strings.Contains(content, "# Task 1") { 417 - t.Error("Task title not in view content") 418 - } 419 - if !strings.Contains(content, "Review quarterly report") { 420 - t.Error("Task description not in view content") 421 - } 422 - if !strings.Contains(content, "**Status:** pending") { 423 - t.Error("Task status not in view content") 424 - } 425 - if !strings.Contains(content, "**Priority:** high") { 426 - t.Error("Task priority not in view content") 427 - } 428 - default: 429 - t.Fatalf("Unexpected message type: %T", msg) 430 - } 431 - }) 432 - 433 - t.Run("mark done command", func(t *testing.T) { 434 - model := taskListModel{ 435 - keys: keys, 436 - help: help.New(), 437 - repo: repo, 438 - opts: TaskListOptions{}, 439 - } 440 - 441 - task := createMockTasks()[0] // Pending task 442 - cmd := model.markDone(task) 443 - if cmd == nil { 444 - t.Fatal("markDone should return a command") 445 - } 446 - 447 - msg := cmd() 448 - switch msg := msg.(type) { 449 - case tasksLoadedMsg: 450 - // Success - tasks reloaded 451 - case errorTaskMsg: 452 - err := error(msg) 453 - if !strings.Contains(err.Error(), "completed") { 454 - t.Fatalf("Unexpected error: %v", err) 455 - } 456 - default: 457 - t.Fatalf("Unexpected message type: %T", msg) 458 - } 459 - }) 460 - 461 - t.Run("mark done already completed task", func(t *testing.T) { 462 - model := taskListModel{ 463 - keys: keys, 464 - help: help.New(), 465 - repo: repo, 466 - opts: TaskListOptions{}, 467 - } 468 - 469 - task := createMockTasks()[2] 470 - cmd := model.markDone(task) 471 - msg := cmd() 472 - 473 - switch msg := msg.(type) { 474 - case errorTaskMsg: 475 - err := error(msg) 476 - if !strings.Contains(err.Error(), "already completed") { 477 - t.Errorf("Expected 'already completed' error, got: %v", err) 478 - } 479 - default: 480 - t.Fatalf("Expected errorTaskMsg for already completed task, got: %T", msg) 481 - } 482 - }) 483 - } 484 - 485 - func TestTaskListModelKeyHandling(t *testing.T) { 486 - repo := &MockTaskRepository{tasks: createMockTasks()} 487 - 488 - t.Run("quit commands", func(t *testing.T) { 489 - model := taskListModel{ 490 - keys: keys, 491 - repo: repo, 492 - tasks: createMockTasks()[:2], // First 2 tasks 493 - opts: TaskListOptions{}, 494 - } 495 - 496 - quitKeys := []string{"ctrl+c", "q"} 497 - for _, key := range quitKeys { 498 - newModel, cmd := model.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune(key)}) 499 - if cmd == nil { 500 - t.Errorf("Key %s should return quit command", key) 501 - } 502 - _ = newModel // Model should be returned 503 - } 504 - }) 505 - 506 - t.Run("navigation keys", func(t *testing.T) { 507 - model := taskListModel{ 508 - keys: keys, 509 - repo: repo, 510 - tasks: createMockTasks()[:3], // First 3 tasks 511 - selected: 1, // Start in middle 512 - opts: TaskListOptions{}, 513 - } 514 - 515 - upKeys := []string{"up", "k"} 516 - for _, key := range upKeys { 517 - testModel := model 518 - newModel, _ := testModel.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune(key)}) 519 - if m, ok := newModel.(taskListModel); ok { 520 - if m.selected != 0 { 521 - t.Errorf("Key %s should move selection up to 0, got %d", key, m.selected) 522 - } 523 - } 524 - } 525 - 526 - downKeys := []string{"down", "j"} 527 - for _, key := range downKeys { 528 - testModel := model 529 - newModel, _ := testModel.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune(key)}) 530 - if m, ok := newModel.(taskListModel); ok { 531 - if m.selected != 2 { 532 - t.Errorf("Key %s should move selection down to 2, got %d", key, m.selected) 533 - } 534 - } 535 - } 536 - }) 537 - 538 - t.Run("view task keys", func(t *testing.T) { 539 - model := taskListModel{ 540 - keys: keys, 541 - repo: repo, 542 - tasks: createMockTasks()[:2], 543 - selected: 0, 544 - opts: TaskListOptions{}, 545 - } 546 - 547 - viewKeys := []string{"enter", "v"} 548 - for _, key := range viewKeys { 549 - testModel := model 550 - _, cmd := testModel.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune(key)}) 551 - if cmd == nil { 552 - t.Errorf("Key %s should return view command", key) 553 - } 554 - } 555 - }) 556 - 557 - t.Run("number shortcuts", func(t *testing.T) { 558 - model := taskListModel{ 559 - keys: keys, 560 - repo: repo, 561 - tasks: createMockTasks()[:4], 562 - opts: TaskListOptions{}, 563 - } 564 - 565 - for i := 1; i <= 4; i++ { 566 - testModel := model 567 - key := fmt.Sprintf("%d", i) 568 - newModel, _ := testModel.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune(key)}) 569 - if m, ok := newModel.(taskListModel); ok { 570 - expectedIndex := i - 1 571 - if m.selected != expectedIndex { 572 - t.Errorf("Number key %s should select index %d, got %d", key, expectedIndex, m.selected) 573 - } 574 - } 575 - } 576 - }) 577 - 578 - t.Run("toggle all/pending", func(t *testing.T) { 579 - model := taskListModel{ 580 - keys: keys, 581 - repo: repo, 582 - tasks: createMockTasks()[:2], 583 - showAll: false, 584 - opts: TaskListOptions{}, 585 - } 586 - 587 - newModel, cmd := model.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("a")}) 588 - if m, ok := newModel.(taskListModel); ok { 589 - if !m.showAll { 590 - t.Error("Key 'a' should toggle showAll to true") 591 - } 592 - } 593 - if cmd == nil { 594 - t.Error("Toggle all should trigger task reload") 595 - } 596 - }) 597 - 598 - t.Run("mark done key", func(t *testing.T) { 599 - model := taskListModel{ 600 - keys: keys, 601 - repo: repo, 602 - tasks: createMockTasks()[:2], 603 - selected: 0, 604 - opts: TaskListOptions{}, 605 - } 606 - 607 - _, cmd := model.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("d")}) 608 - if cmd == nil { 609 - t.Error("Key 'd' should return mark done command") 610 - } 611 - }) 612 - 613 - t.Run("refresh key", func(t *testing.T) { 614 - model := taskListModel{ 615 - keys: keys, 616 - repo: repo, 617 - tasks: createMockTasks()[:2], 618 - opts: TaskListOptions{}, 619 - } 620 - 621 - _, cmd := model.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune("r")}) 622 - if cmd == nil { 623 - t.Error("Key 'r' should return refresh command") 624 - } 625 - }) 626 - 627 - t.Run("viewing mode navigation", func(t *testing.T) { 628 - model := taskListModel{ 629 - keys: keys, 630 - repo: repo, 631 - tasks: createMockTasks()[:2], 632 - viewing: true, 633 - viewContent: "Test content", 634 - opts: TaskListOptions{}, 635 - } 636 - 637 - exitKeys := []string{"q", "esc", "backspace"} 638 - for _, key := range exitKeys { 639 - testModel := model 640 - newModel, _ := testModel.Update(tea.KeyMsg{Type: tea.KeyRunes, Runes: []rune(key)}) 641 - if m, ok := newModel.(taskListModel); ok { 642 - if m.viewing { 643 - t.Errorf("Key %s should exit viewing mode", key) 644 - } 645 - if m.viewContent != "" { 646 - t.Errorf("Key %s should clear view content", key) 647 - } 648 - } 649 - } 650 - }) 651 - } 652 - 653 - func TestTaskListModelView(t *testing.T) { 654 - repo := &MockTaskRepository{tasks: createMockTasks()} 655 - 656 - t.Run("viewing mode", func(t *testing.T) { 657 - model := taskListModel{ 658 - keys: keys, 659 - repo: repo, 660 - viewing: true, 661 - viewContent: "# Task Details\nTest content here", 662 - opts: TaskListOptions{}, 663 - } 664 - 665 - view := model.View() 666 - if !strings.Contains(view, "# Task Details") { 667 - t.Error("View content not displayed in viewing mode") 668 - } 669 - if !strings.Contains(view, "Press q/esc/backspace to return to list") { 670 - t.Error("Return instructions not displayed") 671 - } 672 - }) 673 - 674 - t.Run("error state", func(t *testing.T) { 675 - model := taskListModel{ 676 - keys: keys, 677 - help: help.New(), 678 - repo: repo, 679 - err: errors.New("test error"), 680 - opts: TaskListOptions{}, 681 - } 682 - 683 - view := model.View() 684 - if !strings.Contains(view, "Error: test error") { 685 - t.Error("Error message not displayed") 686 - } 687 - }) 688 - 689 - t.Run("no tasks", func(t *testing.T) { 690 - model := taskListModel{ 691 - keys: keys, 692 - repo: repo, 693 - tasks: []*models.Task{}, 694 - opts: TaskListOptions{}, 695 - } 696 - 697 - view := model.View() 698 - if !strings.Contains(view, "No tasks found") { 699 - t.Error("No tasks message not displayed") 700 - } 701 - if !strings.Contains(view, "Press r to refresh, q to quit") { 702 - t.Error("Help text not displayed") 703 - } 704 - }) 705 - 706 - t.Run("with tasks", func(t *testing.T) { 707 - tasks := createMockTasks()[:2] // First 2 tasks 708 - model := taskListModel{ 709 - keys: keys, 710 - repo: repo, 711 - tasks: tasks, 712 - selected: 0, 713 - showAll: false, 714 - opts: TaskListOptions{}, 715 - } 716 - 717 - view := model.View() 718 - if !strings.Contains(view, "Tasks (pending only)") { 719 - t.Error("Title not displayed correctly") 720 - } 721 - if !strings.Contains(view, "Review quarterly report") { 722 - t.Error("First task not displayed") 723 - } 724 - if !strings.Contains(view, "Plan vacation itinerary") { 725 - t.Error("Second task not displayed") 726 - } 727 - if !strings.Contains(view, "help") { 728 - t.Error("Help instructions not displayed") 729 - } 730 - }) 731 - 732 - t.Run("show all mode", func(t *testing.T) { 733 - model := taskListModel{ 734 - keys: keys, 735 - repo: repo, 736 - tasks: createMockTasks(), 737 - showAll: true, 738 - opts: TaskListOptions{ShowAll: true}, 739 - } 740 - 741 - view := model.View() 742 - if !strings.Contains(view, "Tasks (showing all)") { 743 - t.Error("Show all title not displayed correctly") 744 - } 745 - }) 746 - 747 - t.Run("selected task highlighting", func(t *testing.T) { 748 - tasks := createMockTasks()[:2] 749 - model := taskListModel{ 750 - 751 - keys: keys, 752 - repo: repo, 753 - tasks: tasks, 754 - selected: 0, 755 - opts: TaskListOptions{}, 756 - } 757 - 758 - view := model.View() 759 - if !strings.Contains(view, " > 1 ") { 760 - t.Error("Selected task not highlighted with '>' prefix") 761 - } 762 - }) 763 - } 764 - 765 - func TestTaskListModelUpdate(t *testing.T) { 766 - repo := &MockTaskRepository{tasks: createMockTasks()} 767 - 768 - t.Run("tasks loaded message", func(t *testing.T) { 769 - model := taskListModel{ 770 - keys: keys, 771 - help: help.New(), 772 - repo: repo, 773 - opts: TaskListOptions{}, 774 - } 775 - 776 - tasks := createMockTasks()[:2] 777 - newModel, _ := model.Update(tasksLoadedMsg(tasks)) 778 - 779 - if m, ok := newModel.(taskListModel); ok { 780 - if len(m.tasks) != 2 { 781 - t.Errorf("Expected 2 tasks, got %d", len(m.tasks)) 782 - } 783 - if m.tasks[0].Description != "Review quarterly report" { 784 - t.Error("Tasks not loaded correctly") 785 - } 786 - } 787 - }) 788 - 789 - t.Run("task view message", func(t *testing.T) { 790 - model := taskListModel{ 791 - keys: keys, 792 - help: help.New(), 793 - repo: repo, 794 - opts: TaskListOptions{}, 795 - } 796 - 797 - content := "# Task Details\nTest content" 798 - newModel, _ := model.Update(taskViewMsg(content)) 799 - 800 - if m, ok := newModel.(taskListModel); ok { 801 - if !m.viewing { 802 - t.Error("Viewing mode not activated") 803 - } 804 - if m.viewContent != content { 805 - t.Error("View content not set correctly") 806 - } 807 - } 808 - }) 809 - 810 - t.Run("error message", func(t *testing.T) { 811 - model := taskListModel{ 812 - keys: keys, 813 - help: help.New(), 814 - repo: repo, 815 - opts: TaskListOptions{}, 816 - } 817 - 818 - testErr := errors.New("test error") 819 - newModel, _ := model.Update(errorTaskMsg(testErr)) 820 - 821 - if m, ok := newModel.(taskListModel); ok { 822 - if m.err == nil { 823 - t.Error("Error not set") 824 - } 825 - if m.err.Error() != "test error" { 826 - t.Errorf("Expected 'test error', got %v", m.err) 827 - } 828 - } 829 - }) 830 - 831 - t.Run("selected index bounds", func(t *testing.T) { 832 - model := taskListModel{ 833 - keys: keys, 834 - repo: repo, 835 - tasks: createMockTasks()[:2], 836 - selected: 5, 837 - opts: TaskListOptions{}, 838 - } 839 - 840 - newTasks := createMockTasks()[:1] 841 - newModel, _ := model.Update(tasksLoadedMsg(newTasks)) 842 - 843 - if m, ok := newModel.(taskListModel); ok { 844 - if m.selected >= len(m.tasks) { 845 - t.Error("Selected index should be adjusted to bounds") 846 - } 847 - if m.selected != 0 { 848 - t.Errorf("Expected selected to be 0, got %d", m.selected) 849 - } 850 - } 851 - }) 852 - } 853 - 854 - func TestTaskListRepositoryError(t *testing.T) { 855 - t.Run("list error in loadTasks", func(t *testing.T) { 856 - repo := &MockTaskRepository{ 857 - listError: errors.New("database connection failed"), 858 - } 859 - 860 - model := taskListModel{ 861 - keys: keys, 862 - help: help.New(), 863 - repo: repo, 864 - opts: TaskListOptions{}, 865 - } 866 - 867 - cmd := model.loadTasks() 868 - msg := cmd() 869 - 870 - switch msg := msg.(type) { 871 - case errorTaskMsg: 872 - err := error(msg) 873 - if !strings.Contains(err.Error(), "database connection failed") { 874 - t.Errorf("Expected database error, got: %v", err) 875 - } 876 - default: 877 - t.Fatalf("Expected errorTaskMsg, got: %T", msg) 878 - } 879 - }) 880 - 881 - t.Run("update error in markDone", func(t *testing.T) { 882 - repo := &MockTaskRepository{ 883 - tasks: createMockTasks(), 884 - updateError: errors.New("update failed"), 885 - } 886 - 887 - model := taskListModel{ 888 - keys: keys, 889 - help: help.New(), 890 - repo: repo, 891 - opts: TaskListOptions{}, 892 - } 893 - 894 - task := createMockTasks()[0] 895 - cmd := model.markDone(task) 896 - msg := cmd() 897 - 898 - switch msg := msg.(type) { 899 - case errorTaskMsg: 900 - err := error(msg) 901 - if !strings.Contains(err.Error(), "failed to mark task done") { 902 - t.Errorf("Expected mark done error, got: %v", err) 903 - } 904 - default: 905 - t.Fatalf("Expected errorTaskMsg, got: %T", msg) 906 - } 907 - }) 908 - }
internal/ui/ui_test.go internal/ui/colors_test.go
+19
internal/utils/utils.go
··· 1 1 package utils 2 2 3 3 import ( 4 + "context" 4 5 "os" 5 6 "strings" 6 7 7 8 "github.com/charmbracelet/log" 9 + "github.com/stormlightlabs/noteleaf/internal/models" 10 + "github.com/stormlightlabs/noteleaf/internal/repo" 8 11 "golang.org/x/text/cases" 9 12 "golang.org/x/text/language" 10 13 ) ··· 51 54 func Titlecase(s string) string { 52 55 return cases.Title(language.Und, cases.NoLower).String(s) 53 56 } 57 + 58 + // TestTaskRepository interface for dependency injection in tests 59 + type TestTaskRepository interface { 60 + List(ctx context.Context, options repo.TaskListOptions) ([]*models.Task, error) 61 + Update(ctx context.Context, task *models.Task) error 62 + } 63 + 64 + // TestBookRepository interface for dependency injection in tests 65 + type TestBookRepository interface { 66 + List(ctx context.Context, options repo.BookListOptions) ([]*models.Book, error) 67 + } 68 + 69 + // TestNoteRepository interface for dependency injection in tests 70 + type TestNoteRepository interface { 71 + List(ctx context.Context, options repo.NoteListOptions) ([]*models.Note, error) 72 + }