echo " ... SKIPPED ('name' field found in metadata. metadata already mapped).\n";
            $skipped++;
            continue;
        }
        // backup data to csv file
        if (!empty($backupFile)) {
            backupFile($backupFile, $msg, $video);
        }
        // get provider
        $label = OoyalaApiWrapper::getProviderName($video['labels']);
        $label = empty($label) ? "No provider name" : OoyalaApiWrapper::formatProviderName($label);
        echo " ({$label})";
        $newMeta = mapMetadata($ingester, $video['metadata']);
        if (!array_key_exists('name', $newMeta)) {
            $newMeta['name'] = '';
        }
        echo " ... DONE \n\tNEW Metadata:\n";
        compareMetadata($video['metadata'], $newMeta);
        if (!$dryRun) {
            $resp = OoyalaAsset::updateMetadata($video['embed_code'], $newMeta);
            if (!$resp) {
                $failed++;
            }
        }
        if ($compareWithFile) {
            compareMetadataFile($video, $msg, $newMeta);
        }
    }
    $page++;
} while (!empty($nextPage) && $total < $limit);
echo "\nTotal videos: " . $total . ", Success: " . ($total - $failed - $skipped) . ", Failed: {$failed}, Skipped: {$skipped}\n\n";
function updateRemoteAssetUrls($ingester, $video)
{
    global $dryRun, $skipped, $failed;
    if (empty($video['metadata']['source']) || $video['metadata']['source'] != $ingester->getProvider()) {
        echo "\tSKIP: {$video['name']} (Id: {$video['embed_code']}) - Invalid source value (Provider: {$ingester->getProvider()}, Source: {$video['metadata']['source']}).\n";
        $skipped++;
        return;
    }
    if (empty($video['metadata']['sourceid'])) {
        echo "\tSKIP: {$video['name']} (Id: {$video['embed_code']}) - Empty source id.\n";
        $skipped++;
        return;
    }
    if (!empty($video['metadata']['updateAssetUrls'])) {
        echo "\tSKIP: {$video['name']} (Id: {$video['embed_code']}) - Already updated.\n";
        $skipped++;
        return;
    }
    $urls = $ingester->getRemoteAssetUrls($video['metadata']['sourceid']);
    // for debugging
    //echo "\n\tNEW URLs (".$video['embed_code']."):\n";
    //foreach ( $video['stream_urls'] as $key => &$value ) {
    //	if ( is_null( $value ) ) {
    //		unset( $video['stream_urls'][$key] );
    //	}
    //}
    //compareMetadata( $video['stream_urls'], $urls );
    //echo "\n";
    $resp = true;
    if (!$dryRun) {
        $resp = OoyalaAsset::updateRemoteAssetUrls($video['embed_code'], $urls);
        if ($resp) {
            $metadata = ['updateAssetUrls' => 1];
            $resp = OoyalaAsset::updateMetadata($video['embed_code'], $metadata);
            if (!$resp) {
                "ERROR: {$video['name']} (Id: {$video['embed_code']}) - Cannot set updateAssetUrls to 1 in metadata.\n";
            }
        } else {
            $failed++;
        }
    }
    if ($resp) {
        echo "\tUPDATED: {$video['name']} (Id: {$video['embed_code']}) ... DONE.\n";
    }
}
/**
 * Remove thumbnail field from Custom Metadata
 * @global integer $skipped
 * @global integer $failed
 * @global boolean $dryRun
 * @global string $msg
 * @param array $video
 * @return boolean
 */
function removeThumbnailFromMetadata($video)
{
    global $failed, $dryRun, $msg;
    if (!$dryRun) {
        $metadata = array('thumbnail' => null);
        $resp = OoyalaAsset::updateMetadata($video['embed_code'], $metadata);
        if (!$resp) {
            $failed++;
            echo "{$msg}...FAILED (Error: Cannot remove thumbnail field from Custom Metadata).\n";
            return false;
        }
    }
    return true;
}
 /**
  * Update remote asset (metadata only)
  * @return integer
  */
 protected function updateRemoteAsset()
 {
     if (empty($this->duplicateAsset['embed_code'])) {
         $this->logger->videoWarnings("Error when updating remote asset data: empty asset embed code.\n");
         return 0;
     }
     $this->prepareMetaDataForOoyala($generateUrl = false);
     $ooyalaAsset = new OoyalaAsset();
     $assetMeta = $ooyalaAsset->getAssetMetadata($this->metaData);
     // set reupload
     $assetMeta['reupload'] = 1;
     // remove unwanted data
     $emptyMetaKeys = array_diff(array_keys($this->duplicateAsset['metadata']), array_keys($assetMeta));
     foreach ($emptyMetaKeys as $key) {
         $assetMeta[$key] = null;
     }
     if ($this->debugMode()) {
         print "Ready to update remote asset\n";
         print "id:          {$this->metaData['videoId']}\n";
         print "name:        {$this->metaData['destinationTitle']}\n";
         print "embed code:  {$this->duplicateAsset['embed_code']}\n";
         print "asset name:  {$this->duplicateAsset['name']}\n";
         print "metadata:\n";
         foreach (explode("\n", var_export($assetMeta, TRUE)) as $line) {
             print ":: {$line}\n";
         }
     } else {
         $result = OoyalaAsset::updateMetadata($this->duplicateAsset['embed_code'], $assetMeta);
         if (!$result) {
             $this->logger->videoWarnings();
             return 0;
         }
     }
     $categories = empty($this->metaData['pageCategories']) ? [] : explode(", ", $this->metaData['pageCategories']);
     $msg = "Uploaded remote asset: {$this->metaData['destinationTitle']} (id: {$this->metaData['videoId']})\n";
     $this->logger->videoIngested($msg, $categories);
     return 1;
 }