Beispiel #1
0
 def test_replace_extension(self):
     self.assertEqual(replace_extension('abc.ext', 'temp'), 'abc.temp')
     self.assertEqual(replace_extension('abc.ext', 'temp', 'ext'), 'abc.temp')
     self.assertEqual(replace_extension('abc.unexpected_ext', 'temp', 'ext'), 'abc.unexpected_ext.temp')
     self.assertEqual(replace_extension('abc', 'temp'), 'abc.temp')
     self.assertEqual(replace_extension('.abc', 'temp'), '.abc.temp')
     self.assertEqual(replace_extension('.abc.ext', 'temp'), '.abc.temp')
Beispiel #2
0
 def test_replace_extension(self):
     self.assertEqual(replace_extension('abc.ext', 'temp'), 'abc.temp')
     self.assertEqual(replace_extension('abc.ext', 'temp', 'ext'), 'abc.temp')
     self.assertEqual(replace_extension('abc.unexpected_ext', 'temp', 'ext'), 'abc.unexpected_ext.temp')
     self.assertEqual(replace_extension('abc', 'temp'), 'abc.temp')
     self.assertEqual(replace_extension('.abc', 'temp'), '.abc.temp')
     self.assertEqual(replace_extension('.abc.ext', 'temp'), '.abc.temp')
Beispiel #3
0
 def test_replace_extension(self):
     self.assertEqual(replace_extension("abc.ext", "temp"), "abc.temp")
     self.assertEqual(replace_extension("abc.ext", "temp", "ext"), "abc.temp")
     self.assertEqual(replace_extension("abc.unexpected_ext", "temp", "ext"), "abc.unexpected_ext.temp")
     self.assertEqual(replace_extension("abc", "temp"), "abc.temp")
     self.assertEqual(replace_extension(".abc", "temp"), ".abc.temp")
     self.assertEqual(replace_extension(".abc.ext", "temp"), ".abc.temp")
Beispiel #4
0
    def run(self, info, custom_map=None):
        self.logger = create_logger(__name__)
        metadata = {}

        def add(meta_list, info_list=None):
            if not info_list:
                info_list = meta_list
            if not isinstance(meta_list, (list, tuple)):
                meta_list = (meta_list, )
            if not isinstance(info_list, (list, tuple)):
                info_list = (info_list, )
            for info_f in info_list:
                if info.get(info_f) is not None:
                    for meta_f in meta_list:
                        metadata[meta_f] = info[info_f]
                    break

        # if custom_map is None:
        #     add('title', ('track', 'title'))
        #     add('date', 'upload_date')
        #     add(('description', 'comment'), 'description')
        #     add('purl', 'webpage_url')
        #     add('track', 'track_number')
        #     add('artist', ('artist', 'creator', 'uploader', 'uploader_id'))
        #     add('genre')
        #     add('album')
        #     add('album_artist')
        #     add('disc', 'disc_number')
        # else:
        for entry in info:
            if entry not in info['not_a_tag']:
                add(entry)

        if not metadata:
            self.logger.warning('[ffmpeg] There isn\'t any metadata to add')
            return [], info

        filename = info['filepath']
        temp_filename = prepend_extension(filename, 'temp')
        in_filenames = [filename]
        options = []

        if info['ext'] == 'm4a':
            options.extend(['-vn', '-acodec', 'copy'])
        else:
            options.extend(['-c', 'copy'])

        for (name, value) in metadata.items():
            options.extend(['-metadata', '%s=%s' % (name, value)])

        chapters = info.get('chapters', [])
        if chapters:
            metadata_filename = replace_extension(filename, 'meta')
            with io.open(metadata_filename, 'wt', encoding='utf-8') as f:

                def ffmpeg_escape(text):
                    return re.sub(r'(=|;|#|\\|\n)', r'\\\1', text)

                metadata_file_content = ';FFMETADATA1\n'
                for chapter in chapters:
                    metadata_file_content += '[CHAPTER]\nTIMEBASE=1/1000\n'
                    metadata_file_content += 'START=%d\n' % (
                        chapter['start_time'] * 1000)
                    metadata_file_content += 'END=%d\n' % (
                        chapter['end_time'] * 1000)
                    chapter_title = chapter.get('title')
                    if chapter_title:
                        metadata_file_content += 'title=%s\n' % ffmpeg_escape(
                            chapter_title)
                f.write(metadata_file_content)
                in_filenames.append(metadata_filename)
                options.extend(['-map_metadata', '1'])

        self.logger.info('[ffmpeg] Adding metadata to \'%s\'' % filename)
        self.run_ffmpeg_multiple_files(in_filenames, temp_filename, options)
        if chapters:
            os.remove(metadata_filename)
        os.remove(encodeFilename(filename))
        os.rename(encodeFilename(temp_filename), encodeFilename(filename))
        return [], info