10 miniserve
Miniserve¶
Serveur de fichier minimaliste, sa finalité est de pouvoir partager facilement des films. Un script python permet de générer une page html de description des films en réalisant un scrapping des noms de fichiers ur imdb.
Le serveur de fichier est accessible à ()[http://mathgon.zapto.org:8086/]
La liste des films est accessible à http://mathgon.zapto.org:8086/liste_films.html
Installation¶
Miniserve as a service¶
Démarrage automatique au démarrage et en cas de crash
Y ajouter ce contenu
```` [Unit] Description=Miniserve
[Service] Type=simple PIDFile=/run/miniserve.pid ExecStart= docker run -v /home/mathgon/data:/tmp -p 8086:8080 --rm -it docker.io/svenstaro/miniserve /tmp User=mathgon Group=mathgon WorkingDirectory=/home/mathgon/miniserve Restart=always RestartSec=10
[Install] WantedBy=multi-user.target ```
Executer les commandes
systemctl enable miniserve.service systemctl daemon-reload systemctl restart miniserve.service
Vérifier l'état du service
sudo service miniserve status
Script de scrapping¶
Scan le nom de tous les fichiers d'un répertoire et de ses sous-répertoires afin d'extraire le titre et l'année de sortie.
Interrogation de l'API de The Movie Database (TMDB) afin de récupérer les informations sur le film.
Génère liste_films.html contenant une table html, agrémentée d'un soupcon de jquery, et le copie dans le répertoire du serveur.
```python
from tmdbv3api import TMDb from tmdbv3api import Movie import os import re import pandas as pd from datetime import datetime import requests
tmdb = TMDb() tmdb.api_key = 'bf6a60b1a7103f31397db177d28ef4ea' tmdb.language = 'fr' tmdb.debug = True
movie = Movie()
def findYear(s): # Trouve les dates entre 1950 et 2025 dans une chaine de caractères y = None p = '\d{4}' y = re.findall(p, s) y = [int(i) for i in y] y = [x for x in y if x > 1950 and x < 2025] if len(y) == 1: y = y[0] else: return(None) return(y)
findYear(s)¶
def formatTitle(s): # A partir d'un nom de fichier retourne un titre s = s.replace("_", " ") s = s.replace(".", " ") s = s.replace(" ", " ") s = s.rstrip("(") s = s.rstrip(" ") return(s)
def retrieveGenreList(): # Les genres étant codés par des valeurs, création d'un dico id -> genre dicGenre = {} url = 'https://api.themoviedb.org/3/genre/movie/list?api_key=bf6a60b1a7103f31397db177d28ef4ea&language=FR' json = requests.get(url).json() for g in json['genres']: dicGenre[g['id']] = g['name'] return(dicGenre)
def convertGenres(l): #Retourne un liste de genre à partir d'une list d'idgenres s = '' for g in l: s += dicGenre[g] + ';' s = s[:-1] return(s)
def retrieveduration(filmId): url = 'https://api.themoviedb.org/3/movie/' + str(filmId) + '?api_key=bf6a60b1a7103f31397db177d28ef4ea' json = requests.get(url).json() return(json['runtime'])
runtime = retrieveduration('500')¶
def path_to_image_html(path):
#insert la balise pour les images lors de l'export de la table en html
# voir ligne : dfhtml = df.to_html(escape=False ,formatters=dict(poster_path=path_to_image_html))
return ''
def saut_de_ligne(s):
#insert la balise pour les images lors de l'export de la table en html
# voir ligne : dfhtml = df.to_html(escape=False ,formatters=dict(poster_path=path_to_image_html))
return(s.replace(";", '
'))
def genereHTML(df): #Réorganisation des colonnes df = df[['poster_path','title', 'year', 'runtime', 'genre', 'overview', 'original_language', 'vote_average', 'vote_count', 'date_ajout', 'path']] df['path'] = df['path'].str.replace(walk_dir, '') df.columns = ['poster_path','Titre', 'Année', 'Durée', 'Genre', 'Résuméw', 'langue_ori', 'vote_moy', 'vote_nb', 'date_ajout', 'repertoire']
#Création du fichier html
now = datetime.now() # current date and time
date_time = now.strftime("%d/%m/%Y, %H:%M:%S")
mise_a_jour = "Mise à jour:"+ date_time
print(mise_a_jour)
dfhtml = df.to_html(escape=False ,formatters=dict(poster_path=path_to_image_html, Genre=saut_de_ligne))
dfhtml=dfhtml.replace('<th>','<th class = "th-sm" style="text-align: left">').replace('border="1"','id="example"').replace('class="dataframe"','class="display"')
msgxx ='''
<script type="text/javascript" src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.10.20/js/jquery.dataTables.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css"/>
<script>
$(document).ready(function() {
$('#example').DataTable( {
"paging": false,
"language": {"url": "//cdn.datatables.net/plug-ins/9dcbecd42ad/i18n/French.json"},
"order": [[ 1, "asc" ]]
} );
} );</script>
'''
dfhtml = msgxx + mise_a_jour + dfhtml
dfhtml=dfhtml.replace('<th>','<th class = "th-sm"')
filename = 'liste_films.html'
f= open(filename, 'w+')
f.write(dfhtml)
f.close()
os.system('cp ' + filename + ' ' + walk_dir)
os.system("cp liste_films.html ~/data/")
#Genere un dic id_genre:genre
dicGenre = retrieveGenreList()
#Dataframe vide de sortie
df = pd.DataFrame(columns =['title', 'year', 'runtime', 'genre', 'overview', 'original_language', 'poster_path', 'vote_average', 'vote_count', 'path', "date_ajout"])
def processPath(walk_dir):
for currentpath, folders, files in os.walk(walk_dir):
if 'serie' in currentpath:
break
for filename in files:
if "mkv" in filename or 'avi' in filename:
#print(currentpath + " ->>> " + filename)
#Cherche une date
year = findYear(filename)
if year != None:
t = filename.split(str(year))[0]
t = formatTitle(t)
search_string = t + " y:" + str(year)
else:
t = filename
t = formatTitle(t)
print(currentpath, filename)
print(t)
try:
res = movie.search(t)[0]
runtime = retrieveduration(res.id)
genre = convertGenres(res.genre_ids)
poster_url = 'https://image.tmdb.org/t/p/w185/' + res.poster_path
movielink = "<a href=./" + walk_dir.split("/")[-2] + "/" + filename + ">Télécharger</a>"
print(movielink)
# Date de l'ajout du fichier sur le serveur
cmd = "date -r " + walk_dir + '/"' + filename + '" -u +"%Y-%m-%d"'
print(cmd)
date_ajout = os.popen(cmd).read().rstrip()
row = [res.title, year, runtime, genre, res.overview, res.original_language, poster_url, res.vote_average, res.vote_count, movielink, date_ajout]
row = list(map(str, row))
df.loc[len(df)] = row
except:
print('PROBLEME')
COmpile les dex répertoire de¶
walk_dir = "/home/mathgon/data/Films/" processPath(walk_dir)
walk_dir = "/home/mathgon/data/Films_vus/" processPath(walk_dir) df = df.sort_values("date_ajout", ascending = False) genereHTML(df) ```