Fix ffprobe with special characters (#4646)

* Clean path from scpecial characters before running ffprobe

* Fix camera paths
This commit is contained in:
Nicolas Mowen 2022-12-08 18:02:11 -07:00 committed by GitHub
parent bc52fc1e79
commit 4f79ca1bf0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 14 deletions

View File

@ -1091,7 +1091,19 @@ def ffprobe():
{"success": False, "message": f"Path needs to be provided."}, "404" {"success": False, "message": f"Path needs to be provided."}, "404"
) )
if "," in clean_camera_user_pass(path_param): if path_param.startswith("camera"):
camera = path_param[7:]
if camera not in current_app.frigate_config.cameras.keys():
return jsonify(
{"success": False, "message": f"{camera} is not a valid camera."}, "404"
)
paths = map(
lambda input: input.path,
current_app.frigate_config.cameras[camera].ffmpeg.inputs,
)
elif "," in clean_camera_user_pass(path_param):
paths = path_param.split(",") paths = path_param.split(",")
else: else:
paths = [path_param] paths = [path_param]
@ -1100,7 +1112,7 @@ def ffprobe():
output = [] output = []
for path in paths: for path in paths:
ffprobe = ffprobe_stream(path) ffprobe = ffprobe_stream(path.strip())
output.append( output.append(
{ {
"return_code": ffprobe.returncode, "return_code": ffprobe.returncode,

View File

@ -880,6 +880,7 @@ def get_nvidia_gpu_stats() -> dict[str, str]:
def ffprobe_stream(path: str) -> sp.CompletedProcess: def ffprobe_stream(path: str) -> sp.CompletedProcess:
"""Run ffprobe on stream.""" """Run ffprobe on stream."""
clean_path = escape_special_characters(path)
ffprobe_cmd = [ ffprobe_cmd = [
"ffprobe", "ffprobe",
"-print_format", "-print_format",
@ -888,7 +889,7 @@ def ffprobe_stream(path: str) -> sp.CompletedProcess:
"stream=codec_long_name,width,height,bit_rate,duration,display_aspect_ratio,avg_frame_rate", "stream=codec_long_name,width,height,bit_rate,duration,display_aspect_ratio,avg_frame_rate",
"-loglevel", "-loglevel",
"quiet", "quiet",
path, clean_path,
] ]
return sp.run(ffprobe_cmd, capture_output=True) return sp.run(ffprobe_cmd, capture_output=True)

View File

@ -40,18 +40,9 @@ export default function System() {
} }
setState({ ...state, showFfprobe: true }); setState({ ...state, showFfprobe: true });
let paths = '';
config.cameras[camera].ffmpeg.inputs.forEach((input) => {
if (paths) {
paths += ',';
paths += input.path;
} else {
paths = input.path;
}
});
const response = await axios.get('ffprobe', { const response = await axios.get('ffprobe', {
params: { params: {
paths, paths: `camera:${camera}`,
}, },
}); });
@ -117,7 +108,11 @@ export default function System() {
<Dialog> <Dialog>
<div className="p-4"> <div className="p-4">
<Heading size="lg">Vainfo Output</Heading> <Heading size="lg">Vainfo Output</Heading>
{state.vainfo != '' ? <p className="mb-2 max-h-96 overflow-scroll">{state.vainfo}</p> : <ActivityIndicator />} {state.vainfo != '' ? (
<p className="mb-2 max-h-96 overflow-scroll">{state.vainfo}</p>
) : (
<ActivityIndicator />
)}
</div> </div>
<div className="p-2 flex justify-start flex-row-reverse space-x-2"> <div className="p-2 flex justify-start flex-row-reverse space-x-2">
<Button className="ml-2" onClick={() => onCopyVainfo()} type="text"> <Button className="ml-2" onClick={() => onCopyVainfo()} type="text">