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