def test_can_play_ignores_empty_container(self): class FakePlayer(FileSupportMixin): supported_containers = set(['mp4']) supported_schemes = set([RTMP]) fake_player = FakePlayer() media_file = MediaFile() media_file.container = '' media_file.type = VIDEO uri = StorageURI(media_file, 'rtmp', 'test', server_uri='rtmp://stream.host.example/play') assert_equals('', uri.file.container, message='It is important that the server uri has no container.') assert_equals((True, ), fake_player.can_play([uri]))
def add_default_data(): log.info('Adding default data') settings = [ (u'email_media_uploaded', None), (u'email_comment_posted', None), (u'email_support_requests', None), (u'email_send_from', u'noreply@localhost'), (u'wording_user_uploads', N_(u"Upload your media using the form below. We'll review it and get back to you.")), (u'wording_administrative_notes', None), (u'wording_display_administrative_notes', u''), (u'popularity_decay_exponent', u'4'), (u'popularity_decay_lifetime', u'36'), (u'rich_text_editor', u'tinymce'), (u'google_analytics_uacct', u''), (u'featured_category', u'1'), (u'max_upload_size', u'314572800'), (u'ftp_storage', u'false'), (u'ftp_server', u'ftp.someserver.com'), (u'ftp_user', u'username'), (u'ftp_password', u'password'), (u'ftp_upload_directory', u'media'), (u'ftp_download_url', u'http://www.someserver.com/web/accessible/media/'), (u'ftp_upload_integrity_retries', u'10'), (u'akismet_key', u''), (u'akismet_url', u''), (u'req_comment_approval', u''), (u'use_embed_thumbnails', u'true'), (u'api_secret_key_required', u'true'), (u'api_secret_key', random_string(20)), (u'api_media_max_results', u'50'), (u'api_tree_max_depth', u'10'), (u'general_site_name', u'MediaDrop'), (u'general_site_title_display_order', u'prepend'), (u'sitemaps_display', u'True'), (u'rss_display', u'True'), (u'vulgarity_filtered_words', u''), (u'primary_language', u'en'), (u'advertising_banner_html', u''), (u'advertising_sidebar_html', u''), (u'comments_engine', u'builtin'), (u'facebook_appid', u''), (u'youtube_apikey', u''), ] settings.extend(appearance_settings) for key, value in settings: s = Setting() s.key = key s.value = value DBSession.add(s) admin_user = User() admin_user.user_name = u'admin' admin_user.display_name = u'Admin' admin_user.email_address = u'*****@*****.**' admin_user.password = u'admin' DBSession.add(admin_user) admin_group = Group(name=u'admins', display_name=u'Admins') admin_group.users.append(admin_user) DBSession.add(admin_group) editor_group = Group(name=u'editors', display_name=u'Editors') DBSession.add(editor_group) anonymous_group = Group(name=u'anonymous', display_name=u'Everyone (including guests)') DBSession.add(anonymous_group) authenticated_group = Group(name=u'authenticated', display_name=u'Logged in users') DBSession.add(authenticated_group) admin_perm = Permission(name=u'admin', groups=[admin_group], description=u'Grants access to the admin panel') DBSession.add(admin_perm) edit_perm = Permission(name=u'edit', groups=[admin_group, editor_group], description=u'Grants access to edit site content') DBSession.add(edit_perm) view_perm = Permission(name=u'view', groups=[admin_group, anonymous_group, editor_group], description=u'View published media') DBSession.add(view_perm) upload_perm = Permission(name=u'upload', groups=[admin_group, anonymous_group, editor_group], description=u'Can upload new media') DBSession.add(upload_perm) media_upload_perm = Permission() media_upload_perm.permission_name = u'MEDIA_UPLOAD' media_upload_perm.description = u'Grants the ability to upload new media' media_upload_perm.groups.append(admin_group) media_upload_perm.groups.append(editor_group) media_upload_perm.groups.append(anonymous_group) DBSession.add(edit_perm) category = Category(name=u'Featured', slug=u'featured') DBSession.add(category) category2 = Category(name=u'Instructional', slug=u'instructional') DBSession.add(category2) podcast = Podcast() podcast.slug = u'hello-world' podcast.title = u'Hello World' podcast.subtitle = u'My very first podcast!' podcast.description = u"""<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>""" podcast.category = u'Technology' podcast.author = Author(admin_user.display_name, admin_user.email_address) podcast.explicit = None podcast.copyright = u'Copyright 2009 Xyz' podcast.itunes_url = None podcast.feedburner_url = None DBSession.add(podcast) comment = Comment() comment.subject = u'Re: New Media' comment.author = AuthorWithIP(name=u'John Doe', ip=2130706433) comment.body = u'<p>Hello to you too!</p>' DBSession.add(comment) media = Media() media.type = None media.slug = u'new-media' media.reviewed = True media.encoded = False media.publishable = False media.title = u'New Media' media.subtitle = None media.description = u"""<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>""" media.description_plain = u"""Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.""" media.author = Author(admin_user.display_name, admin_user.email_address) media.categories.append(category) media.comments.append(comment) DBSession.add(media) #XXX The list of default players is actually defined in model.players # and should at some point be moved here to avoid inconsistency # between the default storage engines and default players. remote_url_storage = RemoteURLStorage() default_engines = [ SwiftStorage(), LocalFileStorage(), remote_url_storage, YoutubeStorage(), VimeoStorage(), BlipTVStorage(), DailyMotionStorage(), ] for engine in default_engines: DBSession.add(engine) import datetime instructional_media = [ (u'workflow-in-mediadrop', u'Workflow in MediaDrop', u'<p>This sceencast explains the publish status feature in MediaDrop.</p><p>Initially all videos uploaded through the front-end or admin panel are placed under "awaiting review" status. Once the administrator hits the "review complete" button, they can upload media. Videos can be added in any format, however, they can only be published if they are in a web-ready format such as FLV, M4V, MP3, or MP4. Alternatively, if they are published through Youtube or Vimeo the encoding step is skipped</p><p>Once uploaded and encoded the administrator can then publish the video.</p>', u'This sceencast explains the publish status feature in MediaDrop.\nInitially all videos uploaded through the front-end or admin panel are placed under \"awaiting review\" status. Once the administrator hits the \"review complete\" button, they can upload media. Videos can be added in any format, however, they can only be published if they are in a web-ready format such as FLV, M4V, MP3, or MP4. Alternatively, if they are published through Youtube or Vimeo the encoding step is skipped\nOnce uploaded and encoded the administrator can then publish the video.', datetime.datetime(2010, 5, 13, 2, 29, 40), 218, u'http://static.mediadrop.net/files/videos/tutorial-workflow-in-mediadrop.mp4', u'video', u'mp4', ), (u'creating-a-podcast-in-mediadrop', u'Creating a Podcast in MediaDrop', u'<p>This describes the process an administrator goes through in creating a podcast in MediaDrop. An administrator can enter information that will automatically generate the iTunes/RSS feed information. Any episodes published to a podcast will automatically publish to iTunes/RSS.</p>', u'This describes the process an administrator goes through in creating a podcast in MediaDrop. An administrator can enter information that will automatically generate the iTunes/RSS feed information. Any episodes published to a podcast will automatically publish to iTunes/RSS.', datetime.datetime(2010, 5, 13, 2, 33, 44), 100, u'http://static.mediadrop.net/files/videos/tutorial-create-podcast-in-mediadrop.mp4', u'video', u'mp4', ), (u'adding-a-video-in-mediadrop', u'Adding a Video in MediaDrop', u'<p>This screencast shows how video or audio can be added in MediaDrop.</p><p>MediaDrop supports a wide range of formats including (but not limited to): YouTube, Vimeo, Amazon S3, Bits on the Run, BrightCove, Kaltura, and either your own server or someone else\'s.</p><p>Videos can be uploaded in any format, but can only be published in web-ready formats such as FLV, MP3, M4V, MP4 etc.</p>', u'This screencast shows how video or audio can be added in MediaDrop.\nMediaDrop supports a wide range of formats including (but not limited to): YouTube, Vimeo, Amazon S3, Bits on the Run, BrightCove, Kaltura, and either your own server or someone else\'s.\nVideos can be uploaded in any format, but can only be published in web-ready formats such as FLV, MP3, M4V, MP4 etc.', datetime.datetime(2010, 5, 13, 02, 37, 36), 169, u'http://static.mediadrop.net/files/videos/tutorial-add-video-in-mediadrop.mp4', u'video', u'mp4', ), ] name = u'MediaDrop Team' email = u'*****@*****.**' for slug, title, desc, desc_plain, publish_on, duration, url, type_, container in instructional_media: media = Media() media.author = Author(name, email) media.description = desc media.description_plain = desc_plain media.duration = duration media.publish_on = publish_on media.slug = slug media.title = title media.type = type_ media_file = MediaFile() media_file.container = container media_file.created_on = publish_on media_file.display_name = os.path.basename(url) media_file.duration = duration media_file.type = type_ media_file.storage = remote_url_storage media_file.unique_id = url DBSession.add(media) DBSession.add(media_file) media.files.append(media_file) media.categories.append(category2) media.encoded = True media.reviewed = True media.publishable = True
def add_new_media_file(media, file=None, url=None): """Create a MediaFile instance from the given file or URL. This function MAY modify the given media object. :type media: :class:`~mediadrop.model.media.Media` instance :param media: The media object that this file or URL will belong to. :type file: :class:`cgi.FieldStorage` or None :param file: A freshly uploaded file object. :type url: unicode or None :param url: A remote URL string. :rtype: :class:`~mediadrop.model.media.MediaFile` :returns: A newly created media file instance. :raises StorageError: If the input file or URL cannot be stored with any of the registered storage engines. """ sorted_engines = enabled_engines() for engine in sorted_engines: try: meta = engine.parse(file=file, url=url) log.debug('Engine %r returned meta %r', engine, meta) break except UnsuitableEngineError: log.debug('Engine %r unsuitable for %r/%r', engine, file, url) continue else: raise StorageError(_('Unusable file or URL provided.'), None, None) from mediadrop.model import DBSession, MediaFile mf = MediaFile() mf.storage = engine mf.media = media mf.type = meta['type'] mf.display_name = meta.get('display_name', default_display_name(file, url)) mf.unique_id = meta.get('unique_id', None) mf.container = meta.get('container', None) mf.size = meta.get('size', None) mf.bitrate = meta.get('bitrate', None) mf.width = meta.get('width', None) mf.height = meta.get('height', None) mf.tags = "one, two, three" media.files.append(mf) DBSession.flush() unique_id = engine.store(media_file=mf, file=file, url=url, meta=meta) if unique_id: mf.unique_id = unique_id elif not mf.unique_id: raise StorageError('Engine %r returned no unique ID.', engine) #Read id3 tag and extract the details from there from mediadrop.lib.storage import LocalFileStorage if (isinstance(engine, LocalFileStorage)): mf.id3tags = engine.get_id3_tags(unique_id) mf.extracted_tags = engine.get_id3_user_tags(unique_id) print("ID3 tags: ", mf.id3tags) if (mf.id3tags != None): mf.display_name = mf.id3tags['title'][0] if not media.duration and meta.get('duration', 0): media.duration = meta['duration'] if not media.description and meta.get('description'): media.description = clean_xhtml(meta['description']) if not media.title: media.title = meta.get('title', None) or mf.display_name if media.type is None: media.type = mf.type if ('thumbnail_url' in meta or 'thumbnail_file' in meta) \ and (not has_thumbs(media) or has_default_thumbs(media)): thumb_file = meta.get('thumbnail_file', None) if thumb_file is not None: thumb_filename = thumb_file.filename else: thumb_url = meta['thumbnail_url'] thumb_filename = os.path.basename(thumb_url) # Download the image to a buffer and wrap it as a file-like object try: temp_img = urlopen(thumb_url) thumb_file = StringIO(temp_img.read()) temp_img.close() except URLError, e: log.exception(e) if thumb_file is not None: create_thumbs_for(media, thumb_file, thumb_filename) thumb_file.close()
def add_default_data(): log.info('Adding default data') settings = [ (u'email_media_uploaded', None), (u'email_comment_posted', None), (u'email_support_requests', None), (u'email_send_from', u'noreply@localhost'), (u'wording_user_uploads', N_(u"Upload your media using the form below. We'll review it and get back to you." )), (u'wording_administrative_notes', None), (u'wording_display_administrative_notes', u''), (u'popularity_decay_exponent', u'4'), (u'popularity_decay_lifetime', u'36'), (u'rich_text_editor', u'tinymce'), (u'google_analytics_uacct', u''), (u'featured_category', u'1'), (u'max_upload_size', u'314572800'), (u'ftp_storage', u'false'), (u'ftp_server', u'ftp.someserver.com'), (u'ftp_user', u'username'), (u'ftp_password', u'password'), (u'ftp_upload_directory', u'media'), (u'ftp_download_url', u'http://www.someserver.com/web/accessible/media/'), (u'ftp_upload_integrity_retries', u'10'), (u'akismet_key', u''), (u'akismet_url', u''), (u'req_comment_approval', u''), (u'use_embed_thumbnails', u'true'), (u'api_secret_key_required', u'true'), (u'api_secret_key', random_string(20)), (u'api_media_max_results', u'50'), (u'api_tree_max_depth', u'10'), (u'general_site_name', u'MediaDrop'), (u'general_site_title_display_order', u'prepend'), (u'sitemaps_display', u'True'), (u'rss_display', u'True'), (u'vulgarity_filtered_words', u''), (u'primary_language', u'en'), (u'advertising_banner_html', u''), (u'advertising_sidebar_html', u''), (u'comments_engine', u'builtin'), (u'facebook_appid', u''), (u'youtube_apikey', u''), ] settings.extend(appearance_settings) for key, value in settings: s = Setting() s.key = key s.value = value DBSession.add(s) admin_user = User() admin_user.user_name = u'admin' admin_user.display_name = u'Admin' admin_user.email_address = u'*****@*****.**' admin_user.password = u'admin' DBSession.add(admin_user) admin_group = Group(name=u'admins', display_name=u'Admins') admin_group.users.append(admin_user) DBSession.add(admin_group) editor_group = Group(name=u'editors', display_name=u'Editors') DBSession.add(editor_group) anonymous_group = Group(name=u'anonymous', display_name=u'Everyone (including guests)') DBSession.add(anonymous_group) authenticated_group = Group(name=u'authenticated', display_name=u'Logged in users') DBSession.add(authenticated_group) admin_perm = Permission(name=u'admin', groups=[admin_group], description=u'Grants access to the admin panel') DBSession.add(admin_perm) edit_perm = Permission(name=u'edit', groups=[admin_group, editor_group], description=u'Grants access to edit site content') DBSession.add(edit_perm) view_perm = Permission(name=u'view', groups=[admin_group, anonymous_group, editor_group], description=u'View published media') DBSession.add(view_perm) upload_perm = Permission( name=u'upload', groups=[admin_group, anonymous_group, editor_group], description=u'Can upload new media') DBSession.add(upload_perm) media_upload_perm = Permission() media_upload_perm.permission_name = u'MEDIA_UPLOAD' media_upload_perm.description = u'Grants the ability to upload new media' media_upload_perm.groups.append(admin_group) media_upload_perm.groups.append(editor_group) media_upload_perm.groups.append(anonymous_group) DBSession.add(edit_perm) category = Category(name=u'Featured', slug=u'featured') DBSession.add(category) category2 = Category(name=u'Instructional', slug=u'instructional') DBSession.add(category2) podcast = Podcast() podcast.slug = u'hello-world' podcast.title = u'Hello World' podcast.subtitle = u'My very first podcast!' podcast.description = u"""<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>""" podcast.category = u'Technology' podcast.author = Author(admin_user.display_name, admin_user.email_address) podcast.explicit = None podcast.copyright = u'Copyright 2009 Xyz' podcast.itunes_url = None podcast.feedburner_url = None DBSession.add(podcast) comment = Comment() comment.subject = u'Re: New Media' comment.author = AuthorWithIP(name=u'John Doe', ip=2130706433) comment.body = u'<p>Hello to you too!</p>' DBSession.add(comment) media = Media() media.type = None media.slug = u'new-media' media.reviewed = True media.encoded = False media.publishable = False media.title = u'New Media' media.subtitle = None media.description = u"""<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>""" media.description_plain = u"""Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.""" media.author = Author(admin_user.display_name, admin_user.email_address) media.categories.append(category) media.comments.append(comment) DBSession.add(media) #XXX The list of default players is actually defined in model.players # and should at some point be moved here to avoid inconsistency # between the default storage engines and default players. remote_url_storage = RemoteURLStorage() default_engines = [ LocalFileStorage(), remote_url_storage, YoutubeStorage(), VimeoStorage(), BlipTVStorage(), DailyMotionStorage(), ] for engine in default_engines: DBSession.add(engine) import datetime instructional_media = [ ( u'workflow-in-mediadrop', u'Workflow in MediaDrop', u'<p>This sceencast explains the publish status feature in MediaDrop.</p><p>Initially all videos uploaded through the front-end or admin panel are placed under "awaiting review" status. Once the administrator hits the "review complete" button, they can upload media. Videos can be added in any format, however, they can only be published if they are in a web-ready format such as FLV, M4V, MP3, or MP4. Alternatively, if they are published through Youtube or Vimeo the encoding step is skipped</p><p>Once uploaded and encoded the administrator can then publish the video.</p>', u'This sceencast explains the publish status feature in MediaDrop.\nInitially all videos uploaded through the front-end or admin panel are placed under \"awaiting review\" status. Once the administrator hits the \"review complete\" button, they can upload media. Videos can be added in any format, however, they can only be published if they are in a web-ready format such as FLV, M4V, MP3, or MP4. Alternatively, if they are published through Youtube or Vimeo the encoding step is skipped\nOnce uploaded and encoded the administrator can then publish the video.', datetime.datetime(2010, 5, 13, 2, 29, 40), 218, u'http://static.mediadrop.video/files/videos/tutorial-workflow-in-mediadrop.mp4', u'video', u'mp4', ), ( u'creating-a-podcast-in-mediadrop', u'Creating a Podcast in MediaDrop', u'<p>This describes the process an administrator goes through in creating a podcast in MediaDrop. An administrator can enter information that will automatically generate the iTunes/RSS feed information. Any episodes published to a podcast will automatically publish to iTunes/RSS.</p>', u'This describes the process an administrator goes through in creating a podcast in MediaDrop. An administrator can enter information that will automatically generate the iTunes/RSS feed information. Any episodes published to a podcast will automatically publish to iTunes/RSS.', datetime.datetime(2010, 5, 13, 2, 33, 44), 100, u'http://static.mediadrop.video/files/videos/tutorial-create-podcast-in-mediadrop.mp4', u'video', u'mp4', ), ( u'adding-a-video-in-mediadrop', u'Adding a Video in MediaDrop', u'<p>This screencast shows how video or audio can be added in MediaDrop.</p><p>MediaDrop supports a wide range of formats including (but not limited to): YouTube, Vimeo, Amazon S3, Bits on the Run, BrightCove, Kaltura, and either your own server or someone else\'s.</p><p>Videos can be uploaded in any format, but can only be published in web-ready formats such as FLV, MP3, M4V, MP4 etc.</p>', u'This screencast shows how video or audio can be added in MediaDrop.\nMediaDrop supports a wide range of formats including (but not limited to): YouTube, Vimeo, Amazon S3, Bits on the Run, BrightCove, Kaltura, and either your own server or someone else\'s.\nVideos can be uploaded in any format, but can only be published in web-ready formats such as FLV, MP3, M4V, MP4 etc.', datetime.datetime(2010, 5, 13, 02, 37, 36), 169, u'http://static.mediadrop.video/files/videos/tutorial-add-video-in-mediadrop.mp4', u'video', u'mp4', ), ] name = u'MediaDrop Team' email = u'*****@*****.**' for slug, title, desc, desc_plain, publish_on, duration, url, type_, container in instructional_media: media = Media() media.author = Author(name, email) media.description = desc media.description_plain = desc_plain media.duration = duration media.publish_on = publish_on media.slug = slug media.title = title media.type = type_ media_file = MediaFile() media_file.container = container media_file.created_on = publish_on media_file.display_name = os.path.basename(url) media_file.duration = duration media_file.type = type_ media_file.storage = remote_url_storage media_file.unique_id = url DBSession.add(media) DBSession.add(media_file) media.files.append(media_file) media.categories.append(category2) media.encoded = True media.reviewed = True media.publishable = True
def add_new_media_file(media, file=None, url=None): """Create a MediaFile instance from the given file or URL. This function MAY modify the given media object. :type media: :class:`~mediadrop.model.media.Media` instance :param media: The media object that this file or URL will belong to. :type file: :class:`cgi.FieldStorage` or None :param file: A freshly uploaded file object. :type url: unicode or None :param url: A remote URL string. :rtype: :class:`~mediadrop.model.media.MediaFile` :returns: A newly created media file instance. :raises StorageError: If the input file or URL cannot be stored with any of the registered storage engines. """ sorted_engines = enabled_engines() for engine in sorted_engines: try: meta = engine.parse(file=file, url=url) log.debug('Engine %r returned meta %r', engine, meta) break except UnsuitableEngineError: log.debug('Engine %r unsuitable for %r/%r', engine, file, url) continue else: raise StorageError(_('Unusable file or URL provided.'), None, None) from mediadrop.model import DBSession, MediaFile mf = MediaFile() mf.storage = engine mf.media = media mf.type = meta['type'] mf.display_name = meta.get('display_name', default_display_name(file, url)) mf.unique_id = meta.get('unique_id', None) mf.container = meta.get('container', None) mf.size = meta.get('size', None) mf.bitrate = meta.get('bitrate', None) mf.width = meta.get('width', None) mf.height = meta.get('height', None) media.files.append(mf) DBSession.flush() unique_id = engine.store(media_file=mf, file=file, url=url, meta=meta) if unique_id: mf.unique_id = unique_id elif not mf.unique_id: raise StorageError('Engine %r returned no unique ID.', engine) if not media.duration and meta.get('duration', 0): media.duration = meta['duration'] if not media.description and meta.get('description'): media.description = clean_xhtml(meta['description']) if not media.title: media.title = meta.get('title', None) or mf.display_name if media.type is None: media.type = mf.type if ('thumbnail_url' in meta or 'thumbnail_file' in meta) \ and (not has_thumbs(media) or has_default_thumbs(media)): thumb_file = meta.get('thumbnail_file', None) if thumb_file is not None: thumb_filename = thumb_file.filename else: thumb_url = meta['thumbnail_url'] thumb_filename = os.path.basename(thumb_url) # Download the image to a buffer and wrap it as a file-like object try: temp_img = urlopen(thumb_url) thumb_file = StringIO(temp_img.read()) temp_img.close() except URLError, e: log.exception(e) if thumb_file is not None: create_thumbs_for(media, thumb_file, thumb_filename) thumb_file.close()