feat: 🎉 Rating Orama!

This commit is contained in:
2023-04-09 06:45:27 +02:00
commit b2f4b573f3
61 changed files with 8130 additions and 0 deletions
+24
View File
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
+5
View File
@@ -0,0 +1,5 @@
*.js
*.cjs
build/
coverage/
node_modules/
+3
View File
@@ -0,0 +1,3 @@
{
"attributeGroups": ["^x-*", "$CODE_GUIDE", "^placeholder"]
}
+236
View File
@@ -0,0 +1,236 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="./src/styles/index.css" rel="stylesheet" />
<title>Inicio</title>
</head>
<body class="min-h-screen bg-gray-100">
<p class="mb-6 bg-yellow-400">
Work in progress - API 0.1.0 / Harvester 0.1.0 / Views 0.1.0
<a class="text-blue-800" href="mailto:hola@pedroperez.dev"
>Have you found any bugs or is it not working with a specific tv
show?</a
>
</p>
<div class="flex w-full flex-col items-center">
<h1 class="mb-6 text-3xl font-bold">Breaking Bad</h1>
<div class="mb-6 rounded-lg bg-white p-6 shadow-md">
<div class="mb-4 text-center">
<span class="text-gray-600">IMDb ID:</span>
<span class="font-semibold text-gray-800">0903747</span>
</div>
<div class="grid grid-cols-2 gap-8">
<ul class="space-y-2">
<li>
<span class="text-gray-600">Title:</span>
<span class="font-semibold text-gray-800">Breaking Bad</span>
</li>
<li>
<span class="text-gray-600">Runtime:</span>
<span class="font-semibold text-gray-800">49 min</span>
</li>
<li>
<span class="text-gray-600">Seasons:</span>
<span class="font-semibold text-gray-800">5</span>
</li>
</ul>
<ul class="space-y-2">
<li>
<span class="text-gray-600">Total votes:</span>
<span class="font-semibold text-gray-800">1970456</span>
</li>
<li>
<span class="text-gray-600">Average rating:</span>
<span class="font-semibold text-gray-800">8.95</span>
</li>
<li>
<span class="text-gray-600">Median rating:</span>
<span class="font-semibold text-gray-800">8.85</span>
</li>
</ul>
</div>
</div>
<div class="mb-6 w-2/3">
<h2 class="mb-6 text-center text-2xl font-bold">Seasons overall</h2>
<canvas id="seasons"></canvas>
</div>
<div class="mb-6 w-2/3">
<div x-data="{ selectedSeasonNumber: 1}">
<h2 class="mb-6 text-center text-2xl font-bold">
Season <span x-text="selectedSeasonNumber"></span>
</h2>
<canvas id="episodes"></canvas>
<div class="mt-4 flex items-center justify-center space-x-2">
<button
x-on:click="selectedSeasonNumber = 1; loadSeason(1)"
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
:class="selectedSeasonNumber === 1 ? 'bg-black text-white' : 'text-black'"
>
S1
</button>
<button
x-on:click="selectedSeasonNumber = 2; loadSeason(2)"
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
:class="selectedSeasonNumber === 2 ? 'bg-black text-white' : 'text-black'"
>
S2
</button>
<button
x-on:click="selectedSeasonNumber = 3; loadSeason(3)"
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
:class="selectedSeasonNumber === 3 ? 'bg-black text-white' : 'text-black'"
>
S3
</button>
<button
x-on:click="selectedSeasonNumber = 4; loadSeason(4)"
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
:class="selectedSeasonNumber === 4 ? 'bg-black text-white' : 'text-black'"
>
S4
</button>
<button
x-on:click="selectedSeasonNumber = 5; loadSeason(5)"
class="rounded-md border-2 border-black px-4 py-2 font-semibold text-black hover:bg-black hover:text-white"
:class="selectedSeasonNumber === 5 ? 'bg-black text-white' : 'text-black'"
>
S5
</button>
</div>
</div>
</div>
</div>
<footer class="bg-gray-200" aria-label="Site Footer">
<ul class="mt-12 flex justify-center gap-6 p-12">
<li>
<a
class="text-gray-700 transition hover:text-gray-700/75"
href="https://www.instagram.com/zepyrshut/"
rel="noreferrer"
target="_blank"
>
<span class="sr-only">Instagram</span>
<svg
class="h-6 w-6"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
fill-rule="evenodd"
d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z"
clip-rule="evenodd"
/>
</svg>
</a>
</li>
<li>
<a
class="text-gray-700 transition hover:text-gray-700/75"
href="https://github.com/zepyrshut"
rel="noreferrer"
target="_blank"
>
<span class="sr-only">GitHub</span>
<svg
class="h-6 w-6"
aria-hidden="true"
fill="currentColor"
viewBox="0 0 24 24"
>
<path
fill-rule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clip-rule="evenodd"
/>
</svg>
</a>
</li>
<li>
<a
class="text-gray-700 transition hover:text-gray-700/75"
href="https://pedroperez.dev/"
rel="noreferrer"
target="_blank"
>
<span class="sr-only">Website</span>
<svg
class="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M12 21a9.004 9.004 0 008.716-6.747M12 21a9.004 9.004 0 01-8.716-6.747M12 21c2.485 0 4.5-4.03 4.5-9S14.485 3 12 3m0 18c-2.485 0-4.5-4.03-4.5-9S9.515 3 12 3m0 0a8.997 8.997 0 017.843 4.582M12 3a8.997 8.997 0 00-7.843 4.582m15.686 0A11.953 11.953 0 0112 10.5c-2.998 0-5.74-1.1-7.843-2.918m15.686 0A8.959 8.959 0 0121 12c0 .778-.099 1.533-.284 2.253m0 0A17.919 17.919 0 0112 16.5c-3.162 0-6.133-.815-8.716-2.247m0 0A9.015 9.015 0 013 12c0-1.605.42-3.113 1.157-4.418"
/>
</svg>
</a>
</li>
<li>
<a
class="text-gray-700 transition hover:text-gray-700/75"
href="https://github.com/zepyrshut/rating-orama"
rel="noreferrer"
target="_blank"
>
<span class="sr-only">Source</span>
<svg
class="h-6 w-6"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M17.25 6.75L22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3l-4.5 16.5"
/>
</svg>
</a>
</li>
</ul>
</footer>
<script src="./src/main.js" type="module"></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.2.1/chart.umd.js"
integrity="sha512-vCUbejtS+HcWYtDHRF2T5B0BKwVG/CLeuew5uT2AiX4SJ2Wff52+kfgONvtdATqkqQMC9Ye5K+Td0OTaz+P7cw=="
crossorigin="anonymous"
referrerpolicy="no-referrer"
></script>
<script type="module">
import { initCharts, loadSpecificSeason } from "./src/components/charts.js";
import { data } from "./src/data/breaking-bad.js";
const tvShowParsed = data;
function loadSeason(season) {
const currentScrollY = window.scrollY;
loadSpecificSeason(tvShowParsed, season);
window.scrollTo(0, currentScrollY);
}
window.loadSeason = loadSeason;
document.addEventListener("DOMContentLoaded", function () {
initCharts(tvShowParsed);
});
</script>
</body>
</html>
+80
View File
@@ -0,0 +1,80 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link href="./src/styles/index.css" rel="stylesheet" />
<title>Inicio</title>
</head>
<body class="min-h-screen bg-gray-100">
<p class="mb-6 bg-yellow-400">
Work in progress - API 0.1.0 / Harvester 0.1.0 / Views 0.1.0
<a class="text-blue-800" href="mailto:hola@pedroperez.dev"
>Have you found any bugs or is it not working with a specific tv
show?</a
>
</p>
<div class="flex min-h-screen flex-col items-center justify-center">
<h1 class="mb-6 text-3xl font-bold">Rating Orama</h1>
<div class="w-full max-w-md">
<form x-data="search" @submit.prevent="submit" class="flex items-center gap-3" >
<input
x-model="ttID"
class="rounded-md border-2 border-black bg-white px-4 py-2 w-11/12"
id="search"
name="search"
type="text"
placeholder="tt0903747"
required
/>
<button
:disabled="isLoading"
class="rounded-md border-2 border-black bg-white px-4 py-2 font-bold text-black w-2/12"
type="submit"
:class="isLoading ? '' : 'hover:bg-black hover:text-white'"
>
<div class="flex items-center justify-center">
<template x-if="isLoading">
<div role="status">
<svg
xmlns="http://www.w3.org/2000/svg"
class="h-6 w-6 animate-spin fill-black text-white"
aria-hidden="true"
viewBox="0 0 100 101"
fill="none"
>
<path
d="M100 50.5908C100 78.2051 77.6142 100.591 50 100.591C22.3858 100.591 0 78.2051 0 50.5908C0 22.9766 22.3858 0.59082 50 0.59082C77.6142 0.59082 100 22.9766 100 50.5908ZM9.08144 50.5908C9.08144 73.1895 27.4013 91.5094 50 91.5094C72.5987 91.5094 90.9186 73.1895 90.9186 50.5908C90.9186 27.9921 72.5987 9.67226 50 9.67226C27.4013 9.67226 9.08144 27.9921 9.08144 50.5908Z"
fill="currentColor"
/>
<path
d="M93.9676 39.0409C96.393 38.4038 97.8624 35.9116 97.0079 33.5539C95.2932 28.8227 92.871 24.3692 89.8167 20.348C85.8452 15.1192 80.8826 10.7238 75.2124 7.41289C69.5422 4.10194 63.2754 1.94025 56.7698 1.05124C51.7666 0.367541 46.6976 0.446843 41.7345 1.27873C39.2613 1.69328 37.813 4.19778 38.4501 6.62326C39.0873 9.04874 41.5694 10.4717 44.0505 10.1071C47.8511 9.54855 51.7191 9.52689 55.5402 10.0491C60.8642 10.7766 65.9928 12.5457 70.6331 15.2552C75.2735 17.9648 79.3347 21.5619 82.5849 25.841C84.9175 28.9121 86.7997 32.2913 88.1811 35.8758C89.083 38.2158 91.5421 39.6781 93.9676 39.0409Z"
fill="currentFill"
/>
</svg>
<span class="sr-only">Cargando...</span>
</div>
</template>
<template x-if="!isLoading" class="lorem">
<span>Go!</span>
</template>
</div>
</button>
</form>
<p class="mt-2">
Please input <span class="font-bold">tt id</span> from IDMb
</p>
</div>
</div>
<script src="./src/main.js" type="module"></script>
</body>
</html>
+4128
View File
File diff suppressed because it is too large Load Diff
+31
View File
@@ -0,0 +1,31 @@
{
"name": "views-dev",
"private": true,
"version": "0.1.0",
"type": "module",
"author": "Pedro Pérez",
"license": "EUPL",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"devDependencies": {
"@tailwindcss/forms": "^0.5.3",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.21",
"prettier": "^2.8.7",
"prettier-plugin-organize-attributes": "^0.0.5",
"prettier-plugin-tailwindcss": "^0.2.7",
"standard": "^17.0.0",
"tailwindcss": "^3.3.1",
"vite": "^4.2.1"
},
"standard": {
"ignore": [
"node_modules",
"dist",
"*.config.js"
]
}
}
+6
View File
@@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {}
}
}
+178
View File
@@ -0,0 +1,178 @@
export function initCharts (tvShowParsed) {
new EpisodeChart(tvShowParsed, 'episodes', 0)
new SeasonsChart(tvShowParsed, 'seasons')
}
export function loadSpecificSeason (tvShowParsed, seasonId) {
new EpisodeChart(tvShowParsed, 'episodes', seasonId - 1)
}
let chartInstance
class SeasonsChart {
constructor (tvShowParsed, canvasId) {
this.tvShowParsed = tvShowParsed
this.canvasId = canvasId
this.createChart()
}
createChart () {
const seasons = this.tvShowParsed.seasons
const labels = seasons.map((season) => `Season ${season.number}`)
const averageRating = seasons.map((season) => season.avg_rating)
const medianRating = seasons.map((season) => season.median_rating)
const votes = seasons.map((season) => season.votes)
const title = 'Seasons'
const ctx = document.getElementById(this.canvasId)
new Chart(ctx, {
type: 'bar',
data: {
labels,
datasets: [
{
label: 'Average rating',
data: averageRating,
backgroundColor: 'rgba(75, 192, 192, 0.5)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 1,
Range: 10,
yAxisID: 'y-axis-ratings'
},
{
label: 'Median rating',
data: medianRating,
backgroundColor: 'rgba(255, 206, 86, 0.5)',
borderColor: 'rgba(255, 206, 86, 1)',
borderWidth: 1,
Range: 10,
yAxisID: 'y-axis-ratings'
},
{
label: 'Votes',
data: votes,
type: 'line',
tension: 0.4,
fill: false,
borderColor: 'rgba(255, 99, 132, 1)',
borderWidth: 2,
yAxisID: 'y-axis-votes'
}
]
},
options: {
animation: {
duration: 0
},
y: {
stacked: true
},
scales: {
'y-axis-ratings': {
min: 0,
max: 10,
type: 'linear',
display: true,
position: 'left',
beginAtZero: true
},
'y-axis-votes': {
type: 'linear',
display: true,
position: 'right',
beginAtZero: true
}
}
},
plugins: {
title: {
display: true,
text: title
}
}
})
}
}
class EpisodeChart {
constructor (tvShowParsed, canvasId, seasonId) {
this.tvShowParsed = tvShowParsed
this.canvasId = canvasId
this.seasonId = seasonId
this.createChart()
}
createChart () {
if (chartInstance) {
chartInstance.destroy()
}
const episodes = this.tvShowParsed.seasons[this.seasonId].episodes
const labels = episodes.map((episode) => `Ep. ${episode.number}`)
const ratings = episodes.map((episode) => episode.avg_rating)
const votes = episodes.map((episode) => episode.votes)
const title = `Episodes of season ${this.seasonId + 1}`
const ctx = document.getElementById(this.canvasId)
chartInstance = new Chart(ctx, {
type: 'bar',
data: {
labels,
datasets: [
{
label: 'Average rating',
data: ratings,
backgroundColor: 'rgba(75, 192, 192, 0.5)',
borderColor: 'rgba(75, 192, 192, 1)',
borderWidth: 1,
Range: 10,
yAxisID: 'y-axis-ratings'
},
{
label: 'Votes',
data: votes,
type: 'line',
tension: 0.4,
fill: false,
borderColor: 'rgba(255, 99, 132, 1)',
borderWidth: 2,
yAxisID: 'y-axis-votes'
}
]
},
options: {
animation: {
duration: 0
},
scales: {
'y-axis-ratings': {
min: 0,
max: 10,
type: 'linear',
display: true,
position: 'left',
beginAtZero: true
},
'y-axis-votes': {
type: 'linear',
display: true,
position: 'right',
beginAtZero: true
}
},
plugins: {
tooltip: {
callbacks: {
title: function (context) {
const index = context[0].dataIndex
const episode = episodes[index]
return `${episode.title} (${episode.aired.split('T')[0]})`
}
}
}
}
}
})
}
}
+12
View File
@@ -0,0 +1,12 @@
export function search() {
return {
url: '/tv-show?id=',
ttID: '',
isLoading: false,
isError: false,
submit() {
this.isLoading = true;
fetch(this.url+this.ttID)
}
}
}
+546
View File
@@ -0,0 +1,546 @@
export const data = {
show_id: '0903747',
title: 'Breaking Bad',
runtime: '49',
votes: 1970456,
avg_rating: 8.957686180794227,
median_rating: 8.851234567891,
seasons: [
{
number: 1,
avg_rating: 8.701234567891,
median_rating: 8.701234567891,
votes: 202551,
episodes: [
{
number: 1,
episode_id: '0959621',
title: 'Pilot',
aired: '2008-01-20T00:00:00Z',
avg_rating: 9.001234567891,
votes: 38574
},
{
number: 2,
episode_id: '1054724',
title: "Cat's in the Bag...",
aired: '2008-01-27T00:00:00Z',
avg_rating: 8.601234567891,
votes: 28116
},
{
number: 3,
episode_id: '1054725',
title: "...And the Bag's in the River",
aired: '2008-02-10T00:00:00Z',
avg_rating: 8.701234567891,
votes: 27227
},
{
number: 4,
episode_id: '1054726',
title: 'Cancer Man',
aired: '2008-02-17T00:00:00Z',
avg_rating: 8.201234567891,
votes: 26251
},
{
number: 5,
episode_id: '1054727',
title: 'Gray Matter',
aired: '2008-02-24T00:00:00Z',
avg_rating: 8.301234567891,
votes: 25788
},
{
number: 6,
episode_id: '1054728',
title: "Crazy Handful of Nothin'",
aired: '2008-03-02T00:00:00Z',
avg_rating: 9.301234567891,
votes: 30318
},
{
number: 7,
episode_id: '1054729',
title: 'A No-Rough-Stuff-Type Deal',
aired: '2008-03-09T00:00:00Z',
avg_rating: 8.801234567891,
votes: 26277
}
]
},
{
number: 2,
avg_rating: 8.793542260198691,
median_rating: 8.801234567891,
votes: 314689,
episodes: [
{
number: 1,
episode_id: '1232244',
title: 'Seven Thirty-Seven',
aired: '2009-03-08T00:00:00Z',
avg_rating: 8.601234567891,
votes: 23829
},
{
number: 2,
episode_id: '1232249',
title: 'Grilled',
aired: '2009-03-15T00:00:00Z',
avg_rating: 9.301234567891,
votes: 27376
},
{
number: 3,
episode_id: '1232250',
title: 'Bit by a Dead Bee',
aired: '2009-03-22T00:00:00Z',
avg_rating: 8.301234567891,
votes: 22927
},
{
number: 4,
episode_id: '1232251',
title: 'Down',
aired: '2009-03-29T00:00:00Z',
avg_rating: 8.201234567891,
votes: 23044
},
{
number: 5,
episode_id: '1232252',
title: 'Breakage',
aired: '2009-04-05T00:00:00Z',
avg_rating: 8.301234567891,
votes: 22405
},
{
number: 6,
episode_id: '1232253',
title: 'Peekaboo',
aired: '2009-04-12T00:00:00Z',
avg_rating: 8.801234567891,
votes: 24596
},
{
number: 7,
episode_id: '1232254',
title: 'Negro y Azul',
aired: '2009-04-19T00:00:00Z',
avg_rating: 8.601234567891,
votes: 22516
},
{
number: 8,
episode_id: '1232255',
title: 'Better Call Saul',
aired: '2009-04-26T00:00:00Z',
avg_rating: 9.201234567891,
votes: 26928
},
{
number: 9,
episode_id: '1232256',
title: '4 Days Out',
aired: '2009-05-03T00:00:00Z',
avg_rating: 9.101234567891,
votes: 25676
},
{
number: 10,
episode_id: '1232245',
title: 'Over',
aired: '2009-05-10T00:00:00Z',
avg_rating: 8.501234567891,
votes: 21990
},
{
number: 11,
episode_id: '1232246',
title: 'Mandala',
aired: '2009-05-17T00:00:00Z',
avg_rating: 8.901234567891,
votes: 22706
},
{
number: 12,
episode_id: '1232247',
title: 'Phoenix',
aired: '2009-05-24T00:00:00Z',
avg_rating: 9.301234567891,
votes: 25512
},
{
number: 13,
episode_id: '1232248',
title: 'ABQ',
aired: '2009-05-31T00:00:00Z',
avg_rating: 9.201234567891,
votes: 25184
}
]
},
{
number: 3,
avg_rating: 8.73200379866023,
median_rating: 8.501234567891,
votes: 321759,
episodes: [
{
number: 1,
episode_id: '1528116',
title: 'No Más',
aired: '2010-03-21T00:00:00Z',
avg_rating: 8.501234567891,
votes: 21788
},
{
number: 2,
episode_id: '1615186',
title: 'Caballo sin Nombre',
aired: '2010-03-28T00:00:00Z',
avg_rating: 8.601234567891,
votes: 21259
},
{
number: 3,
episode_id: '1615187',
title: 'I.F.T.',
aired: '2010-04-04T00:00:00Z',
avg_rating: 8.401234567891,
votes: 21128
},
{
number: 4,
episode_id: '1615554',
title: 'Green Light',
aired: '2010-04-11T00:00:00Z',
avg_rating: 8.201234567891,
votes: 21304
},
{
number: 5,
episode_id: '1615555',
title: 'Más',
aired: '2010-04-18T00:00:00Z',
avg_rating: 8.501234567891,
votes: 20681
},
{
number: 6,
episode_id: '1615556',
title: 'Sunset',
aired: '2010-04-25T00:00:00Z',
avg_rating: 9.301234567891,
votes: 24259
},
{
number: 7,
episode_id: '1615944',
title: 'One Minute',
aired: '2010-05-02T00:00:00Z',
avg_rating: 9.601234567891,
votes: 29760
},
{
number: 8,
episode_id: '1615557',
title: 'I See You',
aired: '2010-05-09T00:00:00Z',
avg_rating: 8.701234567891,
votes: 21246
},
{
number: 9,
episode_id: '1615558',
title: 'Kafkaesque',
aired: '2010-05-16T00:00:00Z',
avg_rating: 8.401234567891,
votes: 20956
},
{
number: 10,
episode_id: '1615550',
title: 'Fly',
aired: '2010-05-23T00:00:00Z',
avg_rating: 7.801234567891,
votes: 37113
},
{
number: 11,
episode_id: '1615551',
title: 'Abiquiu',
aired: '2010-05-30T00:00:00Z',
avg_rating: 8.401234567891,
votes: 20848
},
{
number: 12,
episode_id: '1615552',
title: 'Half Measures',
aired: '2010-06-06T00:00:00Z',
avg_rating: 9.501234567891,
votes: 28966
},
{
number: 13,
episode_id: '1615553',
title: 'Full Measure',
aired: '2010-06-13T00:00:00Z',
avg_rating: 9.601234567891,
votes: 32451
}
]
},
{
number: 4,
avg_rating: 8.962773029429462,
median_rating: 8.801234567891,
votes: 360823,
episodes: [
{
number: 1,
episode_id: '1683084',
title: 'Box Cutter',
aired: '2011-07-17T00:00:00Z',
avg_rating: 9.201234567891,
votes: 25917
},
{
number: 2,
episode_id: '1683089',
title: 'Thirty-Eight Snub',
aired: '2011-07-24T00:00:00Z',
avg_rating: 8.201234567891,
votes: 21491
},
{
number: 3,
episode_id: '1683090',
title: 'Open House',
aired: '2011-07-31T00:00:00Z',
avg_rating: 8.001234567891,
votes: 21780
},
{
number: 4,
episode_id: '1683091',
title: 'Bullet Points',
aired: '2011-08-07T00:00:00Z',
avg_rating: 8.601234567891,
votes: 20664
},
{
number: 5,
episode_id: '1683092',
title: 'Shotgun',
aired: '2011-08-14T00:00:00Z',
avg_rating: 8.601234567891,
votes: 20719
},
{
number: 6,
episode_id: '1683093',
title: 'Cornered',
aired: '2011-08-21T00:00:00Z',
avg_rating: 8.401234567891,
votes: 20950
},
{
number: 7,
episode_id: '1683094',
title: 'Problem Dog',
aired: '2011-08-28T00:00:00Z',
avg_rating: 8.801234567891,
votes: 21642
},
{
number: 8,
episode_id: '1683095',
title: 'Hermanos',
aired: '2011-09-04T00:00:00Z',
avg_rating: 9.201234567891,
votes: 24356
},
{
number: 9,
episode_id: '1683096',
title: 'Bug',
aired: '2011-09-11T00:00:00Z',
avg_rating: 8.801234567891,
votes: 21930
},
{
number: 10,
episode_id: '1683085',
title: 'Salud',
aired: '2011-09-18T00:00:00Z',
avg_rating: 9.601234567891,
votes: 30819
},
{
number: 11,
episode_id: '1683086',
title: 'Crawl Space',
aired: '2011-09-25T00:00:00Z',
avg_rating: 9.701234567891,
votes: 35874
},
{
number: 12,
episode_id: '1683087',
title: 'End Times',
aired: '2011-10-02T00:00:00Z',
avg_rating: 9.501234567891,
votes: 27683
},
{
number: 13,
episode_id: '1683088',
title: 'Face Off',
aired: '2011-10-09T00:00:00Z',
avg_rating: 9.901234567891,
votes: 66998
}
]
},
{
number: 5,
avg_rating: 9.382484567891,
median_rating: 9.451234567891,
votes: 770634,
episodes: [
{
number: 1,
episode_id: '2081647',
title: 'Live Free or Die',
aired: '2012-07-15T00:00:00Z',
avg_rating: 9.201234567891,
votes: 29240
},
{
number: 2,
episode_id: '2301457',
title: 'Madrigal',
aired: '2012-07-22T00:00:00Z',
avg_rating: 8.801234567891,
votes: 25392
},
{
number: 3,
episode_id: '2301459',
title: 'Hazard Pay',
aired: '2012-07-29T00:00:00Z',
avg_rating: 8.801234567891,
votes: 24811
},
{
number: 4,
episode_id: '2301461',
title: 'Fifty-One',
aired: '2012-08-05T00:00:00Z',
avg_rating: 8.801234567891,
votes: 25002
},
{
number: 5,
episode_id: '2301463',
title: 'Dead Freight',
aired: '2012-08-12T00:00:00Z',
avg_rating: 9.701234567891,
votes: 36260
},
{
number: 6,
episode_id: '2301465',
title: 'Buyout',
aired: '2012-08-19T00:00:00Z',
avg_rating: 9.001234567891,
votes: 25440
},
{
number: 7,
episode_id: '2301467',
title: 'Say My Name',
aired: '2012-08-26T00:00:00Z',
avg_rating: 9.501234567891,
votes: 32854
},
{
number: 8,
episode_id: '2301469',
title: 'Gliding Over All',
aired: '2012-09-02T00:00:00Z',
avg_rating: 9.601234567891,
votes: 32564
},
{
number: 9,
episode_id: '2301471',
title: 'Blood Money',
aired: '2013-08-11T00:00:00Z',
avg_rating: 9.401234567891,
votes: 31146
},
{
number: 10,
episode_id: '2301443',
title: 'Buried',
aired: '2013-08-18T00:00:00Z',
avg_rating: 9.201234567891,
votes: 27751
},
{
number: 11,
episode_id: '2301445',
title: 'Confessions',
aired: '2013-08-25T00:00:00Z',
avg_rating: 9.601234567891,
votes: 33390
},
{
number: 12,
episode_id: '2301447',
title: 'Rabid Dog',
aired: '2013-09-01T00:00:00Z',
avg_rating: 9.101234567891,
votes: 28993
},
{
number: 13,
episode_id: '2301449',
title: "To'hajiilee",
aired: '2013-09-08T00:00:00Z',
avg_rating: 9.801234567891,
votes: 49153
},
{
number: 14,
episode_id: '2301451',
title: 'Ozymandias',
aired: '2013-09-15T00:00:00Z',
avg_rating: 10.001234567891,
votes: 193236
},
{
number: 15,
episode_id: '2301453',
title: 'Granite State',
aired: '2013-09-22T00:00:00Z',
avg_rating: 9.701234567891,
votes: 48290
},
{
number: 16,
episode_id: '2301455',
title: 'Felina',
aired: '2013-09-29T00:00:00Z',
avg_rating: 9.901234567891,
votes: 127112
}
]
}
]
}
+8
View File
@@ -0,0 +1,8 @@
import Alpine from 'https://cdn.jsdelivr.net/npm/alpinejs@3.12.0/dist/module.esm.min.js'
import { search } from './components/search'
window.Alpine = Alpine
Alpine.data('search', search)
Alpine.start()
+3
View File
@@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
+11
View File
@@ -0,0 +1,11 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: 'class',
content: ['./*.html', './src/**/*.{js,ts,jsx,tsx}'],
theme: {
extend: {}
},
plugins: [require('@tailwindcss/forms')({
strategy: 'class'
})]
}
+5
View File
@@ -0,0 +1,5 @@
import { defineConfig } from 'vite'
export default defineConfig({
base: './'
})