1 # -*- coding: utf-8 -*-
2 # This extension adjusts mp3s so that they all have the same volume
6 # (c) 2011-11-06 Bernd Schlapsi <brot@gmx.info>
7 # Released under the same license terms as gPodder itself.
13 from gpodder
import util
16 logger
= logging
.getLogger(__name__
)
20 __title__
= _('mp3gain Volume Normalizer')
21 __description__
= _('Normalize the volume of MP3 files without re-encoding')
22 __author__
= 'Bernd Schlapsi <brot@gmx.info>'
30 class gPodderExtension
:
31 MIME_TYPE
= 'audio/mpeg'
33 def __init__(self
, container
):
34 self
.container
= container
35 self
.config
= self
.container
.config
37 self
.mp3gain
= self
.container
.require_command('mp3gain')
39 def on_episode_downloaded(self
, episode
):
40 self
._convert
_episode
(episode
)
42 def on_episodes_context_menu(self
, episodes
):
43 if not self
.config
.context_menu
:
46 if not all(e
.was_downloaded(and_exists
=True) for e
in episodes
):
49 if not any(e
.mime_type
== self
.MIME_TYPE
for e
in episodes
):
52 return [(_('Normalize volume (mp3gain)'), self
._convert
_episodes
)]
54 def _convert_episode(self
, episode
):
55 if episode
.mime_type
!= self
.MIME_TYPE
:
58 filename
= episode
.local_filename(create
=False)
62 cmd
= [self
.mp3gain
, '-c', filename
]
64 p
= subprocess
.Popen(cmd
, stdout
=subprocess
.PIPE
,
65 stderr
=subprocess
.PIPE
)
66 stdout
, stderr
= p
.communicate()
69 logger
.info('mp3gain processing successful.')
71 logger
.warn('mp3gain failed: %s / %s', stdout
, stderr
)
73 def _convert_episodes(self
, episodes
):
74 for episode
in episodes
:
75 self
._convert
_episode
(episode
)