aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin
diff options
context:
space:
mode:
Diffstat (limited to 'mediagoblin')
-rw-r--r--mediagoblin/media_types/audio/__init__.py2
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/ascii.html4
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/audio.html2
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/image.html14
-rw-r--r--mediagoblin/templates/mediagoblin/media_displays/video.html22
-rw-r--r--mediagoblin/templates/mediagoblin/user_pages/media.html48
-rw-r--r--mediagoblin/tools/exif.py15
-rw-r--r--mediagoblin/tools/files.py19
-rw-r--r--mediagoblin/user_pages/views.py13
9 files changed, 99 insertions, 40 deletions
diff --git a/mediagoblin/media_types/audio/__init__.py b/mediagoblin/media_types/audio/__init__.py
index 9b33f9e3..4f3ead60 100644
--- a/mediagoblin/media_types/audio/__init__.py
+++ b/mediagoblin/media_types/audio/__init__.py
@@ -22,4 +22,4 @@ MEDIA_MANAGER = {
'processor': process_audio,
'sniff_handler': sniff_handler,
'display_template': 'mediagoblin/media_displays/audio.html',
- 'accepted_extensions': ['mp3', 'flac', 'ogg', 'wav', 'm4a']}
+ 'accepted_extensions': ['mp3', 'flac', 'wav', 'm4a']}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/ascii.html b/mediagoblin/templates/mediagoblin/media_displays/ascii.html
index 6330595b..3cc5e0ab 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/ascii.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/ascii.html
@@ -27,7 +27,11 @@
{%- endautoescape -%}
</pre>
</div>
+{% endblock %}
+
+{% block mediagoblin_sidebar %}
{% if 'original' in media.media_files %}
+ <h3>{% trans %}Download{% endtrans %}</h3>
<p>
<a href="{{ request.app.public_store.file_url(
media.media_files['original']) }}">
diff --git a/mediagoblin/templates/mediagoblin/media_displays/audio.html b/mediagoblin/templates/mediagoblin/media_displays/audio.html
index 9713aa49..95bc6e88 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/audio.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/audio.html
@@ -57,7 +57,7 @@
<ul>
{% if 'original' in media.media_files %}
<li><a href="{{ request.app.public_store.file_url(
- media.media_files.original) }}">{% trans %}original file{% endtrans %}</a>
+ media.media_files.original) }}">{% trans %}Original file{% endtrans %}</a>
{% endif %}
<li><a href="{{ request.app.public_store.file_url(
media.media_files.webm_audio) }}">{% trans %}WebM file (Vorbis codec){% endtrans %}</a>
diff --git a/mediagoblin/templates/mediagoblin/media_displays/image.html b/mediagoblin/templates/mediagoblin/media_displays/image.html
index 7dfecb11..86725cca 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/image.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/image.html
@@ -17,3 +17,17 @@
#}
{% extends 'mediagoblin/user_pages/media.html' %}
+
+{% block mediagoblin_sidebar %}
+ {% if 'original' in media.media_files %}
+ <h3>{% trans %}Download{% endtrans %}</h3>
+ <p>
+ <a href="{{ request.app.public_store.file_url(
+ media.media_files['original']) }}">
+ {%- trans -%}
+ Original
+ {%- endtrans -%}
+ </a>
+ </p>
+ {% endif %}
+{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/media_displays/video.html b/mediagoblin/templates/mediagoblin/media_displays/video.html
index 86c277aa..d72de2ca 100644
--- a/mediagoblin/templates/mediagoblin/media_displays/video.html
+++ b/mediagoblin/templates/mediagoblin/media_displays/video.html
@@ -46,14 +46,16 @@
</div>
</video>
</div>
- {% if 'original' in media.media_files %}
- <p>
- <a href="{{ request.app.public_store.file_url(
- media.media_files['original']) }}">
- {%- trans -%}
- Original
- {%- endtrans -%}
- </a>
- </p>
- {% endif %}
+{% endblock %}
+
+{% block mediagoblin_sidebar %}
+ <h3>{% trans %}Download{% endtrans %}</h3>
+ <ul>
+ {% if 'original' in media.media_files %}
+ <li><a href="{{ request.app.public_store.file_url(
+ media.media_files.original) }}">{% trans %}Original file{% endtrans %}</a>
+ {% endif %}
+ <li><a href="{{ request.app.public_store.file_url(
+ media.media_files.webm_640) }}">{% trans %}WebM file (640p; VP8/Vorbis){% endtrans %}</a>
+ </ul>
{% endblock %}
diff --git a/mediagoblin/templates/mediagoblin/user_pages/media.html b/mediagoblin/templates/mediagoblin/user_pages/media.html
index 21990442..15ac4988 100644
--- a/mediagoblin/templates/mediagoblin/user_pages/media.html
+++ b/mediagoblin/templates/mediagoblin/user_pages/media.html
@@ -93,28 +93,6 @@
{% autoescape False %}
<p>{{ media.description_html }}</p>
{% endautoescape %}
- {% if media.attachment_files|count %}
- <h3>Attachments</h3>
- <ul>
- {% for attachment in media.attachment_files %}
- <li>
- <a href="{{ request.app.public_store.file_url(attachment.filepath) }}">
- {{ attachment.name }}
- </a>
- </li>
- {% endfor %}
- </ul>
- {% endif %}
- {% if app_config['allow_attachments']
- and request.user
- and (media.uploader == request.user._id
- or request.user.is_admin) %}
- <p>
- <a href="{{ request.urlgen('mediagoblin.edit.attachments',
- user=media.get_uploader.username,
- media=media._id) }}">Add attachment</a>
- </p>
- {% endif %}
{% if comments %}
<a
{% if not request.user %}
@@ -185,6 +163,32 @@
{% include "mediagoblin/utils/exif.html" %}
+ {% if media.attachment_files|count %}
+ <h3>{% trans %}Attachments{% endtrans %}</h3>
+ <ul>
+ {% for attachment in media.attachment_files %}
+ <li>
+ <a href="{{ request.app.public_store.file_url(attachment.filepath) }}">
+ {{ attachment.name }}
+ </a>
+ </li>
+ {% endfor %}
+ </ul>
+ {% endif %}
+ {% if app_config['allow_attachments']
+ and request.user
+ and (media.uploader == request.user._id
+ or request.user.is_admin) %}
+ {% if not media.attachment_files|count %}
+ <h3>{% trans %}Attachments{% endtrans %}</h3>
+ {% endif %}
+ <p>
+ <a href="{{ request.urlgen('mediagoblin.edit.attachments',
+ user=media.get_uploader.username,
+ media=media._id) }}">{% trans %}Add attachment{% endtrans %}</a>
+ </p>
+ {% endif %}
+
{% block mediagoblin_sidebar %}
{% endblock %}
</div>
diff --git a/mediagoblin/tools/exif.py b/mediagoblin/tools/exif.py
index c4fc1fe5..98c3de27 100644
--- a/mediagoblin/tools/exif.py
+++ b/mediagoblin/tools/exif.py
@@ -102,6 +102,10 @@ def clean_exif(exif):
def _ifd_tag_to_dict(tag):
+ '''
+ Takes an IFD tag object from the EXIF library and converts it to a dict
+ that can be stored as JSON in the database.
+ '''
data = {
'printable': tag.printable,
'tag': tag.tag,
@@ -109,6 +113,11 @@ def _ifd_tag_to_dict(tag):
'field_offset': tag.field_offset,
'field_length': tag.field_length,
'values': None}
+
+ if isinstance(tag.printable, str):
+ # Force it to be decoded as UTF-8 so that it'll fit into the DB
+ data['printable'] = tag.printable.decode('utf8', 'replace')
+
if type(tag.values) == list:
data['values'] = []
for val in tag.values:
@@ -118,7 +127,11 @@ def _ifd_tag_to_dict(tag):
else:
data['values'].append(val)
else:
- data['values'] = tag.values
+ if isinstance(tag.values, str):
+ # Force UTF-8, so that it fits into the DB
+ data['values'] = tag.values.decode('utf8', 'replace')
+ else:
+ data['values'] = tag.values
return data
diff --git a/mediagoblin/tools/files.py b/mediagoblin/tools/files.py
index 25c1a6e6..fd38f05e 100644
--- a/mediagoblin/tools/files.py
+++ b/mediagoblin/tools/files.py
@@ -16,6 +16,7 @@
from mediagoblin import mg_globals
+
def delete_media_files(media):
"""
Delete all files associated with a MediaEntry
@@ -23,10 +24,20 @@ def delete_media_files(media):
Arguments:
- media: A MediaEntry document
"""
+ no_such_files = []
for listpath in media.media_files.itervalues():
- mg_globals.public_store.delete_file(
- listpath)
+ try:
+ mg_globals.public_store.delete_file(
+ listpath)
+ except OSError:
+ no_such_files.append("/".join(listpath))
for attachment in media.attachment_files:
- mg_globals.public_store.delete_file(
- attachment['filepath'])
+ try:
+ mg_globals.public_store.delete_file(
+ attachment['filepath'])
+ except OSError:
+ no_such_files.append("/".join(attachment))
+
+ if no_such_files:
+ raise OSError(", ".join(no_such_files))
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index a9b17b3b..0e061c46 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from webob import exc
+import logging
from mediagoblin import messages, mg_globals
from mediagoblin.db.util import DESCENDING, ObjectId
@@ -33,6 +34,9 @@ from werkzeug.contrib.atom import AtomFeed
from mediagoblin.media_types import get_media_manager
+_log = logging.getLogger(__name__)
+_log.setLevel(logging.DEBUG)
+
@uses_pagination
def user_home(request, page):
"""'Homepage' of a User()"""
@@ -185,7 +189,14 @@ def media_confirm_delete(request, media):
comment.delete()
# Delete all files on the public storage
- delete_media_files(media)
+ try:
+ delete_media_files(media)
+ except OSError, error:
+ _log.error('No such files from the user "{1}"'
+ ' to delete: {0}'.format(str(error), username))
+ messages.add_message(request, messages.ERROR,
+ _('Some of the files with this entry seem'
+ ' to be missing. Deleting anyway.'))
media.delete()
messages.add_message(