Extensions: Various fixes and clean-ups from review
[gpodder.git] / share / gpodder / extensions / mp3gain.py
blob782c6e274497280d2898f5d0aacdf94071af1285
1 # -*- coding: utf-8 -*-
2 # This extension adjusts mp3s so that they all have the same volume
4 # Requires: mp3gain
6 # (c) 2011-11-06 Bernd Schlapsi <brot@gmx.info>
7 # Released under the same license terms as gPodder itself.
9 import os
10 import subprocess
12 import gpodder
13 from gpodder import util
15 import logging
16 logger = logging.getLogger(__name__)
18 _ = gpodder.gettext
20 __title__ = _('mp3gain Volume Normalizer')
21 __description__ = _('Normalize the volume of MP3 files without re-encoding')
22 __author__ = 'Bernd Schlapsi <brot@gmx.info>'
25 DefaultConfig = {
26 'context_menu': True,
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:
44 return None
46 if not all(e.was_downloaded(and_exists=True) for e in episodes):
47 return None
49 if not any(e.mime_type == self.MIME_TYPE for e in episodes):
50 return None
52 return [(_('Normalize volume (mp3gain)'), self._convert_episodes)]
54 def _convert_episode(self, episode):
55 if episode.mime_type != self.MIME_TYPE:
56 return
58 filename = episode.local_filename(create=False)
59 if filename is None:
60 return
62 cmd = [self.mp3gain, '-c', filename]
64 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
65 stderr=subprocess.PIPE)
66 stdout, stderr = p.communicate()
68 if p.returncode == 0:
69 logger.info('mp3gain processing successful.')
70 else:
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)