Changed media processing delegation to a 'sniffing' method
[mediagoblin.git] / mediagoblin / media_types / video / processing.py
CommitLineData
93bdab9d 1# GNU MediaGoblin -- federated, autonomous media hosting
cf29e8a8 2# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
93bdab9d
JW
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU Affero General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU Affero General Public License for more details.
13#
14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
93bdab9d 17import tempfile
e9c1b938 18import logging
a63b640f 19import os
93bdab9d 20
93bdab9d 21from mediagoblin import mg_globals as mgg
8e5f9746
JW
22from mediagoblin.processing import mark_entry_failed, \
23 THUMB_SIZE, MEDIUM_SIZE, create_pub_filepath
26729e02 24from . import transcoders
1f255101 25
1f255101 26logging.basicConfig()
8e5f9746
JW
27
28_log = logging.getLogger(__name__)
29_log.setLevel(logging.DEBUG)
93bdab9d 30
ec4261a4
JW
31def sniff_handler(media_file, **kw):
32 return False
93bdab9d
JW
33
34def process_video(entry):
35 """
5a34a80d
JW
36 Process a video entry, transcode the queued media files (originals) and
37 create a thumbnail for the entry.
93bdab9d 38 """
23caf305
CAW
39 video_config = mgg.global_config['media_type:mediagoblin.media_types.video']
40
93bdab9d
JW
41 workbench = mgg.workbench_manager.create_workbench()
42
8545cfc9 43 queued_filepath = entry.queued_media_file
93bdab9d
JW
44 queued_filename = workbench.localized_file(
45 mgg.queue_store, queued_filepath,
46 'source')
47
e9c1b938 48 medium_filepath = create_pub_filepath(
a63b640f
JW
49 entry,
50 '{original}-640p.webm'.format(
51 original=os.path.splitext(
5a34a80d 52 queued_filepath[-1])[0] # Select the file name without .ext
a63b640f 53 ))
93bdab9d 54
e9c1b938
JW
55 thumbnail_filepath = create_pub_filepath(
56 entry, 'thumbnail.jpg')
1f255101 57
93bdab9d 58
e9c1b938
JW
59 # Create a temporary file for the video destination
60 tmp_dst = tempfile.NamedTemporaryFile()
93bdab9d 61
e9c1b938
JW
62 with tmp_dst:
63 # Transcode queued file to a VP8/vorbis file that fits in a 640x640 square
64 transcoder = transcoders.VideoTranscoder(queued_filename, tmp_dst.name)
93bdab9d 65
e9c1b938 66 # Push transcoded video to public storage
8e5f9746 67 _log.debug('Saving medium...')
e9c1b938
JW
68 mgg.public_store.get_file(medium_filepath, 'wb').write(
69 tmp_dst.read())
8e5f9746 70 _log.debug('Saved medium')
e9c1b938 71
228c4470 72 entry.media_files['webm_640'] = medium_filepath
e9c1b938
JW
73
74 # Save the width and height of the transcoded video
ddc1cae9 75 entry.media_data['video'] = {
e9c1b938
JW
76 u'width': transcoder.dst_data.videowidth,
77 u'height': transcoder.dst_data.videoheight}
93bdab9d 78
e9c1b938
JW
79 # Create a temporary file for the video thumbnail
80 tmp_thumb = tempfile.NamedTemporaryFile()
93bdab9d 81
e9c1b938
JW
82 with tmp_thumb:
83 # Create a thumbnail.jpg that fits in a 180x180 square
84 transcoders.VideoThumbnailer(queued_filename, tmp_thumb.name)
1f255101 85
e9c1b938 86 # Push the thumbnail to public storage
8e5f9746 87 _log.debug('Saving thumbnail...')
e9c1b938
JW
88 mgg.public_store.get_file(thumbnail_filepath, 'wb').write(
89 tmp_thumb.read())
8e5f9746 90 _log.debug('Saved thumbnail')
93bdab9d 91
228c4470 92 entry.media_files['thumb'] = thumbnail_filepath
93bdab9d 93
23caf305
CAW
94 if video_config['keep_original']:
95 # Push original file to public storage
96 queued_file = file(queued_filename, 'rb')
93bdab9d 97
23caf305
CAW
98 with queued_file:
99 original_filepath = create_pub_filepath(
100 entry,
101 queued_filepath[-1])
26729e02 102
23caf305
CAW
103 with mgg.public_store.get_file(original_filepath, 'wb') as \
104 original_file:
105 _log.debug('Saving original...')
106 original_file.write(queued_file.read())
107 _log.debug('Saved original')
1f255101 108
228c4470 109 entry.media_files['original'] = original_filepath
93bdab9d 110
e9c1b938
JW
111 mgg.queue_store.delete_file(queued_filepath)
112
e9c1b938
JW
113 # Save the MediaEntry
114 entry.save()