tag.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:4k
源码类别:

Windows CE

开发平台:

C/C++

  1. /* libxmms-flac - XMMS FLAC input plugin
  2.  * Copyright (C) 2000,2001,2002,2003,2004,2005  Josh Coalson
  3.  * Copyright (C) 2002,2003,2004,2005  Daisuke Shimamura
  4.  *
  5.  * Based on FLAC plugin.c and mpg123 plugin
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version 2
  10.  * of the License, or (at your option) any later version.
  11.  *
  12.  * This program is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.  * GNU General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with this program; if not, write to the Free Software
  19.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20.  */
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <stdio.h>
  24. #include <glib.h>
  25. #include <xmms/plugin.h>
  26. #include <xmms/util.h>
  27. #include <xmms/configfile.h>
  28. #include <xmms/titlestring.h>
  29. #include "FLAC/metadata.h"
  30. #include "plugin_common/tags.h"
  31. #include "charset.h"
  32. #include "configure.h"
  33. /*
  34.  * Function local__extname (filename)
  35.  *
  36.  *    Return pointer within filename to its extenstion, or NULL if
  37.  *    filename has no extension.
  38.  *
  39.  */
  40. static char *local__extname(const char *filename)
  41. {
  42. char *ext = strrchr(filename, '.');
  43. if (ext != NULL)
  44. ++ext;
  45. return ext;
  46. }
  47. static char *local__getstr(char* str)
  48. {
  49. if (str && strlen(str) > 0)
  50. return str;
  51. return NULL;
  52. }
  53. static int local__getnum(char* str)
  54. {
  55. if (str && strlen(str) > 0)
  56. return atoi(str);
  57. return 0;
  58. }
  59. static char *local__getfield(const FLAC__StreamMetadata *tags, const char *name)
  60. {
  61. if (0 != tags) {
  62. const char *utf8 = FLAC_plugin__tags_get_tag_utf8(tags, name);
  63. if (0 != utf8) {
  64. if(flac_cfg.title.convert_char_set)
  65. return convert_from_utf8_to_user(utf8);
  66. else
  67. return strdup(utf8);
  68. }
  69. }
  70. return 0;
  71. }
  72. static void local__safe_free(char *s)
  73. {
  74. if (0 != s)
  75. free(s);
  76. }
  77. /*
  78.  * Function flac_format_song_title (tag, filename)
  79.  *
  80.  *    Create song title according to `tag' and/or `filename' and
  81.  *    return it.  The title must be subsequently freed using g_free().
  82.  *
  83.  */
  84. char *flac_format_song_title(char *filename)
  85. {
  86. char *ret = NULL;
  87. TitleInput *input = NULL;
  88. FLAC__StreamMetadata *tags;
  89. char *title, *artist, *performer, *album, *date, *tracknumber, *genre, *description;
  90. FLAC_plugin__tags_get(filename, &tags);
  91. title       = local__getfield(tags, "TITLE");
  92. artist      = local__getfield(tags, "ARTIST");
  93. performer   = local__getfield(tags, "PERFORMER");
  94. album       = local__getfield(tags, "ALBUM");
  95. date        = local__getfield(tags, "DATE");
  96. tracknumber = local__getfield(tags, "TRACKNUMBER");
  97. genre       = local__getfield(tags, "GENRE");
  98. description = local__getfield(tags, "DESCRIPTION");
  99. XMMS_NEW_TITLEINPUT(input);
  100. input->performer = local__getstr(performer);
  101. if(!input->performer)
  102. input->performer = local__getstr(artist);
  103. input->album_name = local__getstr(album);
  104. input->track_name = local__getstr(title);
  105. input->track_number = local__getnum(tracknumber);
  106. input->year = local__getnum(date);
  107. input->genre = local__getstr(genre);
  108. input->comment = local__getstr(description);
  109. input->file_name = g_basename(filename);
  110. input->file_path = filename;
  111. input->file_ext = local__extname(filename);
  112. ret = xmms_get_titlestring(flac_cfg.title.tag_override ? flac_cfg.title.tag_format : xmms_get_gentitle_format(), input);
  113. g_free(input);
  114. if (!ret) {
  115. /*
  116.  * Format according to filename.
  117.  */
  118. ret = g_strdup(g_basename(filename));
  119. if (local__extname(ret) != NULL)
  120. *(local__extname(ret) - 1) = ''; /* removes period */
  121. }
  122. FLAC_plugin__tags_destroy(&tags);
  123. local__safe_free(title);
  124. local__safe_free(artist);
  125. local__safe_free(performer);
  126. local__safe_free(album);
  127. local__safe_free(date);
  128. local__safe_free(tracknumber);
  129. local__safe_free(genre);
  130. local__safe_free(description);
  131. return ret;
  132. }