return new Blob([encodedData]);
};
+MetadataFileHandle.prototype.getSyncLyrics = function() {
+ var args = validator_.validateArgs(arguments, [
+ { name: 'index', type: types_.UNSIGNED_LONG }
+ ]);
+
+ var data = {
+ uri: this.uri,
+ id: this._id,
+ index: args.index
+ };
+
+ var result = native_.callSync('MetadataFileHandleGetSyncLyrics', data);
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
+ }
+ return new MetadataSyncLyrics(native_.getResultObject(result));
+};
+
+function MetadataSyncLyrics(data) {
+ Object.defineProperties(this, {
+ timestamp: { value: data.timestamp, writable: false, enumerable: true },
+ lyrics: { value: data.lyrics, writable: false, enumerable: true }
+ });
+}
+
// Exports
exports = new MetadataManager();
}
}
-MetadataFileHandle::MetadataFileHandle(int id) : handle_(nullptr), id_(id), width_(0), height_(0) {
+MetadataFileHandle::MetadataFileHandle(int id) : handle_(nullptr), id_(id), width_(0), height_(0), lyrics_num_(0) {
ScopeLogger();
}
// 'this' owns a handle_, and uri_ and invalidates 'o'
MetadataFileHandle::MetadataFileHandle(MetadataFileHandle&& o)
- : handle_(nullptr), id_(o.id_), uri_(std::move(o.uri_)), width_(0), height_(0) {
+ : handle_(nullptr), id_(o.id_), uri_(std::move(o.uri_)), width_(0), height_(0), lyrics_num_(0) {
ScopeLogger();
handle_ = o.handle_;
o.handle_ = nullptr;
uri_ = std::move(o.uri_);
width_ = o.width_;
height_ = o.height_;
+ lyrics_num_ = o.lyrics_num_;
return *this;
}
return PlatformResult(ErrorCode::NO_ERROR);
}
+PlatformResult MetadataFileHandle::InitSyncLyricsNum() {
+ ScopeLogger();
+ if (0 == lyrics_num_) {
+ char* value = nullptr;
+ int native_res = metadata_extractor_get_metadata(handle_, METADATA_SYNCLYRICS_NUM, &value);
+ if (METADATA_EXTRACTOR_ERROR_NONE != native_res) {
+ LoggerE("Error during getting lyrics number: %d", native_res);
+ return convertErrorCode(native_res);
+ }
+ lyrics_num_ = (unsigned long)atoi(value);
+ free(value);
+ }
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
+PlatformResult MetadataFileHandle::GetSyncLyrics(const unsigned long index,
+ unsigned long* timestamp,
+ std::string* lyrics_string) {
+ ScopeLogger();
+ char* lyrics = nullptr;
+ SCOPE_EXIT {
+ free(lyrics);
+ };
+
+ auto ret = InitSyncLyricsNum();
+ if (!ret) {
+ return ret;
+ }
+
+ // validation of input index (available values are <0; lyrics_num -1>)
+ if (index >= lyrics_num_) {
+ std::string message = "Invalid lyrics index: " + std::to_string(index);
+ return LogAndCreateResult(ErrorCode::INVALID_VALUES_ERR, message.c_str());
+ }
+
+ int native_res = metadata_extractor_get_synclyrics(handle_, index, timestamp, &lyrics);
+ if (METADATA_EXTRACTOR_ERROR_NONE != native_res) {
+ LoggerE("Error during getting sync lyrics: %d", native_res);
+ return convertErrorCode(native_res);
+ }
+ if (lyrics) {
+ *lyrics_string = lyrics;
+ }
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
} // namespace metadata
} // namespace extension
common::PlatformResult GetFrame(std::vector<std::uint8_t>* frame_array);
common::PlatformResult GetFrame(const unsigned long timestamp, const bool is_accurate,
std::vector<std::uint8_t>* frame_array);
+ common::PlatformResult GetSyncLyrics(const unsigned long index, unsigned long* timestamp,
+ std::string* lyrics_string);
private:
common::PlatformResult InitWidthHeight();
+ common::PlatformResult InitSyncLyricsNum();
common::PlatformResult EncodeJPEG(unsigned char* frame, size_t frame_size,
std::uint8_t** uint8_frame, size_t* buffer_size);
unsigned int width_;
unsigned int height_;
+ unsigned int lyrics_num_;
};
} // namespace metadata
REGISTER_METHOD(MetadataFileHandleGetArtwork);
REGISTER_METHOD(MetadataFileHandleGetThumbnailFrame);
REGISTER_METHOD(MetadataFileHandleGetFrameAtTime);
+ REGISTER_METHOD(MetadataFileHandleGetSyncLyrics);
REGISTER_METHOD(MetadataFileHandleRelease);
#undef REGISTER_METHOD
}
ReportSuccess(picojson::value(result_frame), out);
}
+picojson::value getSyncLyricsJSON(const unsigned long timestamp, const std::string& lyrics) {
+ ScopeLogger();
+ picojson::value result = picojson::value(picojson::object());
+ picojson::object& result_obj = result.get<picojson::object>();
+ result_obj.insert(std::make_pair("timestamp", picojson::value((double)timestamp)));
+ result_obj.insert(std::make_pair("lyrics", picojson::value(lyrics)));
+
+ return result;
+}
+
+void MetadataInstance::MetadataFileHandleGetSyncLyrics(const picojson::value& args,
+ picojson::object& out) {
+ ScopeLogger();
+ const std::string& uri = args.get("uri").get<std::string>();
+ const int id = static_cast<int>(args.get("id").get<double>());
+ const unsigned long index = static_cast<unsigned long>(args.get("index").get<double>());
+
+ auto res = InitializeHandleIfNeeded(uri, id);
+ if (!res) {
+ LogAndReportError(res, &out);
+ return;
+ }
+
+ unsigned long timestamp = 0;
+ std::string lyrics;
+ try {
+ MetadataFileHandle& m = handles_map_.at(id);
+
+ auto res = m.GetSyncLyrics(index, ×tamp, &lyrics);
+ if (!res) {
+ LogAndReportError(res, &out);
+ return;
+ }
+ } catch (...) {
+ // this should never happen
+ LogAndReportError(
+ PlatformResult(ErrorCode::ABORT_ERR, "Unknown error during accessing a file."), &out);
+ return;
+ }
+
+ ReportSuccess(getSyncLyricsJSON(timestamp, lyrics), out);
+}
+
void MetadataInstance::MetadataFileHandleRelease(const picojson::value& args,
picojson::object& out) {
ScopeLogger();
void MetadataFileHandleGetArtwork(const picojson::value& args, picojson::object& out);
void MetadataFileHandleGetThumbnailFrame(const picojson::value& args, picojson::object& out);
void MetadataFileHandleGetFrameAtTime(const picojson::value& args, picojson::object& out);
+ void MetadataFileHandleGetSyncLyrics(const picojson::value& args, picojson::object& out);
void MetadataFileHandleRelease(const picojson::value& args, picojson::object& out);
std::map<int, MetadataFileHandle> handles_map_;