Skip to content

Commit 3fe678e

Browse files
committed
V. 2.2.0
- Update "Readme.md" - Add New Script "audio_extract" - Add New Script "image_downloader" - Update "requirements.txt"
1 parent c6bba08 commit 3fe678e

4 files changed

Lines changed: 340 additions & 1 deletion

File tree

README.md

Lines changed: 166 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,7 +824,7 @@ Utile per:
824824
1. Esegui lo script dal terminale o da un IDE Python:
825825

826826
```bash
827-
python eml_converter.py.py
827+
python eml_converter.py
828828
```
829829

830830
2. Inserisci il **percorso della cartella** contenente i file **.eml** quando richiesto.
@@ -849,3 +849,168 @@ Tutti i file .eml sono stati convertiti in PDF nella cartella 'converted_pdfs'.
849849
- **Output pulito**: Ogni PDF include i dettagli dell'email in un formato leggibile.
850850

851851
---
852+
853+
## _Estrattore Tracce Audio da MKV 🎥🎵_ - **audio_extract.py** 🗂️
854+
855+
Uno script Python per **identificare** e **estrarre tracce audio** da file `.mkv`, singolarmente o in modo ricorsivo da una cartella. Utilizza `ffprobe` per analizzare le tracce e `ffmpeg` per estrarle nel formato `.flac`.
856+
857+
---
858+
859+
## Descrizione 📄
860+
861+
Questo **Estrattore Audio da MKV** consente di selezionare e salvare una traccia audio specifica da un file `.mkv`, mantenendo la qualità del flusso originale grazie alla conversione in `.flac`.
862+
863+
Utile per:
864+
865+
- **Recuperare tracce audio multilingua** da film e serie.
866+
- **Creare archivi audio** da video in alta qualità.
867+
- **Automatizzare l'estrazione** da intere directory video.
868+
869+
---
870+
871+
## Funzionalità 🌟
872+
873+
- **Analisi automatica**: mostra tutte le tracce audio disponibili con la lingua (se presente).
874+
- **Conversione diretta**: estrae la traccia scelta e la salva come file `.flac`.
875+
- **Supporto directory**: può elaborare cartelle con più file `.mkv`, anche in modo ricorsivo.
876+
- **Interfaccia interattiva**: guida passo dopo passo tramite input da terminale.
877+
878+
---
879+
880+
## Requisiti 📦
881+
882+
- **ffmpeg** (incluso anche `ffprobe`)
883+
884+
> Assicurati che `ffmpeg` e `ffprobe` siano installati e accessibili tramite il terminale (PATH di sistema).
885+
886+
---
887+
888+
## Installazione 🔧
889+
890+
1. Esegui lo script direttamente:
891+
892+
```bash
893+
python audio_extract.py
894+
```
895+
896+
---
897+
898+
## Utilizzo 🚀
899+
900+
### ▶️ Modalità Singolo File
901+
902+
1. Inserisci il percorso di un file `.mkv` quando richiesto.
903+
2. Visualizza le tracce disponibili.
904+
3. Seleziona quella da esportare.
905+
906+
### 📁 Modalità Directory
907+
908+
1. Inserisci il percorso di una cartella.
909+
2. Indica il numero della traccia da estrarre.
910+
3. Scegli se elaborare ricorsivamente le sottocartelle.
911+
912+
### Esempio Output
913+
914+
file audio verranno salvati con il seguente formato:
915+
916+
```
917+
nomefile_trackX.flac
918+
```
919+
920+
Nello **stesso percorso** del video originale, dove `X` è il numero della traccia selezionata.
921+
922+
---
923+
924+
## Esempio di Utilizzo 🧪
925+
926+
### Singolo File:
927+
928+
```plaintext
929+
Inserisci il percorso del file MKV o della directory: /video/film.mkv
930+
931+
Tracce audio trovate:
932+
0: Traccia 0 (ita)
933+
1: Traccia 1 (eng)
934+
935+
Inserisci il numero della traccia da esportare: 1
936+
Audio estratto: /video/film_track1.flac
937+
```
938+
939+
### Cartella:
940+
941+
```plaintext
942+
Inserisci il percorso del file MKV o della directory: /media/serie_tv
943+
Inserisci il numero della traccia da esportare: 0
944+
Vuoi elaborare tutti i file MKV nella directory in modo ricorsivo? (s/n): s
945+
```
946+
947+
---
948+
949+
## Note 📝
950+
951+
- Funziona solo con file `.mkv`.
952+
- L'output è sempre in formato `.flac`, ma lo script può essere adattato ad altri formati (`.mp3`, `.wav`, ecc).
953+
- Le lingue vengono mostrate se disponibili nei metadati.
954+
955+
---
956+
957+
## _Scaricatore di Immagini da Pagina Web 🌐🖼️_ - **image_downloader.py** 🗂️
958+
959+
Uno script Python per **scaricare tutte le immagini** presenti in una pagina web, inclusi i contenuti **Base64** convertiti in PNG o nel loro formato originale.
960+
961+
---
962+
963+
## Descrizione 📄
964+
965+
Questo **Image Downloader** analizza il contenuto HTML di una pagina web, individua tutti i tag `<img>` e scarica le immagini collegate nel formato originale. Gestisce sia immagini con URL assoluti e relativi, sia immagini codificate in Base64.
966+
967+
Utile per:
968+
969+
- **Salvare tutte le immagini** da una pagina web con un click.
970+
- **Effettuare scraping visivo** per archiviazione o analisi.
971+
- **Convertire immagini Base64** in file immagine leggibili.
972+
973+
---
974+
975+
## Funzionalità 🌟
976+
977+
- ✅ Rileva immagini standard e in lazy loading (`src`, `data-src`).
978+
- 🧠 Converte immagini Base64 in file reali, inclusi `.png`.
979+
- 📁 Crea automaticamente una cartella `export` per l’output.
980+
- 🔁 Gestisce URL relativi grazie a `urljoin`.
981+
- 🧽 Pulisce gli URL rimuovendo parametri inutili (`?`).
982+
983+
---
984+
985+
## Installazione 🔧
986+
987+
1. Esegui:
988+
989+
```bash
990+
python download_images.py
991+
```
992+
993+
---
994+
995+
## Utilizzo 🚀
996+
997+
1. Inserisci l'**URL della pagina web** da cui vuoi scaricare le immagini.
998+
2. Le immagini verranno salvate nella cartella `export`.
999+
1000+
### Esempio Output
1001+
1002+
```plaintext
1003+
Inserisci l'URL della pagina web: https://esempio.it
1004+
Scaricata: export/logo.png
1005+
Scaricata immagine Base64: export/base64_image_1.png
1006+
```
1007+
1008+
---
1009+
1010+
## Note 📝
1011+
1012+
- Le immagini SVG in Base64 vengono convertite in `.png`.
1013+
- Lo script non scarica risorse dinamiche caricate da JavaScript.
1014+
- Funziona solo con pagine accessibili pubblicamente.
1015+
1016+
---

audio_extract.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import os
2+
import subprocess
3+
4+
def get_audio_tracks(video_path):
5+
cmd = [
6+
"ffprobe", "-i", video_path, "-show_entries", "stream=index:stream_tags=language", "-select_streams", "a", "-of", "csv=p=0"
7+
]
8+
result = subprocess.run(cmd, capture_output=True, text=True)
9+
tracks = result.stdout.strip().split("\n")
10+
return [track.split(',') for track in tracks if track]
11+
12+
def extract_audio(video_path, track_number, output_format="flac"):
13+
output_path = os.path.splitext(video_path)[0] + f"_track{track_number}.{output_format}"
14+
cmd = [
15+
"ffmpeg", "-i", video_path, "-map", f"0:a:{track_number}", "-c:a", "flac", output_path
16+
]
17+
subprocess.run(cmd)
18+
print(f"Audio estratto: {output_path}")
19+
20+
def process_directory(directory, track_number):
21+
for root, _, files in os.walk(directory):
22+
for file in files:
23+
if file.endswith(".mkv"):
24+
video_path = os.path.join(root, file)
25+
print(f"Elaborazione di: {video_path}")
26+
extract_audio(video_path, track_number)
27+
28+
def main():
29+
video_path = input("Inserisci il percorso del file MKV o della directory: ").strip()
30+
if not os.path.exists(video_path):
31+
print("Il percorso specificato non esiste.")
32+
return
33+
34+
if os.path.isfile(video_path):
35+
tracks = get_audio_tracks(video_path)
36+
if not tracks:
37+
print("Nessuna traccia audio trovata.")
38+
return
39+
40+
print("Tracce audio trovate:")
41+
for i, track in enumerate(tracks):
42+
lang = track[1] if len(track) > 1 else "sconosciuto"
43+
print(f"{i}: Traccia {track[0]} ({lang})")
44+
45+
try:
46+
track_number = int(input("Inserisci il numero della traccia da esportare: "))
47+
extract_audio(video_path, track_number)
48+
except ValueError:
49+
print("Numero traccia non valido.")
50+
else:
51+
track_number = int(input("Inserisci il numero della traccia da esportare: "))
52+
recursive = input("Vuoi elaborare tutti i file MKV nella directory in modo ricorsivo? (s/n): ").strip().lower()
53+
if recursive == 's':
54+
process_directory(video_path, track_number)
55+
else:
56+
for file in os.listdir(video_path):
57+
if file.endswith(".mkv"):
58+
video_file = os.path.join(video_path, file)
59+
extract_audio(video_file, track_number)
60+
61+
if __name__ == "__main__":
62+
main()

image_downloader.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import os
2+
import requests
3+
import base64
4+
from bs4 import BeautifulSoup
5+
from urllib.parse import urljoin, urlparse, unquote
6+
from PIL import Image
7+
import io
8+
9+
def download_images(url):
10+
# Creare la cartella export se non esiste
11+
folder = "export"
12+
if not os.path.exists(folder):
13+
os.makedirs(folder)
14+
15+
# Scaricare il contenuto della pagina
16+
try:
17+
response = requests.get(url, headers={"User-Agent": "Mozilla/5.0"})
18+
response.raise_for_status()
19+
except requests.exceptions.RequestException as e:
20+
print(f"Errore nel caricamento della pagina: {e}")
21+
return
22+
23+
soup = BeautifulSoup(response.text, "html.parser")
24+
25+
# Ottenere tutti i tag img
26+
img_tags = soup.find_all("img")
27+
28+
for index, img in enumerate(img_tags):
29+
img_url = img.get("src") or img.get("data-src") # Considera anche lazy loading
30+
if not img_url:
31+
continue
32+
33+
if img_url.startswith("data:image"): # Gestire immagini Base64
34+
try:
35+
header, encoded = img_url.split(",", 1)
36+
img_data = base64.b64decode(encoded)
37+
ext = header.split("/")[1].split(";")[0] # Estrai l'estensione dell'immagine
38+
39+
if ext == "svg+xml":
40+
ext = "png" # Convertire SVG in PNG
41+
img_name = os.path.join(folder, f"base64_image_{index}.{ext}")
42+
43+
with open(img_name, "wb") as img_file:
44+
img_file.write(img_data)
45+
46+
print(f"Scaricata immagine Base64 convertita in PNG: {img_name}")
47+
else:
48+
img_name = os.path.join(folder, f"base64_image_{index}.{ext}")
49+
50+
with open(img_name, "wb") as img_file:
51+
img_file.write(img_data)
52+
53+
print(f"Scaricata immagine Base64: {img_name}")
54+
except Exception as e:
55+
print(f"Errore nella conversione Base64: {e}")
56+
continue
57+
58+
# Convertire URL relativi in assoluti
59+
img_url = urljoin(url, img_url)
60+
img_url = unquote(img_url.split('?')[0]) # Rimuovere parametri dall'URL
61+
62+
try:
63+
img_response = requests.get(img_url, headers={"User-Agent": "Mozilla/5.0"})
64+
img_response.raise_for_status()
65+
66+
img_name = os.path.join(folder, os.path.basename(urlparse(img_url).path))
67+
68+
# Salvare l'immagine
69+
with open(img_name, "wb") as img_file:
70+
img_file.write(img_response.content)
71+
72+
print(f"Scaricata: {img_name}")
73+
except requests.exceptions.RequestException as e:
74+
print(f"Errore nel download di {img_url}: {e}")
75+
76+
if __name__ == "__main__":
77+
url = input("Inserisci l'URL della pagina web: ")
78+
download_images(url)

0 commit comments

Comments
 (0)