Index: media.php
===================================================================
--- media.php	(revision 23689)
+++ media.php	(working copy)
@@ -1024,12 +1024,13 @@
  *
  * @param string $url The URL that should be embedded.
  * @param array $args Additional arguments and parameters.
+ * @param bool $use_cache Use a cached value if available.
  * @return bool|string False on failure or the embed HTML on success.
  */
-function wp_oembed_get( $url, $args = '' ) {
+function wp_oembed_get( $url, $args = '', $use_cache = true ) {
 	require_once( ABSPATH . WPINC . '/class-oembed.php' );
 	$oembed = _wp_oembed_get_object();
-	return $oembed->get_html( $url, $args );
+	return $oembed->get_html( $url, $args, $use_cache );
 }
 
 /**
Index: class-oembed.php
===================================================================
--- class-oembed.php	(revision 23689)
+++ class-oembed.php	(working copy)
@@ -66,9 +66,22 @@
 	 *
 	 * @param string $url The URL to the content that should be attempted to be embedded.
 	 * @param array $args Optional arguments. Usually passed from a shortcode.
+     * @param bool $use_cache Use a cached value if available.
 	 * @return bool|string False on failure, otherwise the UNSANITIZED (and potentially unsafe) HTML that should be used to embed.
 	 */
-	function get_html( $url, $args = '' ) {
+	function get_html( $url, $args = '', $use_cache = true ) {
+
+        // Check for a cached result (stored in the post meta)
+        $cachekey = '_oembed_' . md5( $url . serialize( $attr ) );
+
+        if ( $use_cache ) {
+            $cache = get_transient( $cachekey );
+
+            if ( ! empty( $cache ) )
+                return $cache;
+
+        }
+
 		$provider = false;
 
 		if ( !isset($args['discover']) )
@@ -92,10 +105,17 @@
 		if ( !$provider && $args['discover'] )
 			$provider = $this->discover( $url );
 
-		if ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) )
-			return false;
+		if ( !$provider || false === $data = $this->fetch( $provider, $url, $args ) ) {
+            // Cache failures.
+            set_transient( $cachekey, '{{unknown}}', 12 * HOUR_IN_SECONDS );
+            return '{{unknown}}';
+        }
 
-		return apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args );
+        $html = apply_filters( 'oembed_result', $this->data2html( $data, $url ), $url, $args );
+        $expiry_time = ! empty ( $data->cache_age ) ? (int) $data->cache_age : 30 * DAY_IN_SECONDS;
+        set_transient( $cachekey, $html, $expiry_time );
+
+		return $html;
 	}
 
 	/**
Index: class-wp-embed.php
===================================================================
--- class-wp-embed.php	(revision 23689)
+++ class-wp-embed.php	(working copy)
@@ -165,30 +165,18 @@
 		// Unknown URL format. Let oEmbed have a go.
 		if ( $post_ID ) {
 
-			// Check for a cached result (stored in the post meta)
-			$cachekey = '_oembed_' . md5( $url . serialize( $attr ) );
-			if ( $this->usecache ) {
-				$cache = get_post_meta( $post_ID, $cachekey, true );
-
-				// Failures are cached
-				if ( '{{unknown}}' === $cache )
-					return $this->maybe_make_link( $url );
-
-				if ( ! empty( $cache ) )
-					return apply_filters( 'embed_oembed_html', $cache, $url, $attr, $post_ID );
-			}
-
 			// Use oEmbed to get the HTML
 			$attr['discover'] = ( apply_filters('embed_oembed_discover', false) && author_can( $post_ID, 'unfiltered_html' ) );
-			$html = wp_oembed_get( $url, $attr );
+			$html = wp_oembed_get( $url, $attr, $this->usecache );
 
-			// Cache the result
-			$cache = ( $html ) ? $html : '{{unknown}}';
-			update_post_meta( $post_ID, $cachekey, $cache );
+			// If there was a result, return it
+			if ( $html ) {
+                // Failures
+                if ( '{{unknown}}' === $html )
+                    return $this->maybe_make_link( $url );
 
-			// If there was a result, return it
-			if ( $html )
 				return apply_filters( 'embed_oembed_html', $html, $url, $attr, $post_ID );
+            }
 		}
 
 		// Still unknown
