1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/*
* metainfo_menu.c: Media file info menu
*
* See the main source file 'xineliboutput.c' for copyright information and
* how to reach the author.
*
* $Id: metainfo_menu.c,v 1.4.2.1 2009-06-09 11:52:00 phintuka Exp $
*
*/
#ifdef HAVE_LIBEXTRACTOR
# include <extractor.h>
#endif
#include <vdr/status.h>
#include "../i18n.h"
#include "../config.h"
#include "metainfo_menu.h"
//
// cMetainfoMenu
//
cMetainfoMenu::cMetainfoMenu(cString Filename) :
cOsdMenu(Filename),
m_Filename(Filename)
{
const char *Title = strrchr(Filename, '/');
if(Title && *(Title+1))
SetTitle(Title+1);
}
cMetainfoMenu::~cMetainfoMenu()
{
}
void cMetainfoMenu::Display(void)
{
cOsdMenu::Display();
char metadata[4096];
metadata[0] = 0;
#ifdef HAVE_LIBEXTRACTOR
EXTRACTOR_ExtractorList * plugins;
EXTRACTOR_KeywordList * md_list;
plugins = EXTRACTOR_loadDefaultLibraries();
md_list = EXTRACTOR_getKeywords(plugins, m_Filename);
md_list = EXTRACTOR_removeEmptyKeywords (md_list);
md_list = EXTRACTOR_removeDuplicateKeywords(md_list, 0);
md_list = EXTRACTOR_removeKeywordsOfType(md_list, EXTRACTOR_THUMBNAILS);
const char *key;
char * buf;
while(md_list) {
if((key=EXTRACTOR_getKeywordTypeAsString(md_list->keywordType))) {
buf = strdup(md_list->keyword);
sprintf(metadata, "%s%s: %s\n", metadata, key, buf);
free(buf);
}
md_list=md_list->next;
}
EXTRACTOR_freeKeywords(md_list);
EXTRACTOR_removeAll(plugins); /* unload plugins */
#else
cString cmd;
if(xc.IsPlaylistFile(m_Filename))
cmd = cString::sprintf("file -b '%s'; cat '%s'", *m_Filename, *m_Filename);
else if(xc.IsAudioFile(m_Filename))
cmd = cString::sprintf("mp3info -x '%s' ; file -b '%s'", *m_Filename, *m_Filename);
else if(xc.IsVideoFile(m_Filename))
cmd = cString::sprintf("file -b '%s'; midentify '%s'", *m_Filename, *m_Filename);
else if(xc.IsImageFile(m_Filename))
cmd = cString::sprintf("file -b '%s'; identify '%s'", *m_Filename, *m_Filename);
else
cmd = cString::sprintf("file -b '%s'", *m_Filename);
cPipe p;
if(p.Open(*cmd, "r")) {
int n = fread(metadata, 1, sizeof(metadata)-1, p);
if(n>0) {
metadata[n] = 0;
strreplace(metadata, ',', '\n');
}
}
#endif
DisplayMenu()->SetText(metadata, false);
cStatus::MsgOsdTextItem(cString::sprintf("%s\n%s", tr("Metainfo"), *m_Filename));
}
eOSState cMetainfoMenu::ProcessKey(eKeys Key)
{
eOSState state = cOsdMenu::ProcessKey(Key);
return state;
}
|