Scrom est une application qui permet de télécharger des ROMs pour différents systèmes d'émulation. Ces ROMs sont récupérées depuis Archive.org , un site qui fait référence à de nombreuses consoles, plateformes et applications liées à l'émulation. Cette application a été développée en Python avec la bibliothèque graphique GTK3 .
Le script Bash scrom.sh lance l’application et gère l’ajout de nouveaux systèmes. Il balaye le répertoire /links à la recherche de nouveaux fichiers .dat . Ces fichiers de données contiennent le nom du système, l’identifiant de l’uploader, l'extension du fichier et les pages système. Les pages sont scannées à la recherche de liens de téléchargement de ROMs. Enfin, ces liens sont insérés dans une base de données. Le nom des fichiers de données correspond au nom du système associé à l’identifiant de l’uploader.
Voici un exemple d’un fichier .dat : dreamcast_retrogamechampion.dat .
dreamcast
retrogamechampion
zip
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/1/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/4/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/9/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/A/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/B/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/C/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/D/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/E/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/F/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/G/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/H/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/I/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/J/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/K/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/L/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/M/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/N/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/O/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/P/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/Q/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/R/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/S/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/T/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/U/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/V/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/W/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/X/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/Y/
https://archive.org/download/sega-dreamcast-champion-collection-updated-v2/Z/
sqlite3 : une bibliothèque C qui fournit des fonctions pour manipuler des bases de données SQLite.
curl : une bibliothèque en ligne de commande qui permet d'utiliser des protocoles de communication sur Internet, comme HTTP.
lynx : un navigateur web textuel qui permet de naviguer sur Internet dans un environnement de terminal.
axel : un outil de téléchargement rapide qui permet de télécharger des fichiers sur Internet.
Installations sous Ubuntu :sudo apt install <program>
scrom.sh : Script de démarrage de l'application.
#!/bin/bash
BDD_NOM='scrom.db'
DIR_DAT='links'
NC='\033[0m'
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
PURPLE='\033[0;35m'
# -----------------------------------------
# creation des tables de la base de données
# -----------------------------------------
function create_tables() {
# vérifier si la base de données existe
if [ ! -f $BDD_NOM ]; then
echo -e "${RED}database not found, create $BDD_NOM${NC}"
# créer la base de données
sqlite3 $BDD_NOM < /dev/null
echo "create tables : systemes, pages, jeux"
# créer la table systemes
sqlite3 -batch $BDD_NOM "create table systemes (\
id INTEGER PRIMARY KEY,\
identifiant TEXT,\
machine TEXT,\
televerseur TEXT,\
extension TEXT,\
commentaire TEXT);" 2> /dev/null
# créer la table pages
sqlite3 -batch $BDD_NOM "create table pages (\
id INTEGER PRIMARY KEY,\
identifiant_systeme TEXT,\
lien TEXT,\
commentaire TEXT);" 2> /dev/null
# créer la table jeux
sqlite3 -batch $BDD_NOM "create table jeux (\
id INTEGER PRIMARY KEY,\
lien_page TEXT,\
lien TEXT,\
nom TEXT,\
telechargement TEXT,\
commentaire TEXT);" 2> /dev/null
fi
}
# -------------------------------------------
# vérifier si toutes les URLs sont valides
# $1 = fichier .dat
# -------------------------------------------
function check_urls() {
# toutes les URL sont valides
local urls=0
# boucle sur toutes les URLs dans le fichier .dat
while read -r url_page; do
# vérifier si la ligne n'est pas vide
if [ -z "$url_page" ]; then
break
fi
# vérifier si l'URL est valide
if [[ $url_page =~ ^https?://.*$ ]]; then
echo -n "$url_page : "
# obtenir le statut de l'URL avec curl
status="$(curl -Is "$url_page" | head -1)"
validate=( $status )
# vérifier si l'URL est valide
if [ "${validate[-2]}" == "200" ]; then
echo -e "${GREEN}valid${NC}"
else
echo -e "${RED}not valid${NC}"
# pas valide
urls=1
fi
else
echo -e "${RED}$url_page : bad url${NC}"
# mauvaise URL
urls=1
fi
# boucle sur toutes les URLs du fichier .dat
done < <(tail -n +4 "$1")
# si au moins une URL n'est pas valide, retourne 1 sinon 0
return $urls
}
# ------------------------------------------------------------
# fonction pour ajouter des fichiers .dat à la base de données
# ------------------------------------------------------------
function files_to_database() {
# vérifier si le répertoire existe
if [ -d "$DIR_DAT" ]; then
echo -e "${YELLOW}check if all .dat files have been added to the database...${NC}"
# boucle sur tous les fichiers .dat
for file in "$DIR_DAT"/*.dat; do
# lire les 3 premières lignes, et obtenir machine, téléverseur et extension
exec 6< $file
read machine <&6
read televerseur <&6
read extension <&6
exec 6<&-
# créer l'identifiant
identifiant=$(echo $machine\_$televerseur)
echo -ne "dat file ${PURPLE}$machine - $televerseur${NC} in database : "
# datas_file = 0 n'est pas ajouté à la base de données
datas_file=0
# vérifier si le fichier .dat a été ajouté à la base de données
# obtenir tous les identifiants dans la base de données
identifiants=(`sqlite3 -batch $BDD_NOM "select identifiant from systemes"`)
# vérifier si l'identifiant est dans la base de données
for idents in "${identifiants[@]}"; do
# identifiant trouvé, data_file = 1
if [ $idents == $identifiant ]; then
datas_file=1
echo -e "${GREEN}ok${NC}"
break
fi
done
# data_file = 0, le fichier .dat n'a pas été ajouté à la base de données,
# vérifier si toutes les URLs sont valides
if [ $datas_file == 0 ]; then
echo -e "${RED}no found, checking urls :${NC}"
# obtenir le nombre de lignes dans le fichier .dat
lines=$(wc -l < "$file")
# vérifier si le fichier contient des liens
if [ "$lines" -le 3 ]; then
echo -e "${RED}no URLs found, the .dat file is not added to the database${NC}"
datas_file=1
else
# le fichier contient au moins une URL,
# vérification des URLs
if check_urls $file; then
echo -n "all urls are valid : "
else
echo -e "${RED}at least one URL is not valid, the .dat file is not added to the database${NC}"
datas_file=1
fi
fi
fi
# data_file = 0, le fichier .dat n'a pas été ajouté à la base de données
# et toutes les URL sont valides, le fichier peut être ajouté à la base de données
if [ $datas_file == 0 ]; then
echo -e "${YELLOW}searching for games...${NC}"
# boucle sur toutes les URL
tail -n +4 $file | while read url_page; do
# vérifier si la ligne url_page n'est pas vide
if [ -z "$url_page" ]; then
break
fi
# insérer dans la table pages identifiant_systeme et lien
sqlite3 -batch $BDD_NOM "\
insert into pages (identifiant_systeme,lien) \
values ('$identifiant','$url_page');" 2> /dev/null
# extraire le dernier répertoire de l'URL
echo -n "${url_page#*/*/*/*/} : "
# obtenir tous les liens de jeux avec l'extension spécifiée contenus dans la page
counter=0; while read url_jeu; do
# extraire de url_jeu le nom du jeu
[[ $url_jeu == *\'* ]] && url_jeu=$(echo $url_jeu | sed "s/'/''/g")
nom_jeu=$(basename "$url_jeu" ".$extension")
# insérer dans la table jeux lien_page, lien, nom, telechargement
sqlite3 -batch $BDD_NOM "\
insert into jeux (lien_page,lien,nom,telechargement) \
values ('$url_page','$url_jeu','$nom_jeu','-');" 2> /dev/null
# compter les jeux
let counter++
# obtenir tous les liens de jeux avec l'extension spécifiée contenus dans la page avec lynx
done < <(lynx -dump -listonly -nonumbers $url_page | grep "\.${extension}$")
echo -e "${GREEN}${counter} found${NC}"
# boucle sur toutes les URL
done
# insérer dans la table systemes identifiant, machine, televerseur, extension
sqlite3 -batch $BDD_NOM "\
insert into systemes (identifiant,machine,televerseur,extension) \
values ('$identifiant','$machine','$televerseur','$extension');" 2> /dev/null
fi
# boucle sur tous les fichiers .dat
done
fi
}
# ----
# main
# ----
# creation de la base de données et des tables
create_tables
# inserer les fichiers .dat dans la base de données
files_to_database
scrom.py : Initialise et exécute l'application.
config.py : Gestion du fichier de configuration.
glade.py : l'interface graphique.
handler.py : gestion des actions de l'interface.
systeme.py : gestion de la base de donnees.
download.py : gestion du téléchargement.
(Code thème : github-dark)