protected function _associateAttachmentsAndMedia(array $attachments, array $input, array $container)
 {
     $mediaModel = $this->_getMediaModel();
     $visitor = XenForo_Visitor::getInstance();
     $requiresTranscode = false;
     foreach ($attachments as $attachmentId => $attachment) {
         if (!isset($input[$attachmentId])) {
             continue;
         }
         $attachInput = array_merge(array('media_title' => '', 'media_description' => '', 'tags' => '', 'custom_fields' => array()), $input[$attachmentId]);
         $mediaData = array('media_title' => $attachInput['media_title'], 'media_description' => $attachInput['media_description'], 'media_type' => $input['media_type'], 'media_state' => $input['media_state'], 'attachment_id' => $attachmentId, 'user_id' => $visitor->user_id, 'username' => $visitor->username, 'album_id' => !empty($container['album_id']) ? $container['album_id'] : 0, 'category_id' => !empty($container['category_id']) ? $container['category_id'] : 0);
         if ($input['media_type'] == 'video_upload' && $mediaModel->requiresTranscoding($attachment)) {
             $customFields = array();
             $customFieldsShown = array();
             $customFieldsData = $this->_updateCustomFields($attachInput, array(), true);
             if ($customFieldsData) {
                 list($customFields, $customFieldsShown) = $customFieldsData;
             }
             $transcodeData = array('attachmentId' => $attachmentId, 'media' => $mediaData, 'tags' => $attachInput['tags'], 'customFields' => $customFieldsData ? $customFields : array(), 'customFieldsShown' => $customFieldsData ? $customFieldsShown : array());
             $attachmentFile = $mediaModel->getAttachmentDataFilePath($attachment);
             // We check for tag errors and permissions here, now, so nothing will prevent the transcoding finishing later.
             if ($mediaModel->canEditTags()) {
                 $tagModel = XenForo_Model::create('XenForo_Model_Tag');
                 /** @var XenForo_TagHandler_Tagger $tagger */
                 $tagger = $tagModel->getTagger('xengallery_media');
                 $tagger->setPermissionsFromContext($container)->setTags($tagModel->splitTags($attachInput['tags']));
                 if ($tagger->getErrors()) {
                     throw $this->responseException($this->responseError($tagger->getErrors()));
                 }
                 $transcodeData['tagger_permissions'] = $tagger->getPermissions();
             } else {
                 unset($transcodeData['tags']);
             }
             $video = new XenGallery_Helper_Video($attachmentFile);
             $video->queueTranscode($transcodeData);
             $requiresTranscode = true;
         } else {
             $mediaWriter = XenForo_DataWriter::create('XenGallery_DataWriter_Media');
             $tagger = null;
             if ($mediaModel->canEditTags()) {
                 $tagModel = $this->getModelFromCache('XenForo_Model_Tag');
                 /** @var XenForo_TagHandler_Tagger $tagger */
                 $tagger = $tagModel->getTagger('xengallery_media');
                 $tagger->setPermissionsFromContext($container)->setTags($tagModel->splitTags($attachInput['tags']));
                 $mediaWriter->mergeErrors($tagger->getErrors());
             }
             $mediaWriter->bulkSet($mediaData);
             $mediaWriter->save();
             $media = $mediaWriter->getMergedData();
             if ($tagger) {
                 $tagger->setContent($media['media_id'], true)->save();
             }
             $this->_updateCustomFields($attachInput, $media);
             $mediaModel->updateAttachmentData($attachmentId, $media['media_id']);
             $mediaModel->updateExifData($attachment, $media);
             $mediaWriter->updateUserMediaQuota();
             if ($media['media_type'] == 'image_upload') {
                 $watermarkModel = $this->_getWatermarkModel();
                 $options = XenForo_Application::getOptions();
                 if ($options->get('xengalleryEnableWatermarking') == 'enabled' && !$watermarkModel->canBypassWatermark()) {
                     $media = array_merge($media, $attachment);
                     $imageInfo = $watermarkModel->addWatermarkToImage($media);
                     if ($imageInfo) {
                         $mediaModel->rebuildThumbnail($media, $imageInfo);
                     }
                 }
             }
         }
     }
     return $requiresTranscode;
     // Does not require transcoding
 }