diff --git a/IPython/core/display.py b/IPython/core/display.py
index b53a85c..2c9cc01 100644
--- a/IPython/core/display.py
+++ b/IPython/core/display.py
@@ -21,6 +21,7 @@ from __future__ import print_function
import os
import struct
+import mimetypes
from IPython.core.formatters import _safe_get_formatter_method
from IPython.utils.py3compat import (string_types, cast_bytes_py2, cast_unicode,
@@ -781,6 +782,90 @@ class Image(DisplayObject):
def _find_ext(self, s):
return unicode_type(s.split('.')[-1].lower())
+class Video(DisplayObject):
+
+ def __init__(self, data=None, url=None, filename=None, embed=None, mimetype=None):
+ """Create a video object given raw data or an URL.
+
+ When this object is returned by an input cell or passed to the
+ display function, it will result in the video being displayed
+ in the frontend.
+
+ Parameters
+ ----------
+ data : unicode, str or bytes
+ The raw image data or a URL or filename to load the data from.
+ This always results in embedded image data.
+ url : unicode
+ A URL to download the data from. If you specify `url=`,
+ the image data will not be embedded unless you also specify `embed=True`.
+ filename : unicode
+ Path to a local file to load the data from.
+ Videos from a file are always embedded.
+ embed : bool
+ Should the image data be embedded using a data URI (True) or be
+ loaded using an tag. Set this to True if you want the image
+ to be viewable later with no internet connection in the notebook.
+
+ Default is `True`, unless the keyword argument `url` is set, then
+ default value is `False`.
+
+ Note that QtConsole is not able to display images if `embed` is set to `False`
+ mimetype: unicode
+ Specify the mimetype in case you load in a encoded video.
+ Examples
+ --------
+ Video('https://archive.org/download/Sita_Sings_the_Blues/Sita_Sings_the_Blues_small.mp4')
+ Video('path/to/video.mp4')
+ Video('path/to/video.mp4', embed=False)
+ """
+ if url is None and (data.startswith('http') or data.startswith('https')):
+ url = data
+ data = None
+ embed = False
+ elif os.path.exists(data):
+ filename = data
+ data = None
+
+ self.mimetype = mimetype
+ self.embed = embed if embed is not None else (filename is not None)
+ super(Video, self).__init__(data=data, url=url, filename=filename)
+
+ def _repr_html_(self):
+ # External URLs and potentially local files are not embedded into the
+ # notebook output.
+ if not self.embed:
+ url = self.url if self.url is not None else self.filename
+ output = """""".format(url)
+ return output
+ # Embedded videos uses base64 encoded videos.
+ if self.filename is not None:
+ mimetypes.init()
+ mimetype, encoding = mimetypes.guess_type(self.filename)
+
+ video = open(self.filename, 'rb').read()
+ video_encoded = video.encode('base64')
+ else:
+ video_encoded = self.data
+ mimetype = self.mimetype
+ output = """""".format(mimetype, video_encoded)
+ return output
+
+ def reload(self):
+ # TODO
+ pass
+
+ def _repr_png_(self):
+ # TODO
+ pass
+ def _repr_jpeg_(self):
+ # TODO
+ pass
def clear_output(wait=False):
"""Clear the output of the current cell receiving output.