Ajout du support de MYSQL
This commit is contained in:
parent
1693e9b620
commit
b0aca69596
@ -34,3 +34,16 @@ SOULIGNE='\e[4m'
|
|||||||
CLIGNOTANT='\e[5m'
|
CLIGNOTANT='\e[5m'
|
||||||
INVERSE='\e[7m'
|
INVERSE='\e[7m'
|
||||||
NORMAL='\e[0m'
|
NORMAL='\e[0m'
|
||||||
|
|
||||||
|
db_query() {
|
||||||
|
local sql="$1"
|
||||||
|
if [ "$dbtype" = "sqlite" ]; then
|
||||||
|
sqlite3 "$DB_FILE" "$sql"
|
||||||
|
else
|
||||||
|
# Le séparateur par défaut de --batch est tabulation
|
||||||
|
mysql --batch --raw --default-character-set=utf8mb4 \
|
||||||
|
-h "$MYSQL_HOST" -P "$MYSQL_PORT" \
|
||||||
|
-u "$MYSQL_USER" -p"$MYSQL_PASS" \
|
||||||
|
-D "$MYSQL_DB" -e "$sql" | sed '1d' | tr '\t' '|'
|
||||||
|
fi
|
||||||
|
}
|
||||||
@ -2,7 +2,7 @@
|
|||||||
#CONFIG A MODIF
|
#CONFIG A MODIF
|
||||||
URL_API="A NOUS DEMANDER SUR DISCORD"
|
URL_API="A NOUS DEMANDER SUR DISCORD"
|
||||||
APIKEY="A RETROUVER DANS VOTRE PROFIL"
|
APIKEY="A RETROUVER DANS VOTRE PROFIL"
|
||||||
DB_FILE="/home/$USER/autopost/base_autopost.db"
|
|
||||||
DOSSIER_GLOBAL="/home/$USER/"
|
DOSSIER_GLOBAL="/home/$USER/"
|
||||||
DOSSIER_NFO="/home/$USER/autopost/mediainfo/"
|
DOSSIER_NFO="/home/$USER/autopost/mediainfo/"
|
||||||
DOSSIER_LOGS="/home/$USER/autopost/logs/"
|
DOSSIER_LOGS="/home/$USER/autopost/logs/"
|
||||||
@ -16,5 +16,12 @@ NG_USER=""
|
|||||||
NG_PASS=""
|
NG_PASS=""
|
||||||
NG_NBR_CONN=""
|
NG_NBR_CONN=""
|
||||||
|
|
||||||
|
dbtype="sqlite" # ou "mysql"
|
||||||
|
DB_FILE="/home/$USER/autopost/base_autopost.db"
|
||||||
|
MYSQL_HOST=""
|
||||||
|
MYSQL_PORT=
|
||||||
|
MYSQL_USER=""
|
||||||
|
MYSQL_PASS=""
|
||||||
|
MYSQL_DB=""
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -8,6 +8,13 @@ module.exports = {
|
|||||||
|
|
||||||
// Chemin vers le fichier de base de données SQLite
|
// Chemin vers le fichier de base de données SQLite
|
||||||
dbFile: path.join(__dirname, 'base_autopost.db'),
|
dbFile: path.join(__dirname, 'base_autopost.db'),
|
||||||
|
|
||||||
|
//MySQL
|
||||||
|
DB_HOST: '',
|
||||||
|
DB_PORT: ,
|
||||||
|
DB_USER: '',
|
||||||
|
DB_PASSWORD: '',
|
||||||
|
DB_DATABASE: '',
|
||||||
|
|
||||||
// Chemins personnalisables pour les dossiers
|
// Chemins personnalisables pour les dossiers
|
||||||
finishdirectory: path.join(__dirname, 'FINIS'),
|
finishdirectory: path.join(__dirname, 'FINIS'),
|
||||||
|
|||||||
90
autopost/db.js
Normal file
90
autopost/db.js
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
// db.js
|
||||||
|
const config = require('./config');
|
||||||
|
|
||||||
|
let db, mysqlPool, sqlite3;
|
||||||
|
const dbtype = config.dbtype;
|
||||||
|
|
||||||
|
if (dbtype === 'mysql') {
|
||||||
|
const mysql = require('mysql2/promise');
|
||||||
|
mysqlPool = mysql.createPool({
|
||||||
|
host: config.DB_HOST,
|
||||||
|
port: config.DB_PORT,
|
||||||
|
user: config.DB_USER,
|
||||||
|
password: config.DB_PASSWORD,
|
||||||
|
database: config.DB_DATABASE,
|
||||||
|
waitForConnections: true,
|
||||||
|
connectionLimit: 10,
|
||||||
|
});
|
||||||
|
|
||||||
|
db = {
|
||||||
|
async query(sql, params = []) {
|
||||||
|
return await mysqlPool.query(sql, params);
|
||||||
|
},
|
||||||
|
async close() {
|
||||||
|
await mysqlPool.end();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
async function testConnection() {
|
||||||
|
try {
|
||||||
|
const conn = await mysqlPool.getConnection();
|
||||||
|
await conn.ping();
|
||||||
|
conn.release();
|
||||||
|
console.log('[DATABASE] Connexion MySQL OK');
|
||||||
|
} catch (err) {
|
||||||
|
console.error('[DATABASE] Échec connexion MySQL:', err.message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
db.testConnection = testConnection;
|
||||||
|
} else {
|
||||||
|
// SQLite
|
||||||
|
sqlite3 = require('sqlite3').verbose();
|
||||||
|
db = {
|
||||||
|
async query(sql, params = []) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const lowered = sql.trim().toLowerCase();
|
||||||
|
let base = new sqlite3.Database(config.dbFile, lowered.startsWith('select') ? sqlite3.OPEN_READONLY : sqlite3.OPEN_READWRITE);
|
||||||
|
if (lowered.startsWith('select') && lowered.includes('count(')) {
|
||||||
|
base.get(sql, params, (err, row) => {
|
||||||
|
base.close();
|
||||||
|
if (err) return reject(err);
|
||||||
|
resolve([[row]]);
|
||||||
|
});
|
||||||
|
} else if (lowered.startsWith('select')) {
|
||||||
|
base.all(sql, params, (err, rows) => {
|
||||||
|
base.close();
|
||||||
|
if (err) return reject(err);
|
||||||
|
resolve([rows]);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
base.run(sql, params, function(err) {
|
||||||
|
base.close();
|
||||||
|
if (err) return reject(err);
|
||||||
|
resolve([{ affectedRows: this.changes }]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
async close() {}
|
||||||
|
};
|
||||||
|
async function testConnection() {
|
||||||
|
try {
|
||||||
|
let base = new sqlite3.Database(config.dbFile);
|
||||||
|
base.get('SELECT 1', [], (err, row) => {
|
||||||
|
base.close();
|
||||||
|
if (err) {
|
||||||
|
console.error('[DATABASE] Échec connexion SQLite:', err.message);
|
||||||
|
process.exit(1);
|
||||||
|
} else {
|
||||||
|
console.log('[DATABASE] Connexion SQLite OK');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error('[DATABASE] Échec connexion SQLite:', err.message);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
db.testConnection = testConnection;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = db;
|
||||||
@ -1,5 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
source $HOME/autopost/common.sh
|
|
||||||
|
source /home/$USER/autopost/common.sh
|
||||||
|
|
||||||
# Vérification et création des dossiers
|
# Vérification et création des dossiers
|
||||||
for dossier in "$DOSSIER_NFO" "$DOSSIER_NZB_ATTENTE" "$DOSSIER_NZB_FINAL" "$DOSSIER_LOGS" "tmp"
|
for dossier in "$DOSSIER_NFO" "$DOSSIER_NZB_ATTENTE" "$DOSSIER_NZB_FINAL" "$DOSSIER_LOGS" "tmp"
|
||||||
@ -28,10 +29,11 @@ checkusenet(){
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
cd ${DOSSIER_GLOBAL}
|
cd "${DOSSIER_GLOBAL}"
|
||||||
|
|
||||||
while true; do
|
while true; do
|
||||||
verif=$(sqlite3 "$DB_FILE" "BEGIN IMMEDIATE; SELECT id, nom FROM release WHERE status = 0 LIMIT 1; COMMIT;")
|
# Utilisation universelle
|
||||||
|
verif=$(db_query "SELECT id, nom FROM \`release\` WHERE status = 0 LIMIT 1;")
|
||||||
if [ -n "$verif" ]; then
|
if [ -n "$verif" ]; then
|
||||||
id=$(echo "$verif" | awk -F "|" '{print $1}' | xargs)
|
id=$(echo "$verif" | awk -F "|" '{print $1}' | xargs)
|
||||||
name=$(echo "$verif" | awk -F "|" '{print $2}' | xargs)
|
name=$(echo "$verif" | awk -F "|" '{print $2}' | xargs)
|
||||||
@ -40,19 +42,16 @@ while true; do
|
|||||||
|
|
||||||
echo -e "${VERT}DEBUT DE TRAITEMENT DE ${FILESANSEXT}${NORMAL}" | tee -a "$LOG"
|
echo -e "${VERT}DEBUT DE TRAITEMENT DE ${FILESANSEXT}${NORMAL}" | tee -a "$LOG"
|
||||||
echo -e "${CYAN}CREATION DES PAR2${NORMAL}" | tee -a "$LOG"
|
echo -e "${CYAN}CREATION DES PAR2${NORMAL}" | tee -a "$LOG"
|
||||||
# Lancement de parpar et redirection vers tee sans sous-shell
|
parpar -s10M -S -m4096M -t16 -r20% -O -o "${FILESANSEXT}.par2" "${name}" \
|
||||||
parpar -s10M -r20%+2 -m4096M -p1l -o "${FILESANSEXT}.par2" "${name}" \
|
|
||||||
> >(tee -a "$LOG") 2> >(tee -a "$LOG" >&2)
|
> >(tee -a "$LOG") 2> >(tee -a "$LOG" >&2)
|
||||||
ret=$?
|
ret=$?
|
||||||
if [ $ret -ne 0 ]; then
|
if [ $ret -ne 0 ]; then
|
||||||
echo -e "${ROUGE}Erreur parpar (code $ret). Marquage en échec.${NORMAL}" | tee -a "$LOG"
|
echo -e "${ROUGE}Erreur parpar (code $ret). Marquage en échec.${NORMAL}" | tee -a "$LOG"
|
||||||
sqlite3 "$DB_FILE" \
|
db_query "UPDATE \`release\` SET status = 2 WHERE id = ${id};"
|
||||||
"BEGIN IMMEDIATE; UPDATE release SET status = 2 WHERE id = ${id}; COMMIT;"
|
|
||||||
rm -f "${FILESANSEXT}.par2" "${FILESANSEXT}.vol*"
|
rm -f "${FILESANSEXT}.par2" "${FILESANSEXT}.vol*"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Suite du traitement loggué
|
|
||||||
{
|
{
|
||||||
echo -e "${VERT}UPLOAD SUR USENET${NORMAL}"
|
echo -e "${VERT}UPLOAD SUR USENET${NORMAL}"
|
||||||
checkusenet
|
checkusenet
|
||||||
@ -72,7 +71,7 @@ while true; do
|
|||||||
if [[ ${nzbsizebit} -le ${jsonsizebit} ]] || [[ ${nzbsizebit} = "NAN" ]]; then
|
if [[ ${nzbsizebit} -le ${jsonsizebit} ]] || [[ ${nzbsizebit} = "NAN" ]]; then
|
||||||
echo -e "${ROUGE}PROBLEME TAILLE NZB${NORMAL}"
|
echo -e "${ROUGE}PROBLEME TAILLE NZB${NORMAL}"
|
||||||
rm "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb" "${FILESANSEXT}.par2" "${FILESANSEXT}.vol*"
|
rm "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb" "${FILESANSEXT}.par2" "${FILESANSEXT}.vol*"
|
||||||
sqlite3 "$DB_FILE" "BEGIN IMMEDIATE; UPDATE release SET status = 2 WHERE id = ${id}; COMMIT;"
|
db_query "UPDATE \`release\` SET status = 2 WHERE id = ${id};"
|
||||||
else
|
else
|
||||||
echo -e "${CYAN}ENVOI SUR LE SITE${NORMAL}"
|
echo -e "${CYAN}ENVOI SUR LE SITE${NORMAL}"
|
||||||
curl -s -k -L -m 60 --output /dev/null \
|
curl -s -k -L -m 60 --output /dev/null \
|
||||||
@ -88,7 +87,7 @@ while true; do
|
|||||||
mv "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.7z" "${DOSSIER_NZB_FINAL}${first_char}/"
|
mv "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.7z" "${DOSSIER_NZB_FINAL}${first_char}/"
|
||||||
rm -rf "${FILESANSEXT}"*
|
rm -rf "${FILESANSEXT}"*
|
||||||
rm "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb"
|
rm "${DOSSIER_NZB_ATTENTE}${FILESANSEXT}.nzb"
|
||||||
sqlite3 "$DB_FILE" "BEGIN IMMEDIATE; UPDATE release SET status = 1 WHERE id = ${id}; COMMIT;"
|
db_query "UPDATE \`release\` SET status = 1 WHERE id = ${id};"
|
||||||
echo -e "${VERT}FIN DE TRAITEMENT DE ${FILESANSEXT}${NORMAL}"
|
echo -e "${VERT}FIN DE TRAITEMENT DE ${FILESANSEXT}${NORMAL}"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
@ -96,5 +95,5 @@ while true; do
|
|||||||
fi
|
fi
|
||||||
} > >(tee -a "$LOG") 2>&1
|
} > >(tee -a "$LOG") 2>&1
|
||||||
fi
|
fi
|
||||||
attente 10
|
attente 3
|
||||||
done
|
done
|
||||||
|
|||||||
@ -1,15 +1,15 @@
|
|||||||
const express = require('express');
|
const express = require('express');
|
||||||
const session = require('express-session');
|
const session = require('express-session');
|
||||||
const sqlite3 = require('sqlite3').verbose();
|
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
const AnsiToHtml = require('ansi-to-html');
|
const AnsiToHtml = require('ansi-to-html');
|
||||||
const convert = new AnsiToHtml();
|
const convert = new AnsiToHtml();
|
||||||
const { exec } = require('child_process');
|
const { exec } = require('child_process');
|
||||||
const os = require('os');
|
const os = require('os');
|
||||||
|
|
||||||
// Import de la configuration depuis config.js
|
|
||||||
const config = require('./config');
|
const config = require('./config');
|
||||||
|
const db = require('./db');
|
||||||
|
|
||||||
|
db.testConnection(); // vérification au démarrage
|
||||||
|
|
||||||
const app = express();
|
const app = express();
|
||||||
const port = config.port;
|
const port = config.port;
|
||||||
@ -17,33 +17,20 @@ const port = config.port;
|
|||||||
// Middleware pour parser les formulaires POST
|
// Middleware pour parser les formulaires POST
|
||||||
app.use(express.urlencoded({ extended: true }));
|
app.use(express.urlencoded({ extended: true }));
|
||||||
|
|
||||||
// Configuration des sessions en utilisant le secret depuis la config
|
|
||||||
app.use(session({
|
app.use(session({
|
||||||
secret: config.sessionSecret,
|
secret: config.sessionSecret,
|
||||||
resave: false,
|
resave: false,
|
||||||
saveUninitialized: false
|
saveUninitialized: false
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// Servir des fichiers statiques (CSS, images, etc.)
|
|
||||||
app.use(express.static('public'));
|
app.use(express.static('public'));
|
||||||
|
|
||||||
// Chemin vers la base SQLite défini dans la config
|
|
||||||
const DB_FILE = config.dbFile;
|
|
||||||
|
|
||||||
// Création du routeur pour /autopost
|
|
||||||
const autopostRouter = express.Router();
|
const autopostRouter = express.Router();
|
||||||
|
|
||||||
// Servir les fichiers statiques dans le contexte du routeur
|
|
||||||
autopostRouter.use('/js', express.static(path.join(__dirname, '../node_modules/@tailwindcss/browser/dist')));
|
autopostRouter.use('/js', express.static(path.join(__dirname, '../node_modules/@tailwindcss/browser/dist')));
|
||||||
|
|
||||||
// Servir les fichiers jQuery depuis node_modules/jquery/dist
|
|
||||||
autopostRouter.use('/jquery', express.static(path.join(__dirname, '../node_modules/jquery/dist')));
|
autopostRouter.use('/jquery', express.static(path.join(__dirname, '../node_modules/jquery/dist')));
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- Auth non protégée -----------------------------
|
||||||
Routes non protégées (login, logout) sous /autopost
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
// Affichage du formulaire de login à l'URL /autopost/login
|
|
||||||
autopostRouter.get('/login', (req, res) => {
|
autopostRouter.get('/login', (req, res) => {
|
||||||
res.send(`
|
res.send(`
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
@ -73,228 +60,350 @@ autopostRouter.get('/login', (req, res) => {
|
|||||||
`);
|
`);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Traitement du formulaire de login en utilisant la config pour vérifier les identifiants
|
|
||||||
autopostRouter.post('/login', (req, res) => {
|
autopostRouter.post('/login', (req, res) => {
|
||||||
const { username, password } = req.body;
|
const { username, password } = req.body;
|
||||||
if (username === config.auth.username && password === config.auth.password) {
|
if (username === config.auth.username && password === config.auth.password) {
|
||||||
req.session.authenticated = true;
|
req.session.authenticated = true;
|
||||||
res.redirect('/autopost');
|
res.redirect('/autopost');
|
||||||
} else {
|
} else {
|
||||||
res.send('Identifiants invalides. <a href="/autopost/login">Réessayer</a>');
|
res.send('Identifiants invalides. <a href="/autopost/login">Réessayer</a>');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Déconnexion
|
|
||||||
autopostRouter.get('/logout', (req, res) => {
|
autopostRouter.get('/logout', (req, res) => {
|
||||||
req.session.destroy();
|
req.session.destroy();
|
||||||
res.redirect('/autopost/login');
|
res.redirect('/autopost/login');
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
|
||||||
Middleware de protection pour les routes suivantes
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
function checkAuth(req, res, next) {
|
function checkAuth(req, res, next) {
|
||||||
if (req.session && req.session.authenticated) {
|
if (req.session && req.session.authenticated) {
|
||||||
next();
|
next();
|
||||||
} else {
|
} else {
|
||||||
res.redirect(req.baseUrl + '/login');
|
res.redirect(req.baseUrl + '/login');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
autopostRouter.use(checkAuth);
|
autopostRouter.use(checkAuth);
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- PAGE PRINCIPALE -----------------------------
|
||||||
Route GET principale pour /autopost avec pagination
|
autopostRouter.get('/', async (req, res) => {
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
autopostRouter.get('/', (req, res) => {
|
|
||||||
const limit = 100; // enregistrements par page
|
const limit = 100; // enregistrements par page
|
||||||
const page = parseInt(req.query.page) || 1;
|
const page = parseInt(req.query.page) || 1;
|
||||||
const offset = (page - 1) * limit;
|
const offset = (page - 1) * limit;
|
||||||
|
|
||||||
let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READONLY, (err) => {
|
try {
|
||||||
if (err) {
|
// Récupérer le nombre total d'enregistrements
|
||||||
console.error(err.message);
|
const [countResult] = await db.query("SELECT COUNT(*) as total FROM `release`");
|
||||||
return res.status(500).send("Erreur lors de l'ouverture de la base de données.");
|
const totalRecords = countResult[0].total;
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// Récupérer le nombre total d'enregistrements
|
|
||||||
const countQuery = "SELECT COUNT(*) as total FROM release";
|
|
||||||
db.get(countQuery, [], (err, countResult) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
res.status(500).send("Erreur lors du comptage des enregistrements.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const totalRecords = countResult.total;
|
|
||||||
const totalPages = Math.ceil(totalRecords / limit);
|
const totalPages = Math.ceil(totalRecords / limit);
|
||||||
|
|
||||||
const query = `
|
const [rows] = await db.query(
|
||||||
SELECT nom, status, id FROM release
|
"SELECT nom, status, id FROM `release` ORDER BY (status = 2) DESC, id DESC LIMIT ? OFFSET ?",
|
||||||
ORDER BY (status = 2) DESC, id DESC
|
[limit, offset]
|
||||||
LIMIT ${limit} OFFSET ${offset};
|
);
|
||||||
|
|
||||||
|
let html = `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Suivi Autopost</title>
|
||||||
|
<script src="js/index.global.js"></script>
|
||||||
|
<script src="jquery/jquery.min.js"></script>
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Roboto:400,700&display=swap" rel="stylesheet">
|
||||||
|
</head>
|
||||||
|
<body class="bg-slate-900 text-white font-sans p-4">
|
||||||
|
<div class="w-full px-4">
|
||||||
|
<h1 class="text-3xl font-bold mb-4">Suivi Autopost</h1>
|
||||||
|
<p class="mb-4">
|
||||||
|
<a href="/autopost/logout" class="text-blue-400 hover:underline">Déconnexion</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<input type="text" id="searchInput" placeholder="Rechercher..."
|
||||||
|
class="p-2 mb-4 border border-gray-300 rounded w-full"/>
|
||||||
|
<nav aria-label="Page navigation" class="mb-4">
|
||||||
|
<ul class="inline-flex items-center -space-x-px">
|
||||||
|
<li>
|
||||||
|
${ page > 1
|
||||||
|
? `<a href="/autopost/?page=${page - 1}" class="px-3 py-2 ml-0 leading-tight text-gray-500 bg-white border border-gray-300 rounded-l-lg hover:bg-gray-100 hover:text-gray-700">Précédent</a>`
|
||||||
|
: `<span class="px-3 py-2 ml-0 leading-tight text-gray-500 bg-gray-200 border border-gray-300 rounded-l-lg">Précédent</span>`
|
||||||
|
}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<span class="px-4 py-2 leading-tight text-gray-700 bg-white border border-gray-300">Page ${page} sur ${totalPages}</span>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
${ page < totalPages
|
||||||
|
? `<a href="/autopost/?page=${page + 1}" class="px-3 py-2 leading-tight text-gray-500 bg-white border border-gray-300 rounded-r-lg hover:bg-gray-100 hover:text-gray-700">Suivant</a>`
|
||||||
|
: `<span class="px-3 py-2 leading-tight text-gray-500 bg-gray-200 border border-gray-300 rounded-r-lg">Suivant</span>`
|
||||||
|
}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
<div class="overflow-x-auto">
|
||||||
|
<table class="min-w-full bg-gray-800">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="px-4 py-2 border border-gray-700 whitespace-nowrap">Name</th>
|
||||||
|
<th class="px-4 py-2 border border-gray-700 whitespace-nowrap">Status</th>
|
||||||
|
<th class="px-4 py-2 border border-gray-700">ID</th>
|
||||||
|
<th class="px-4 py-2 border border-gray-700 whitespace-nowrap">Actions</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
`;
|
`;
|
||||||
db.all(query, [], (err, rows) => {
|
|
||||||
if (err) {
|
rows.forEach(row => {
|
||||||
console.error(err.message);
|
let statusText = '';
|
||||||
res.status(500).send("Erreur lors de la requête.");
|
let statusClass = '';
|
||||||
return;
|
switch (parseInt(row.status)) {
|
||||||
|
case 0:
|
||||||
|
statusText = 'EN ATTENTE';
|
||||||
|
statusClass = 'bg-cyan-500 text-black font-bold';
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
statusText = 'ENVOI TERMINÉ';
|
||||||
|
statusClass = 'bg-green-300 text-black font-bold';
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
statusText = 'ERREUR';
|
||||||
|
statusClass = 'bg-red-300 text-black font-bold';
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
statusText = 'DEJA DISPONIBLE';
|
||||||
|
statusClass = 'bg-pink-300 text-black font-bold';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
statusText = 'INCONNU';
|
||||||
}
|
}
|
||||||
|
let logLink = (parseInt(row.status) === 1 || parseInt(row.status) === 2)
|
||||||
let html = `
|
? ' | <a href="#" class="log-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Log</a>'
|
||||||
<!DOCTYPE html>
|
: '';
|
||||||
<html lang="fr">
|
let mediainfoLink = (parseInt(row.status) === 0 || parseInt(row.status) === 1 || parseInt(row.status) === 2)
|
||||||
<head>
|
? ' | <a href="#" class="mediainfo-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Mediainfo</a>'
|
||||||
<meta charset="UTF-8">
|
: '';
|
||||||
<title>Suivi Autopost</title>
|
let dlLink = row.status === 1
|
||||||
<!-- Inclusion de Tailwind CSS et jQuery -->
|
? ` | <a href="/autopost/dl?name=${encodeURIComponent(row.nom)}" class="dl-link text-blue-400 hover:underline">DL</a>`
|
||||||
<script src="js/index.global.js"></script>
|
: '';
|
||||||
<script src="jquery/jquery.min.js"></script>
|
|
||||||
</head>
|
|
||||||
<body class="bg-slate-900 text-white font-sans p-4">
|
|
||||||
<!-- Conteneur "fluid" -->
|
|
||||||
<div class="w-full px-4">
|
|
||||||
<h1 class="text-3xl font-bold mb-4">Suivi Autopost</h1>
|
|
||||||
<p class="mb-4">
|
|
||||||
<a href="/autopost/logout" class="text-blue-400 hover:underline">Déconnexion</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<input type="text" id="searchInput" placeholder="Rechercher..."
|
|
||||||
class="p-2 mb-4 border border-gray-300 rounded w-full"/>
|
|
||||||
<!-- Pagination avec Tailwind -->
|
|
||||||
<nav aria-label="Page navigation" class="mb-4">
|
|
||||||
<ul class="inline-flex items-center -space-x-px">
|
|
||||||
<li>
|
|
||||||
${ page > 1
|
|
||||||
? `<a href="/autopost/?page=${page - 1}" class="px-3 py-2 ml-0 leading-tight text-gray-500 bg-white border border-gray-300 rounded-l-lg hover:bg-gray-100 hover:text-gray-700">Précédent</a>`
|
|
||||||
: `<span class="px-3 py-2 ml-0 leading-tight text-gray-500 bg-gray-200 border border-gray-300 rounded-l-lg">Précédent</span>`
|
|
||||||
}
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
<span class="px-4 py-2 leading-tight text-gray-700 bg-white border border-gray-300">Page ${page} sur ${totalPages}</span>
|
|
||||||
</li>
|
|
||||||
<li>
|
|
||||||
${ page < totalPages
|
|
||||||
? `<a href="/autopost/?page=${page + 1}" class="px-3 py-2 leading-tight text-gray-500 bg-white border border-gray-300 rounded-r-lg hover:bg-gray-100 hover:text-gray-700">Suivant</a>`
|
|
||||||
: `<span class="px-3 py-2 leading-tight text-gray-500 bg-gray-200 border border-gray-300 rounded-r-lg">Suivant</span>`
|
|
||||||
}
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
<div class="overflow-x-auto">
|
|
||||||
<table class="min-w-full bg-gray-800">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th class="px-4 py-2 border border-gray-700 whitespace-nowrap">Name</th>
|
|
||||||
<th class="px-4 py-2 border border-gray-700 whitespace-nowrap">Status</th>
|
|
||||||
<th class="px-4 py-2 border border-gray-700">ID</th>
|
|
||||||
<th class="px-4 py-2 border border-gray-700 whitespace-nowrap">Actions</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
`;
|
|
||||||
|
|
||||||
rows.forEach(row => {
|
|
||||||
let statusText = '';
|
|
||||||
let statusClass = '';
|
|
||||||
switch (row.status) {
|
|
||||||
case 0:
|
|
||||||
statusText = 'EN ATTENTE';
|
|
||||||
statusClass = 'bg-cyan-500 text-black font-bold';
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
statusText = 'ENVOI TERMINÉ';
|
|
||||||
statusClass = 'bg-green-300 text-black font-bold';
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
statusText = 'ERREUR';
|
|
||||||
statusClass = 'bg-red-300 text-black font-bold';
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
statusText = 'DEJA DISPONIBLE';
|
|
||||||
statusClass = 'bg-pink-300 text-black font-bold';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
statusText = 'INCONNU';
|
|
||||||
}
|
|
||||||
let logLink = (parseInt(row.status) === 1 || parseInt(row.status) === 2)
|
|
||||||
? ' | <a href="#" class="log-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Log</a>'
|
|
||||||
: '';
|
|
||||||
let mediainfoLink = (parseInt(row.status) === 0 || parseInt(row.status) === 1 || parseInt(row.status) === 2)
|
|
||||||
? ' | <a href="#" class="mediainfo-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Mediainfo</a>'
|
|
||||||
: '';
|
|
||||||
let dlLink = row.status === 1
|
|
||||||
? ` | <a href="/autopost/dl?name=${encodeURIComponent(row.nom)}" class="dl-link text-blue-400 hover:underline">DL</a>`
|
|
||||||
: '';
|
|
||||||
|
|
||||||
html += `
|
|
||||||
<tr id="row-${row.id}" class="odd:bg-gray-800 even:bg-gray-700">
|
|
||||||
<td class="px-4 py-2 border border-gray-700">${row.nom}</td>
|
|
||||||
<td class="px-4 py-2 border border-gray-700 status-text whitespace-nowrap ${statusClass}">${statusText}</td>
|
|
||||||
<td class="px-4 py-2 border border-gray-700">${row.id}</td>
|
|
||||||
<td class="px-4 py-2 border border-gray-700 whitespace-nowrap">
|
|
||||||
<a href="#" class="edit-link text-blue-400 hover:underline" data-id="${row.id}" data-status="${row.status}">Editer</a> |
|
|
||||||
<a href="#" class="delete-link text-blue-400 hover:underline" data-id="${row.id}">Supprimer</a>
|
|
||||||
${logLink}
|
|
||||||
${mediainfoLink}
|
|
||||||
${dlLink}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
`;
|
|
||||||
});
|
|
||||||
|
|
||||||
html += `
|
html += `
|
||||||
</tbody>
|
<tr id="row-${row.id}" class="odd:bg-gray-800 even:bg-gray-700">
|
||||||
</table>
|
<td class="px-4 py-2 border border-gray-700">${row.nom}</td>
|
||||||
</div>
|
<td class="px-4 py-2 border border-gray-700 status-text whitespace-nowrap ${statusClass}">${statusText}</td>
|
||||||
</div>
|
<td class="px-4 py-2 border border-gray-700">${row.id}</td>
|
||||||
|
<td class="px-4 py-2 border border-gray-700 whitespace-nowrap">
|
||||||
<!-- Modale d'édition -->
|
<a href="#" class="edit-link text-blue-400 hover:underline" data-id="${row.id}" data-status="${row.status}">Editer</a> |
|
||||||
<div id="editModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
|
<a href="#" class="delete-link text-blue-400 hover:underline" data-id="${row.id}">Supprimer</a>
|
||||||
<div class="bg-gray-800 p-6 rounded relative w-1/2">
|
${logLink}
|
||||||
<span class="absolute top-2 right-2 text-white cursor-pointer close">×</span>
|
${mediainfoLink}
|
||||||
<h2 class="text-xl font-semibold mb-4">Editer Release <span id="modalReleaseId"></span></h2>
|
${dlLink}
|
||||||
<form id="editForm">
|
</td>
|
||||||
<label for="statusSelect" class="block mb-2">Status :</label>
|
</tr>
|
||||||
<select id="statusSelect" name="status" class="w-full p-2 mb-4 rounded border border-gray-300">
|
`;
|
||||||
<option value="0">EN ATTENTE</option>
|
});
|
||||||
<option value="1">ENVOI TERMINÉ</option>
|
|
||||||
<option value="2">ERREUR</option>
|
html += `
|
||||||
<option value="3">DEJA DISPONIBLE</option>
|
</tbody>
|
||||||
</select>
|
</table>
|
||||||
<input type="hidden" id="releaseId" name="id" value=""/>
|
</div>
|
||||||
<button type="submit" class="w-full p-2 bg-blue-600 text-white rounded hover:bg-blue-700">
|
</div>
|
||||||
Mettre à jour
|
|
||||||
</button>
|
<!-- Modale d'édition -->
|
||||||
</form>
|
<div id="editModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
|
||||||
</div>
|
<div class="bg-gray-800 p-6 rounded relative w-1/2">
|
||||||
</div>
|
<span class="absolute top-2 right-2 text-white cursor-pointer close">×</span>
|
||||||
|
<h2 class="text-xl font-semibold mb-4">Editer Release <span id="modalReleaseId"></span></h2>
|
||||||
<!-- Modale pour afficher le log -->
|
<form id="editForm">
|
||||||
<div id="logModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
|
<label for="statusSelect" class="block mb-2">Status :</label>
|
||||||
<div class="bg-gray-800 p-6 rounded relative w-2/3">
|
<select id="statusSelect" name="status" class="w-full p-2 mb-4 rounded border border-gray-300">
|
||||||
<span class="absolute top-2 right-2 text-white cursor-pointer close log-close">×</span>
|
<option value="0">EN ATTENTE</option>
|
||||||
<h2 class="text-xl font-semibold mb-4">Contenu du log</h2>
|
<option value="1">ENVOI TERMINÉ</option>
|
||||||
<pre id="logContent" class="max-h-[80vh] overflow-y-auto"></pre>
|
<option value="2">ERREUR</option>
|
||||||
</div>
|
<option value="3">DEJA DISPONIBLE</option>
|
||||||
</div>
|
</select>
|
||||||
|
<input type="hidden" id="releaseId" name="id" value=""/>
|
||||||
<!-- Modale pour afficher le mediainfo -->
|
<button type="submit" class="w-full p-2 bg-blue-600 text-white rounded hover:bg-blue-700">
|
||||||
<div id="mediainfoModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
|
Mettre à jour
|
||||||
<div class="bg-gray-800 p-6 rounded relative w-2/3">
|
</button>
|
||||||
<span class="absolute top-2 right-2 text-white cursor-pointer close mediainfo-close">×</span>
|
</form>
|
||||||
<h2 class="text-xl font-semibold mb-4">Contenu du mediainfo</h2>
|
</div>
|
||||||
<pre id="mediainfoContent" class="max-h-[80vh] overflow-y-auto"></pre>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
<!-- Modale pour afficher le log -->
|
||||||
|
<div id="logModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
|
||||||
<script>
|
<div class="bg-gray-800 p-6 rounded relative w-2/3">
|
||||||
function updateTable(rows) {
|
<span class="absolute top-2 right-2 text-white cursor-pointer close log-close">×</span>
|
||||||
let tbody = $("table tbody");
|
<h2 class="text-xl font-semibold mb-4">Contenu du log</h2>
|
||||||
tbody.empty();
|
<pre id="logContent" class="max-h-[80vh] overflow-y-auto"></pre>
|
||||||
rows.forEach(function(row) {
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Modale pour afficher le mediainfo -->
|
||||||
|
<div id="mediainfoModal" class="hidden fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center">
|
||||||
|
<div class="bg-gray-800 p-6 rounded relative w-2/3">
|
||||||
|
<span class="absolute top-2 right-2 text-white cursor-pointer close mediainfo-close">×</span>
|
||||||
|
<h2 class="text-xl font-semibold mb-4">Contenu du mediainfo</h2>
|
||||||
|
<pre id="mediainfoContent" class="max-h-[80vh] overflow-y-auto"></pre>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function updateTable(rows) {
|
||||||
|
let tbody = $("table tbody");
|
||||||
|
tbody.empty();
|
||||||
|
rows.forEach(function(row) {
|
||||||
|
let statusText = '';
|
||||||
|
let statusClass = '';
|
||||||
|
switch (parseInt(row.status)) {
|
||||||
|
case 0:
|
||||||
|
statusText = 'EN ATTENTE';
|
||||||
|
statusClass = 'bg-cyan-500 text-black font-bold';
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
statusText = 'ENVOI TERMINÉ';
|
||||||
|
statusClass = 'bg-green-300 text-black font-bold';
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
statusText = 'ERREUR';
|
||||||
|
statusClass = 'bg-red-300 text-black font-bold';
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
statusText = 'DEJA DISPONIBLE';
|
||||||
|
statusClass = 'bg-pink-300 text-black font-bold';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
statusText = 'INCONNU';
|
||||||
|
}
|
||||||
|
|
||||||
|
let logLink = parseInt(row.status) === 1 || parseInt(row.status) === 2
|
||||||
|
? ' | <a href="#" class="log-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Log</a>'
|
||||||
|
: '';
|
||||||
|
let mediainfoLink = parseInt(row.status) === 0 || parseInt(row.status) === 1 || parseInt(row.status) === 2
|
||||||
|
? ' | <a href="#" class="mediainfo-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Mediainfo</a>'
|
||||||
|
: '';
|
||||||
|
let dlLink = parseInt(row.status) === 1
|
||||||
|
? ' | <a href="/autopost/dl?name='+encodeURIComponent(row.nom)+'" class="dl-link text-blue-400 hover:underline">DL</a>'
|
||||||
|
: '';
|
||||||
|
let tr = \`
|
||||||
|
<tr id="row-\${row.id}" class="odd:bg-gray-800 even:bg-gray-700">
|
||||||
|
<td class="px-4 py-2 border border-gray-700 whitespace-nowrap">\${row.nom}</td>
|
||||||
|
<td class="px-4 py-2 border border-gray-700 status-text whitespace-nowrap \${statusClass}">\${statusText}</td>
|
||||||
|
<td class="px-4 py-2 border border-gray-700">\${row.id}</td>
|
||||||
|
<td class="px-4 py-2 border border-gray-700">
|
||||||
|
<a href="#" class="edit-link text-blue-400 hover:underline" data-id="\${row.id}" data-status="\${row.status}">Editer</a> |
|
||||||
|
<a href="#" class="delete-link text-blue-400 hover:underline" data-id="\${row.id}">Supprimer</a>\${logLink}\${mediainfoLink}\${dlLink}
|
||||||
|
</td>
|
||||||
|
</tr>\`;
|
||||||
|
tbody.append(tr);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$(document).ready(function(){
|
||||||
|
$("#searchInput").on("keyup", function() {
|
||||||
|
let q = $(this).val();
|
||||||
|
$.ajax({
|
||||||
|
url: '/autopost/search',
|
||||||
|
type: 'GET',
|
||||||
|
data: { q: q },
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
updateTable(data);
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert("Erreur lors de la recherche.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on("click", ".edit-link", function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let releaseId = $(this).data('id');
|
||||||
|
let currentStatus = $(this).data('status');
|
||||||
|
$('#releaseId').val(releaseId);
|
||||||
|
$('#modalReleaseId').text(releaseId);
|
||||||
|
$('#statusSelect').val(currentStatus);
|
||||||
|
$('#editModal').removeClass('hidden').fadeIn();
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on("click", ".delete-link", function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (confirm("Êtes-vous sûr de vouloir supprimer cet enregistrement ?")) {
|
||||||
|
let releaseId = $(this).data('id');
|
||||||
|
$.ajax({
|
||||||
|
url: '/autopost/delete/' + releaseId,
|
||||||
|
type: 'POST',
|
||||||
|
success: function(data) {
|
||||||
|
$('#row-' + releaseId).fadeOut('slow', function(){
|
||||||
|
$(this).remove();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert("Erreur lors de la suppression.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on("click", ".log-link", function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let filename = $(this).data("filename");
|
||||||
|
$.ajax({
|
||||||
|
url: '/autopost/log',
|
||||||
|
type: 'GET',
|
||||||
|
data: { name: filename },
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
$("#logContent").html(data.content);
|
||||||
|
$("#logModal").removeClass('hidden').fadeIn();
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert("Erreur lors du chargement du fichier log.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$(document).on("click", ".mediainfo-link", function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let filename = $(this).data("filename");
|
||||||
|
$.ajax({
|
||||||
|
url: '/autopost/mediainfo',
|
||||||
|
type: 'GET',
|
||||||
|
data: { name: filename },
|
||||||
|
dataType: 'json',
|
||||||
|
success: function(data) {
|
||||||
|
$("#mediainfoContent").text(data.content);
|
||||||
|
$("#mediainfoModal").removeClass('hidden').fadeIn();
|
||||||
|
},
|
||||||
|
error: function() {
|
||||||
|
alert("Erreur lors du chargement du fichier mediainfo.");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.close').click(function(){
|
||||||
|
$(this).closest('.fixed').fadeOut(function(){
|
||||||
|
$(this).addClass('hidden');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('.fixed').click(function(e) {
|
||||||
|
if (e.target === this) {
|
||||||
|
$(this).fadeOut(function(){
|
||||||
|
$(this).addClass('hidden');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$('#editForm').submit(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
let releaseId = $('#releaseId').val();
|
||||||
|
let newStatus = $('#statusSelect').val();
|
||||||
|
$.ajax({
|
||||||
|
url: '/autopost/edit/' + releaseId,
|
||||||
|
type: 'POST',
|
||||||
|
data: { status: newStatus },
|
||||||
|
success: function(data) {
|
||||||
let statusText = '';
|
let statusText = '';
|
||||||
let statusClass = '';
|
let statusClass = '';
|
||||||
switch (parseInt(row.status)) {
|
switch(parseInt(newStatus)) {
|
||||||
case 0:
|
case 0:
|
||||||
statusText = 'EN ATTENTE';
|
statusText = 'EN ATTENTE';
|
||||||
statusClass = 'bg-cyan-500 text-black font-bold';
|
statusClass = 'bg-cyan-500 text-black font-bold';
|
||||||
@ -314,209 +423,50 @@ autopostRouter.get('/', (req, res) => {
|
|||||||
default:
|
default:
|
||||||
statusText = 'INCONNU';
|
statusText = 'INCONNU';
|
||||||
}
|
}
|
||||||
|
let row = $('#row-' + releaseId);
|
||||||
let logLink = parseInt(row.status) === 1 || parseInt(row.status) === 2
|
// Mise à jour uniquement de la cellule status
|
||||||
? ' | <a href="#" class="log-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Log</a>'
|
row.find('.status-text')
|
||||||
: '';
|
.removeClass('bg-cyan-500 bg-green-300 bg-red-300 bg-pink-300')
|
||||||
let mediainfoLink = parseInt(row.status) === 0 || parseInt(row.status) === 1 || parseInt(row.status) === 2
|
.addClass(statusClass)
|
||||||
? ' | <a href="#" class="mediainfo-link text-blue-400 hover:underline" data-filename="'+row.nom+'">Mediainfo</a>'
|
.text(statusText);
|
||||||
: '';
|
$('#editModal').fadeOut(function(){
|
||||||
let dlLink = parseInt(row.status) === 1
|
|
||||||
? ' | <a href="/autopost/dl?name='+encodeURIComponent(row.nom)+'" class="dl-link text-blue-400 hover:underline">DL</a>'
|
|
||||||
: '';
|
|
||||||
let tr = \`
|
|
||||||
<tr id="row-\${row.id}" class="odd:bg-gray-800 even:bg-gray-700">
|
|
||||||
<td class="px-4 py-2 border border-gray-700 whitespace-nowrap">\${row.nom}</td>
|
|
||||||
<td class="px-4 py-2 border border-gray-700 status-text whitespace-nowrap \${statusClass}">\${statusText}</td>
|
|
||||||
<td class="px-4 py-2 border border-gray-700">\${row.id}</td>
|
|
||||||
<td class="px-4 py-2 border border-gray-700">
|
|
||||||
<a href="#" class="edit-link text-blue-400 hover:underline" data-id="\${row.id}" data-status="\${row.status}">Editer</a> |
|
|
||||||
<a href="#" class="delete-link text-blue-400 hover:underline" data-id="\${row.id}">Supprimer</a>\${logLink}\${mediainfoLink}\${dlLink}
|
|
||||||
</td>
|
|
||||||
</tr>\`;
|
|
||||||
tbody.append(tr);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#searchInput").on("keyup", function() {
|
|
||||||
let q = $(this).val();
|
|
||||||
$.ajax({
|
|
||||||
url: '/autopost/search',
|
|
||||||
type: 'GET',
|
|
||||||
data: { q: q },
|
|
||||||
dataType: 'json',
|
|
||||||
success: function(data) {
|
|
||||||
updateTable(data);
|
|
||||||
},
|
|
||||||
error: function() {
|
|
||||||
alert("Erreur lors de la recherche.");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).on("click", ".edit-link", function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let releaseId = $(this).data('id');
|
|
||||||
let currentStatus = $(this).data('status');
|
|
||||||
$('#releaseId').val(releaseId);
|
|
||||||
$('#modalReleaseId').text(releaseId);
|
|
||||||
$('#statusSelect').val(currentStatus);
|
|
||||||
$('#editModal').removeClass('hidden').fadeIn();
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).on("click", ".delete-link", function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
if (confirm("Êtes-vous sûr de vouloir supprimer cet enregistrement ?")) {
|
|
||||||
let releaseId = $(this).data('id');
|
|
||||||
$.ajax({
|
|
||||||
url: '/autopost/delete/' + releaseId,
|
|
||||||
type: 'POST',
|
|
||||||
success: function(data) {
|
|
||||||
$('#row-' + releaseId).fadeOut('slow', function(){
|
|
||||||
$(this).remove();
|
|
||||||
});
|
|
||||||
},
|
|
||||||
error: function() {
|
|
||||||
alert("Erreur lors de la suppression.");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).on("click", ".log-link", function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let filename = $(this).data("filename");
|
|
||||||
$.ajax({
|
|
||||||
url: '/autopost/log',
|
|
||||||
type: 'GET',
|
|
||||||
data: { name: filename },
|
|
||||||
dataType: 'json',
|
|
||||||
success: function(data) {
|
|
||||||
$("#logContent").html(data.content);
|
|
||||||
$("#logModal").removeClass('hidden').fadeIn();
|
|
||||||
},
|
|
||||||
error: function() {
|
|
||||||
alert("Erreur lors du chargement du fichier log.");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).on("click", ".mediainfo-link", function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
let filename = $(this).data("filename");
|
|
||||||
$.ajax({
|
|
||||||
url: '/autopost/mediainfo',
|
|
||||||
type: 'GET',
|
|
||||||
data: { name: filename },
|
|
||||||
dataType: 'json',
|
|
||||||
success: function(data) {
|
|
||||||
$("#mediainfoContent").text(data.content);
|
|
||||||
$("#mediainfoModal").removeClass('hidden').fadeIn();
|
|
||||||
},
|
|
||||||
error: function() {
|
|
||||||
alert("Erreur lors du chargement du fichier mediainfo.");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$('.close').click(function(){
|
|
||||||
$(this).closest('.fixed').fadeOut(function(){
|
|
||||||
$(this).addClass('hidden');
|
$(this).addClass('hidden');
|
||||||
});
|
});
|
||||||
});
|
},
|
||||||
|
error: function() {
|
||||||
$('.fixed').click(function(e) {
|
alert("Erreur lors de la mise à jour.");
|
||||||
if (e.target === this) {
|
}
|
||||||
$(this).fadeOut(function(){
|
|
||||||
$(this).addClass('hidden');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$('#editForm').submit(function(e){
|
|
||||||
e.preventDefault();
|
|
||||||
let releaseId = $('#releaseId').val();
|
|
||||||
let newStatus = $('#statusSelect').val();
|
|
||||||
$.ajax({
|
|
||||||
url: '/autopost/edit/' + releaseId,
|
|
||||||
type: 'POST',
|
|
||||||
data: { status: newStatus },
|
|
||||||
success: function(data) {
|
|
||||||
let statusText = '';
|
|
||||||
let statusClass = '';
|
|
||||||
switch(parseInt(newStatus)) {
|
|
||||||
case 0:
|
|
||||||
statusText = 'EN ATTENTE';
|
|
||||||
statusClass = 'bg-cyan-500 text-black font-bold';
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
statusText = 'ENVOI TERMINÉ';
|
|
||||||
statusClass = 'bg-green-300 text-black font-bold';
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
statusText = 'ERREUR';
|
|
||||||
statusClass = 'bg-red-300 text-black font-bold';
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
statusText = 'DEJA DISPONIBLE';
|
|
||||||
statusClass = 'bg-pink-300 text-black font-bold';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
statusText = 'INCONNU';
|
|
||||||
}
|
|
||||||
let row = $('#row-' + releaseId);
|
|
||||||
// Mise à jour uniquement de la cellule status
|
|
||||||
row.find('.status-text')
|
|
||||||
.removeClass('bg-cyan-500 bg-green-300 bg-red-300 bg-pink-300')
|
|
||||||
.addClass(statusClass)
|
|
||||||
.text(statusText);
|
|
||||||
$('#editModal').fadeOut(function(){
|
|
||||||
$(this).addClass('hidden');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
error: function() {
|
|
||||||
alert("Erreur lors de la mise à jour.");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
</script>
|
});
|
||||||
</body>
|
});
|
||||||
</html>
|
</script>
|
||||||
`;
|
</body>
|
||||||
res.send(html);
|
</html>
|
||||||
db.close();
|
`;
|
||||||
});
|
res.send(html);
|
||||||
});
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).send("Erreur lors de la requête DB.");
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- Recherche -----------------------------
|
||||||
Route GET pour la recherche côté serveur
|
autopostRouter.get('/search', async (req, res) => {
|
||||||
------------------------------------------------------------------------- */
|
const q = req.query.q || "";
|
||||||
autopostRouter.get('/search', (req, res) => {
|
const searchQuery = "%" + q + "%";
|
||||||
const q = req.query.q || "";
|
try {
|
||||||
const searchQuery = "%" + q + "%";
|
const [rows] = await db.query(
|
||||||
let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READONLY, (err) => {
|
"SELECT nom, status, id FROM `release` WHERE nom LIKE ? ORDER BY id DESC LIMIT 500",
|
||||||
if (err) {
|
[searchQuery]
|
||||||
console.error(err.message);
|
);
|
||||||
return res.status(500).json({ error: "Erreur lors de l'ouverture de la base de données." });
|
res.json(rows);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).json({ error: "Erreur lors de la requête." });
|
||||||
}
|
}
|
||||||
});
|
|
||||||
db.all("SELECT nom, status, id FROM release WHERE nom LIKE ? ORDER BY id DESC LIMIT 500", [searchQuery], (err, rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
res.status(500).json({ error: "Erreur lors de la requête." });
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
res.json(rows);
|
|
||||||
db.close();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- Log -----------------------------
|
||||||
Route GET pour récupérer le contenu d'un fichier log
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
autopostRouter.get('/log', (req, res) => {
|
autopostRouter.get('/log', (req, res) => {
|
||||||
const filename = req.query.name;
|
const filename = req.query.name;
|
||||||
if (!filename) {
|
if (!filename) {
|
||||||
@ -534,9 +484,7 @@ autopostRouter.get('/log', (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- Mediainfo -----------------------------
|
||||||
Route GET pour récupérer le contenu d'un fichier mediainfo
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
autopostRouter.get('/mediainfo', (req, res) => {
|
autopostRouter.get('/mediainfo', (req, res) => {
|
||||||
const filename = req.query.name;
|
const filename = req.query.name;
|
||||||
if (!filename) {
|
if (!filename) {
|
||||||
@ -559,9 +507,7 @@ autopostRouter.get('/mediainfo', (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- Download -----------------------------
|
||||||
Route GET pour télécharger le fichier NZB
|
|
||||||
------------------------------------------------------------------------- */
|
|
||||||
autopostRouter.get('/dl', (req, res) => {
|
autopostRouter.get('/dl', (req, res) => {
|
||||||
const filename = req.query.name;
|
const filename = req.query.name;
|
||||||
if (!filename) {
|
if (!filename) {
|
||||||
@ -603,67 +549,46 @@ autopostRouter.get('/dl', (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- Édition -----------------------------
|
||||||
Route POST pour mettre à jour le statut (édition)
|
autopostRouter.post('/edit/:id', async (req, res) => {
|
||||||
------------------------------------------------------------------------- */
|
const id = req.params.id;
|
||||||
autopostRouter.post('/edit/:id', (req, res) => {
|
const newStatus = req.body.status;
|
||||||
const id = req.params.id;
|
try {
|
||||||
const newStatus = req.body.status;
|
await db.query("UPDATE `release` SET status = ? WHERE id = ?", [newStatus, id]);
|
||||||
let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READWRITE, (err) => {
|
if (req.xhr || req.headers.accept.indexOf('json') > -1) {
|
||||||
if (err) {
|
res.json({ success: true });
|
||||||
console.error(err.message);
|
} else {
|
||||||
return res.status(500).send("Erreur lors de l'ouverture de la base de données.");
|
res.redirect("/autopost/");
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).send("Erreur lors de la mise à jour.");
|
||||||
}
|
}
|
||||||
});
|
|
||||||
db.run("UPDATE release SET status = ? WHERE id = ?", [newStatus, id], function(err) {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
res.status(500).send("Erreur lors de la mise à jour.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.xhr || req.headers.accept.indexOf('json') > -1) {
|
|
||||||
res.json({ success: true });
|
|
||||||
} else {
|
|
||||||
res.redirect("/autopost/");
|
|
||||||
}
|
|
||||||
db.close();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
/* -------------------------------------------------------------------------
|
// --------------------------- Suppression -----------------------------
|
||||||
Route POST pour supprimer un enregistrement
|
autopostRouter.post('/delete/:id', async (req, res) => {
|
||||||
------------------------------------------------------------------------- */
|
const id = req.params.id;
|
||||||
autopostRouter.post('/delete/:id', (req, res) => {
|
try {
|
||||||
const id = req.params.id;
|
await db.query("DELETE FROM `release` WHERE id = ?", [id]);
|
||||||
let db = new sqlite3.Database(DB_FILE, sqlite3.OPEN_READWRITE, (err) => {
|
if (req.xhr || req.headers.accept.indexOf('json') > -1) {
|
||||||
if (err) {
|
res.json({ success: true });
|
||||||
console.error(err.message);
|
} else {
|
||||||
return res.status(500).send("Erreur lors de l'ouverture de la base de données.");
|
res.redirect("/autopost/");
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).send("Erreur lors de la suppression.");
|
||||||
}
|
}
|
||||||
});
|
|
||||||
db.run("DELETE FROM release WHERE id = ?", [id], function(err) {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
res.status(500).send("Erreur lors de la suppression.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (req.xhr || req.headers.accept.indexOf('json') > -1) {
|
|
||||||
res.json({ success: true });
|
|
||||||
} else {
|
|
||||||
res.redirect("/autopost/");
|
|
||||||
}
|
|
||||||
db.close();
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// Redirection de la route GET d'édition si accès direct
|
// Redirection accès direct GET /edit/:id
|
||||||
autopostRouter.get('/edit/:id', (req, res) => {
|
autopostRouter.get('/edit/:id', (req, res) => {
|
||||||
res.redirect("/autopost/");
|
res.redirect("/autopost/");
|
||||||
});
|
});
|
||||||
|
|
||||||
// Monter le routeur sur le chemin /autopost
|
|
||||||
app.use('/autopost', autopostRouter);
|
app.use('/autopost', autopostRouter);
|
||||||
|
|
||||||
app.listen(port, () => {
|
app.listen(port, () => {
|
||||||
console.log(`Serveur démarré sur http://localhost:${port}/autopost`);
|
console.log(`Serveur démarré sur http://localhost:${port}/autopost`);
|
||||||
});
|
});
|
||||||
|
|||||||
91
install.sh
91
install.sh
@ -92,28 +92,67 @@ else
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Vérifier et installer sqlite3 si manquant
|
# Demande à l'utilisateur
|
||||||
if command -v sqlite3 > /dev/null 2>&1; then
|
echo "Quel système de base de données voulez-vous utiliser ?"
|
||||||
LISTE_APPLIS+=("sqlite3")
|
select BDD in "SQLite" "MySQL"; do
|
||||||
else
|
case $BDD in
|
||||||
echo -e "${ROUGE}sqlite3 est manquant. Installation en cours...${NORMAL}"
|
"SQLite")
|
||||||
if $sudook; then
|
echo "Vous avez choisi SQLite."
|
||||||
sudo apt install sqlite3
|
# Bloc vérification/install sqlite3
|
||||||
LISTE_APPLIS+=("sqlite3")
|
if command -v sqlite3 > /dev/null 2>&1; then
|
||||||
echo -e "${VERT}sqlite3 installé${NORMAL}"
|
LISTE_APPLIS+=("sqlite3")
|
||||||
else
|
else
|
||||||
curl -L -o sqlite-tools.zip "https://www.sqlite.org/2024/sqlite-tools-linux-x64-3470000.zip"
|
echo -e "${ROUGE}sqlite3 est manquant. Installation en cours...${NORMAL}"
|
||||||
unzip sqlite-tools.zip -d "$BIN_DIR"
|
if $sudook; then
|
||||||
chmod 777 "$BIN_DIR/sqlite3"
|
sudo apt install -y sqlite3
|
||||||
|
LISTE_APPLIS+=("sqlite3")
|
||||||
# Nettoyage des fichiers inutiles
|
echo -e "${VERT}sqlite3 installé${NORMAL}"
|
||||||
rm -rf sqlite-tools.zip "$BIN_DIR/sqlite-tools-linux-x64-3480000" "$BIN_DIR/sqldiff" "$BIN_DIR/sqlite3_analyzer" "$BIN_DIR/sqlite3_rsync"
|
else
|
||||||
|
curl -L -o sqlite-tools.zip "https://www.sqlite.org/2024/sqlite-tools-linux-x64-3470000.zip"
|
||||||
LISTE_APPLIS+=("$BIN_DIR/sqlite3")
|
unzip sqlite-tools.zip -d "$BIN_DIR"
|
||||||
echo -e "${VERT}sqlite3 installé dans $BIN_DIR${NORMAL}"
|
chmod 777 "$BIN_DIR/sqlite3"
|
||||||
|
# Nettoyage
|
||||||
fi
|
rm -rf sqlite-tools.zip "$BIN_DIR/sqlite-tools-linux-x64-3480000" "$BIN_DIR/sqldiff" "$BIN_DIR/sqlite3_analyzer" "$BIN_DIR/sqlite3_rsync"
|
||||||
fi
|
LISTE_APPLIS+=("$BIN_DIR/sqlite3")
|
||||||
|
echo -e "${VERT}sqlite3 installé dans $BIN_DIR${NORMAL}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
"MySQL")
|
||||||
|
echo "Vous avez choisi MySQL."
|
||||||
|
if command -v mysql > /dev/null 2>&1; then
|
||||||
|
LISTE_APPLIS+=("mysql")
|
||||||
|
echo -e "${VERT}MySQL est disponible${NORMAL}"
|
||||||
|
# Place ici le code MySQL à exécuter
|
||||||
|
else
|
||||||
|
echo -e "${ROUGE}MySQL n'est pas installé. Bascule automatique sur SQLite.${NORMAL}"
|
||||||
|
# Bloc vérification/install sqlite3 (copié plus haut)
|
||||||
|
if command -v sqlite3 > /dev/null 2>&1; then
|
||||||
|
LISTE_APPLIS+=("sqlite3")
|
||||||
|
else
|
||||||
|
echo -e "${ROUGE}sqlite3 est manquant. Installation en cours...${NORMAL}"
|
||||||
|
if $sudook; then
|
||||||
|
sudo apt install -y sqlite3
|
||||||
|
LISTE_APPLIS+=("sqlite3")
|
||||||
|
echo -e "${VERT}sqlite3 installé${NORMAL}"
|
||||||
|
else
|
||||||
|
curl -L -o sqlite-tools.zip "https://www.sqlite.org/2024/sqlite-tools-linux-x64-3470000.zip"
|
||||||
|
unzip sqlite-tools.zip -d "$BIN_DIR"
|
||||||
|
chmod 777 "$BIN_DIR/sqlite3"
|
||||||
|
rm -rf sqlite-tools.zip "$BIN_DIR/sqlite-tools-linux-x64-3480000" "$BIN_DIR/sqldiff" "$BIN_DIR/sqlite3_analyzer" "$BIN_DIR/sqlite3_rsync"
|
||||||
|
LISTE_APPLIS+=("$BIN_DIR/sqlite3")
|
||||||
|
echo -e "${VERT}sqlite3 installé dans $BIN_DIR${NORMAL}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Choix invalide."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# Vérifier et installer jq si manquant
|
# Vérifier et installer jq si manquant
|
||||||
if command -v jq > /dev/null 2>&1; then
|
if command -v jq > /dev/null 2>&1; then
|
||||||
@ -314,7 +353,7 @@ export NVM_DIR="$HOME/.nvm"
|
|||||||
# Vérification des modules npm nécessaires
|
# Vérification des modules npm nécessaires
|
||||||
log "Vérification des modules npm requis..."
|
log "Vérification des modules npm requis..."
|
||||||
|
|
||||||
modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "autoprefixer" "jquery")
|
modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "autoprefixer" "jquery" "mysql2")
|
||||||
missing_modules=()
|
missing_modules=()
|
||||||
|
|
||||||
for module in "${modules[@]}"; do
|
for module in "${modules[@]}"; do
|
||||||
@ -339,6 +378,12 @@ if [ ! -f "$AUTOPOST_DIR/server.js" ]; then
|
|||||||
updated="1"
|
updated="1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$AUTOPOST_DIR/db.js" ]; then
|
||||||
|
log "Téléchargement de db.js..."
|
||||||
|
wget -q -O "$AUTOPOST_DIR/db.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/db.js"
|
||||||
|
updated="1"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -f "$AUTOPOST_DIR/config.js" ]; then
|
if [ ! -f "$AUTOPOST_DIR/config.js" ]; then
|
||||||
log "Téléchargement de config.js..."
|
log "Téléchargement de config.js..."
|
||||||
wget -q -O "$AUTOPOST_DIR/config.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/config.js"
|
wget -q -O "$AUTOPOST_DIR/config.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/config.js"
|
||||||
|
|||||||
10
update.sh
10
update.sh
@ -209,7 +209,7 @@ export NVM_DIR="$HOME/.nvm"
|
|||||||
# Vérification des modules npm nécessaires
|
# Vérification des modules npm nécessaires
|
||||||
log "Vérification des modules npm requis..."
|
log "Vérification des modules npm requis..."
|
||||||
|
|
||||||
modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "jquery")
|
modules=("express" "express-session" "sqlite3" "ansi-to-html" "@tailwindcss/browser" "jquery" "mysql2")
|
||||||
missing_modules=()
|
missing_modules=()
|
||||||
|
|
||||||
for module in "${modules[@]}"; do
|
for module in "${modules[@]}"; do
|
||||||
@ -235,12 +235,20 @@ if [ ! -f "$AUTOPOST_DIR/server.js" ]; then
|
|||||||
updated="1"
|
updated="1"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$AUTOPOST_DIR/db.js" ]; then
|
||||||
|
log "Téléchargement de db.js..."
|
||||||
|
wget -q -O "$AUTOPOST_DIR/db.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/db.js"
|
||||||
|
updated="1"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -f "$AUTOPOST_DIR/config.js" ]; then
|
if [ ! -f "$AUTOPOST_DIR/config.js" ]; then
|
||||||
log "Téléchargement de config.js..."
|
log "Téléchargement de config.js..."
|
||||||
wget -q -O "$AUTOPOST_DIR/config.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/config.js"
|
wget -q -O "$AUTOPOST_DIR/config.js" "https://tig.unfr.pw/UNFR/postauto/raw/branch/main/autopost/config.js"
|
||||||
echo -e "${BLEU}Installation terminée. Vous pouvez maintenant configurer $AUTOPOST_DIR/config.js.${NORMAL}"
|
echo -e "${BLEU}Installation terminée. Vous pouvez maintenant configurer $AUTOPOST_DIR/config.js.${NORMAL}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Vérifier et installer 7z si manquant
|
# Vérifier et installer 7z si manquant
|
||||||
if command -v 7z > /dev/null 2>&1; then
|
if command -v 7z > /dev/null 2>&1; then
|
||||||
LISTE_APPLIS+=("7z")
|
LISTE_APPLIS+=("7z")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user