📄 taglib.cpp
字号:
/***************************************************************************** * taglib.cpp: Taglib tag parser/writer ***************************************************************************** * Copyright (C) 2003-2006 the VideoLAN team * $Id$ * * Authors: Clément Stenac <zorglub@videolan.org> * Rafaël Carré <funman@videolanorg> * * 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. *****************************************************************************/#ifdef HAVE_CONFIG_H# include "config.h"#endif#include <vlc_common.h>#include <vlc_plugin.h>#include <vlc_playlist.h>#include <vlc_meta.h>#include <vlc_demux.h>#include <vlc_strings.h>#include <vlc_charset.h>#ifdef WIN32# include <io.h>#else# include <unistd.h>#endif#include <fileref.h>#include <tag.h>#include <tstring.h>#include <id3v2tag.h>#include <textidentificationframe.h>#include <tbytevector.h>#include <mpegfile.h>#include <attachedpictureframe.h>//#include <oggflacfile.h> /* ogg flac files aren't auto-casted by TagLib */#include <flacfile.h>#include <flacproperties.h>#include <vorbisfile.h>#include <vorbisproperties.h>#include <xiphcomment.h>#include <uniquefileidentifierframe.h>#include <textidentificationframe.h>//#include <relativevolumeframe.h> /* parse the tags without TagLib helpers? */static int ReadMeta ( vlc_object_t * );static int DownloadArt ( vlc_object_t * );static int WriteMeta ( vlc_object_t * );vlc_module_begin(); set_capability( "meta reader", 1000 ); set_callbacks( ReadMeta, NULL ); add_submodule(); set_capability( "art downloader", 50 ); set_callbacks( DownloadArt, NULL ); add_submodule(); set_capability( "meta writer", 50 ); set_callbacks( WriteMeta, NULL );vlc_module_end();using namespace TagLib;/* Try detecting embedded art */static void DetectImage( FileRef f, demux_t *p_demux ){ demux_meta_t *p_demux_meta = (demux_meta_t *)p_demux->p_private; vlc_meta_t *p_meta = p_demux_meta->p_meta; int i_score = -1; /* Preferred type of image * The 21 types are defined in id3v2 standard: * http://www.id3.org/id3v2.4.0-frames */ static const int pi_cover_score[] = { 0, /* Other */ 5, /* 32x32 PNG image that should be used as the file icon */ 4, /* File icon of a different size or format. */ 20, /* Front cover image of the album. */ 19, /* Back cover image of the album. */ 13, /* Inside leaflet page of the album. */ 18, /* Image from the album itself. */ 17, /* Picture of the lead artist or soloist. */ 16, /* Picture of the artist or performer. */ 14, /* Picture of the conductor. */ 15, /* Picture of the band or orchestra. */ 9, /* Picture of the composer. */ 8, /* Picture of the lyricist or text writer. */ 7, /* Picture of the recording location or studio. */ 10, /* Picture of the artists during recording. */ 11, /* Picture of the artists during performance. */ 6, /* Picture from a movie or video related to the track. */ 1, /* Picture of a large, coloured fish. */ 12, /* Illustration related to the track. */ 3, /* Logo of the band or performer. */ 2 /* Logo of the publisher (record company). */ }; if( MPEG::File *mpeg = dynamic_cast<MPEG::File *>(f.file() ) ) { ID3v2::Tag *p_tag = mpeg->ID3v2Tag(); if( !p_tag ) return; ID3v2::FrameList list = p_tag->frameListMap()[ "APIC" ]; if( list.isEmpty() ) return; ID3v2::AttachedPictureFrame *p_apic; TAB_INIT( p_demux_meta->i_attachments, p_demux_meta->attachments ); for( ID3v2::FrameList::Iterator iter = list.begin(); iter != list.end(); iter++ ) { p_apic = dynamic_cast<ID3v2::AttachedPictureFrame*>(*iter); input_attachment_t *p_attachment; const char *psz_name, *psz_mime, *psz_description; ByteVector p_data_taglib; const char *p_data; int i_data; psz_mime = p_apic->mimeType().toCString(true); psz_description = psz_name = p_apic->description().toCString(true); /* some old iTunes version not only sets incorrectly the mime type * or the description of the image, * but also embeds incorrectly the image. * Recent versions seem to behave correctly */ if( !strncmp( psz_mime, "PNG", 3 ) || !strncmp( psz_name, "\xC2\x89PNG", 5 ) ) { msg_Warn( p_demux, "%s: Invalid picture embedded by broken iTunes version, " "you really shouldn't use this crappy software.", (const char *)f.file()->name() ); break; } p_data_taglib = p_apic->picture(); p_data = p_data_taglib.data(); i_data = p_data_taglib.size(); msg_Dbg( p_demux, "Found embedded art: %s (%s) is %i bytes", psz_name, psz_mime, i_data ); p_attachment = vlc_input_attachment_New( psz_name, psz_mime, psz_description, p_data, i_data ); TAB_APPEND_CAST( (input_attachment_t**), p_demux_meta->i_attachments, p_demux_meta->attachments, p_attachment ); if( pi_cover_score[p_apic->type()] > i_score ) { i_score = pi_cover_score[p_apic->type()]; char *psz_url; if( asprintf( &psz_url, "attachment://%s", p_attachment->psz_name ) == -1 ) return; vlc_meta_SetArtURL( p_meta, psz_url ); free( psz_url ); } } } else if( Ogg::Vorbis::File *oggv = dynamic_cast<Ogg::Vorbis::File *>(f.file() ) ) { Ogg::XiphComment *p_tag = oggv->tag(); if( !p_tag ) return; StringList mime_list = p_tag->fieldListMap()[ "COVERARTMIME" ]; StringList art_list = p_tag->fieldListMap()[ "COVERART" ]; /* we support only one cover in ogg/vorbis */ if( mime_list.size() != 1 || art_list.size() != 1 ) return; input_attachment_t *p_attachment; const char *psz_name, *psz_mime, *psz_description; uint8_t *p_data; int i_data; psz_name = "cover"; psz_mime = mime_list[0].toCString(true); psz_description = "cover"; i_data = vlc_b64_decode_binary( &p_data, art_list[0].toCString(true) ); msg_Dbg( p_demux, "Found embedded art: %s (%s) is %i bytes", psz_name, psz_mime, i_data ); TAB_INIT( p_demux_meta->i_attachments, p_demux_meta->attachments ); p_attachment = vlc_input_attachment_New( psz_name, psz_mime, psz_description, p_data, i_data ); free( p_data ); TAB_APPEND_CAST( (input_attachment_t**), p_demux_meta->i_attachments, p_demux_meta->attachments, p_attachment ); vlc_meta_SetArtURL( p_meta, "attachment://cover" ); }#if 0 //flac embedded images are extracted in the flac demuxer else if( FLAC::File *flac = dynamic_cast<FLAC::File *>(f.file() ) ) { p_tag = flac->ID3v2Tag(); if( p_tag ) return; ID3v2::FrameList l = p_tag->frameListMap()[ "APIC" ]; if( l.isEmpty() ) return; vlc_meta_SetArtURL( p_meta, "APIC" ); }#endif#if 0/* TagLib doesn't support MP4 file yet */ else if( MP4::File *mp4 = dynamic_cast<MP4::File *>( f.file() ) ) { MP4::Tag *mp4tag = dynamic_cast<MP4::Tag *>( mp4->tag() ); if( mp4tag && mp4tag->cover().size() ) vlc_meta_SetArtURL( p_meta, "MP4C" ); }#endif}static int ReadMeta( vlc_object_t *p_this ){ demux_t *p_demux = (demux_t *)p_this; demux_meta_t *p_demux_meta = (demux_meta_t*)p_demux->p_private; vlc_meta_t *p_meta; TagLib::FileRef f; TAB_INIT( p_demux_meta->i_attachments, p_demux_meta->attachments ); p_demux_meta->p_meta = NULL;#if defined(WIN32) || defined (UNDER_CE) if(GetVersion() < 0x80000000) { wchar_t wpath[MAX_PATH + 1]; if( !MultiByteToWideChar( CP_UTF8, 0, p_demux->psz_path, -1, wpath, MAX_PATH) ) return VLC_EGENERIC; wpath[MAX_PATH] = L'0'; f = FileRef( wpath ); } else return VLC_EGENERIC;#else const char *local_name = ToLocale( p_demux->psz_path ); if( local_name == NULL ) return VLC_EGENERIC;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -