🎬 Como Criar um Script para Postar Filmes com Upload de Thumbnail no ImgBB (via API) 🎬
Imagine ter à sua disposição um painel simples, direto, bonito e funcional — onde você pode postar um filme, gerar automaticamente o nome do arquivo .mp4
com base no título e, de quebra, enviar a thumbnail diretamente para o ImgBB. Soa poderoso, não?
Pois é isso que vamos construir agora. E o melhor: de forma prática, didática e totalmente adaptável à sua realidade.
🧰 Pré-requisitos Essenciais
Antes de mergulhar no código, precisamos alinhar alguns pontos. Para colocar esse sistema no ar, você vai precisar de:
- Um ambiente com PHP e MySQL configurado.
- Uma tabela de gêneros no banco de dados, chamada
genres
. - Uma conta no ImgBB — com a API Key em mãos.
💡 Estrutura Inicial — HTML e CSS
A Interface do Formulário
Abaixo está o ponto de partida da nossa interface. Um layout centrado, moderno, com cores que remetem à estética da Netflix — escuro, elegante, direto ao ponto.
<div class="container">
<h1>POSTAR FILME</h1>
O Estilo da Página
Repare na escolha das cores, no espaçamento, nos contornos sutis. Isso não é apenas estética — é usabilidade.
body {
font-family: 'Arial', sans-serif;
background-color: #141414;
color: #eaeaea;
}
📝 Campos do Formulário: O Que o Usuário Vai Preencher
O formulário é simples, mas poderoso. São três entradas fundamentais:
<input type="text" name="title" required>
<input type="file" name="poster" accept="image/*" required>
<input type="text" name="video_link" required>
Com isso, o usuário define:
- O título do filme.
- A capa (thumbnail), que será enviada ao ImgBB.
- O link do vídeo, que pode ser um arquivo .mp4, um stream HLS ou um embed.
Seleção de Gêneros: Dinâmica e Automática
<select name="genres[]" multiple required>
<?php
$stmt = $pdo->query("SELECT id, title FROM genres");
while ($genre = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "<option value='{$genre['id']}'>{$genre['title']}</option>";
}
?>
</select>
🌍 Link para o Gerador Externo de Thumbnails
<p>
<a href="https://st58347.ispot.cc/gerador-de-thumbnail.html" target="_blank">
Acessar o gerador de thumbnail, título e nome de arquivo.
</a>
</p>
📦 Back-end com PHP: Lidando com o Upload da Imagem
A seguir, o trecho responsável por enviar a thumbnail ao ImgBB:
if ($_FILES['poster']['tmp_name']) {
$api_key = 'SUA_API_KEY_DO_IMGBB';
$image = base64_encode(file_get_contents($_FILES['poster']['tmp_name']));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.imgbb.com/1/upload?key=' . $api_key);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'image' => $image,
'name' => pathinfo($_FILES['poster']['name'], PATHINFO_FILENAME)
]);
$response = curl_exec($ch);
curl_close($ch);
$json = json_decode($response, true);
if (isset($json['data']['url'])) {
$poster_url = $json['data']['url'];
} else {
$error = 'Erro ao fazer upload da imagem.';
}
}
🧠 Gerando o Nome do Arquivo .mp4 com Base no Título
$title = $_POST['title'];
$filename = strtolower(preg_replace('/[^a-z0-9]+/', '-', $title)) . '.mp4';
Por exemplo: “Avatar 2: O Caminho da Água” vira avatar-2-o-caminho-da-agua.mp4
✅ Finalizando: Exibindo Mensagens e Enviando os Dados
Para dar feedback ao usuário:
<?php if ($message): ?>
<div class="message"><?php echo $message; ?></div>
<?php endif; ?>
Botão de envio do formulário:
<input type="submit" value="POSTAR FILME">
🔐 Segurança e Boas Práticas
- Utilize
prepare()
comPDO
para evitar SQL Injection. - Valide dados com
isset()
,empty()
efilter_var()
. - Teste exaustivamente com arquivos reais antes de publicar.
✅ Código completo (index.php, por exemplo)
<?php
// Conexão com banco de dados (ajuste conforme seu ambiente)
$host = 'localhost';
$db = 'nome_do_banco';
$user = 'usuario';
$pass = 'senha';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
} catch (\PDOException $e) {
exit("Erro ao conectar ao banco: " . $e->getMessage());
}
$message = '';
$error = '';
// Processamento do formulário
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$title = $_POST['title'];
$video_link = $_POST['video_link'];
$video_type = $_POST['video_type'];
$genres = $_POST['genres'] ?? [];
// Geração do nome do arquivo com base no título
$filename = strtolower(preg_replace('/[^a-z0-9]+/', '-', $title)) . '.mp4';
// Upload da imagem para o ImgBB
if (isset($_FILES['poster']['tmp_name'])) {
$api_key = 'SUA_IMGBB_API_KEY_AQUI';
$image = base64_encode(file_get_contents($_FILES['poster']['tmp_name']));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.imgbb.com/1/upload?key=' . $api_key);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
'image' => $image,
'name' => pathinfo($_FILES['poster']['name'], PATHINFO_FILENAME)
]);
$response = curl_exec($ch);
curl_close($ch);
$json = json_decode($response, true);
if (isset($json['data']['url'])) {
$poster_url = $json['data']['url'];
// Inserção no banco
$stmt = $pdo->prepare("INSERT INTO movies (title, poster, video_link, video_type, filename) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$title, $poster_url, $video_link, $video_type, $filename]);
$movie_id = $pdo->lastInsertId();
// Relacionar gêneros
foreach ($genres as $genre_id) {
$stmt = $pdo->prepare("INSERT INTO movie_genre (movie_id, genre_id) VALUES (?, ?)");
$stmt->execute([$movie_id, $genre_id]);
}
$message = 'Filme postado com sucesso!';
} else {
$error = 'Erro ao fazer upload da imagem.';
}
} else {
$error = 'Imagem não enviada.';
}
}
?>
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>POSTAR FILME</title>
<style>
body {
font-family: 'Arial', sans-serif;
background-color: #141414;
color: #eaeaea;
margin: 0;
padding: 0;
}
.container {
max-width: 800px;
margin: 0 auto;
padding: 20px;
border-radius: 8px;
background: linear-gradient(180deg, rgba(0,0,0,0.8), rgba(20,20,20,0.8));
box-shadow: 0 0 15px rgba(0, 0, 0, 0.5);
}
h1 {
text-align: center;
color: #e50914;
}
label {
margin-top: 10px;
display: block;
}
input[type="text"],
input[type="file"],
select {
width: 100%;
padding: 10px;
margin: 10px 0;
border: 1px solid #e50914;
border-radius: 5px;
background-color: #333;
color: #fff;
}
input[type="submit"] {
background-color: #e50914;
border: none;
color: white;
padding: 15px;
cursor: pointer;
border-radius: 5px;
width: 100%;
}
.message {
background: green;
padding: 10px;
text-align: center;
margin: 10px 0;
}
.error {
background: red;
padding: 10px;
text-align: center;
margin: 10px 0;
}
a {
color: #FF0;
}
</style>
</head>
<body>
<div class="container">
<h1>POSTAR FILME</h1>
<?php if ($message): ?>
<div class="message"><?php echo $message; ?></div>
<?php endif; ?>
<?php if ($error): ?>
<div class="error"><?php echo $error; ?></div>
<?php endif; ?>
<form method="POST" enctype="multipart/form-data">
<label for="title">Título:</label>
<input type="text" name="title" required>
<label for="poster">Capa do Filme:</label>
<input type="file" name="poster" accept="image/*" required>
<label for="video_link">URL do Vídeo:</label>
<input type="text" name="video_link" required>
<p>
<a href="https://st58347.ispot.cc/gerador-de-thumbnail.html" target="_blank">
Acessar o gerador de thumbnail, título e nome de arquivo.
</a>
</p>
<label for="video_type">Tipo de Vídeo:</label>
<select name="video_type" required>
<option value="embed">Embed</option>
<option value="mp4">MP4</option>
<option value="hls">HLS</option>
</select>
<label for="genres">Gêneros:</label>
<select name="genres[]" multiple required>
<?php
$stmt = $pdo->query("SELECT id, title FROM genres");
while ($genre = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "<option value='{$genre['id']}'>{$genre['title']}</option>";
}
?>
</select>
<input type="submit" value="POSTAR FILME">
</form>
</div>
</body>
</html>
🧱 Estrutura do Banco de Dados (Exemplo)
CREATE TABLE genres (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL
);
CREATE TABLE movies (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
poster TEXT,
video_link TEXT,
video_type VARCHAR(50),
filename VARCHAR(255)
);
CREATE TABLE movie_genre (
movie_id INT,
genre_id INT,
FOREIGN KEY (movie_id) REFERENCES movies(id) ON DELETE CASCADE,
FOREIGN KEY (genre_id) REFERENCES genres(id) ON DELETE CASCADE
);
🧩 Conclusão
Esse sistema não é apenas funcional — ele é inteligente. Automatiza tarefas, organiza seus vídeos e economiza tempo.
Você pode expandi-lo, incluir sinopses, trailers, campos para avaliação e muito mais. Basta querer.
Conheça as pessoas que tornaram este conteúdo possível
Se você gostou do conteúdo, considere fazer uma doação para os colabadores listados logo abaixo, pode ser apenas o valor de um cafezinho:Você também poderá se interessar por:
0 Comments
Leave a Reply
Por Matheus Lopes