1 /* Copyright (c) MediaArea.net SARL. All Rights Reserved.
2 *
3 * Use of this source code is governed by a BSD-style license that can
4 * be found in the License.html file in the root of the source tree.
5 */
6
7 #include <string>
8 #include "ZenLib/Ztring.h"
9 #include "ZenLib/ZtringListList.h"
10 #include "ZenLib/File.h"
11 #include "MediaInfo/MediaInfo.h"
12 #include "MediaInfo/MediaInfoList.h"
13 #include <stdio.h>
14
15 struct Option
16 {
17 ZenLib::Ztring media_filename;
18 ZenLib::Ztring out_filename;
19 ZenLib::Ztring details;
20 ZenLib::Ztring read_by_human;
21 ZenLib::Ztring language;
22 ZenLib::Ztring out_format;
23 ZenLib::ZtringListList extra_options;
24 };
25
usage()26 static int usage()
27 {
28 fprintf(stderr, "tool [--details|-d] [--human-readable|-h] [--format|-f output_format] [--language|-l output_language] [--extra-options|-e options] media_filename output_filename\n");
29 return 1;
30 }
31
parse_options(int ac,char * av[],Option & opts)32 static int parse_options(int ac, char *av[], Option& opts)
33 {
34 if (ac < 3)
35 return usage();
36
37 opts.out_format = __T("XML");
38 opts.details = __T("0");
39 opts.read_by_human = __T("0");
40 opts.language = __T("raw");
41 opts.extra_options.Separator_Set(0, __T(","));
42 opts.extra_options.Separator_Set(1, __T(":"));
43
44 int nb_arguments = 0;
45
46 for (int i = 1; i < ac; ++i)
47 {
48 if (std::string("--details") == av[i] || std::string("-d") == av[i])
49 {
50 opts.details = __T("1");
51 }
52 else if (std::string("--human-readable") == av[i] || std::string("-h") == av[i])
53 {
54 opts.read_by_human = __T("1");
55 }
56 else if (std::string("--format") == av[i] || std::string("-f") == av[i])
57 {
58 ++i;
59 if (i == ac)
60 return usage();
61
62 opts.out_format = ZenLib::Ztring().From_Local(av[i]);
63 }
64 else if (std::string("--language") == av[i] || std::string("-l") == av[i])
65 {
66 ++i;
67 if (i == ac)
68 return usage();
69
70 opts.language = ZenLib::Ztring().From_Local(av[i]);
71 }
72 else if (std::string("--extra-options") == av[i] || std::string("-e") == av[i])
73 {
74 ++i;
75 if (i == ac)
76 return usage();
77
78 opts.extra_options.Write(ZenLib::Ztring().From_Local(av[i]));
79 }
80 else
81 {
82 if (nb_arguments == 0)
83 opts.media_filename = ZenLib::Ztring().From_Local(av[i]);
84 else if (nb_arguments == 1)
85 opts.out_filename = ZenLib::Ztring().From_Local(av[i]);
86 else
87 return usage();
88
89 ++nb_arguments;
90 }
91 }
92
93 if (nb_arguments != 2)
94 return usage();
95
96 return 0;
97 }
98
main(int ac,char * av[])99 int main(int ac, char *av[])
100 {
101 setlocale(LC_ALL, "");
102 MediaInfoLib::MediaInfo::Option_Static(__T("CharSet"), __T(""));
103
104 Option opts;
105 if (parse_options(ac, av, opts))
106 return 1;
107
108 ZenLib::File out;
109 out.Create(opts.out_filename);
110 out.Open(opts.out_filename, ZenLib::File::Access_Write);
111 if (!out.Opened_Get())
112 {
113 fprintf(stderr, "Cannot open output file:%s\n", opts.out_filename.To_UTF8().c_str());
114 return 1;
115 }
116
117 MediaInfoLib::MediaInfoList mi;
118
119 mi.Option(__T("Details"), opts.details);
120 mi.Option(__T("ReadByHuman"), opts.read_by_human);
121 mi.Option(__T("Language"), opts.language);
122 mi.Option(__T("Inform"), opts.out_format);
123
124 for (int i = 0; i < opts.extra_options.size(); ++i)
125 {
126 ZenLib::Ztring option = opts.extra_options.Read(i, 0);
127 ZenLib::Ztring value = opts.extra_options.Read(i, 1);
128
129 mi.Option(option, value);
130 }
131
132 if (mi.Open(opts.media_filename) == 0)
133 {
134 fprintf(stderr, "Cannot open media file\n");
135 return 1;
136 }
137 if (out.Write(mi.Inform()) == 0)
138 {
139 fprintf(stderr, "Cannot write to output file\n");
140 return 1;
141 }
142 out.Close();
143 mi.Close();
144
145 return 0;
146 }
147