pls.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:8k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * pls.c : PLS playlist format import
  3.  *****************************************************************************
  4.  * Copyright (C) 2004 the VideoLAN team
  5.  * $Id: 3c056b1b907eba970619e0febe7f8ef725dc76ae $
  6.  *
  7.  * Authors: Clément Stenac <zorglub@videolan.org>
  8.  * Authors: Sigmund Augdal Helberg <dnumgis@videolan.org>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /*****************************************************************************
  25.  * Preamble
  26.  *****************************************************************************/
  27. #ifdef HAVE_CONFIG_H
  28. # include "config.h"
  29. #endif
  30. #include <vlc_common.h>
  31. #include <vlc_demux.h>
  32. #include "playlist.h"
  33. struct demux_sys_t
  34. {
  35.     char *psz_prefix;
  36. };
  37. /*****************************************************************************
  38.  * Local prototypes
  39.  *****************************************************************************/
  40. static int Demux( demux_t *p_demux);
  41. static int Control( demux_t *p_demux, int i_query, va_list args );
  42. /*****************************************************************************
  43.  * Import_PLS: main import function
  44.  *****************************************************************************/
  45. int Import_PLS( vlc_object_t *p_this )
  46. {
  47.     demux_t *p_demux = (demux_t *)p_this;
  48.     const uint8_t *p_peek;
  49.     CHECK_PEEK( p_peek, 10 );
  50.     if( POKE( p_peek, "[playlist]", 10 ) || POKE( p_peek, "[Reference]", 10 ) ||
  51.         demux_IsPathExtension( p_demux, ".pls" )   || demux_IsForced( p_demux, "pls" ) )
  52.     {
  53.         ;
  54.     }
  55.     else return VLC_EGENERIC;
  56.     STANDARD_DEMUX_INIT_MSG(  "found valid PLS playlist file");
  57.     p_demux->p_sys->psz_prefix = FindPrefix( p_demux );
  58.     return VLC_SUCCESS;
  59. }
  60. /*****************************************************************************
  61.  * Deactivate: frees unused data
  62.  *****************************************************************************/
  63. void Close_PLS( vlc_object_t *p_this )
  64. {
  65.     demux_t *p_demux = (demux_t *)p_this;
  66.     free( p_demux->p_sys->psz_prefix );
  67.     free( p_demux->p_sys );
  68. }
  69. static int Demux( demux_t *p_demux )
  70. {
  71.     mtime_t        i_duration = -1;
  72.     char          *psz_name = NULL;
  73.     char          *psz_line;
  74.     char          *psz_mrl = NULL;
  75.     char          *psz_mrl_orig = NULL;
  76.     char          *psz_key;
  77.     char          *psz_value;
  78.     int            i_item = -1;
  79.     int            i_new_item = 0;
  80.     int            i_key_length;
  81.     input_item_t *p_input;
  82.     INIT_PLAYLIST_STUFF;
  83.     while( ( psz_line = stream_ReadLine( p_demux->s ) ) )
  84.     {
  85.         if( !strncasecmp( psz_line, "[playlist]", sizeof("[playlist]")-1 ) ||
  86.             !strncasecmp( psz_line, "[Reference]", sizeof("[Reference]")-1 ) )
  87.         {
  88.             free( psz_line );
  89.             continue;
  90.         }
  91.         psz_key = psz_line;
  92.         psz_value = strchr( psz_line, '=' );
  93.         if( psz_value )
  94.         {
  95.             *psz_value='';
  96.             psz_value++;
  97.         }
  98.         else
  99.         {
  100.             msg_Warn( p_demux, "invalid line in pls file" );
  101.             free( psz_line );
  102.             continue;
  103.         }
  104.         if( !strcasecmp( psz_key, "version" ) )
  105.         {
  106.             msg_Dbg( p_demux, "pls file version: %s", psz_value );
  107.             free( psz_line );
  108.             continue;
  109.         }
  110.         if( !strcasecmp( psz_key, "numberofentries" ) )
  111.         {
  112.             msg_Dbg( p_demux, "pls should have %d entries", atoi(psz_value) );
  113.             free( psz_line);
  114.             continue;
  115.         }
  116.         /* find the number part of of file1, title1 or length1 etc */
  117.         i_key_length = strlen( psz_key );
  118.         if( i_key_length >= 4 ) /* Ref1 type case */
  119.         {
  120.             i_new_item = atoi( psz_key + 3 );
  121.             if( i_new_item == 0 && i_key_length >= 5 ) /* file1 type case */
  122.             {
  123.                 i_new_item = atoi( psz_key + 4 );
  124.                 if( i_new_item == 0 && i_key_length >= 6 ) /* title1 type case */
  125.                 {
  126.                     i_new_item = atoi( psz_key + 5 );
  127.                     if( i_new_item == 0 && i_key_length >= 7 ) /* length1 type case */
  128.                     {
  129.                         i_new_item = atoi( psz_key + 6 );
  130.                     }
  131.                 }
  132.             }
  133.         }
  134.         if( i_new_item == 0 )
  135.         {
  136.             msg_Warn( p_demux, "couldn't find number of items" );
  137.             free( psz_line );
  138.             continue;
  139.         }
  140.         if( i_item == -1 )
  141.         {
  142.             i_item = i_new_item;
  143.         }
  144.         /* we found a new item, insert the previous */
  145.         if( i_item != i_new_item )
  146.         {
  147.             if( psz_mrl )
  148.             {
  149.                 p_input = input_item_New( p_demux, psz_mrl, psz_name );
  150.                 input_item_CopyOptions( p_current_input, p_input );
  151.                 input_item_AddSubItem( p_current_input, p_input );
  152.                 vlc_gc_decref( p_input );
  153.             }
  154.             else
  155.             {
  156.                 msg_Warn( p_demux, "no file= part found for item %d", i_item );
  157.             }
  158.             free( psz_name );
  159.             psz_name = NULL;
  160.             i_duration = -1;
  161.             i_item = i_new_item;
  162.             i_new_item = 0;
  163.         }
  164.         if( !strncasecmp( psz_key, "file", sizeof("file") -1 ) ||
  165.             !strncasecmp( psz_key, "Ref", sizeof("Ref") -1 ) )
  166.         {
  167.             free( psz_mrl_orig );
  168.             psz_mrl_orig =
  169.             psz_mrl = ProcessMRL( psz_value, p_demux->p_sys->psz_prefix );
  170.             if( !strncasecmp( psz_key, "Ref", sizeof("Ref") -1 ) )
  171.             {
  172.                 if( !strncasecmp( psz_mrl, "http://", sizeof("http://") -1 ) )
  173.                 {
  174.                     psz_mrl++;
  175.                     psz_mrl[0] = 'm';
  176.                     psz_mrl[1] = 'm';
  177.                     psz_mrl[2] = 's';
  178.                 }
  179.             }
  180.         }
  181.         else if( !strncasecmp( psz_key, "title", sizeof("title") -1 ) )
  182.         {
  183.             free( psz_name );
  184.             psz_name = strdup( psz_value );
  185.         }
  186.         else if( !strncasecmp( psz_key, "length", sizeof("length") -1 ) )
  187.         {
  188.             i_duration = atoi( psz_value );
  189.             if( i_duration != -1 )
  190.             {
  191.                 i_duration *= 1000000;
  192.             }
  193.         }
  194.         else
  195.         {
  196.             msg_Warn( p_demux, "unknown key found in pls file: %s", psz_key );
  197.         }
  198.         free( psz_line );
  199.     }
  200.     /* Add last object */
  201.     if( psz_mrl )
  202.     {
  203.         p_input = input_item_New( p_demux, psz_mrl, psz_name );
  204.         input_item_CopyOptions( p_current_input, p_input );
  205.         input_item_AddSubItem( p_current_input, p_input );
  206.         vlc_gc_decref( p_input );
  207.         free( psz_mrl_orig );
  208.         psz_mrl = NULL;
  209.     }
  210.     else
  211.     {
  212.         msg_Warn( p_demux, "no file= part found for item %d", i_item );
  213.     }
  214.     free( psz_name );
  215.     psz_name = NULL;
  216.     HANDLE_PLAY_AND_RELEASE;
  217.     return 0; /* Needed for correct operation of go back */
  218. }
  219. static int Control( demux_t *p_demux, int i_query, va_list args )
  220. {
  221.     VLC_UNUSED(p_demux); VLC_UNUSED(i_query); VLC_UNUSED(args);
  222.     return VLC_EGENERIC;
  223. }