From bfc4781ca5d053021179671c1c2d2203c6158389 2013-04-19 07:12:41 From: Eugene Van den Bulke Date: 2013-04-19 07:12:41 Subject: [PATCH] VideoIframe from YouTubeVideo (simplified) + VimeoVideo --- diff --git a/IPython/lib/display.py b/IPython/lib/display.py index 3066c49..3cc55bf 100644 --- a/IPython/lib/display.py +++ b/IPython/lib/display.py @@ -6,7 +6,27 @@ from os.path import exists, isfile, splitext, abspath, join, isdir from os import walk, sep -class YouTubeVideo(object): +class VideoIframe(object): + """ + Generic class to embed videos in a iframe + """ + + def __init__(self, id, width=400, height=300, **kwargs): + self.id = id + self.width = width + self.height = height + self.params = kwargs + + def _repr_html_(self): + """return the embed iframe for this video id""" + if self.params: + from urllib import urlencode + params = "?" + urlencode(self.params) + else: + params = "" + return self.iframe % (self.width, self.height, self.id, params) + +class YouTubeVideo(VideoIframe): """Class for embedding a YouTube Video in an IPython session, based on its video id. e.g. to embed the video on this page: @@ -17,33 +37,20 @@ class YouTubeVideo(object): vid = YouTubeVideo("foo") display(vid) - + To start from 30 seconds: - + vid = YouTubeVideo("abc", start=30) display(vid) - + To calculate seconds from time as hours, minutes, seconds use: start=int(timedelta(hours=1, minutes=46, seconds=40).total_seconds()) - Other parameters can be provided as documented at + Other parameters can be provided as documented at https://developers.google.com/youtube/player_parameters#parameter-subheader """ - def __init__(self, id, width=400, height=300, **kwargs): - self.id = id - self.width = width - self.height = height - self.params = kwargs - - def _repr_html_(self): - """return YouTube embed iframe for this video id""" - if self.params: - from urllib import urlencode # Deferred import - params = "?" + urlencode(self.params) - else: - params = "" - return """ + iframe = """ - """ % (self.width, self.height, self.id, params) + """ + +class VimeoVideo(VideoIframe): + """ + Class for embedding a Vimeo video in an IPython session, based on its video id. + """ + + iframe = """ + + """ + class FileLink(object): """Class for embedding a local file link in an IPython session, based on path @@ -62,14 +87,14 @@ class FileLink(object): local_file = FileLink("my/data.txt") display(local_file) - + or in the HTML notebook, just:: - + FileLink("my/data.txt") """ - + html_link_str = "%s" - + def __init__(self, path, url_prefix='files/', @@ -85,7 +110,7 @@ class FileLink(object): 'files'] result_html_prefix : str text to append to beginning to link [default: none] - result_html_suffix : str + result_html_suffix : str text to append at the end of link [default: '
'] """ if isdir(path): @@ -96,24 +121,24 @@ class FileLink(object): self.url_prefix = url_prefix self.result_html_prefix = result_html_prefix self.result_html_suffix = result_html_suffix - + def _format_path(self): fp = ''.join([self.url_prefix,self.path]) return ''.join([self.result_html_prefix, self.html_link_str % (fp, self.path), self.result_html_suffix]) - + def _repr_html_(self): """return html link to file """ if not exists(self.path): - return ("Path (%s) doesn't exist. " + return ("Path (%s) doesn't exist. " "It may still be in the process of " "being generated, or you may have the " "incorrect path." % self.path) - + return self._format_path() - + def __repr__(self): """return absolute path to file """ @@ -128,11 +153,11 @@ class FileLinks(FileLink): local_files = FileLinks("my/data") display(local_files) - + or in the HTML notebook, just - + FileLinks("my/data") - + """ def __init__(self, path, @@ -145,34 +170,34 @@ class FileLinks(FileLink): """ included_suffixes : list of filename suffixes to include when formatting output [default: include all files] - - See the FileLink (baseclass of LocalDirectory) docstring for + + See the FileLink (baseclass of LocalDirectory) docstring for information on additional parameters. - - notebook_display_formatter : func used to format links for display + + notebook_display_formatter : func used to format links for display in the notebook. See discussion of formatter function below. - - terminal_display_formatter : func used to format links for display + + terminal_display_formatter : func used to format links for display in the terminal. See discussion of formatter function below. - - + + Passing custom formatter functions ---------------------------------- Formatter functions must be of the form: f(dirname, fnames, included_suffixes) - dirname : the name of a directory (a string), - fnames : a list of the files in that directory - included_suffixes : a list of the file suffixes that should be - included in the output (passing None means + dirname : the name of a directory (a string), + fnames : a list of the files in that directory + included_suffixes : a list of the file suffixes that should be + included in the output (passing None means to include all suffixes in the output in the built-in formatters) - - returns a list of lines that should will be print in the + + returns a list of lines that should will be print in the notebook (if passing notebook_display_formatter) or the terminal - (if passing terminal_display_formatter). This function is iterated - over for each directory in self.path. Default formatters are in + (if passing terminal_display_formatter). This function is iterated + over for each directory in self.path. Default formatters are in place, can be passed here to support alternative formatting. - + """ if isfile(path): raise ValueError,\ @@ -181,33 +206,33 @@ class FileLinks(FileLink): self.included_suffixes = included_suffixes # remove trailing slashs for more consistent output formatting path = path.rstrip('/') - + self.path = path self.url_prefix = url_prefix self.result_html_prefix = result_html_prefix self.result_html_suffix = result_html_suffix - + self.notebook_display_formatter = \ notebook_display_formatter or self._get_notebook_display_formatter() self.terminal_display_formatter = \ terminal_display_formatter or self._get_terminal_display_formatter() - + def _get_display_formatter(self, dirname_output_format, fname_output_format, fp_format, fp_cleaner=None): """ generate built-in formatter function - - this is used to define both the notebook and terminal built-in + + this is used to define both the notebook and terminal built-in formatters as they only differ by some wrapper text for each entry - - dirname_output_format: string to use for formatting directory + + dirname_output_format: string to use for formatting directory names, dirname will be substituted for a single "%s" which must appear in this string fname_output_format: string to use for formatting file names, if a single "%s" appears in the string, fname will be substituted - if two "%s" appear in the string, the path to fname will be + if two "%s" appear in the string, the path to fname will be substituted for the first and fname will be substituted for the second fp_format: string to use for formatting filepaths, must contain @@ -216,7 +241,7 @@ class FileLinks(FileLink): """ def f(dirname, fnames, included_suffixes=None): result = [] - # begin by figuring out which filenames, if any, + # begin by figuring out which filenames, if any, # are going to be displayed display_fnames = [] for fname in fnames: @@ -224,13 +249,13 @@ class FileLinks(FileLink): (included_suffixes == None or splitext(fname)[1] in included_suffixes)): display_fnames.append(fname) - + if len(display_fnames) == 0: # if there are no filenames to display, don't print anything # (not even the directory name) pass else: - # otherwise print the formatted directory name followed by + # otherwise print the formatted directory name followed by # the formatted filenames dirname_output_line = dirname_output_format % dirname result.append(dirname_output_line) @@ -258,7 +283,7 @@ class FileLinks(FileLink): self.result_html_prefix + spacer + self.html_link_str + self.result_html_suffix fp_format = self.url_prefix + '%s/%s' if sep == "\\": - # Working on a platform where the path separator is "\", so + # Working on a platform where the path separator is "\", so # must convert these to "/" for generating a URI def fp_cleaner(fp): # Replace all occurences of backslash ("\") with a forward @@ -267,7 +292,7 @@ class FileLinks(FileLink): return fp.replace('\\','/') else: fp_cleaner = None - + return self._get_display_formatter(dirname_output_format, fname_output_format, fp_format, @@ -280,11 +305,11 @@ class FileLinks(FileLink): dirname_output_format = "%s/" fname_output_format = spacer + "%s" fp_format = '%s/%s' - + return self._get_display_formatter(dirname_output_format, fname_output_format, fp_format) - + def _format_path(self): result_lines = [] walked_dir = list(walk(self.path)) @@ -292,7 +317,7 @@ class FileLinks(FileLink): for dirname, subdirs, fnames in walked_dir: result_lines += self.notebook_display_formatter(dirname, fnames, self.included_suffixes) return '\n'.join(result_lines) - + def __repr__(self): """return newline-separated absolute paths """