1 # -*- coding: utf-8 -*-
2 # This extension adjusts the volume of audio files to a standard level
3 # Supported file formats are mp3 and ogg
5 # Requires: normalize-audio, mpg123
7 # (c) 2011-11-06 Bernd Schlapsi <brot@gmx.info>
8 # Released under the same license terms as gPodder itself.
14 from gpodder
import util
17 logger
= logging
.getLogger(__name__
)
21 __title__
= _('Normalize audio with re-encoding')
22 __description__
= _('Normalize the volume of audio files with normalize-audio')
23 __author__
= 'Bernd Schlapsi <brot@gmx.info>'
27 'context_menu': True, # Show action in the episode list context menu
30 # a tuple of (extension, command)
32 'ogg': 'normalize-ogg',
33 'mp3': 'normalize-mp3',
36 class gPodderExtension
:
37 def __init__(self
, container
):
38 self
.container
= container
41 self
.container
.require_command('normalize-ogg')
42 self
.container
.require_command('normalize-mp3')
43 self
.container
.require_command('normalize-audio')
46 logger
.info('Extension "%s" is being loaded.' % __title__
)
49 logger
.info('Extension "%s" is being unloaded.' % __title__
)
51 def on_episode_downloaded(self
, episode
):
52 self
._convert
_episode
(episode
)
54 def on_episodes_context_menu(self
, episodes
):
55 if not self
.container
.config
.context_menu
:
58 mimetypes
= [e
.mime_type
for e
in episodes
59 if e
.mime_type
is not None and e
.file_exists()]
60 if 'audio/ogg' not in mimetypes
and 'audio/mpeg' not in mimetypes
:
63 return [(self
.container
.metadata
.title
, self
._convert
_episodes
)]
65 def _convert_episode(self
, episode
):
66 if episode
.file_type() != 'audio':
69 filename
= episode
.local_filename(create
=False)
73 basename
, extension
= os
.path
.splitext(filename
)
75 cmd
= [CONVERT_COMMANDS
.get(extension
, 'normalize-audio'), filename
]
77 p
= subprocess
.Popen(cmd
, stdout
=subprocess
.PIPE
,
78 stderr
=subprocess
.PIPE
)
79 stdout
, stderr
= p
.communicate()
82 logger
.info('normalize-audio processing successful.')
83 gpodder
.user_extensions
.on_notification_show(_('File normalized'),
86 logger
.warn('normalize-audio failed: %s / %s', stdout
, stderr
)
88 def _convert_episodes(self
, episodes
):
89 for episode
in episodes
:
90 self
._convert
_episode
(episode
)