def _add_new_media_file(media, original_filename, file): # FIXME: I think this will raise a KeyError if the uploaded # file doesn't have an extension. file_ext = os.path.splitext(original_filename)[1].lower()[1:] # set the file paths depending on the file type media_file = MediaFile() media_file.type = file_ext media_file.url = 'dummy_url' # model requires that url not NULL media_file.is_original = True media_file.enable_player = media_file.is_playable media_file.enable_feed = not media_file.is_embeddable media_file.size = os.fstat(file.fileno())[6] # update media relations media.files.append(media_file) # add the media file (and its media, if new) to the database to get IDs DBSession.add(media_file) DBSession.flush() # copy the file to its permanent location file_name = '%d_%d_%s.%s' % (media.id, media_file.id, media.slug, file_ext) file_url = _store_media_file(file, file_name) media_file.url = file_url return media_file
def media_file_from_url(url): """Create and return a MediaFile object representing a given URL. Also returns the URL to a suitable thumbnail image (or None) and the duration of the media file in seconds (or None). Does not add the created MediaFile to the database. """ thumb_url = None duration = None title = None media_file = MediaFile() # Parse the URL checking for known embeddables like YouTube embed = parse_embed_url(url) if embed: media_file.type = embed['type'] media_file.container = embed['container'] media_file.embed = embed['id'] title = embed['title'] if title: media_file.display_name = title else: media_file.display_name = '%s ID: %s' % \ (embed['container'].capitalize(), media_file.embed) thumb_url = embed['thumb_url'] duration = embed['duration'] else: # Check for types we can play ourselves name, ext, container = base_ext_container_from_uri(url) media_file.type = guess_media_type(ext) media_file.container = container media_file.url = url media_file.display_name = os.path.basename(url) return media_file, thumb_url, duration, title
def _save_media_obj(self, name, email, title, description, tags, file, url): # create our media object as a status-less placeholder initially media_obj = Media() media_obj.author = Author(name, email) media_obj.title = title media_obj.slug = get_available_slug(Media, title) media_obj.description = description media_obj.notes = fetch_setting('wording_additional_notes') media_obj.set_tags(tags) # Create a media object, add it to the media_obj, and store the file permanently. if file is not None: media_file = _add_new_media_file(media_obj, file.filename, file.file) else: media_file = MediaFile() url = unicode(url) embed = parse_embed_url(url) if embed: media_file.type = embed['type'] media_file.container = embed['container'] media_file.embed = embed['id'] media_file.display_name = '%s ID: %s' % \ (embed['container'].capitalize(), media_file.embed) else: # Check for types we can play ourselves ext = os.path.splitext(url)[1].lower()[1:] container = guess_container_format(ext) if container in accepted_extensions(): media_file.type = guess_media_type(container) media_file.container = container media_file.url = url media_file.display_name = os.path.basename(url) else: # Trigger a validation error on the whole form. raise formencode.Invalid('Please specify a URL or upload a file below.', None, None) media_obj.files.append(media_file) # Add the final changes. media_obj.update_status() DBSession.add(media_obj) DBSession.flush() create_default_thumbs_for(media_obj) return media_obj
def media_file_from_filename(filename): """Create and return a MediaFile object representing a given filename. Does not store the file, or add the created MediaFile to the database. """ name, ext, container = base_ext_container_from_uri(filename) # set the file paths depending on the file type media_file = MediaFile() media_file.display_name = '%s.%s' % (name, container) media_file.container = container media_file.type = guess_media_type(ext) # File has not been stored. It has neither URL nor Filename. media_file.url = None media_file.file_name = None return media_file
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', u"Upload your media using the form below. We'll review it and get back to you."), (u'wording_additional_notes', None), (u'popularity_decay_exponent', u'4'), (u'popularity_decay_lifetime', u'36'), (u'rich_text_editor', u'tinymce'), (u'google_analytics_uacct', u''), (u'flash_player', u'jwplayer'), (u'html5_player', u'html5'), (u'player_type', u'best'), (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'false'), (u'use_embed_thumbnails', u'true'), ] for key, value in settings: s = Setting() s.key = key s.value = value DBSession.add(s) u = User() u.user_name = u'admin' u.display_name = u'Admin' u.email_address = u'*****@*****.**' u.password = u'admin' DBSession.add(u) g = Group() g.group_name = u'admins' g.display_name = u'Admins' g.users.append(u) DBSession.add(g) p = Permission() p.permission_name = u'admin' p.description = u'Grants access to the admin panel' p.groups.append(g) DBSession.add(p) category = Category() category.name = u'Featured' category.slug = u'featured' DBSession.add(category) category2 = Category() category2.name = u'Instructional' category2.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(u.display_name, u.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(u.display_name, u.email_address) media.categories.append(category) media.comments.append(comment) DBSession.add(media) import datetime instructional_media = [ (u'workflow-in-mediacore', u'Workflow in MediaCore', u'<p>This sceencast explains the publish status feature in MediaCore.</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 MediaCore.\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://getmediacore.com/files/tutorial-workflow-in-mediacore.mp4', u'video', u'flv', ), (u'creating-a-podcast-in-mediacore', u'Creating a Podcast in MediaCore', u'<p>This describes the process an administrator goes through in creating a podcast in MediaCore. 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 MediaCore. 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://getmediacore.com/files/tutorial-create-podcast-in-mediacore.mp4', u'video', u'flv', ), (u'adding-a-video-in-mediacore', u'Adding a Video in MediaCore', u'<p>This screencast shows how video or audio can be added in MediaCore.</p><p>MediaCore supports a wide range of formats including (but not limited to): YouTube, Vimeo, Google Video, 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 MediaCore.\nMediaCore supports a wide range of formats including (but not limited to): YouTube, Vimeo, Google Video, 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://getmediacore.com/files/tutorial-add-video-in-mediacore.mp4', u'video', u'flv', ), ] name = u'MediaCore 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_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.url = 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_file(self, id, file=None, url=None, **kwargs): """Save action for the :class:`~mediacore.forms.media.AddFileForm`. Creates a new :class:`~mediacore.model.media.MediaFile` from the uploaded file or the local or remote URL. :param id: Media ID. If ``"new"`` a new Media stub is created with :func:`~mediacore.model.media.create_media_stub`. :type id: :class:`int` or ``"new"`` :param file: The uploaded file :type file: :class:`cgi.FieldStorage` or ``None`` :param url: A URL to a recognizable audio or video file :type url: :class:`unicode` or ``None`` :rtype: JSON dict :returns: success bool message Error message, if unsuccessful media_id The :attr:`~mediacore.model.media.Media.id` which is important if new media has just been created. file_id The :attr:`~mediacore.model.media.MediaFile.id` for the newly created file. edit_form The rendered XHTML :class:`~mediacore.forms.media.EditFileForm` for this file. status_form The rendered XHTML :class:`~mediacore.forms.media.UpdateStatusForm` """ if id == 'new': media = create_media_stub() else: media = fetch_row(Media, id, incl_trash=True) try: if file is not None: # Create a media object, add it to the video, and store the file permanently. media_file = _add_new_media_file(media, file.filename, file.file) elif url: media_file = MediaFile() # Parse the URL checking for known embeddables like YouTube for type, info in config.embeddable_filetypes.iteritems(): match = re.match(info['pattern'], url) if match: media_file.type = type media_file.url = match.group('id') media_file.enable_feed = False break else: # Check for types we can play ourselves type = os.path.splitext(url)[1].lower()[1:] for playable_types in config.playable_types.itervalues(): if type in playable_types: media_file.type = type media_file.url = url break else: raise Exception, 'Unsupported URL %s' % url else: raise Exception, 'Given no action to perform.' media.files.append(media_file) media.update_type() media.update_status() DBSession.add(media) DBSession.flush() # Render some widgets so the XHTML can be injected into the page edit_form_xhtml = unicode(edit_file_form.display( action=url_for(action='edit_file', id=media.id), file=media_file)) status_form_xhtml = unicode(update_status_form.display( action=url_for(action='update_status', id=media.id), media=media)) return dict( success = True, media_id = media.id, file_id = media_file.id, edit_form = edit_form_xhtml, status_form = status_form_xhtml, ) except Exception, e: return dict( success = False, message = e.message, )
def add_file(self, id, file=None, url=None, **kwargs): """Save action for the :class:`~mediacore.forms.admin.media.AddFileForm`. Creates a new :class:`~mediacore.model.media.MediaFile` from the uploaded file or the local or remote URL. :param id: Media ID. If ``"new"`` a new Media stub is created with :func:`~mediacore.model.media.create_media_stub`. :type id: :class:`int` or ``"new"`` :param file: The uploaded file :type file: :class:`cgi.FieldStorage` or ``None`` :param url: A URL to a recognizable audio or video file :type url: :class:`unicode` or ``None`` :rtype: JSON dict :returns: success bool message Error message, if unsuccessful media_id The :attr:`~mediacore.model.media.Media.id` which is important if new media has just been created. file_id The :attr:`~mediacore.model.media.MediaFile.id` for the newly created file. edit_form The rendered XHTML :class:`~mediacore.forms.admin.media.EditFileForm` for this file. status_form The rendered XHTML :class:`~mediacore.forms.admin.media.UpdateStatusForm` """ if id == 'new': media = create_media_stub() else: media = fetch_row(Media, id) data = dict(success=False) if file is not None: # Create a media object, add it to the video, and store the file permanently. media_file = _add_new_media_file(media, file.filename, file.file) data['success'] = True elif url: media_file = MediaFile() # Parse the URL checking for known embeddables like YouTube for type, info in external_embedded_containers.iteritems(): match = info['pattern'].match(url) if match: media_file.type = guess_media_type(type) media_file.container = type media_file.embed = match.group('id') media_file.display_name = type.capitalize() + ' ID: ' + media_file.embed data['success'] = True break else: # Check for types we can play ourselves try: ext = os.path.splitext(url)[1].lower()[1:] container = guess_container_format(ext) except KeyError: container = None for conts in playable_containers.itervalues(): if container in conts: media_file.type = guess_media_type(container) media_file.container = container media_file.url = url media_file.display_name = os.path.basename(url) data['success'] = True break else: data['message'] = 'Unsupported URL' else: data['message'] = 'No action to perform.' if data['success']: media.files.append(media_file) media.update_type() media.update_status() DBSession.add(media) DBSession.flush() if id == 'new': helpers.create_default_thumbs_for(media) # Render some widgets so the XHTML can be injected into the page edit_form_xhtml = unicode(edit_file_form.display( action=url_for(action='edit_file', id=media.id), file=media_file)) status_form_xhtml = unicode(update_status_form.display( action=url_for(action='update_status', id=media.id), media=media)) data.update(dict( media_id = media.id, file_id = media_file.id, file_type = media_file.type, edit_form = edit_form_xhtml, status_form = status_form_xhtml, )) return data