| 
									
										
										
										
											2016-10-02 13:39:18 +02:00
										 |  |  | # coding: utf-8 | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import subprocess | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-24 09:08:57 +02:00
										 |  |  | from .ffmpeg import FFmpegPostProcessor | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  | from ..utils import ( | 
					
						
							|  |  |  |     check_executable, | 
					
						
							| 
									
										
										
										
											2015-05-14 04:41:30 +08:00
										 |  |  |     encodeArgument, | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  |     encodeFilename, | 
					
						
							|  |  |  |     PostProcessingError, | 
					
						
							|  |  |  |     prepend_extension, | 
					
						
							|  |  |  |     shell_quote | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class EmbedThumbnailPPError(PostProcessingError): | 
					
						
							|  |  |  |     pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-24 09:08:57 +02:00
										 |  |  | class EmbedThumbnailPP(FFmpegPostProcessor): | 
					
						
							| 
									
										
										
										
											2015-05-14 02:32:00 +08:00
										 |  |  |     def __init__(self, downloader=None, already_have_thumbnail=False): | 
					
						
							|  |  |  |         super(EmbedThumbnailPP, self).__init__(downloader) | 
					
						
							|  |  |  |         self._already_have_thumbnail = already_have_thumbnail | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  |     def run(self, info): | 
					
						
							|  |  |  |         filename = info['filepath'] | 
					
						
							|  |  |  |         temp_filename = prepend_extension(filename, 'temp') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 02:32:00 +08:00
										 |  |  |         if not info.get('thumbnails'): | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  |             raise EmbedThumbnailPPError('Thumbnail was not found. Nothing to do.') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 02:32:00 +08:00
										 |  |  |         thumbnail_filename = info['thumbnails'][-1]['filename'] | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-06-18 22:05:02 +08:00
										 |  |  |         if not os.path.exists(encodeFilename(thumbnail_filename)): | 
					
						
							|  |  |  |             self._downloader.report_warning( | 
					
						
							|  |  |  |                 'Skipping embedding the thumbnail because the file is missing.') | 
					
						
							|  |  |  |             return [], info | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-21 03:25:44 +08:00
										 |  |  |         if info['ext'] in ('mp3', 'mkv'): | 
					
						
							| 
									
										
										
										
											2015-04-24 22:08:00 +02:00
										 |  |  |             options = [ | 
					
						
							| 
									
										
										
										
											2015-05-14 02:35:28 +08:00
										 |  |  |                 '-c', 'copy', '-map', '0', '-map', '1', | 
					
						
							| 
									
										
										
										
											2015-04-24 09:08:57 +02:00
										 |  |  |                 '-metadata:s:v', 'title="Album cover"', '-metadata:s:v', 'comment="Cover (Front)"'] | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self._downloader.to_screen('[ffmpeg] Adding thumbnail to "%s"' % filename) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 02:35:28 +08:00
										 |  |  |             self.run_ffmpeg_multiple_files([filename, thumbnail_filename], temp_filename, options) | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 02:32:00 +08:00
										 |  |  |             if not self._already_have_thumbnail: | 
					
						
							|  |  |  |                 os.remove(encodeFilename(thumbnail_filename)) | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  |             os.remove(encodeFilename(filename)) | 
					
						
							|  |  |  |             os.rename(encodeFilename(temp_filename), encodeFilename(filename)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-29 12:47:20 +02:00
										 |  |  |         elif info['ext'] in ['m4a', 'mp4']: | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  |             if not check_executable('AtomicParsley', ['-v']): | 
					
						
							|  |  |  |                 raise EmbedThumbnailPPError('AtomicParsley was not found. Please install.') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 04:41:30 +08:00
										 |  |  |             cmd = [encodeFilename('AtomicParsley', True), | 
					
						
							|  |  |  |                    encodeFilename(filename, True), | 
					
						
							|  |  |  |                    encodeArgument('--artwork'), | 
					
						
							|  |  |  |                    encodeFilename(thumbnail_filename, True), | 
					
						
							|  |  |  |                    encodeArgument('-o'), | 
					
						
							|  |  |  |                    encodeFilename(temp_filename, True)] | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self._downloader.to_screen('[atomicparsley] Adding thumbnail to "%s"' % filename) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if self._downloader.params.get('verbose', False): | 
					
						
							|  |  |  |                 self._downloader.to_screen('[debug] AtomicParsley command line: %s' % shell_quote(cmd)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) | 
					
						
							|  |  |  |             stdout, stderr = p.communicate() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if p.returncode != 0: | 
					
						
							|  |  |  |                 msg = stderr.decode('utf-8', 'replace').strip() | 
					
						
							|  |  |  |                 raise EmbedThumbnailPPError(msg) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 02:32:00 +08:00
										 |  |  |             if not self._already_have_thumbnail: | 
					
						
							|  |  |  |                 os.remove(encodeFilename(thumbnail_filename)) | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  |             # for formats that don't support thumbnails (like 3gp) AtomicParsley | 
					
						
							|  |  |  |             # won't create to the temporary file | 
					
						
							|  |  |  |             if b'No changes' in stdout: | 
					
						
							|  |  |  |                 self._downloader.report_warning('The file format doesn\'t support embedding a thumbnail') | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 os.remove(encodeFilename(filename)) | 
					
						
							|  |  |  |                 os.rename(encodeFilename(temp_filename), encodeFilename(filename)) | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2015-05-29 12:47:20 +02:00
										 |  |  |             raise EmbedThumbnailPPError('Only mp3 and m4a/mp4 are supported for thumbnail embedding for now.') | 
					
						
							| 
									
										
										
										
											2015-04-24 08:48:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return [], info |