diff --git a/qml/InfosGeneric.qml b/qml/InfosGeneric.qml index c702417..7b75cd7 100644 --- a/qml/InfosGeneric.qml +++ b/qml/InfosGeneric.qml @@ -19,13 +19,9 @@ ScrollView { info_extension.text = mediaItem.ext info_date.text = mediaItem.date.toLocaleDateString() info_time.text = mediaItem.date.toLocaleTimeString() - item_duration.visible = (mediaItem.duration > 0) info_duration.text = UtilsString.durationToString_short(mediaItem.duration) - - item_size.visible = false - info_size.text = UtilsString.bytesToString(mediaItem.size) - + info_size.text = UtilsString.bytesToString(mediaItem.size, settingsManager.unitSizes) item_timecode.visible = (mediaItem.timecode.length > 0) info_timecode.text = mediaItem.timecode @@ -47,9 +43,11 @@ ScrollView { columnImage.visible = true info_icodec.text = mediaItem.videoCodec + info_impix.text = ((mediaItem.width * mediaItem.height) / 1000000).toFixed(1) info_idefinition.text = mediaItem.width + " x " + mediaItem.height info_iaspectratio.text = UtilsMedia.varToString(mediaItem.width, mediaItem.height) - item_iorientation.visible = (mediaItem.orientation > 0) + info_iresolution.text = (mediaItem.resolution) ? (mediaItem.resolution + " " + qsTr("dpi")) : "" + item_iorientation.visible = (mediaItem.orientation !== 0) info_iorientation.text = UtilsMedia.orientationToString(mediaItem.orientation) item_iprojection.visible = (mediaItem.projection > 0) info_iprojection.text = UtilsMedia.projectionToString(mediaItem.projection) @@ -271,7 +269,6 @@ ScrollView { } } Row { //// - id: item_size anchors.left: parent.left anchors.leftMargin: 56 height: 24 @@ -468,12 +465,12 @@ ScrollView { spacing: 16 Text { - text: qsTr("definition") + text: qsTr("megapixel") color: Theme.colorSubText font.pixelSize: 15 } Text { - id: info_idefinition + id: info_impix color: Theme.colorText font.pixelSize: 15 } @@ -495,6 +492,41 @@ ScrollView { font.pixelSize: 15 } } + Row { //// + anchors.left: parent.left + anchors.leftMargin: 56 + height: 24 + spacing: 16 + + Text { + text: qsTr("definition") + color: Theme.colorSubText + font.pixelSize: 15 + } + Text { + id: info_idefinition + color: Theme.colorText + font.pixelSize: 15 + } + } + Row { //// + anchors.left: parent.left + anchors.leftMargin: 56 + height: 24 + spacing: 16 + visible: (info_iresolution.text.length > 0) + + Text { + text: qsTr("resolution") + color: Theme.colorSubText + font.pixelSize: 15 + } + Text { + id: info_iresolution + color: Theme.colorText + font.pixelSize: 15 + } + } Row { //// id: item_iorientation anchors.left: parent.left diff --git a/qml/InfosImageTags.qml b/qml/InfosImageTags.qml index c73ab40..392c4f2 100644 --- a/qml/InfosImageTags.qml +++ b/qml/InfosImageTags.qml @@ -25,7 +25,10 @@ ScrollView { info_iso.text = mediaItem.iso info_focal.text = mediaItem.focal info_exposure.text = mediaItem.exposure + info_exposureBias.text = mediaItem.exposureBias info_flash.text = mediaItem.flash + info_lightSource.text = mediaItem.lightSource + info_meteringMode.text = mediaItem.meteringMode columnGPS.visible = mediaItem.hasGPS info_gps_version.text = mediaItem.gpsVersion @@ -213,6 +216,7 @@ ScrollView { anchors.leftMargin: 56 height: 24 spacing: 16 + visible: (info_focal.text.length > 0) Text { text: qsTr("focal") @@ -231,6 +235,7 @@ ScrollView { anchors.leftMargin: 56 height: 24 spacing: 16 + visible: (info_exposure.text.length > 0) Text { text: qsTr("exposure time") @@ -243,12 +248,32 @@ ScrollView { font.pixelSize: 15 } } + Row { //// + id: item_exposureBias + anchors.left: parent.left + anchors.leftMargin: 56 + height: 24 + spacing: 16 + visible: (info_exposureBias.text.length > 0) + + Text { + text: qsTr("exposure bias") + color: Theme.colorSubText + font.pixelSize: 15 + } + Text { + id: info_exposureBias + color: Theme.colorText + font.pixelSize: 15 + } + } Row { //// id: item_iso anchors.left: parent.left anchors.leftMargin: 56 height: 24 spacing: 16 + visible: (info_iso.text.length > 0) Text { text: qsTr("ISO") @@ -267,6 +292,7 @@ ScrollView { anchors.leftMargin: 56 height: 24 spacing: 16 + visible: (info_flash.text != "false") Text { text: qsTr("flash") @@ -279,6 +305,44 @@ ScrollView { font.pixelSize: 15 } } + Row { //// + id: item_lightSource + anchors.left: parent.left + anchors.leftMargin: 56 + height: 24 + spacing: 16 + visible: (info_lightSource.text.length > 0) + + Text { + text: qsTr("light source") + color: Theme.colorSubText + font.pixelSize: 15 + } + Text { + id: info_lightSource + color: Theme.colorText + font.pixelSize: 15 + } + } + Row { //// + id: item_meteringMode + anchors.left: parent.left + anchors.leftMargin: 56 + height: 24 + spacing: 16 + visible: (info_meteringMode.text.length > 0) + + Text { + text: qsTr("metering mode") + color: Theme.colorSubText + font.pixelSize: 15 + } + Text { + id: info_meteringMode + color: Theme.colorText + font.pixelSize: 15 + } + } } //////////////// diff --git a/src/media.cpp b/src/media.cpp index d7c320a..5fded1b 100644 --- a/src/media.cpp +++ b/src/media.cpp @@ -121,7 +121,9 @@ bool Media::getMetadatasFromPicture() if (ed) { m_hasEXIF = true; - tag_found = 0; + m_exif_tag_found = 0; + + //ExifByteOrder byte_order = exif_data_get_byte_order(ed); // EXIF //////////////////////////////////////////////////////////////// @@ -134,14 +136,14 @@ bool Media::getMetadatasFromPicture() { exif_entry_get_value(entry, buf, sizeof(buf)); m_camera_brand = buf; - tag_found++; + m_exif_tag_found++; } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_MODEL); if (entry) { exif_entry_get_value(entry, buf, sizeof(buf)); m_camera_model = buf; - tag_found++; + m_exif_tag_found++; } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_SOFTWARE); @@ -149,7 +151,21 @@ bool Media::getMetadatasFromPicture() { exif_entry_get_value(entry, buf, sizeof(buf)); m_camera_software = buf; - tag_found++; + m_exif_tag_found++; + } + + //////////////// + + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_DATE_TIME); + if (entry) + { + // TODO + //0x882a TimeZoneOffset int16s[n] ExifIFD (1 or 2 values: 1. The time zone offset of DateTimeOriginal from GMT in hours, 2. If present, the time zone offset of ModifyDate) + //0x9010 OffsetTime string ExifIFD (time zone for ModifyDate) + + // ex: DateTime: 2018:08:10 10:37:08 + exif_entry_get_value(entry, buf, sizeof(buf)); + m_date_metadatas = QDateTime::fromString(buf, "yyyy:MM:dd hh:mm:ss"); } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_X_DIMENSION); @@ -157,21 +173,54 @@ bool Media::getMetadatasFromPicture() { exif_entry_get_value(entry, buf, sizeof(buf)); width = QString::fromLatin1(buf).toUInt(); - tag_found++; } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_PIXEL_Y_DIMENSION); if (entry) { exif_entry_get_value(entry, buf, sizeof(buf)); height = QString::fromLatin1(buf).toUInt(); - tag_found++; } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_X_RESOLUTION); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + resolution_x = QString::fromLatin1(buf).toUInt(); + } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_Y_RESOLUTION); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + resolution_y = QString::fromLatin1(buf).toUInt(); + } + + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_COLOR_SPACE); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + //qDebug() << "EXIF_TAG_COLOR_SPACE" << QString::fromLatin1(buf); + //m_exif_tag_found++; + } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_1], EXIF_TAG_BITS_PER_SAMPLE); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + //qDebug() << "EXIF_TAG_BITS_PER_SAMPLE" << QString::fromLatin1(buf); + //m_exif_tag_found++; + } + + //EXIF_TAG_COLOR_SPACE + //EXIF_TAG_BITS_PER_SAMPLE + //EXIF_TAG_YCBCR_COEFFICIENTS + //EXIF_TAG_YCBCR_SUB_SAMPLING + //EXIF_TAG_YCBCR_POSITIONING + //EXIF_TAG_WHITE_POINT + //EXIF_TAG_PRIMARY_CHROMATICITIES entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_ORIENTATION); if (entry) { exif_entry_get_value(entry, buf, sizeof(buf)); - //orientation = buf; + //qDebug() << "EXIF_TAG_ORIENTATION" << QString::fromLatin1(buf); /* 1 = Horizontal (normal) 2 = Mirror horizontal @@ -182,12 +231,18 @@ bool Media::getMetadatasFromPicture() 7 = Mirror horizontal and rotate 90 CW 8 = Rotate 270 CW */ +/* if (strncmp(buf, "Top-left", sizeof(buf)) == 0) { - // TODO + //orientation = -90; + } + if (strncmp(buf, "Right-top", sizeof(buf)) == 0) + { + //orientation = 90; } - tag_found++; +*/ } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_FNUMBER); if (entry) { @@ -197,7 +252,7 @@ bool Media::getMetadatasFromPicture() focal = buf; focal.replace("f", "ƒ"); } - tag_found++; + m_exif_tag_found++; } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_FOCAL_LENGTH); if (entry) @@ -208,7 +263,7 @@ bool Media::getMetadatasFromPicture() if (!focal.isEmpty()) focal += " "; focal += buf; } - tag_found++; + m_exif_tag_found++; } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_ISO_SPEED_RATINGS); @@ -216,37 +271,80 @@ bool Media::getMetadatasFromPicture() { exif_entry_get_value(entry, buf, sizeof(buf)); iso = buf; - tag_found++; + m_exif_tag_found++; } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_EXPOSURE_TIME); if (entry) { exif_entry_get_value(entry, buf, sizeof(buf)); - esposure_time = buf; - tag_found++; + exposure_time = buf; + m_exif_tag_found++; } - entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_FLASH); + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_EXPOSURE_BIAS_VALUE); if (entry) { exif_entry_get_value(entry, buf, sizeof(buf)); - int flashvalue = QString::fromLatin1(buf).toInt(); - - if (flashvalue > 0) flash = true; - tag_found++; + exposure_bias = buf; + m_exif_tag_found++; } - entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_DATE_TIME); + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_METERING_MODE); if (entry) { - // TODO - //0x882a TimeZoneOffset int16s[n] ExifIFD (1 or 2 values: 1. The time zone offset of DateTimeOriginal from GMT in hours, 2. If present, the time zone offset of ModifyDate) - //0x9010 OffsetTime string ExifIFD (time zone for ModifyDate) + exif_entry_get_value(entry, buf, sizeof(buf)); + metering_mode = buf; + m_exif_tag_found++; + } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHARPNESS); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + //qDebug() << "EXIF_TAG_SHARPNESS" << QString::fromLatin1(buf); + //m_exif_tag_found++; + } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_SATURATION); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + //qDebug() << "EXIF_TAG_SATURATION" << QString::fromLatin1(buf); + //m_exif_tag_found++; + } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_SHUTTER_SPEED_VALUE); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + //qDebug() << "EXIF_TAG_SHUTTER_SPEED_VALUE" << QString::fromLatin1(buf); + //m_exif_tag_found++; + } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_APERTURE_VALUE); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + //qDebug() << "EXIF_TAG_APERTURE_VALUE" << QString::fromLatin1(buf); + //m_exif_tag_found++; + } + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_MAX_APERTURE_VALUE); + if (entry) + { + exif_entry_get_value(entry, buf, sizeof(buf)); + //qDebug() << "EXIF_TAG_MAX_APERTURE_VALUE" << QString::fromLatin1(buf); + //m_exif_tag_found++; + } + //EXIF_TAG_BRIGHTNESS_VALUE - // ex: DateTime: 2018:08:10 10:37:08 + entry = exif_content_get_entry(ed->ifd[EXIF_IFD_EXIF], EXIF_TAG_FLASH); + if (entry) + { exif_entry_get_value(entry, buf, sizeof(buf)); - m_date_metadatas = QDateTime::fromString(buf, "yyyy:MM:dd hh:mm:ss"); - tag_found++; + int flashvalue = QString::fromLatin1(buf).toInt(); + + if (flashvalue > 0) flash = true; + m_exif_tag_found++; } + //EXIF_TAG_FLASH_ENERGY + //EXIF_TAG_FLASH_PIX_VERSION + + // GPS infos /////////////////////////////////////////////////////////// QDate gpsDate; QTime gpsTime; @@ -257,7 +355,7 @@ bool Media::getMetadatasFromPicture() // ex: GPSDateStamp: 2018:08:10 exif_entry_get_value(entry, buf, sizeof(buf)); gpsDate = QDate::fromString(buf, "yyyy:MM:dd"); - tag_found++; + m_exif_tag_found++; } entry = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], static_cast(EXIF_TAG_GPS_TIME_STAMP)); @@ -269,17 +367,16 @@ bool Media::getMetadatasFromPicture() if (!gpsTime.isValid()) gpsTime = QTime::fromString(buf, "hh:mm:ss.z"); - tag_found++; + m_exif_tag_found++; } if (gpsDate.isValid() && gpsTime.isValid()) m_date_gps = QDateTime(gpsDate, gpsTime); - // GPS infos /////////////////////////////////////////////////////////////// if (m_date_gps.isValid()) { m_hasGPS = true; - tag_found++; + m_exif_tag_found++; entry = exif_content_get_entry(ed->ifd[EXIF_IFD_GPS], static_cast(EXIF_TAG_GPS_LATITUDE)); @@ -379,7 +476,6 @@ bool Media::getMetadatasFromPicture() qDebug() << "gps_diff:" << m_gps_diff; qDebug() << "gps_version:" << m_gps_version; qDebug() << "gps_timestamp:" << m_date_gps; - */ } @@ -425,7 +521,7 @@ bool Media::getMetadatasFromPicture() vcodec = img_infos.format(); width = img_infos.size().rwidth(); height = img_infos.size().rheight(); - orientation = img_infos.transformation(); + orientation = img_infos.transformation(); // FIXME status = true; } @@ -471,13 +567,41 @@ bool Media::getMetadatasFromAudio() status = true; TagLib::Tag *tag = f.tag(); - tag_artist = QString::fromStdWString(tag->artist().toCWString()); - tag_title = QString::fromStdWString(tag->title().toCWString()); - tag_album = QString::fromStdWString(tag->album().toCWString()); - tag_track_nb = tag->track(); - tag_year = tag->year(); - tag_genre = QString::fromStdWString(tag->genre().toCWString()); - tag_comment = QString::fromStdWString(tag->comment().toCWString()); + if (tag->artist().length()) + { + tag_artist = QString::fromStdWString(tag->artist().toCWString()); + m_audio_tag_found++; + } + if (tag->title().length()) + { + tag_title = QString::fromStdWString(tag->title().toCWString()); + m_audio_tag_found++; + } + if (tag->album().length()) + { + tag_album = QString::fromStdWString(tag->album().toCWString()); + m_audio_tag_found++; + } + if (tag->track() > 0) + { + tag_track_nb = tag->track(); + m_audio_tag_found++; + } + if (tag->year() > 0) + { + tag_year = tag->year(); + m_audio_tag_found++; + } + if (tag->genre().length()) + { + tag_genre = QString::fromStdWString(tag->genre().toCWString()); + m_audio_tag_found++; + } + if (tag->comment().length()) + { + tag_comment = QString::fromStdWString(tag->comment().toCWString()); + m_audio_tag_found++; + } //std::cout << "-- TAG (properties) --" << std::endl; TagLib::PropertyMap tags = f.file()->properties(); diff --git a/src/media.h b/src/media.h index 6d57106..d7df682 100644 --- a/src/media.h +++ b/src/media.h @@ -83,15 +83,19 @@ class Media: public QObject Q_PROPERTY(unsigned width READ getWidth NOTIFY mediaUpdated) Q_PROPERTY(unsigned height READ getHeight NOTIFY mediaUpdated) Q_PROPERTY(unsigned depth READ getDepth NOTIFY mediaUpdated) + Q_PROPERTY(unsigned resolution READ getResolution NOTIFY mediaUpdated) Q_PROPERTY(bool alpha READ getAlpha NOTIFY mediaUpdated) Q_PROPERTY(unsigned projection READ getProjection NOTIFY mediaUpdated) - Q_PROPERTY(unsigned orientation READ getOrientation NOTIFY mediaUpdated) + Q_PROPERTY(int orientation READ getOrientation NOTIFY mediaUpdated) // image tags Q_PROPERTY(QString iso READ getIso NOTIFY mediaUpdated) Q_PROPERTY(QString focal READ getFocal NOTIFY mediaUpdated) Q_PROPERTY(QString exposure READ getExposure NOTIFY mediaUpdated) + Q_PROPERTY(QString exposureBias READ getExposureBias NOTIFY mediaUpdated) + Q_PROPERTY(QString meteringMode READ getMeteringMode NOTIFY mediaUpdated) Q_PROPERTY(bool flash READ getFlash NOTIFY mediaUpdated) + Q_PROPERTY(QString lightSource READ getLightSource NOTIFY mediaUpdated) // audio tags Q_PROPERTY(QString tag_title READ getTagTitle NOTIFY mediaUpdated) @@ -125,12 +129,20 @@ class Media: public QObject Q_PROPERTY(unsigned gpsDiff READ getGpsDiff NOTIFY metadatasUpdated) Q_PROPERTY(QString gpsVersion READ getGpsVersion NOTIFY metadatasUpdated) + //////// + bool m_valid = false; Shared::FileType m_type = Shared::FILE_UNKNOWN; Shared::ShotType m_stype = Shared::SHOT_UNKNOWN; //Shared::ShotState m_state = Shared::SHOT_STATE_DEFAULT; + // MiniVideo media MediaFile_t *m_media = nullptr; + // MiniVideo media tracks + QList tracksAudio; + QList tracksVideo; + QList tracksSubtitles; + QList tracksOther; QString m_path; QString m_file_folder; @@ -154,7 +166,7 @@ class Media: public QObject QDateTime m_date_gps; // GLOBAL metadatas - unsigned orientation = 0; + int orientation = 0; unsigned projection = 0; unsigned width = 0; unsigned height = 0; @@ -163,12 +175,23 @@ class Media: public QObject // IMAGE metadatas bool m_hasEXIF = false; - bool hasEXIF() const { return (m_hasEXIF && tag_found); } - unsigned tag_found = 0; + unsigned m_exif_tag_found = 0; + bool m_hasXMP = false; + unsigned m_xmp_tag_found = 0; + bool m_hasIIM = false; + unsigned m_iim_tag_found = 0; + bool m_hasMakerNote = false; + QString m_makernote_brand; + QString focal; QString iso; - QString esposure_time; + QString exposure_time; + QString exposure_bias; + QString metering_mode; + unsigned resolution_x = 0; + unsigned resolution_y = 0; bool flash = false; + QString light_source; // VIDEO metadatas QString vcodec; @@ -185,6 +208,8 @@ class Media: public QObject unsigned asamplerate = 0; bool m_hasAudioTags = false; + unsigned m_audio_tag_found = 0; + QString tag_title; QString tag_artist; QString tag_album; @@ -197,15 +222,6 @@ class Media: public QObject QString tag_covertart_mime; QString tag_transcoded; - QString getTagTitle() const { return tag_title; } - QString getTagArtist() const { return tag_artist; } - QString getTagAlbum() const { return tag_album; } - unsigned getTagTrackNb() const { return tag_track_nb; } - unsigned getTagTrackTotal() const { return tag_track_total; } - unsigned getTagYear() const { return tag_year; } - QString getTagGenre() const { return tag_genre; } - QString getTagComment() const { return tag_comment; } - // GPS metadatas bool m_hasGPS = false; bool hasGPS() const { return m_hasGPS; } @@ -219,7 +235,7 @@ class Media: public QObject unsigned gps_dop = 0; unsigned gps_diff = 0; - bool hasAudioTags() const { return m_hasAudioTags; } + //////// bool hasAudio() const { return (tracksAudio.length() > 0); } bool hasVideo() const { return (tracksVideo.length() > 0); } @@ -229,11 +245,6 @@ class Media: public QObject bool getMetadatasFromVideo(); bool getMetadatasFromAudio(); - QList tracksAudio; - QList tracksVideo; - QList tracksSubtitles; - QList tracksOther; - QString getName() const { return m_file_name; } QString getFolder() const { return m_file_folder; } QString getPath() const { return m_path; } @@ -250,21 +261,14 @@ class Media: public QObject QDateTime getDateMetadata() const; QDateTime getDateGPS() const; - QString getCameraBrand() const { return m_camera_brand; } - QString getCameraModel() const { return m_camera_model; } - QString getCameraSoftware() const { return m_camera_software; } - unsigned getWidth() const { return width; } unsigned getHeight() const { return height; } unsigned getDepth() const { return bpp; } bool getAlpha() const { return alpha; } unsigned getProjection() const { return projection; } - unsigned getOrientation() const { return orientation; } + int getOrientation() const { return orientation; } + unsigned getResolution() const { return resolution_x; } - QString getIso() const { return iso; } - QString getFocal() const { return focal; } - QString getExposure() const { return esposure_time; } - bool getFlash() const { return flash; } QString getVideoCodec() const { return vcodec; } QString getTimecode() const { return vtimecode; } @@ -278,6 +282,29 @@ class Media: public QObject unsigned getAudioBitrateMode() const { return abitratemode; } unsigned getAudioSamplerate() const { return asamplerate; } + bool hasAudioTags() const { return m_hasAudioTags && m_audio_tag_found; } + QString getTagTitle() const { return tag_title; } + QString getTagArtist() const { return tag_artist; } + QString getTagAlbum() const { return tag_album; } + unsigned getTagTrackNb() const { return tag_track_nb; } + unsigned getTagTrackTotal() const { return tag_track_total; } + unsigned getTagYear() const { return tag_year; } + QString getTagGenre() const { return tag_genre; } + QString getTagComment() const { return tag_comment; } + + bool hasEXIF() const { return (m_hasEXIF && m_exif_tag_found); } + bool hasXMP() const { return m_hasXMP && m_xmp_tag_found; } + bool hasIIM() const { return m_hasIIM && m_iim_tag_found; } + QString getCameraBrand() const { return m_camera_brand; } + QString getCameraModel() const { return m_camera_model; } + QString getCameraSoftware() const { return m_camera_software; } + QString getIso() const { return iso; } + QString getFocal() const { return focal; } + QString getExposure() const { return exposure_time; } + QString getExposureBias() const { return exposure_bias; } + QString getMeteringMode() const { return metering_mode; } + bool getFlash() const { return flash; } + QString getLightSource() const { return light_source; } QString getLatitudeStr() const { return gps_lat_str; } QString getLongitudeStr() const { return gps_long_str; } QString getAltitudeStr() const { return gps_alt_str; }