annotate sat/tools/video.py @ 3405:ecdb3728749e

plugin XEP-0353: Jingle Message Initiation implementation: This plugin uses the new `XEP-0166_initiate` trigger to initiate a Jingle session with messages if the peer jid has no resource specified. On reception, if the sender is not in our roster, a confirmation is requested to user to avoid leaking presence and IP. If user refuses the session for somebody not in roster, nothing is sent at all (the request is just ignored).
author Goffi <goffi@goffi.org>
date Thu, 12 Nov 2020 14:53:15 +0100
parents c8033a9357e7
children be6d91572633
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3347
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
1 #!/usr/bin/env python3
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
2
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
3 # SàT: an XMPP client
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
4 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
5
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
6 # This program is free software: you can redistribute it and/or modify
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
7 # it under the terms of the GNU Affero General Public License as published by
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
8 # the Free Software Foundation, either version 3 of the License, or
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
9 # (at your option) any later version.
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
10
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
11 # This program is distributed in the hope that it will be useful,
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
14 # GNU Affero General Public License for more details.
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
15
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
16 # You should have received a copy of the GNU Affero General Public License
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
18
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
19 """Methods to manipulate videos"""
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
20 from typing import Union
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
21 from pathlib import Path
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
22 from twisted.python.procutils import which
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
23 from sat.core.i18n import _
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
24 from sat.core import exceptions
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
25 from sat.core.log import getLogger
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
26 from .common import async_process
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
27
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
28
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
29 log = getLogger(__name__)
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
30
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
31
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
32
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
33
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
34
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
35 try:
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 ffmpeg_path = which('ffmpeg')[0]
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
37 except IndexError:
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
38 log.warning(_(
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 "ffmpeg executable not found, video thumbnails won't be available"))
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
40 ffmpeg_path = None
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
41
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
42
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 async def get_thumbnail(video_path: Union[Path, str], dest_path: Path) -> Path:
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 """Extract thumbnail from video
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
45
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 @param video_path: source of the video
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 @param dest_path: path where the file must be saved
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 @return: path of the generated thumbnail
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 image is created in temporary directory but is not delete automatically
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 it should be deleted after use.
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 Image will be in JPEG format.
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
52 @raise exceptions.NotFound: ffmpeg is missing
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
53 """
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
54 if ffmpeg_path is None:
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 raise exceptions.NotFound(
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 _("ffmpeg executable is not available, can't generate video thumbnail"))
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
57
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
58 await async_process.run(
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
59 ffmpeg_path, "-i", str(video_path), "-ss", "10", "-frames:v", "1", str(dest_path)
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
60 )