<?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=Saul</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=Saul"/>
	<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/Special:Contributions/Saul"/>
	<updated>2026-06-07T15:33:27Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1597</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1597"/>
		<updated>2014-10-16T19:23:06Z</updated>

		<summary type="html">&lt;p&gt;Saul: Undo revision 1596 by VenusHongmw (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Want to Join the MediaGoblin Community? =&lt;br /&gt;
&lt;br /&gt;
We’re really glad that you want to join the MediaGoblin community!&lt;br /&gt;
&lt;br /&gt;
There are a variety of ways to help and support MediaGoblin and to join the team.  If you want to code, great, if not, even better!  MediaGoblin interested contributors in many different roles: users, system administrators, technical writers, testers, evangelists, UI/UX and graphics designers, cheerleaders, and dreamers.&lt;br /&gt;
&lt;br /&gt;
We observe the [https://www.djangoproject.com/conduct/ Django code of conduct].  Be welcoming, friendly, and patient!&lt;br /&gt;
&lt;br /&gt;
This wiki covers a variety of ways that you can get involved with MediaGoblin as well as instructions on how to get started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hang out with the MediaGoblin folk ==&lt;br /&gt;
&lt;br /&gt;
MediaGoblin has a mailing list and an IRC channel where we hang out.  See [http://mediagoblin.org/pages/join.html our join page] for links.&lt;br /&gt;
&lt;br /&gt;
Please drop by and say “Hi!”  And, if you’re looking for something to do, just ask---there’s always work to be done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Take Part in the Monthly Meetings ==&lt;br /&gt;
&lt;br /&gt;
Each month is a [[:Meeting|Meeting]]. You can take part and help decide on the future of MediaGoblin. Or just be around and see what&#039;s happening live!&lt;br /&gt;
&lt;br /&gt;
=How Can you help ?=&lt;br /&gt;
&lt;br /&gt;
First and foremost, for many (but not all) types of contributions you may want to set up a local instance.  To learn how to do this, see the [[HackingHowto]] page.  (If you&#039;re not familiar with command line level things, there are still ways you can help below!)&lt;br /&gt;
&lt;br /&gt;
== File Bugs / Triage Bugs ==&lt;br /&gt;
&lt;br /&gt;
Issue reports are critical for all projects.  Identified bugs give developers a basis for beginning work, and providing an idea of what features and issues are most important to users and the overall usability of the software.  If you identify errors, flaws, unexpected behaviors, or deficits that impede use, file a bug.&lt;br /&gt;
&lt;br /&gt;
* [[File Bugs]] -- notes on filing new bugs/issues/feature requests&lt;br /&gt;
* [[Feature Ideas]] -- notes on possible features&lt;br /&gt;
* [[Triage Bugs]] -- notes on triaging&lt;br /&gt;
* [[BugTriageDay]] -- every other Thursday is bug triage day where anyone can help out triaging bugs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Send Encouragement / Spread the Word ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, a nice word, simple encouragement, and interest in the work we’re doing is enough to inspire a tizzy of productive work.  Just a bit more interest and encouragement can even make the difference between a complete feature and limited functionality; between a completed milestone and lost momentum.&lt;br /&gt;
&lt;br /&gt;
Similarly, MediaGoblin, and the movement for free network services, is always in need of encouragement.  Use free network services, understand the principals behind the movement, be able to articulate the benefits of free network services and the problems with psudo-free applications that don’t respect the users’ freedom.&lt;br /&gt;
&lt;br /&gt;
Write a blog post, post a status update, drop by the listserv or join #mediagoblin on freenode.net and let us know.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Documentation / Edit Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation quick start]] - How to contribute to the documentation effort.&lt;br /&gt;
* [[ManualStandards]] - covers the standards for writing the user manual (forthcoming.) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
Do you have access to the web? Do you like sharing your opinions? If so, we need your help to test MediaGoblin! Testers play around with the current test instance, note what operating system and browser they use (notes on multiple set-ups are also helpful) and take some notes. That&#039;s it! It&#039;s a very important task that doesn&#039;t require any special knowledge and you&#039;re done in under an hour. Ready to help?  &lt;br /&gt;
&lt;br /&gt;
* [[User Experience]] - user experience testing.  Includes link to an instance you can try!&lt;br /&gt;
* [[UnitTests|Unit Tests]] - all about the unit tests&lt;br /&gt;
* [[Manual_Functional_Testing|Manual Functional Testing]] - a great way to get to know MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Translate MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
If you know English and another language and feel comfortable translating elements of the interface or even the documentation, we’d love to have help translating the software and resources.&lt;br /&gt;
Translating MediaGoblin is very easy with a web interface, so there is no programming knowledge required at all.&lt;br /&gt;
&lt;br /&gt;
* [[Translations]] - How to translate stuff or update the translations&lt;br /&gt;
&lt;br /&gt;
== Become a User ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
We’re building MediaGoblin for us and for you but really you’re one of us and I am you and we are we and MediaGoblin is the walrus.&lt;br /&gt;
&lt;br /&gt;
We&#039;re planning to launch our own public instance of MediaGoblin in the near future--probably in the September/October 2011 time frame.  When we do, sign up for an account, use the service and relish in the thought that this service comes with a heaping side of Freedom and you can salt and pepper it to your liking.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Help Others ==&lt;br /&gt;
&lt;br /&gt;
Have you spent time with MediaGoblin?  If so, your experience and wisdom are invaluable and you’re the best person we can think of to help other users with their questions.&lt;br /&gt;
&lt;br /&gt;
Hang out on the IRC channel and help answer new peoples&#039; questions.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run your own MediaGoblin Instance ==&lt;br /&gt;
&lt;br /&gt;
Are there things about our instance you want to change?  Are there things about other instances you wish were different?  Want to test upcoming changes?  Want to create patches to implement things you need?  That’s great—you can run your own instance!&lt;br /&gt;
&lt;br /&gt;
The primary documentation for this is at [http://docs.mediagoblin.org http://docs.mediagoblin.org] but here are some additional tips:&lt;br /&gt;
&lt;br /&gt;
* [[Configure_MediaGoblin|Configuration]] - Learn about MediaGoblin configuration files and file options.&lt;br /&gt;
* [[Deployment]] - General deployment advice&lt;br /&gt;
* [[Scaling Down]] - Minimizing MediaGoblin&#039;s resource requirements&lt;br /&gt;
* [[Virtual Machine Hosting]] - Deploy your own publicly available MediaGoblin server using [http://aws.amazon.com/free/?utm_source=adwords&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=CPC_Google_AWS_ec2&amp;amp;utm_content=TextV01_PP_V01_EC2&amp;amp;trk=CPC_Google_AWS_ec2 Amazon&#039;s free EC2 tier].&lt;br /&gt;
&lt;br /&gt;
= Technical project documentation =&lt;br /&gt;
&lt;br /&gt;
The technical docs, that are more finished and the ones that are better maintained near the code (so they stay up to date) are in the more technical chapters of the [http://docs.mediagoblin.org/ main documentation].&lt;br /&gt;
* [[Storage]] - How MediaGoblin&#039;s internal storage system works.&lt;br /&gt;
* [[Processing]] - What happens after you submit your image/video/etc?  Processing!  More about that.&lt;br /&gt;
* [https://gitorious.org/mediagoblin/mediagoblin/blobs/master/extlib/README External Library Policy] - covers use of external libraries&lt;br /&gt;
* [[User:Cwebber/braindumps]] - Chris Webber&#039;s braindumps (you can help refactoring these into real sections of the site!)&lt;br /&gt;
* [[Multiple media support]] - Design plan for multiple media support&lt;br /&gt;
&lt;br /&gt;
== Write Code / Fix Code ==&lt;br /&gt;
&lt;br /&gt;
MedaGoblin development is premised on the idea that the entire interface for the platform be completely theme-able.  If you have a design or theming background, consider developing themes for MediaGoblin.  New themes help test the theming system, provide attractive and appealing interfaces for prospective users.  If you want to start a new theme but don’t know where to start, touch base with the development community on the list or in the IRC channel for more information.&lt;br /&gt;
&lt;br /&gt;
If you are a coder and you would like to write code, the repository is hosted on gitorious. Clone or fork the repository and start poking around. Become familiar with this manual for an overview of how the software works and is used. Consider the contributor wiki for more information about the project, our preferred methods, and guides for developing MediaGoblin. We even have tips on becoming a coder and we’re willing to help!&lt;br /&gt;
&lt;br /&gt;
* [[HackingHowto|Hacking]] - notes on making and sending in code contributions&lt;br /&gt;
** [[BeginnersCorner|Beginner&#039;s Corner]] - resources for those who are new to Python or Git.&lt;br /&gt;
** &#039;&#039;Started from an older version of the Hacking Howto?  We switched from buildout-&amp;gt;virtualenv, so look at [[Moving from buildout to virtualenv]] for information on how to move over.&#039;&#039;&lt;br /&gt;
* [[Git workflow]] - How to go about submitting patches via git.&lt;br /&gt;
* [[Code review tips]] - Tips on how to go about doing local code review&lt;br /&gt;
* [[Templating]] - How our templating structure is set up&lt;br /&gt;
* [[Code overview]] - Overview of the structure of the codebase&lt;br /&gt;
&lt;br /&gt;
== Create a Theme ==&lt;br /&gt;
&lt;br /&gt;
See [http://docs.mediagoblin.org/siteadmin/theming.html the theming docs]&lt;br /&gt;
&lt;br /&gt;
== Write a plugin ==&lt;br /&gt;
&lt;br /&gt;
If you start, you&#039;ll find some basic documentation [http://docs.mediagoblin.org/#part-4-developer-s-zone| in the docs site]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve made a plugin ? List it here : &lt;br /&gt;
&lt;br /&gt;
[[Available_Plugins|Available plugins]]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve written a plugin ? You got some tips to share ? A tutorial idea ? Please do :&lt;br /&gt;
 &lt;br /&gt;
[[PluginsTips|Plugins Tips]]&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
== Android client ==&lt;br /&gt;
&lt;br /&gt;
See [[Android Client]]&lt;br /&gt;
&lt;br /&gt;
= Inner workings of the secret sanctum =&lt;br /&gt;
&lt;br /&gt;
* [[IRCBot]] - covers our irc bot&lt;br /&gt;
* [[ReleaseProcess|Release Process]] - covers the release process&lt;br /&gt;
* [[Update the website]] - Learn how to update mediagoblin.org!&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
&lt;br /&gt;
[[GMG FAQ]]&lt;/div&gt;</summary>
		<author><name>Saul</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Configure_MediaGoblin&amp;diff=1441</id>
		<title>Configure MediaGoblin</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Configure_MediaGoblin&amp;diff=1441"/>
		<updated>2014-01-16T22:55:04Z</updated>

		<summary type="html">&lt;p&gt;Saul: /* Disable transcoding */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The config files =&lt;br /&gt;
&lt;br /&gt;
So basically there are two config files (and one meta-config file).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;mediagoblin.ini:&#039;&#039;&#039; Use this to configure MediaGoblin, the application.  Want to use a different storage system?  Configure it here!&lt;br /&gt;
* &#039;&#039;&#039;paste.ini:&#039;&#039;&#039; This just actually configures the web server that launches the MediaGoblin application, and some other things (like actually sets up the applications that serve your static files).&lt;br /&gt;
&lt;br /&gt;
And then there&#039;s the meta-config file:&lt;br /&gt;
* &#039;&#039;&#039;mediagoblin/config_spec.ini:&#039;&#039;&#039; This sets the defaults for config file options and the type conversion for things in mediagoblin.ini.  Developers who add new config options should probably register them and their types here (and set some good defaults, if applicable).&lt;br /&gt;
&lt;br /&gt;
= Changing config files =&lt;br /&gt;
&lt;br /&gt;
So you want to turn on (or off) all the bells and whistles, set up mediagoblin to use a storage system running out of a distributed cluster of Commodore 64s, change your email server configuration, etc.  Where do you set all this stuff up?&lt;br /&gt;
&lt;br /&gt;
You should do the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# copy the config files&lt;br /&gt;
$ cp paste.ini paste_local.ini&lt;br /&gt;
$ cp mediagoblin.ini mediagoblin_local.ini&lt;br /&gt;
&lt;br /&gt;
# edit paste_local.ini to know where mediagoblin_local.ini is&lt;br /&gt;
$ editor paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Find the line marked &amp;quot;config =&amp;quot; under [app:mediagoblin]; change to:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[app:mediagoblin]&lt;br /&gt;
use = egg:mediagoblin#app&lt;br /&gt;
filter-with = beaker&lt;br /&gt;
config = %(here)s/mediagoblin_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to use lazyserver.sh, you can run it like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./lazyserver.sh -c paste_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, all the ./bin/gmg commands have arguments to allow you to pass in the config file.  For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg shell -cf mediagoblin_local.ini&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(It&#039;s important to note that the ./bin/gmg commands don&#039;t care about the paster file, they just care about the mediagoblin config file.)&lt;br /&gt;
&lt;br /&gt;
BTW, all these ./bin/gmg subcommands have help.  You can check them like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./bin/gmg shell --help&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for more info.&lt;br /&gt;
&lt;br /&gt;
= Setting up Cloud Files public storage =&lt;br /&gt;
&lt;br /&gt;
In mediagoblin.ini (or mediagoblin_local.ini), add this to the file and edit it to fit your needs.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[storage:publicstore]&lt;br /&gt;
storage_class = mediagoblin.storage.cloudfiles:CloudFilesStorage&lt;br /&gt;
cloudfiles_user = user&lt;br /&gt;
cloudfiles_api_key = 1a2b3c4d5e6f7g8h9i&lt;br /&gt;
cloudfiles_container = mediagoblin&lt;br /&gt;
&lt;br /&gt;
# Uncomment this and fill it in to set the API endpoint to anything other&lt;br /&gt;
# than Rackspace Cloud Files US&lt;br /&gt;
# cloudfiles_host = https://example.org/v1.0 &lt;br /&gt;
&lt;br /&gt;
# Only applicable if you run MediaGoblin on a Rackspace Cloud Server&lt;br /&gt;
# it routes traffic through the internal Rackspace network, this&lt;br /&gt;
# means that the bandwith is free.&lt;br /&gt;
cloudfiles_use_servicenet = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To make these settings work with OpenStack Object Storage (Swift) you will need to set the API endpoint (&amp;lt;code&amp;gt;cloudfiles_host&amp;lt;/code&amp;gt;) to avoid it defaulting to Rackspace Cloud Files US.&lt;br /&gt;
&lt;br /&gt;
= Attachments =&lt;br /&gt;
&lt;br /&gt;
Attachment are arbitrary files that are associated to a media entry. &lt;br /&gt;
&lt;br /&gt;
For example, it could be the GIMP .xcf file for an image, the .blend of a Blender render.&lt;br /&gt;
&lt;br /&gt;
== Hazards ==&lt;br /&gt;
&lt;br /&gt;
Attachments are not filtered or scanned and therefore present a security risk. They can be used to perform XSS attacks or to upload malicious content. Make sure your environment is safe before enabling it.&lt;br /&gt;
&lt;br /&gt;
== Allow attachments ==&lt;br /&gt;
&lt;br /&gt;
To allow attachments, add&lt;br /&gt;
&lt;br /&gt;
  allow_attachments = true&lt;br /&gt;
&lt;br /&gt;
to your mediagoblin.ini (or mediagoblin_local.ini)&lt;br /&gt;
&lt;br /&gt;
= Disable transcoding =&lt;br /&gt;
&lt;br /&gt;
Transcoding means that your video is resized or converted to another format, which usually takes a lot of time and CPU power.&lt;br /&gt;
&lt;br /&gt;
Currently transcoding is disabled for a video only if its mime-type, container, video and audio formats are all explicitly excluded at once in the configuration.&lt;br /&gt;
&lt;br /&gt;
Add this section to your &amp;lt;code&amp;gt;mediagoblin.ini&amp;lt;/code&amp;gt; to disable transcoding of WebM and Ogg/Theora videos:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[media_type:mediagoblin.media_types.video]&lt;br /&gt;
[[skip_transcode]]&lt;br /&gt;
mime_types = video/webm, video/ogg, application/ogg, application/x-annodex&lt;br /&gt;
container_formats = Matroska, Ogg&lt;br /&gt;
video_codecs = VP8 video, Theora&lt;br /&gt;
audio_codecs = Vorbis,&lt;br /&gt;
dimensions_match = false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Saul</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Storage&amp;diff=1365</id>
		<title>Storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Storage&amp;diff=1365"/>
		<updated>2013-09-07T09:17:29Z</updated>

		<summary type="html">&lt;p&gt;Saul: /* Writing code to store stuff */  - fixed link formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Being a media publishing platform, storage is a big deal in MediaGoblin.  As such there are a few systems that are storage-related that you may encounter while doing some MediaGoblin hacking.&lt;br /&gt;
&lt;br /&gt;
MediaGoblin also comes with an extensible storage interface and several implementations mapping to it: basic local file storage, OpenStack &amp;quot;swift&amp;quot; style storage... and a few more plus the ability to write your own.&lt;br /&gt;
&lt;br /&gt;
= The storage systems attached to your app =&lt;br /&gt;
&lt;br /&gt;
== Dynamic content: queue_store and public_store ==&lt;br /&gt;
&lt;br /&gt;
Two instances of the StorageInterface come attached to your app.  These are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;queue_store:&#039;&#039;&#039; When a user submits a fresh piece of media for their gallery, before the [[Processing]] stage, that piece of media sits here in the queue_store.  (It&#039;s possible that we&#039;ll rename this to &amp;quot;private_store&amp;quot; and start storing more non-publicly-stored stuff in the future...).  This is a StorageInterface implementation instance.  Visitors to your site probably cannot see it... it isn&#039;t designed to be seen, anyway.&lt;br /&gt;
* &#039;&#039;&#039;public_store:&#039;&#039;&#039; After your media goes through processing it gets moved to the public store.  This is also a StorageInterface implelementation, and is for stuff that&#039;s intended to be seen by site visitors.&lt;br /&gt;
&lt;br /&gt;
== The workbench ==&lt;br /&gt;
&lt;br /&gt;
In addition, there&#039;s a &amp;quot;workbench&amp;quot; used during processing... it&#039;s just for temporary files during processing, and also for making local copies of stuff that might be on remote storage interfaces while transitionally moving/converting from the queue_store to the public store.  See the workbench module documentation for more.&lt;br /&gt;
&lt;br /&gt;
== Static assets / staticdirect ==&lt;br /&gt;
&lt;br /&gt;
On top of all that, there is some static media that comes bundled with your application.  This stuff is kept in:&lt;br /&gt;
&lt;br /&gt;
 mediagoblin/static/&lt;br /&gt;
&lt;br /&gt;
These files are for mediagoblin base assets.  Things like the CSS files, logos, etc.  You can mount these at whatever location is appropriate to you (see the direct_remote_path option in the config file) so if your users are keeping their static assets at http://static.mgoblin.example.org/ but their actual site is at http://mgoblin.example.org/, you need to be able to get your static files in a where-it&#039;s-mounted agnostic way.  There&#039;s a &amp;quot;staticdirector&amp;quot; attached to the request object.  It&#039;s pretty easy to use; just look at this bit taken from the mediagoblin/templates/mediagoblin/base.html main template:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot;&lt;br /&gt;
          href=&amp;quot;{{ request.staticdirect(&#039;/css/extlib/text.css&#039;) }}&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
see?  Not too hard.  As expected, if you configured direct_remote_path to be http://static.mgoblin.example.org/ you&#039;ll get back http://static.mgoblin.example.org/css/extlib/text.css just as you&#039;d probably expect.&lt;br /&gt;
&lt;br /&gt;
= StorageInterface and implementations =&lt;br /&gt;
&lt;br /&gt;
== The guts of StorageInterface and friends ==&lt;br /&gt;
&lt;br /&gt;
So, the StorageInterface!&lt;br /&gt;
&lt;br /&gt;
So, the public and queue stores both use StorageInterface implementations... but what does that mean?  It&#039;s not too hard.&lt;br /&gt;
&lt;br /&gt;
Open up: mediagoblin/storage.py&lt;br /&gt;
&lt;br /&gt;
In here you&#039;ll see a couple of things.  First of all, there&#039;s the StorageInterface class.  What you&#039;ll see is that this is just a very simple python class.  A few of the methods actually implement things, but for the most part, they don&#039;t.  What really matters about this class is the &#039;&#039;docstrings&#039;&#039;.  Each expected method is documented as to how it should be constructed.  Want to make a new StorageInterface?  Simply subclass it.  Want to know how to use the methods of your storage system?  Read these docs, they span all implementations.&lt;br /&gt;
&lt;br /&gt;
There are a couple of implementations of these classes bundled in storage.py as well.  The most simple of these is BasicFileStorage, which is also the default storage system used.  As expected, this stores files locally on your machine.&lt;br /&gt;
&lt;br /&gt;
There&#039;s also a CloudFileStorage system.  This provides a mapping to [OpenStack&#039;s swift http://swift.openstack.org/] storage system (used by RackSpace Cloud files and etc).&lt;br /&gt;
&lt;br /&gt;
Between these two examples you should be able to get a pretty good idea of how to write your own storage systems, for storing data across your beowulf cluster of radioactive monkey brains, whatever.&lt;br /&gt;
&lt;br /&gt;
== Writing code to store stuff ==&lt;br /&gt;
&lt;br /&gt;
So what does coding for StorageInterface implementations actually look like?  It&#039;s pretty simple, really.  For one thing, the design is fairly inspired by [https://docs.djangoproject.com/en/dev/ref/files/storage/ Django&#039;s file storage API]... with some differences.&lt;br /&gt;
&lt;br /&gt;
Basically, you access files on &amp;quot;file paths&amp;quot;, which aren&#039;t exactly like unix file paths, but are close.  If you wanted to store a file on a path like dir1/dir2/filename.jpg you&#039;d actually write that file path like:&lt;br /&gt;
&lt;br /&gt;
 [&#039;dir1&#039;, &#039;dir2&#039;, &#039;filename.jpg&#039;]&lt;br /&gt;
&lt;br /&gt;
This way we can be *sure* that each component is actually a component of the path that&#039;s expected... we do some filename cleaning on each component.&lt;br /&gt;
&lt;br /&gt;
Your StorageInterface should pass in and out &amp;quot;file like objects&amp;quot;.  In other words, they should provide .read() and .write() at minimum, and probably also .seek() and .close().&lt;/div&gt;</summary>
		<author><name>Saul</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=1194</id>
		<title>Feature Ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=1194"/>
		<updated>2013-03-13T08:02:35Z</updated>

		<summary type="html">&lt;p&gt;Saul: /* Media Types */ eliminate server transcoding if not needed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
There are many features that one can think of for MediaGoblin. Some should be implemented really soon, because they are needed right now. Other features would be nice to have, but are currently really hard to implement. And finally there are the Feature Ideas that can be classified as &amp;quot;brain storming&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This wiki page is mostly for long term feature ideas. This specifically means there are no promises that anything listed here will ever happen. It means nobody is currently working on this feature.&lt;br /&gt;
&lt;br /&gt;
If you have an idea for a new feature, that is not listed here or in the Bug Tracker, please talk to some developers, or add it below in the &amp;quot;Yet Unsorted Ideas&amp;quot; section. If you really think, that your idea is extremely important and needs to be acted upon soon, you could file a bug.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
If there is a bug (closed or open), please link to it.&lt;br /&gt;
&lt;br /&gt;
=== Access Control ===&lt;br /&gt;
* Renaming of an account&lt;br /&gt;
** by its user&lt;br /&gt;
** by an admin&lt;br /&gt;
* Account creation / activation, considering e-mail address&lt;br /&gt;
** Expire inactive accounts&lt;br /&gt;
** A method of account activation: ask the user to send e-mail message with a specified text from the address they entered, instead of GMG sending a message to that address (which could be somebody else’s).&lt;br /&gt;
*** What about faked addresses? If that’s a serious problem for this, could it still be a requirement? Or is it so serious that it would bother malicious misusers least of all people? --[[User:Aleksejrs|Aleksejrs]] 15:17, 7 December 2011 (EST)&lt;br /&gt;
** The above allows accepting multiple inactive accounts for the same e-mail address without bothering its owner and without making it difficult for him to register.&lt;br /&gt;
*** But accounts could have the same name… --[[User:Aleksejrs|Aleksejrs]] 15:14, 7 December 2011 (EST)&lt;br /&gt;
&lt;br /&gt;
=== Design (UI / HTML) ===&lt;br /&gt;
* Point and click theme options: Colors, layout, typefaces, size, thumbnail options, etc.&lt;br /&gt;
** Simple settable options to &amp;quot;personalize&amp;quot; the instance without fiddling with templates.&lt;br /&gt;
* Responsive base theme&lt;br /&gt;
* User Avatar&lt;br /&gt;
&lt;br /&gt;
=== Extensions ===&lt;br /&gt;
* A link to the page about installed (and not installed?) plugins.&lt;br /&gt;
&lt;br /&gt;
=== Federation ===&lt;br /&gt;
* [[User:Aleksejrs/ideas/federation|Two federation ideas]]&lt;br /&gt;
&lt;br /&gt;
=== Import/Export ===&lt;br /&gt;
* [[Feature_Ideas/Flickr_Import|flickr Import]]&lt;br /&gt;
* MediaWiki export&lt;br /&gt;
* digiKam plugin (export to mediagoblin)&lt;br /&gt;
* Mount GMG as a file system (e.g. FUSE)&lt;br /&gt;
&lt;br /&gt;
=== Licensing ===&lt;br /&gt;
* Help the site admin comply with the AGPL.&lt;br /&gt;
* Creative Commons choice on user profile. E.g. default license choice for media uploaded by that user.&lt;br /&gt;
* “Other (please specify: [ ])” license as an alternative to “All rights reserved”.&lt;br /&gt;
&lt;br /&gt;
=== Media Processing ===&lt;br /&gt;
* [[Feature_Ideas/Reprocessing|Retry media processing]]&lt;br /&gt;
** Related: rotating images that have no proper Orientation tags.&lt;br /&gt;
&lt;br /&gt;
=== Media Types ===&lt;br /&gt;
* For non-still-images:&lt;br /&gt;
** Duration&lt;br /&gt;
** Bitrate&lt;br /&gt;
** Format structure (e.g. “Ogg/Theora+Vorbis”)&lt;br /&gt;
** Permit pre-encoded uploads to eliminate server-side processing (available as of 0.3.3)&lt;br /&gt;
** Support Ogg/Theora player (already implemented?)&lt;br /&gt;
** Subtitles for video and audio&lt;br /&gt;
* A way to find out what formats can be uploaded.&lt;br /&gt;
** E.g.: A simple type list near the upload field.&lt;br /&gt;
* For images with transparency, let the uploader specify background (e.g. color or checkerboard).&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
* Ability to write metadata (comments, tags, etc.) to files.&lt;br /&gt;
* Copy (some) metadata from the full‐size image into the smaller versions. If possible (according to metadata formats), add a note to them that they are not exactly the original.&lt;br /&gt;
** [http://issues.mediagoblin.org/ticket/94 #94]: exif data handling for users (about privacy)&lt;br /&gt;
** &amp;lt;del&amp;gt;[http://issues.mediagoblin.org/ticket/284 #284]: Support &amp;quot;Orientation&amp;quot; EXIF tag&amp;lt;/del&amp;gt; (fixed)&lt;br /&gt;
** EXIF info?&lt;br /&gt;
* Display more info about the file on its page&lt;br /&gt;
** Resolution of the original&lt;br /&gt;
** File size of the original&lt;br /&gt;
** Resolution of the scaled-down version&lt;br /&gt;
* &amp;quot;trans-tagging&amp;quot;: Adding tags to other peoples media [http://issues.mediagoblin.org/ticket/251 #251]&lt;br /&gt;
** [[Many images usecase#Crowd tagging/captioning/commenting]]&lt;br /&gt;
* Geotagging support. &lt;br /&gt;
** Both read and write. &lt;br /&gt;
** Display on OpenStreetMap.&lt;br /&gt;
* Consider [https://en.wikipedia.org/wiki/Semantic_Web Semantic Web]&lt;br /&gt;
** Microformats, RDFa, Microdata&lt;br /&gt;
** Consider the privacy implications when choosing what to mark up.&lt;br /&gt;
* Add hashes etc, something like magnet links, of the files. The information can then be used for downloading, searching, linking to.&lt;br /&gt;
** Maybe also optional for privacy.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
* DONE: CSRF ([http://issues.mediagoblin.org/ticket/76 #76])&lt;br /&gt;
* &amp;lt;code&amp;gt;X-Content-Type-Options: nosniff&amp;lt;/code&amp;gt;&lt;br /&gt;
*: Served pages have the content-type set. And the browser should not be allowed to guess a different type. See: [https://bugzilla.mozilla.org/show_bug.cgi?id=471020 Firefox bug #471020]&lt;br /&gt;
* &amp;quot;Content Security Policy&amp;quot; (CSP) might really be a good add on to have. Noone should rely solely on this, but it might make things a lot safer if other security guards fail.&lt;br /&gt;
*: A simple allow &#039;self&#039; might already get a lot of things better.&lt;br /&gt;
*: [https://developer.mozilla.org/en/Security/CSP/Introducing_Content_Security_Policy Link1] [https://developer.mozilla.org/en/Security/CSP/CSP_policy_directives#options Link2]&lt;br /&gt;
* Possibly disallowing pages to be shown in frames.&lt;br /&gt;
&lt;br /&gt;
=== Unsorted Ideas ===&lt;br /&gt;
Put your new ideas here:&lt;br /&gt;
* Search.&lt;br /&gt;
* Related Content&lt;br /&gt;
* The user has the possibility to make backup of your content that can be migrated to another instance mediagoblin&lt;br /&gt;
* Generate pages dynamically using files on the file system.&lt;br /&gt;
** Like the UI of an ordinary image viewer (e.g. geeqie) or a file manager generates thumbnails (optionally saving them), shows metadata…&lt;br /&gt;
** MediaWiki can generate thumbnails of arbitrary size on demand.&lt;/div&gt;</summary>
		<author><name>Saul</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=902</id>
		<title>Feature Ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=902"/>
		<updated>2012-08-29T02:21:49Z</updated>

		<summary type="html">&lt;p&gt;Saul: /* Media Types */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
There are many features that one can think of for MediaGoblin. Some should be implemented really soon, because they are needed right now. Other features would be nice to have, but are currently really hard to implement. And finally there are the Feature Ideas that can be classified as &amp;quot;brain storming&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This wiki page is mostly for long term feature ideas. This specifically means there are no promises that anything listed here will ever happen. It means nobody is currently working on this feature.&lt;br /&gt;
&lt;br /&gt;
If you have an idea for a new feature, that is not listed here or in the Bug Tracker, please talk to some developers, or add it below in the &amp;quot;Yet Unsorted Ideas&amp;quot; section. If you really think, that your idea is extremely important and needs to be acted upon soon, you could file a bug.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
If there is a bug (closed or open), please link to it.&lt;br /&gt;
&lt;br /&gt;
=== Access Control ===&lt;br /&gt;
* Renaming of an account&lt;br /&gt;
** by its user&lt;br /&gt;
** by an admin&lt;br /&gt;
* Account creation / activation, considering e-mail address&lt;br /&gt;
** Expire inactive accounts&lt;br /&gt;
** A method of account activation: ask the user to send e-mail message with a specified text from the address they entered, instead of GMG sending a message to that address (which could be somebody else’s).&lt;br /&gt;
*** What about faked addresses? If that’s a serious problem for this, could it still be a requirement? Or is it so serious that it would bother malicious misusers least of all people? --[[User:Aleksejrs|Aleksejrs]] 15:17, 7 December 2011 (EST)&lt;br /&gt;
** The above allows accepting multiple inactive accounts for the same e-mail address without bothering its owner and without making it difficult for him to register.&lt;br /&gt;
*** But accounts could have the same name… --[[User:Aleksejrs|Aleksejrs]] 15:14, 7 December 2011 (EST)&lt;br /&gt;
&lt;br /&gt;
=== Design ===&lt;br /&gt;
* Point and click theme options: Colors, layout, typefaces, size, thumbnail options, etc.&lt;br /&gt;
** Simple settable options to &amp;quot;personalize&amp;quot; the instance without fiddling with templates.&lt;br /&gt;
** [http://bugs.foocorp.net/issues/613 #613]: Make the base of page titles customizable.&lt;br /&gt;
* Responsive base theme&lt;br /&gt;
* User Avatar&lt;br /&gt;
&lt;br /&gt;
=== Extensions ===&lt;br /&gt;
* A link to the page about installed (and not installed?) plugins.&lt;br /&gt;
&lt;br /&gt;
=== Federation ===&lt;br /&gt;
* [[User:Aleksejrs/ideas/federation|Two federation ideas]]&lt;br /&gt;
&lt;br /&gt;
=== Import/Export ===&lt;br /&gt;
* [[Feature_Ideas/Flickr_Import|flickr Import]]&lt;br /&gt;
* MediaWiki export&lt;br /&gt;
* digiKam plugin (export to mediagoblin)&lt;br /&gt;
&lt;br /&gt;
=== Licensing ===&lt;br /&gt;
* Help the site admin comply with the AGPL.&lt;br /&gt;
* Creative Commons choice on user profile. E.g. default license choice for media uploaded by that user.&lt;br /&gt;
&lt;br /&gt;
=== Media Processing ===&lt;br /&gt;
* [[Feature_Ideas/Reprocessing|Retry media processing]]&lt;br /&gt;
** Related: rotating images that have no proper Orientation tags.&lt;br /&gt;
&lt;br /&gt;
=== Media Types ===&lt;br /&gt;
* For non-still-images:&lt;br /&gt;
** Duration&lt;br /&gt;
** Bitrate&lt;br /&gt;
** Format structure (e.g. “Ogg/Theora+Vorbis”)&lt;br /&gt;
** Permit pre-encoded uploads to eliminate server-side processing&lt;br /&gt;
** Support OGG/Theora player&lt;br /&gt;
* A way to find out what formats can be uploaded.&lt;br /&gt;
** E.g.: A simple type list near the upload field.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
* Ability to write metadata (comments, tags, etc.) to files.&lt;br /&gt;
* Copy (some) metadata from the full‐size image into the smaller versions. If possible (according to metadata formats), add a note to them that they are not exactly the original.&lt;br /&gt;
** [http://issues.mediagoblin.org/ticket/94 #94]: exif data handling for users (about privacy)&lt;br /&gt;
** &amp;lt;del&amp;gt;[http://issues.mediagoblin.org/ticket/284 #284]: Support &amp;quot;Orientation&amp;quot; EXIF tag&amp;lt;/del&amp;gt; (fixed)&lt;br /&gt;
** EXIF info?&lt;br /&gt;
* Display more info about the file on its page&lt;br /&gt;
** Resolution of the original&lt;br /&gt;
** File size of the original&lt;br /&gt;
** Resolution of the scaled-down version&lt;br /&gt;
* &amp;quot;trans-tagging&amp;quot;: Adding tags to other peoples media [http://issues.mediagoblin.org/ticket/251 #251]&lt;br /&gt;
** [[Many images usecase#Crowd tagging/captioning/commenting]]&lt;br /&gt;
* Geotagging support. &lt;br /&gt;
** Both read and write. &lt;br /&gt;
** Display on OpenStreetMap.&lt;br /&gt;
&lt;br /&gt;
=== Security ===&lt;br /&gt;
* DONE: CSRF ([http://bugs.foocorp.net/issues/361 #361])&lt;br /&gt;
* &amp;lt;code&amp;gt;X-Content-Type-Options: nosniff&amp;lt;/code&amp;gt;&lt;br /&gt;
*: Served pages have the content-type set. And the browser should not be allowed to guess a different type. See: [https://bugzilla.mozilla.org/show_bug.cgi?id=471020 Firefox bug #471020]&lt;br /&gt;
* &amp;quot;Content Security Policy&amp;quot; (CSP) might really be a good add on to have. Noone should rely solely on this, but it might make things a lot safer if other security guards fail.&lt;br /&gt;
*: A simple allow &#039;self&#039; might already get a lot of things better.&lt;br /&gt;
*: [https://developer.mozilla.org/en/Security/CSP/Introducing_Content_Security_Policy Link1] [https://developer.mozilla.org/en/Security/CSP/CSP_policy_directives#options Link2]&lt;br /&gt;
* Possibly disallowing pages to be shown in frames.&lt;br /&gt;
&lt;br /&gt;
=== Unsorted Ideas ===&lt;br /&gt;
Put your new ideas here:&lt;br /&gt;
* Subtitles for video (and audio?).&lt;br /&gt;
* Search.&lt;br /&gt;
* Related Content&lt;br /&gt;
* The user has the possibility to make backup of your content that can be migrated to another instance mediagoblin&lt;/div&gt;</summary>
		<author><name>Saul</name></author>
	</entry>
</feed>