sHORTgpt / shortGPT /audio /audio_duration.py
wiydarrr's picture
Upload folder using huggingface_hub
5f685fd verified
raw
history blame
2.6 kB
import json
import subprocess
import yt_dlp
from shortGPT.editing_utils.handle_videos import getYoutubeVideoLink
def get_duration_yt_dlp(url):
ydl_opts = {
"quiet": True,
"no_warnings": True,
"no_color": True,
"no_call_home": True,
"no_check_certificate": True
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
dictMeta = ydl.extract_info(url, download=False, )
return dictMeta['duration'], ""
except Exception as e:
return None, f"Failed getting duration from the following video/audio url/path using yt_dlp. {e.args[0]}"
def get_duration_ffprobe(signed_url):
try:
cmd = [
"ffprobe",
"-v",
"quiet",
"-print_format",
"json",
"-show_format",
"-i",
signed_url
]
output = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)
if output.returncode != 0:
return None, f"Error executing command using ffprobe. {output.stderr.strip()}"
metadata = json.loads(output.stdout)
duration = float(metadata["format"]["duration"])
return duration, ""
except Exception as e:
print("Failed getting the duration of the asked ressource", e.args[0])
return None, ""
def get_asset_duration(url, isVideo=True):
if ("youtube.com" in url):
if not isVideo:
url, _ = getYoutubeAudioLink(url)
else:
url, _ = getYoutubeVideoLink(url)
# Trying two different method to get the duration of the video / audio
duration, err_ffprobe = get_duration_ffprobe(url)
if duration is not None:
return url, duration
duration, err_yt_dlp = get_duration_yt_dlp(url)
if duration is not None:
return url, duration
print(err_yt_dlp)
print(err_ffprobe)
print(f"The url/path {url} does not point to a video/ audio. Impossible to extract its duration")
return url, None
def getYoutubeAudioLink(url):
ydl_opts = {
"quiet": True,
"no_warnings": True,
"no_color": True,
"no_call_home": True,
"no_check_certificate": True,
"format": "bestaudio/best"
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
dictMeta = ydl.extract_info(
url,
download=False)
return dictMeta['url'], dictMeta['duration']
except Exception as e:
print("Failed getting audio link from the following video/url", e.args[0])
return None