comparison sat/tools/video.py @ 3347:c8033a9357e7

tools: new `video` module: this module is really basic at the moment, and use `ffmpeg` if present to make thumbnails.
author Goffi <goffi@goffi.org>
date Tue, 25 Aug 2020 08:54:13 +0200
parents
children be6d91572633
comparison
equal deleted inserted replaced
3346:4f1fcee83d36 3347:c8033a9357e7
1 #!/usr/bin/env python3
2
3 # SàT: an XMPP client
4 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
5
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18
19 """Methods to manipulate videos"""
20 from typing import Union
21 from pathlib import Path
22 from twisted.python.procutils import which
23 from sat.core.i18n import _
24 from sat.core import exceptions
25 from sat.core.log import getLogger
26 from .common import async_process
27
28
29 log = getLogger(__name__)
30
31
32
33
34
35 try:
36 ffmpeg_path = which('ffmpeg')[0]
37 except IndexError:
38 log.warning(_(
39 "ffmpeg executable not found, video thumbnails won't be available"))
40 ffmpeg_path = None
41
42
43 async def get_thumbnail(video_path: Union[Path, str], dest_path: Path) -> Path:
44 """Extract thumbnail from video
45
46 @param video_path: source of the video
47 @param dest_path: path where the file must be saved
48 @return: path of the generated thumbnail
49 image is created in temporary directory but is not delete automatically
50 it should be deleted after use.
51 Image will be in JPEG format.
52 @raise exceptions.NotFound: ffmpeg is missing
53 """
54 if ffmpeg_path is None:
55 raise exceptions.NotFound(
56 _("ffmpeg executable is not available, can't generate video thumbnail"))
57
58 await async_process.run(
59 ffmpeg_path, "-i", str(video_path), "-ss", "10", "-frames:v", "1", str(dest_path)
60 )