Ajout des fonctionnalitée pour nextcloud

This commit is contained in:
Grizouille
2025-11-07 13:58:19 +01:00
parent 5765440fdb
commit 899a8ce7b3
6 changed files with 124 additions and 9 deletions

View File

@@ -16,7 +16,7 @@ def load_config(config_abs):
config = ConfigParser()
config.read(config_abs)
assert list(config.keys()) == ['DEFAULT', 'mpd', 'download_dirs', 'debug', 'http', 'proxy', 'threadpool', 'deezer', 'youtubedl'], f"Validating config file failed. Check {config_abs}"
assert list(config.keys()) == ['DEFAULT', 'mpd', 'download_dirs', 'debug', 'http', 'proxy', 'threadpool', 'deezer', 'youtubedl', 'nextcloud', 'nextcloud_ssh_scan_files'], f"Validating config file failed. Check {config_abs}"
if config['mpd'].getboolean('use_mpd'):
if not config['mpd']['music_dir_root'].startswith(config['download_dirs']['base']):

View File

@@ -15,6 +15,7 @@ from mutagen.flac import FLAC, Picture
from mutagen.mp3 import MP3
from mutagen.id3 import PictureType, TIT2, TALB, TPE1, TRCK, TDRC, TPOS, APIC, TPE2
from mutagen import MutagenError
from deezer_downloader.update_nextcloud_files import call_scan
# BEGIN TYPES
@@ -244,6 +245,8 @@ def download_song(song: dict, output_file: str) -> None:
print(f"Warning: Could not write metadata to file: {e}")
except Exception as e:
raise DeezerApiException(f"Could not write song to disk: {e}") from e
call_scan(output_file)
print("Download finished: {}".format(output_file))

View File

@@ -0,0 +1,69 @@
import jwt # PyJWT
from jwt import InvalidTokenError
from jwt import ExpiredSignatureError
import os
from flask import jsonify, abort, session
from deezer_downloader.configuration import config
#def setJwtInCookieToResponse(request, response):
# jwt_token = request.args.get("jwt")
# if not jwt_token:
# return response
#
# response.set_cookie(
# "access_token",
# jwt_token,
# max_age=60*60*24,
# httponly=True,
# secure=True # True si HTTPS
# )
# return response
def addJwtInUserSession(request):
if 'user_uid' in session:
return
jwt_token = request.args.get(config["nextcloud"]["jwt_name_parameter"])
if not jwt_token:
return abort(403)
try:
decoded = jwt.decode(jwt_token, config["nextcloud"]["public_key"], algorithms=["ES256"])
iss = decoded.get("iss")
iat = decoded.get("iat")
exp = decoded.get("exp")
userdata = decoded.get("userdata", {})
email = userdata.get("email")
uid = userdata.get("uid")
display_name = userdata.get("displayName")
print("✅ JWT décodé :")
print("Iss:", iss)
print("Issued At:", iat)
print("Expires:", exp)
print("Email:", email)
print("UID:", uid)
print("Display Name:", display_name)
#base_dir_user = base_dir.format(user=uid)
#config["download_dirs"]["base"] = base_dir_user
session['user_uid'] = uid
session['user_email'] = email
session['user_displayName'] = display_name
session['user_base_dir'] = config["download_dirs"]["base"] + "\\" + uid
#createDownloadDirectoriesIfNotExist()
print(f"✅ Download base dir set to: {session['user_base_dir']}")
except ExpiredSignatureError:
return jsonify({"error": "Token expired"}), 401
except InvalidTokenError as e:
print("❌ Erreur de validation du token :", e)
def createDownloadDirectoriesIfNotExist():
os.makedirs(config["download_dirs"]["base"], exist_ok=True)
os.makedirs(config["download_dirs"]["songs"], exist_ok=True)
os.makedirs(config["download_dirs"]["albums"], exist_ok=True)
os.makedirs(config["download_dirs"]["zips"], exist_ok=True)
os.makedirs(config["download_dirs"]["playlists"], exist_ok=True)
os.makedirs(config["download_dirs"]["youtubedl"], exist_ok=True)

View File

@@ -0,0 +1,35 @@
import paramiko
import os
from deezer_downloader.configuration import config
def call_scan(directory_path):
if not config['nextcloud_ssh_scan_files']['host']:
return
host = config['nextcloud_ssh_scan_files']['host']
port = config['nextcloud_ssh_scan_files']['port']
username = config['nextcloud_ssh_scan_files']['username']
password = config['nextcloud_ssh_scan_files']['password']
directory_path = os.path.dirname(directory_path)
directory_path = directory_path.replace(config['download_dirs']['base'] + "\\", "")
print("Path Nexcloud Scan " + directory_path)
# Commande à exécuter
cmd = 'sudo /home/nextclouddeezer/scan_deezerDl_folder.sh "{dir}"'.format(dir=directory_path)
# Création de la connexion SSH
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # accepter clés inconnues
ssh.connect(hostname=host, port=port, username=username, password=password)
# Exécuter la commande
stdin, stdout, stderr = ssh.exec_command(cmd)
# Afficher les résultats
print("STDOUT:")
print(stdout.read().decode())
print("STDERR:")
print(stderr.read().decode())
# Fermer la connexion
ssh.close()

View File

@@ -4,17 +4,19 @@ from subprocess import Popen, PIPE
from functools import wraps
import requests
import atexit
from flask import Flask, render_template, request, jsonify
from flask import Flask, render_template, request, jsonify, session, make_response
from markupsafe import escape
from flask_autoindex import AutoIndex
import warnings
import giphypop
from deezer_downloader.configuration import config
from deezer_downloader.web.music_backend import sched
from deezer_downloader.web.music_backend import sched, check_and_set_download_dirs_exist
from deezer_downloader.deezer import deezer_search, init_deezer_session
from deezer_downloader.nextcloud import addJwtInUserSession
app = Flask(__name__)
app.secret_key = "vilvhmqerjgùqrgojpùqjgvnùzevoijrpùvqpzejgijzepgùg"
auto_index = AutoIndex(app, config["download_dirs"]["base"], add_url_rules=False)
auto_index.add_icon_rule('music.png', ext='m3u8')
@@ -82,6 +84,9 @@ def validate_schema(*parameters_to_check):
return wrapper
return decorator
@app.before_request
def beforeRequest():
addJwtInUserSession(request)
@app.route("/")
def index():
@@ -117,7 +122,7 @@ def autoindex(path="."):
media_url = "https://cataas.com/cat"
template_context = {'gif_url': media_url}
return auto_index.render_autoindex(path, template_context=template_context)
return auto_index.render_autoindex(path=session['user_base_dir'], template_context=template_context)
@app.route('/queue', methods=['GET'])
@@ -168,6 +173,7 @@ def deezer_download_song_or_album():
add_to_playlist: True|False (add to mpd playlist)
create_zip: True|False (create a zip for the album)
"""
check_and_set_download_dirs_exist()
user_input = request.get_json(force=True)
desc = "Downloading {}".format(user_input['type'])
if user_input['type'] == "track":

View File

@@ -4,6 +4,7 @@ from os.path import basename
import mpd
import platform
from zipfile import ZipFile, ZIP_DEFLATED
from flask import session
from deezer_downloader.configuration import config
from deezer_downloader.youtubedl import youtubedl_download
@@ -16,15 +17,16 @@ from deezer_downloader.threadpool_queue import ThreadpoolScheduler, report_progr
sched = ThreadpoolScheduler()
def check_download_dirs_exist():
def check_and_set_download_dirs_exist():
config["download_dirs"]["songs"] = os.path.join(session['user_base_dir'], "DeezerDownload", "songs")
config["download_dirs"]["zips"] = os.path.join(session['user_base_dir'], "DeezerDownload","zips")
config["download_dirs"]["albums"] = os.path.join(session['user_base_dir'], "DeezerDownload","albums")
config["download_dirs"]["playlists"] = os.path.join(session['user_base_dir'], "DeezerDownload","playlists")
config["download_dirs"]["youtubedl"] = os.path.join(session['user_base_dir'], "DeezerDownload","youtubedl")
for directory in [config["download_dirs"]["songs"], config["download_dirs"]["zips"], config["download_dirs"]["albums"],
config["download_dirs"]["playlists"], config["download_dirs"]["youtubedl"]]:
os.makedirs(directory, exist_ok=True)
check_download_dirs_exist()
def make_song_paths_relative_to_mpd_root(songs, prefix=""):
# ensure last slash
config["mpd"]["music_dir_root"] = os.path.join(config["mpd"]["music_dir_root"], '')