From 8c635917cd184e0c7dd75b48193db3e050e68621 Mon Sep 17 00:00:00 2001 From: Prateek Saxena Date: Tue, 20 Oct 2015 10:27:25 +0530 Subject: [PATCH] mw.ForeignStructuredUpload.BookletLayout: Use lastModified or EXIF date Use the file's lastModified date, or EXIF DateTimeOriginal (where available) as the default value of the DateInputWidget instead of leaving it blank. A lot of the code here is from mw.UploadWizardUpload.prototype.checkFile. Bug: T115863 Change-Id: I75adec9718d89a7177050e8b848478d1b0069dd0 --- resources/Resources.php | 1 + ...i.ForeignStructuredUpload.BookletLayout.js | 89 +++++++++++++++++-- 2 files changed, 85 insertions(+), 5 deletions(-) diff --git a/resources/Resources.php b/resources/Resources.php index 4e247e08fa..d43657bf1b 100644 --- a/resources/Resources.php +++ b/resources/Resources.php @@ -1261,6 +1261,7 @@ return array( 'mediawiki.widgets.DateInputWidget', 'mediawiki.jqueryMsg', 'moment', + 'mediawiki.libs.jpegmeta', ), 'messages' => array( 'foreign-structured-upload-form-label-own-work', diff --git a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js index aa2998bbd1..d896756ac0 100644 --- a/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js +++ b/resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js @@ -183,6 +183,20 @@ this.selectFileWidget.on( 'change', onUploadFormChange.bind( this ) ); this.ownWorkCheckbox.on( 'change', onUploadFormChange.bind( this ) ); + this.selectFileWidget.on( 'change', function () { + var file = layout.getFile(); + + // Set the date to lastModified once we have the file + if ( layout.getDateFromLastModified( file ) !== undefined ) { + layout.dateWidget.setValue( layout.getDateFromLastModified( file ) ); + } + + // Check if we have EXIF data and set to that where available + layout.getDateFromExif( file ).done( function ( date ) { + layout.dateWidget.setValue( date ); + } ); + } ); + return this.uploadForm; }; @@ -467,16 +481,16 @@ multiline: true, autosize: true } ); - this.dateWidget = new mw.widgets.DateInputWidget( { - $overlay: this.$overlay, - required: true, - mustBeBefore: moment().add( 1, 'day' ).locale( 'en' ).format( 'YYYY-MM-DD' ) // Tomorrow - } ); this.categoriesWidget = new mw.widgets.CategorySelector( { // Can't be done here because we don't know the target wiki yet... done in #initialize. // api: new mw.ForeignApi( ... ), $overlay: this.$overlay } ); + this.dateWidget = new mw.widgets.DateInputWidget( { + $overlay: this.$overlay, + required: true, + mustBeBefore: moment().add( 1, 'day' ).locale( 'en' ).format( 'YYYY-MM-DD' ) // Tomorrow + } ); fieldset = new OO.ui.FieldsetLayout( { label: mw.msg( 'upload-form-label-infoform-title' ) @@ -540,6 +554,71 @@ return this.upload.getText(); }; + /** + * Get original date from EXIF data + * + * @param {Object} file + * @return {jQuery.Promise} Promise resolved with the EXIF date + */ + mw.ForeignStructuredUpload.BookletLayout.prototype.getDateFromExif = function ( file ) { + var fileReader, + deferred = $.Deferred(); + + if ( file && file.type === 'image/jpeg' ) { + fileReader = new FileReader(); + fileReader.onload = function () { + var fileStr, arr, i, metadata; + + if ( typeof fileReader.result === 'string' ) { + fileStr = fileReader.result; + } else { + // Array buffer; convert to binary string for the library. + arr = new Uint8Array( fileReader.result ); + fileStr = ''; + for ( i = 0; i < arr.byteLength; i++ ) { + fileStr += String.fromCharCode( arr[ i ] ); + } + } + + try { + metadata = mw.libs.jpegmeta( this.result, file.name ); + } catch ( e ) { + metadata = null; + } + + if ( metadata !== null && metadata.exif !== undefined && metadata.exif.DateTimeOriginal ) { + deferred.resolve( moment( metadata.exif.DateTimeOriginal, 'YYYY:MM:DD' ).format( 'YYYY-MM-DD' ) ); + } else { + deferred.reject(); + } + }; + + if ( 'readAsBinaryString' in fileReader ) { + fileReader.readAsBinaryString( file ); + } else if ( 'readAsArrayBuffer' in fileReader ) { + fileReader.readAsArrayBuffer( file ); + } else { + // We should never get here + deferred.reject(); + throw new Error( 'Cannot read thumbnail as binary string or array buffer.' ); + } + } + + return deferred.promise(); + }; + + /** + * Get last modified date from file + * + * @param {Object} file + * @return {Object} Last modified date from file + */ + mw.ForeignStructuredUpload.BookletLayout.prototype.getDateFromLastModified = function ( file ) { + if ( file && file.lastModified ) { + return moment( file.lastModified ).format( 'YYYY-MM-DD' ); + } + }; + /* Setters */ /** -- 2.20.1