annotate libervia/backend/tools/video.py @ 4306:94e0968987cd

plugin XEP-0033: code modernisation, improve delivery, data validation: - Code has been rewritten using Pydantic models and `async` coroutines for data validation and cleaner element parsing/generation. - Delivery has been completely rewritten. It now works even if server doesn't support multicast, and send to local multicast service first. Delivering to local multicast service first is due to bad support of XEP-0033 in server (notably Prosody which has an incomplete implementation), and the current impossibility to detect if a sub-domain service handles fully multicast or only for local domains. This is a workaround to have a good balance between backward compatilibity and use of bandwith, and to make it work with the incoming email gateway implementation (the gateway will only deliver to entities of its own domain). - disco feature checking now uses `async` corountines. `host` implementation still use Deferred return values for compatibility with legacy code. rel 450
author Goffi <goffi@goffi.org>
date Thu, 26 Sep 2024 16:12:01 +0200
parents 0d7bb4df2343
children
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
3480
7550ae9cfbac Renamed the project from "Salut à Toi" to "Libervia":
Goffi <goffi@goffi.org>
parents: 3479
diff changeset
3 # Libervia: an XMPP client
3479
be6d91572633 date update
Goffi <goffi@goffi.org>
parents: 3347
diff changeset
4 # Copyright (C) 2009-2021 Jérôme Poisson (goffi@goffi.org)
3347
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
4071
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 3480
diff changeset
23 from libervia.backend.core.i18n import _
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 3480
diff changeset
24 from libervia.backend.core import exceptions
4b842c1fb686 refactoring: renamed `sat` package to `libervia.backend`
Goffi <goffi@goffi.org>
parents: 3480
diff changeset
25 from libervia.backend.core.log import getLogger
3347
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 try:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
33 ffmpeg_path = which("ffmpeg")[0]
3347
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
34 except IndexError:
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
35 log.warning(_("ffmpeg executable not found, video thumbnails won't be available"))
3347
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
36 ffmpeg_path = None
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
37
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
38
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
39 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
40 """Extract thumbnail from video
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 @param video_path: source of the video
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
43 @param dest_path: path where the file must be saved
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
44 @return: path of the generated thumbnail
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
45 image is created in temporary directory but is not delete automatically
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
46 it should be deleted after use.
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
47 Image will be in JPEG format.
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
48 @raise exceptions.NotFound: ffmpeg is missing
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
49 """
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
50 if ffmpeg_path is None:
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
51 raise exceptions.NotFound(
4270
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
52 _("ffmpeg executable is not available, can't generate video thumbnail")
0d7bb4df2343 Reformatted code base using black.
Goffi <goffi@goffi.org>
parents: 4071
diff changeset
53 )
3347
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
54
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
55 await async_process.run(
c8033a9357e7 tools: new `video` module:
Goffi <goffi@goffi.org>
parents:
diff changeset
56 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
57 )