Show More
@@ -21,6 +21,7 b' from __future__ import print_function' | |||||
21 |
|
21 | |||
22 | import os |
|
22 | import os | |
23 | import struct |
|
23 | import struct | |
|
24 | import mimetypes | |||
24 |
|
25 | |||
25 | from IPython.core.formatters import _safe_get_formatter_method |
|
26 | from IPython.core.formatters import _safe_get_formatter_method | |
26 | from IPython.utils.py3compat import (string_types, cast_bytes_py2, cast_unicode, |
|
27 | from IPython.utils.py3compat import (string_types, cast_bytes_py2, cast_unicode, | |
@@ -781,6 +782,90 b' class Image(DisplayObject):' | |||||
781 | def _find_ext(self, s): |
|
782 | def _find_ext(self, s): | |
782 | return unicode_type(s.split('.')[-1].lower()) |
|
783 | return unicode_type(s.split('.')[-1].lower()) | |
783 |
|
784 | |||
|
785 | class Video(DisplayObject): | |||
|
786 | ||||
|
787 | def __init__(self, data=None, url=None, filename=None, embed=None, mimetype=None): | |||
|
788 | """Create a video object given raw data or an URL. | |||
|
789 | ||||
|
790 | When this object is returned by an input cell or passed to the | |||
|
791 | display function, it will result in the video being displayed | |||
|
792 | in the frontend. | |||
|
793 | ||||
|
794 | Parameters | |||
|
795 | ---------- | |||
|
796 | data : unicode, str or bytes | |||
|
797 | The raw image data or a URL or filename to load the data from. | |||
|
798 | This always results in embedded image data. | |||
|
799 | url : unicode | |||
|
800 | A URL to download the data from. If you specify `url=`, | |||
|
801 | the image data will not be embedded unless you also specify `embed=True`. | |||
|
802 | filename : unicode | |||
|
803 | Path to a local file to load the data from. | |||
|
804 | Videos from a file are always embedded. | |||
|
805 | embed : bool | |||
|
806 | Should the image data be embedded using a data URI (True) or be | |||
|
807 | loaded using an <img> tag. Set this to True if you want the image | |||
|
808 | to be viewable later with no internet connection in the notebook. | |||
|
809 | ||||
|
810 | Default is `True`, unless the keyword argument `url` is set, then | |||
|
811 | default value is `False`. | |||
|
812 | ||||
|
813 | Note that QtConsole is not able to display images if `embed` is set to `False` | |||
|
814 | mimetype: unicode | |||
|
815 | Specify the mimetype in case you load in a encoded video. | |||
|
816 | Examples | |||
|
817 | -------- | |||
|
818 | Video('https://archive.org/download/Sita_Sings_the_Blues/Sita_Sings_the_Blues_small.mp4') | |||
|
819 | Video('path/to/video.mp4') | |||
|
820 | Video('path/to/video.mp4', embed=False) | |||
|
821 | """ | |||
|
822 | if url is None and (data.startswith('http') or data.startswith('https')): | |||
|
823 | url = data | |||
|
824 | data = None | |||
|
825 | embed = False | |||
|
826 | elif os.path.exists(data): | |||
|
827 | filename = data | |||
|
828 | data = None | |||
|
829 | ||||
|
830 | self.mimetype = mimetype | |||
|
831 | self.embed = embed if embed is not None else (filename is not None) | |||
|
832 | super(Video, self).__init__(data=data, url=url, filename=filename) | |||
|
833 | ||||
|
834 | def _repr_html_(self): | |||
|
835 | # External URLs and potentially local files are not embedded into the | |||
|
836 | # notebook output. | |||
|
837 | if not self.embed: | |||
|
838 | url = self.url if self.url is not None else self.filename | |||
|
839 | output = """<video src="{0}" controls> | |||
|
840 | Your browser does not support the <code>video</code> element. | |||
|
841 | </video>""".format(url) | |||
|
842 | return output | |||
|
843 | # Embedded videos uses base64 encoded videos. | |||
|
844 | if self.filename is not None: | |||
|
845 | mimetypes.init() | |||
|
846 | mimetype, encoding = mimetypes.guess_type(self.filename) | |||
|
847 | ||||
|
848 | video = open(self.filename, 'rb').read() | |||
|
849 | video_encoded = video.encode('base64') | |||
|
850 | else: | |||
|
851 | video_encoded = self.data | |||
|
852 | mimetype = self.mimetype | |||
|
853 | output = """<video controls> | |||
|
854 | <source src="data:{0};base64,{1}" type="{0}"> | |||
|
855 | Your browser does not support the video tag. | |||
|
856 | </video>""".format(mimetype, video_encoded) | |||
|
857 | return output | |||
|
858 | ||||
|
859 | def reload(self): | |||
|
860 | # TODO | |||
|
861 | pass | |||
|
862 | ||||
|
863 | def _repr_png_(self): | |||
|
864 | # TODO | |||
|
865 | pass | |||
|
866 | def _repr_jpeg_(self): | |||
|
867 | # TODO | |||
|
868 | pass | |||
784 |
|
869 | |||
785 | def clear_output(wait=False): |
|
870 | def clear_output(wait=False): | |
786 | """Clear the output of the current cell receiving output. |
|
871 | """Clear the output of the current cell receiving output. |
General Comments 0
You need to be logged in to leave comments.
Login now