hook_node_view can't change content I've read through many questions asking this same thing, but I feel like I'm doing what they are suggesting and it's still not working.

I've created a custom module and enabled it. This is my code:

function mymodule_node_view($node, $view_mode, $langcode) {
  if ($view_mode == 'teaser' &amp;&amp; $node-&gt;type == 'article' &amp;&amp; count($node-&gt;field_video) &gt; 0) {
    kpr($node);

    $markup = sprintf("&lt;video style='width: 502px; height: 282px;' poster='%s'&gt;\n",
        image_style_url('video_thumbnail', $node-&gt;field_video[$node-&gt;language][0]['thumbnailfile']-&gt;uri)
      );

    foreach($node-&gt;field_video[$node-&gt;language][0]['playablefiles'] as $video_object) {
      $markup .= sprintf("&lt;source src='%s' type='%s' /&gt;\n",
          file_create_url($video_object-&gt;uri),
          $video_object-&gt;filemime
        );
    }

    $markup .= "&lt;/video&gt;";

    $node-&gt;content['field_video_embed_code'] = array(
      '#markup' =&gt; $markup,
      '#weight' =&gt; 10,
      '#type'   =&gt; 'markup',
    );

    kpr($node);
  }

}


When I look at the krumo output, I see my changes to the $node object, however, when it renders the new field I'm adding is not included. 

What am I doing wrong?

EDIT: I just realized I'm using Display Suite (it's been awhile since I set this site up) which is overriding which fields are shown and in what order. My guess is that DS is getting my modified content, but not showing the additional field because it isn't listed in my teaser fields? I'm not sure.
You must declare the field for the DS be able to handle it. In your case:

/**
 * Implements hook_field_extra_fields().
 */
function mymodule_field_extra_fields() {

  $extra['node']['article']['display']['field_video_embed_code'] = array(
    'label' =&gt; t('Custom field embed video.'),
    'description' =&gt; t('Adds a custom field.'),
    'weight' =&gt; 0,
  );
  return $extra;
}