-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathBoniTuber.py
306 lines (286 loc) · 16 KB
/
BoniTuber.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
# Código desenvolvido por Rodrigo Bonicenha Ferreira
# Para falar comigo entre em contato através dos canais abaixo:
# Linkedin: https://www.linkedin.com/in/rodrigo-bonicenha/
# Whatsapp: +5541991392100
#
# Este código é livre para edição e uso, desde que as informações sobre o autor não sejam removidas.
#
# Data de Criação: 05/06/2024
# Versão: v1.0.0
# Última modificação em: 05/06/2024
#
# Código developed by Rodrigo Bonicenha Ferreira
# To contact me, please reach out through the channels below:
# Linkedin: https://www.linkedin.com/in/rodrigo-bonicenha/
# Whatsapp: +5541991392100
#
# This code is free for editing and use, as long as the author's information is not removed.
#
# Creation Date: 2024-06-05
# Version: v1.0.0
# Last modified on: 2024-06-05
#
# Code desarrollado por Rodrigo Bonicenha Ferreira
# Para contactos comuníquese a través de los siguientes canales:
# Linkedin: https://www.linkedin.com/in/rodrigo-bonicenha/
# Whatsapp: +5541991392100
#
# Este código es libre para edición y uso, siempre y cuando no se elimine la información sobre el autor.
#
# Fecha de Creación: 05/06/2024
# Versión: v1.0.0
# Última modificación en: 05/06/2024
#
# Este código es libre para edición y uso, siempre y cuando no se elimine la información sobre el autor.
import scrapetube
import os
import time
def get_video_urls(channel_id):
videos = scrapetube.get_channel(channel_id)
video_urls = [f'www.youtube.com/watch?v={video["videoId"]}' for video in videos]
return video_urls
def read_channels_from_file(filename):
channels = {}
interval = 300
languages = {'portugues': 'disable', 'spanish': 'disable', 'english': 'disable'}
if os.path.exists(filename):
with open(filename, 'r') as file:
lines = file.readlines()
current_channel = None
for line in lines:
line = line.strip()
if line.startswith("Nome_do_Canal_"):
current_channel = line.split(" = ")[1]
channels[current_channel] = {"id": None, "urls": []}
elif line.startswith("ID_do_Canal_"):
current_channel_id = line.split(" = ")[1]
channels[current_channel]["id"] = current_channel_id
elif line.startswith("Intervalo_de_Checagem"):
interval = int(line.split(" = ")[1])
elif line.startswith("portugues") or line.startswith("spanish") or line.startswith("english"):
lang, status = line.split(" = ")
languages[lang] = status
return channels, interval, languages
def write_channels_to_file(channels):
for channel, data in channels.items():
channel_formatted = channel.replace(" ", "_")
filename = f"{channel_formatted}.txt"
with open(filename, 'w') as file:
for url in data['urls']:
file.write(f"{url}\n")
def update_channels_from_youtube(channels, languages):
updated = False
for channel, data in channels.items():
if languages['portugues'] == 'enable':
print(f"Verificando atualizações de vídeos do Canal {channel}")
if languages['spanish'] == 'enable':
print(f"Verificando actualizaciones de videos del Canal {channel}")
if languages['english'] == 'enable':
print(f"Checking for video updates from Channel {channel}")
current_urls = get_video_urls(data['id'])
new_videos = [url for url in current_urls if url not in data['urls']]
if new_videos:
if languages['portugues'] == 'enable':
print(f"Foram encontrados {len(new_videos)} vídeos novos para o Canal {channel}. Atualizando nossa base de dados...")
if languages['spanish'] == 'enable':
print(f"Se encontraron {len(new_videos)} videos nuevos para el Canal {channel}. Actualizando nuestra base de datos...")
if languages['english'] == 'enable':
print(f"Found {len(new_videos)} new videos for Channel {channel}. Updating our database...")
data['urls'].extend(new_videos)
updated = True
return updated
def main():
channels_file = 'lista_de_canais.txt'
if not os.path.exists(channels_file):
if languages['portugues'] == 'enable':
print(f"O arquivo {channels_file} não existe. Por favor, crie este arquivo com a lista de canais e intervalo de checagem.")
if languages['english'] == 'enable':
print(f"The file {channels_file} does not exist. Please create this file with the list of channels and check interval.")
if languages['spanish'] == 'enable':
print(f"El archivo {channels_file} no existe. Por favor, cree este archivo con la lista de canales e intervalo de verificación.")
return
while True:
channels, check_interval, languages = read_channels_from_file(channels_file)
if channels:
for channel in channels:
channel_formatted = channel.replace(" ", "_")
filename = f"{channel_formatted}.txt"
if os.path.exists(filename):
with open(filename, 'r') as file:
lines = file.readlines()
channels[channel]["urls"] = [line.strip() for line in lines]
if update_channels_from_youtube(channels, languages):
write_channels_to_file(channels)
if languages['portugues'] == 'enable':
print(f"Aguardando {check_interval} segundos para a próxima checagem...")
if languages['spanish'] == 'enable':
print(f"Esperando {check_interval} segundos para la próxima verificación...")
if languages['english'] == 'enable':
print(f"Waiting {check_interval} seconds for the next check...")
time.sleep(check_interval)
if __name__ == "__main__":
main()
# ===================================
# Detalhamento do Código (Português)
# ===================================
#
# Função get_video_urls
# Esta função é responsável por buscar todas as URLs de vídeos de um canal do YouTube.
# Utiliza a biblioteca 'scrapetube' para obter os vídeos do canal através do ID do canal.
# Itera sobre a lista de vídeos e extrai os IDs dos vídeos, criando as URLs correspondentes e armazenando-as em uma lista.
# A lista de URLs dos vídeos é retornada ao final da função.
#
# Função read_channels_from_file
# Esta função lê os canais e o intervalo de checagem de um arquivo especificado.
# Abre o arquivo e lê linha por linha, identificando o nome do canal, ID do canal, intervalo de checagem e os idiomas habilitados para output.
# Armazena essas informações em um dicionário de canais, no intervalo de checagem e no dicionário de idiomas.
# Retorna esses dados para serem utilizados em outras partes do código.
#
# Função write_channels_to_file
# Esta função escreve as URLs dos vídeos em arquivos específicos para cada canal.
# Itera sobre o dicionário de canais, cria ou abre arquivos nomeados de acordo com cada canal e escreve as URLs dos vídeos nesses arquivos.
#
# Função update_channels_from_youtube
# Esta função atualiza as URLs dos vídeos dos canais a partir do YouTube.
# Verifica se há novos vídeos para cada canal e, caso existam, atualiza a lista de URLs do canal.
# Imprime mensagens de atualização em diferentes idiomas, dependendo das configurações de idioma do usuário.
# Retorna 'True' se houver atualização e 'False' caso contrário.
#
# Função main
# Esta é a função principal que coordena a execução do script.
# Verifica se o arquivo 'lista_de_canais.txt' existe e, caso contrário, imprime mensagens de erro em diferentes idiomas.
# Em um loop infinito, lê os canais e o intervalo de checagem do arquivo, verifica e atualiza os vídeos dos canais e escreve as URLs atualizadas em arquivos.
# A cada ciclo, aguarda o intervalo de checagem especificado antes de repetir o processo.
#
# Estruturas condicionais
# Utilizadas para verificar a existência de arquivos e decidir quais mensagens imprimir com base nas configurações de idioma do usuário.
# Exemplo: if not os.path.exists(channels_file), if languages['english'] == 'enable'.
#
# Laços de repetição
# Utilizados para iterar sobre listas e dicionários.
# Exemplo: for video in videos, for line in lines, for channel, data in channels.items().
#
# Forks
# Utilizados para executar diferentes blocos de código com base nas configurações de idioma e na existência de novos vídeos.
# Exemplo: if update_channels_from_youtube(channels, languages), if not os.path.exists(channels_file).
#
# Variáveis
# Utilizadas para armazenar dados necessários para a execução do script, como listas de URLs, dicionários de canais, intervalo de checagem e configurações de idioma.
# Exemplo: channels, interval, languages, video_urls, filename, updated.
#
# Bibliotecas
# scrapetube: Utilizada para buscar vídeos de um canal do YouTube.
# os: Utilizada para interagir com o sistema operacional, verificando a existência de arquivos.
# time: Utilizada para pausar a execução do script por um determinado intervalo de tempo.
#
# Este é um guia detalhado sobre as funções, estruturas e variáveis do código. Sinta-se à vontade para expandir ou modificar o código conforme necessário.
#
# ==========================
# Code Details (English)
# ==========================
#
# Function get_video_urls
# This function is responsible for fetching all video URLs from a YouTube channel.
# It uses the 'scrapetube' library to get the channel's videos by its ID.
# It iterates over the list of videos and extracts the video IDs, creating the corresponding URLs and storing them in a list.
# The list of video URLs is returned at the end of the function.
#
# Function read_channels_from_file
# This function reads the channels and check interval from a specified file.
# It opens the file and reads it line by line, identifying the channel name, channel ID, check interval, and enabled output languages.
# It stores this information in a dictionary of channels, the check interval, and the language dictionary.
# It returns these data to be used in other parts of the code.
#
# Function write_channels_to_file
# This function writes the video URLs to specific files for each channel.
# It iterates over the dictionary of channels, creates or opens files named according to each channel, and writes the video URLs to these files.
#
# Function update_channels_from_youtube
# This function updates the video URLs of the channels from YouTube.
# It checks if there are new videos for each channel and, if there are, updates the channel's URL list.
# It prints update messages in different languages, depending on the user's language settings.
# It returns 'True' if there is an update and 'False' otherwise.
#
# Function main
# This is the main function that coordinates the script's execution.
# It checks if the 'lista_de_canais.txt' file exists and, if not, prints error messages in different languages.
# In an infinite loop, it reads the channels and check interval from the file, checks and updates the channels' videos, and writes the updated URLs to files.
# In each cycle, it waits for the specified check interval before repeating the process.
#
# Conditional structures
# Used to check for the existence of files and decide which messages to print based on the user's language settings.
# Example: if not os.path.exists(channels_file), if languages['english'] == 'enable'.
#
# Loops
# Used to iterate over lists and dictionaries.
# Example: for video in videos, for line in lines, for channel, data in channels.items().
#
# Forks
# Used to execute different blocks of code based on language settings and the existence of new videos.
# Example: if update_channels_from_youtube(channels, languages), if not os.path.exists(channels_file).
#
# Variables
# Used to store data needed for the script's execution, such as lists of URLs, dictionaries of channels, check interval, and language settings.
# Example: channels, interval, languages, video_urls, filename, updated.
#
# Libraries
# scrapetube: Used to fetch videos from a YouTube channel.
# os: Used to interact with the operating system, checking for file existence.
# time: Used to pause the script's execution for a specified interval.
#
# This is a detailed guide on the functions, structures, and variables of the code. Feel free to expand or modify the code as needed.
#
# ======================================
# Detalles del Código (Español)
# ======================================
#
# Función get_video_urls
# Esta función es responsable de obtener todas las URL de los videos de un canal de YouTube.
# Utiliza la biblioteca 'scrapetube' para obtener los videos del canal mediante su ID.
# Itera sobre la lista de videos y extrae los IDs de los videos, creando las URLs correspondientes y almacenándolas en una lista.
# La lista de URLs de los videos se devuelve al final de la función.
#
# Función read_channels_from_file
# Esta función lee los canales y el intervalo de verificación de un archivo especificado.
# Abre el archivo y lo lee línea por línea, identificando el nombre del canal, ID del canal, intervalo de verificación y los idiomas habilitados para salida.
# Almacena esta información en un diccionario de canales, el intervalo de verificación y el diccionario de idiomas.
# Devuelve estos datos para ser utilizados en otras partes del código.
#
# Función write_channels_to_file
# Esta función escribe las URLs de los videos en archivos específicos para cada canal.
# Itera sobre el diccionario de canales, crea o abre archivos nombrados de acuerdo con cada canal y escribe las URLs de los videos en estos archivos.
#
# Función update_channels_from_youtube
# Esta función actualiza las URLs de los videos de los canales desde YouTube.
# Verifica si hay nuevos videos para cada canal y, si los hay, actualiza la lista de URLs del canal.
# Imprime mensajes de actualización en diferentes idiomas, dependiendo de la configuración de idioma del usuario.
# Devuelve 'True' si hay una actualización y 'False' en caso contrario.
#
# Función main
# Esta es la función principal que coordina la ejecución del script.
# Verifica si el archivo 'lista_de_canais.txt' existe y, si no, imprime mensajes de error en diferentes idiomas.
# En un bucle infinito, lee los canales y el intervalo de verificación del archivo, verifica y actualiza los videos de los canales y escribe las URLs actualizadas en archivos.
# En cada ciclo, espera el intervalo de verificación especificado antes de repetir el proceso.
#
# Estructuras condicionales
# Utilizadas para verificar la existencia de archivos y decidir qué mensajes imprimir según la configuración de idioma del usuario.
# Ejemplo: if not os.path.exists(channels_file), if languages['english'] == 'enable'.
#
# Bucles
# Utilizados para iterar sobre listas y diccionarios.
# Ejemplo: for video in videos, for line in lines, for channel, data in channels.items().
#
# Bifurcaciones
# Utilizadas para ejecutar diferentes bloques de código según la configuración de idioma y la existencia de nuevos videos.
# Ejemplo: if update_channels_from_youtube(channels, languages), if not os.path.exists(channels_file).
#
# Variables
# Utilizadas para almacenar los datos necesarios para la ejecución del script, como listas de URLs, diccionarios de canales, intervalo de verificación y configuración de idioma.
# Ejemplo: channels, interval, languages, video_urls, filename, updated.
#
# Bibliotecas
# scrapetube: Utilizada para obtener videos de un canal de YouTube.
# os: Utilizada para interactuar con el sistema operativo, verificando la existencia de archivos.
# time: Utilizada para pausar la ejecución del script durante un intervalo de tiempo especificado.
#
# Esta es una guía detallada sobre las funciones, estructuras y variables del código. Siéntase libre de expandir o modificar el código según sea necesario.