annotate sat/tools/video.py @ 3582:71516731d0aa

core (memory/sqla): database migration using Alembic: Alembic database migration tool, which is the recommended one for SQLAlchemy has been integrated. When a database is created, it will be used to stamp to current (head) revision, otherwise, DB will be checked to see if it needs to be updated, and upgrade will be triggered if necessary.
author Goffi <goffi@goffi.org>
date Fri, 25 Jun 2021 17:55:23 +0200
parents 7550ae9cfbac
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
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 )