/*****************************************************************************
 * vlc_media.c: vlc.Media binding
 *****************************************************************************
 * Copyright (C) 2007 the VideoLAN team
 * $Id: 066fcf611a9e75132e723aa96a21a112a15094ff $
 *
 * Authors: Olivier Aubert <oaubert at liris.cnrs.fr>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/
#include "vlcglue.h"

/***********************************************************************
 * vlc.Media
 ***********************************************************************/

static PyObject *
vlcMedia_new( PyTypeObject *type, PyObject *args, PyObject *kwds )
{
    fprintf(stderr, "vlcMedia_new called\n");
    PyErr_SetString( PyExc_TypeError, "vlc.Media can be instantiated by itself. You should use vlc.Instance().media_new(mrl)." );
    return NULL;
}

static void
vlcMedia_dealloc( PyObject *self )
{
    libvlc_media_release( LIBVLC_MEDIA->p_media );
    PyObject_DEL( self );
}

static PyObject *
vlcMedia_add_option( PyObject *self, PyObject *args )
{
    libvlc_exception_t ex;
    char* psz_options = NULL;

    if( !PyArg_ParseTuple( args, "s", &psz_options ) )
        return NULL;

    LIBVLC_TRY;
    libvlc_media_add_option( LIBVLC_MEDIA->p_media, psz_options, &ex);
    LIBVLC_EXCEPT;
    Py_INCREF( Py_None );
    return Py_None;
}

static PyObject *
vlcMedia_get_mrl( PyObject *self, PyObject *args )
{
    libvlc_exception_t ex;
    char * psz_mrl;
    PyObject * o_ret;

    LIBVLC_TRY;
    psz_mrl = libvlc_media_get_mrl( LIBVLC_MEDIA->p_media, &ex);
    LIBVLC_EXCEPT;

    o_ret = Py_BuildValue( "s", psz_mrl );
    free( psz_mrl );
    return o_ret;
}

static PyObject *
vlcMedia_get_state( PyObject *self, PyObject *args )
{
    libvlc_exception_t ex;
    libvlc_state_t i_state;

    LIBVLC_TRY;
    i_state = libvlc_media_get_state( LIBVLC_MEDIA->p_media, &ex);
    LIBVLC_EXCEPT;
    /* FIXME: return the defined state constant */
    return Py_BuildValue( "i", i_state );
}

static PyObject *
vlcMedia_get_duration( PyObject *self, PyObject *args )
{
    libvlc_exception_t ex;
    libvlc_time_t i_ret;
    LIBVLC_TRY;
    i_ret = libvlc_media_get_duration( LIBVLC_MEDIA->p_media, &ex);
    LIBVLC_EXCEPT;
    return Py_BuildValue( "L", i_ret );
}

static PyObject *
vlcMedia_media_player_new( PyObject *self, PyObject *args )
{
    libvlc_exception_t ex;
    libvlc_media_player_t *p_mp;
    vlcMediaPlayer *p_ret;

    LIBVLC_TRY;
    p_mp = libvlc_media_player_new_from_media( LIBVLC_MEDIA->p_media, &ex);
    LIBVLC_EXCEPT;

    p_ret = PyObject_New( vlcMediaPlayer, &vlcMediaPlayer_Type );
    p_ret->p_mp = p_mp;
    Py_INCREF( p_ret ); /* Ah bon ? */
    return ( PyObject * )p_ret;
}

static PyObject *
vlcMedia_is_preparsed( PyObject *self, PyObject *args )
{
    libvlc_exception_t ex;
    int i_ret;
    LIBVLC_TRY;
    i_ret = libvlc_media_is_preparsed( LIBVLC_MEDIA->p_media, &ex);
    LIBVLC_EXCEPT;
    return Py_BuildValue( "L", i_ret );
}

static PyObject *
vlcMedia_get_meta( PyObject *self, PyObject *args )
{
    libvlc_exception_t ex;
    char * psz_meta = NULL;
    char * psz_ret = NULL;
    PyObject* o_ret;
    int i_index = -1;
    int i_loop = 0;
    static const char * meta_names[] = { "Title", "Artist", "Genre", "Copyright", "Album", "TrackNumber", "Description", "Rating", "Date", "Setting", "URL", "Language", "NowPlaying", "Publisher", "EncodedBy", "ArtworkURL", "TrackID", NULL };

    if( !PyArg_ParseTuple( args, "s", &psz_meta ) )
        return NULL;
    while( meta_names[i_loop] )
    {
        if( !strncmp(meta_names[i_loop], psz_meta, strlen(meta_names[i_loop])) )
        {
            i_index = i_loop;
            break;
        }
        i_loop++;
    }
    if( i_index < 0 )
    {
        PyObject *py_exc = vlc_Exception;
        PyErr_SetString( py_exc, "Unknown meta attribute" );
        return NULL;
    }

    LIBVLC_TRY;
    psz_ret = libvlc_media_get_meta( LIBVLC_MEDIA->p_media, i_index, &ex);
    LIBVLC_EXCEPT;

    o_ret = Py_BuildValue( "s", psz_ret );
    free( psz_ret );
    return o_ret;
}

static PyMethodDef vlcMedia_methods[] =
{
    { "add_option", vlcMedia_add_option, METH_VARARGS,
      "add_option(str) Add an option to the media." },
    { "get_mrl", vlcMedia_get_mrl, METH_VARARGS,
      "get_mrl() -> str" },
    { "get_state", vlcMedia_get_state, METH_VARARGS,
      "get_state() -> int" },
    { "get_duration", vlcMedia_get_duration, METH_VARARGS,
      "get_duration() -> int" },
    { "mediaplayer_new", vlcMedia_media_player_new, METH_VARARGS,
      "mediaplayer_new() -> vlc.MediaPlayer   Create a MediaPlayer object from a Media" },
    { "is_preparsed", vlcMedia_is_preparsed, METH_VARARGS,
      "is_preparsed() -> int" },
    { "get_meta", vlcMedia_get_meta, METH_VARARGS,
      "get_meta(str) -> str   Read the meta of the media." },

    { NULL }  /* Sentinel */
};

static PyTypeObject vlcMedia_Type =
{
    PyObject_HEAD_INIT( NULL )
    0,                         /*ob_size*/
    "vlc.Media",            /*tp_name*/
    sizeof( vlcMedia_Type ),   /*tp_basicsize*/
    0,                         /*tp_itemsize*/
    vlcMedia_dealloc, /*tp_dealloc*/
    0,                         /*tp_print*/
    0,                         /*tp_getattr*/
    0,                         /*tp_setattr*/
    0,                         /*tp_compare*/
    0,                         /*tp_repr*/
    0,                         /*tp_as_number*/
    0,                         /*tp_as_sequence*/
    0,                         /*tp_as_mapping*/
    0,                         /*tp_hash */
    0,                         /*tp_call*/
    0,                         /*tp_str*/
    0,                         /*tp_getattro*/
    0,                         /*tp_setattro*/
    0,                         /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
    "vlc.Media object.",  /* tp_doc */
    0,                        /* tp_traverse */
    0,                        /* tp_clear */
    0,                         /* tp_richcompare */
    0,                         /* tp_weaklistoffset */
    0,                         /* tp_iter */
    0,                          /* tp_iternext */
    vlcMedia_methods,          /* tp_methods */
    0,                         /* tp_members */
    0,                         /* tp_getset */
    0,                         /* tp_base */
    0,                         /* tp_dict */
    0,                         /* tp_descr_get */
    0,                         /* tp_descr_set */
    0,                         /* tp_dictoffset */
    0,                         /* tp_init */
    0,                         /* tp_alloc */
    vlcMedia_new,              /* tp_new */
};

