Aller au contenu

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

docker run -v /home/mathgon/data:/tmp -p 8086:8080 --rm -it docker.io/svenstaro/miniserve /tmp

Miniserve as a service

Démarrage automatique au démarrage et en cas de crash

sudo nano /etc/systemd/system/miniserve.service

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) ```