On Tue, Nov 2, 2010 at 5:12 PM, wawa wawawa <wazawaz...@gmail.com> wrote:
> Hi All,
>
> So, I've got my django app, rabbitmq and celery working and processing
> my uploaded files. Next step is to get the client to display status
> results provided by JSON, ultimately refreshing to a results page when
> complete.
>
> I'm a little new to JSON / AJAX (AJAJ!) and I'm struggling a little
> with the templates and views part.
>
> Are there any easy examples out there?
>
> I can't seem to find any!
>
> Many thanks in advance for any suggestions.
>
> Cheers
>
> W
>

Sure. I have a TV recording system built using Django (the UI is web
based), which records TV shows to disk in MPEG2 format. I then use the
whole celery stack to convert those video files into something that I
can then load up onto my ipad/iphone.

The transcoding is initiated by a user clicking an icon on the episode
page, which triggers an AJAX call, which eventually calls this
function:

def setup_transcode_episode(episode):
  data = { 'valid': False, }
  if episode.media:
    file = unicode(episode.media)
    rv = transcode_episode_for_ipad.delay(file=file, episode_id=episode.id)
    tm, created = TaskMeta.objects.get_or_create(task_id=rv.task_id)
    episode.ipad_media = tm
    episode.save()
    data['task_id'] = rv.task_id
    data['valid'] = True
  return data

The data dictionary is returned back to the client, which now
periodically polls a view for status, using the task_id.

The task that is invoked, transcode_episode_for_ipad, looks like this:

@task
def transcode_episode_for_ipad(file, episode_id, **kwargs):
  args = make_ipad_encoder_args(file=file)
  out = args[-1]
  ffmpeg = FFmpegProgressMonitor(file=file, task_id=kwargs['task_id'],
args=args)
  rv = ffmpeg.process()
  episode = TVEpisode.objects.get(id=episode_id)
  dir, fn = out.rsplit('/', 1)
  imedia = MplayerFileMedia.objects.create(directory=dir, file=fn)
  episode.ipad_media = imedia
  episode.save()
  return rv

This is pretty straight-forward, I simply produce the arguments for
ffmpeg, and then process it, monitoring the output of the ffmpeg to
give me hints about how long through the transcoding process we are,
which I then store in memcache, to avoid requiring a database hit to
find out the status of the task.
This is easier than it sounds, every <n> frames, ffmpeg prints out a
line indicating how far through the file it is. Just monitor the
output and update the cache as appropriate.

The way my models are set up, TVEpisode.ipad_media is a generic
foreign key, so while transcoding is taking place it points at the
TaskMeta object, which contains the task id. This allows us to know
that the task is underway in the background, even if we didn't
initiate it ourselfs, and use that information to poll for status etc
as appropriate.

Cheers

Tom

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-us...@googlegroups.com.
To unsubscribe from this group, send email to 
django-users+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en.

Reply via email to