20
20
#include "../mediascanner/MediaFile.hh"
21
21
#include "MetadataExtractor.hh"
22
#include "FileTypeDetector.hh"
25
#include<gst/pbutils/pbutils.h>
23
#include <glib-object.h>
26
#include <gst/pbutils/pbutils.h>
59
DetectedFile MetadataExtractor::detect(const std::string &filename) {
60
std::unique_ptr<GFile, void(*)(void *)> file(
61
g_file_new_for_path(filename.c_str()), g_object_unref);
63
throw runtime_error("Could not create file object");
66
GError *error = nullptr;
67
std::unique_ptr<GFileInfo, void(*)(void *)> info(
70
G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE ","
71
G_FILE_ATTRIBUTE_ETAG_VALUE,
72
G_FILE_QUERY_INFO_NONE, /* cancellable */ NULL, &error),
75
string errortxt(error->message);
78
string msg("Query of file info for ");
82
throw runtime_error(msg);
85
string etag(g_file_info_get_etag(info.get()));
86
string content_type(g_file_info_get_attribute_string(
87
info.get(), G_FILE_ATTRIBUTE_STANDARD_FAST_CONTENT_TYPE));
88
if (content_type.empty()) {
89
throw runtime_error("Could not determine content type.");
93
if (content_type.find("audio/") == 0) {
95
} else if (content_type.find("video/") == 0) {
98
throw runtime_error(string("File ") + filename + " is not audio or video");
100
return DetectedFile(filename, etag, content_type, type);
59
104
extract_tag_info (const GstTagList * list, const gchar * tag, gpointer user_data) {
60
105
MediaFile *mf = (MediaFile *) user_data;
94
MediaFile MetadataExtractor::extract(const std::string &filename) {
96
MediaType media_type = d.detect(filename);
97
if (media_type == UnknownMedia) {
98
throw runtime_error("Tried to create an invalid media type.");
101
MediaFile mf(filename);
102
mf.setType(media_type);
139
MediaFile MetadataExtractor::extract(const DetectedFile &d) {
140
MediaFile mf(d.filename);
142
mf.setContentType(d.content_type);
104
144
string uri = mf.getUri();
105
145
GError *error = nullptr;
106
146
unique_ptr<GstDiscovererInfo, void(*)(void *)> info(
111
151
g_error_free(error);
113
153
string msg = "Discovery of file ";
154
msg += mf.getFileName();
115
155
msg += " failed: ";
117
157
throw runtime_error(msg);
120
160
if (gst_discoverer_info_get_result(info.get()) != GST_DISCOVERER_OK) {
121
throw runtime_error("Unable to discover file " + filename);
161
throw runtime_error("Unable to discover file " + mf.getFileName());
124
164
const GstTagList *tags = gst_discoverer_info_get_tags(info.get());