<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mediagoblin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dthompson</id>
	<title>GNU MediaGoblin Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mediagoblin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Dthompson"/>
	<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/Special:Contributions/Dthompson"/>
	<updated>2026-04-19T21:09:44Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Media_Types&amp;diff=1248</id>
		<title>Media Types</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Media_Types&amp;diff=1248"/>
		<updated>2013-04-14T16:57:25Z</updated>

		<summary type="html">&lt;p&gt;Dthompson: Fix typo.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Media types are plugin-like &lt;br /&gt;
&lt;br /&gt;
== File structure ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mediagoblin/media_types/video&lt;br /&gt;
├── __init__.py      # Contains the MEDIA_MANAGER&lt;br /&gt;
├── migrations.py    # DB migrations&lt;br /&gt;
├── models.py        # DB models&lt;br /&gt;
├── processing.py    # De-facto standard main file&lt;br /&gt;
├── ....             # Additional files&lt;br /&gt;
└── ....             # &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MEDIA_MANAGER ==&lt;br /&gt;
&lt;br /&gt;
The media manager contains metadata about the media type,&lt;br /&gt;
along with a reference to the method used to process the media.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
MEDIA_MANAGER = {&lt;br /&gt;
    &amp;quot;human_readable&amp;quot;: &amp;quot;Video&amp;quot;,&lt;br /&gt;
    &amp;quot;processor&amp;quot;: process_video,&lt;br /&gt;
    &amp;quot;sniff_handler&amp;quot;: sniff_handler,&lt;br /&gt;
    &amp;quot;display_template&amp;quot;: &amp;quot;mediagoblin/media_displays/video.html&amp;quot;,&lt;br /&gt;
    &amp;quot;default_thumb&amp;quot;: &amp;quot;images/media_thumbs/video.jpg&amp;quot;,&lt;br /&gt;
    &amp;quot;accepted_extensions&amp;quot;: [&lt;br /&gt;
        &amp;quot;mp4&amp;quot;, &amp;quot;mov&amp;quot;, &amp;quot;webm&amp;quot;, &amp;quot;avi&amp;quot;, &amp;quot;3gp&amp;quot;, &amp;quot;3gpp&amp;quot;, &amp;quot;mkv&amp;quot;, &amp;quot;ogv&amp;quot;, &amp;quot;m4v&amp;quot;]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== human_readable ====&lt;br /&gt;
&lt;br /&gt;
A human-readable name for the media type.&lt;br /&gt;
&lt;br /&gt;
==== processor ====&lt;br /&gt;
&lt;br /&gt;
A reference to the media processing method for the media type.&lt;br /&gt;
&lt;br /&gt;
==== sniff_handler ====&lt;br /&gt;
&lt;br /&gt;
A reference to the sniffing handler for the media type.&lt;br /&gt;
&lt;br /&gt;
==== display_template ====&lt;br /&gt;
&lt;br /&gt;
A path to the [[Media Types/Display|display template]], relative to &amp;lt;code&amp;gt;mediagoblin/templates&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== default_thumb ====&lt;br /&gt;
&lt;br /&gt;
No current use.&lt;br /&gt;
&lt;br /&gt;
==== accepted_extensions ====&lt;br /&gt;
&lt;br /&gt;
A list containing file extensions that should be associated to this media type. This is used as a fast way to get the media type based on an uploaded file before MediaGoblin falls back to sniffing.&lt;br /&gt;
&lt;br /&gt;
== Negotiating media type based on a file upload ==&lt;br /&gt;
&lt;br /&gt;
To decide which of the available media types that should handle a file upload, we first match the file extension to extensions in the available [[Media Types#MEDIA_MANAGER|MEDIA_MANAGERS]], then we resort to sniffing.&lt;br /&gt;
&lt;br /&gt;
=== Sniffing ===&lt;br /&gt;
&lt;br /&gt;
As a second step in media type negotiation, if the file-extension based lookup fails, &amp;lt;code&amp;gt;mediagoblin.media_types.get_media_type_and_manager&amp;lt;/code&amp;gt; will call &amp;lt;code&amp;gt;mediagoblin.media_types.sniff_media&amp;lt;/code&amp;gt;, which will iterate and run all the enabled media types&#039;s sniffing handlers.&lt;br /&gt;
&lt;br /&gt;
The sniffing handlers can respond with either true or false, responding with true indicates that the media type believes it can parse the file.&lt;br /&gt;
&lt;br /&gt;
This is mediagoblin.media_types.video.processing.sniff_handler.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
def sniff_handler(media_file, **kw):&lt;br /&gt;
    transcoder = transcoders.VideoTranscoder()&lt;br /&gt;
    data = transcoder.discover(media_file.name)&lt;br /&gt;
&lt;br /&gt;
    _log.debug(&#039;Discovered: {0}&#039;.format(data))&lt;br /&gt;
&lt;br /&gt;
    if not data:&lt;br /&gt;
        _log.error(&#039;Could not discover {0}&#039;.format(&lt;br /&gt;
                kw.get(&#039;media&#039;)))&lt;br /&gt;
        return False&lt;br /&gt;
&lt;br /&gt;
    if data[&#039;is_video&#039;] == True:&lt;br /&gt;
        return True&lt;br /&gt;
&lt;br /&gt;
    return False&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Dthompson</name></author>
	</entry>
</feed>