Fix #561 - Detect presence of audio in video, hide mute toggle when none
This commit is contained in:
		
							parent
							
								
									70a56b92a6
								
							
						
					
					
						commit
						955e9088d7
					
				
					 2 changed files with 55 additions and 8 deletions
				
			
		|  | @ -61,12 +61,14 @@ const VideoPlayer = React.createClass({ | |||
|     media: ImmutablePropTypes.map.isRequired, | ||||
|     width: React.PropTypes.number, | ||||
|     height: React.PropTypes.number, | ||||
|     sensitive: React.PropTypes.bool | ||||
|     sensitive: React.PropTypes.bool, | ||||
|     intl: React.PropTypes.object.isRequired, | ||||
|     autoplay: React.PropTypes.bool | ||||
|   }, | ||||
| 
 | ||||
|   getDefaultProps () { | ||||
|     return { | ||||
|       width: 196, | ||||
|       width: 239, | ||||
|       height: 110 | ||||
|     }; | ||||
|   }, | ||||
|  | @ -75,7 +77,8 @@ const VideoPlayer = React.createClass({ | |||
|     return { | ||||
|       visible: !this.props.sensitive, | ||||
|       preview: true, | ||||
|       muted: true | ||||
|       muted: true, | ||||
|       hasAudio: true | ||||
|     }; | ||||
|   }, | ||||
| 
 | ||||
|  | @ -108,8 +111,42 @@ const VideoPlayer = React.createClass({ | |||
|     }); | ||||
|   }, | ||||
| 
 | ||||
|   setRef (c) { | ||||
|     this.video = c; | ||||
|   }, | ||||
| 
 | ||||
|   handleLoadedData () { | ||||
|     if (('WebkitAppearance' in document.documentElement.style && this.video.audioTracks.length === 0) || this.video.mozHasAudio === false) { | ||||
|       this.setState({ hasAudio: false }); | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   componentDidMount () { | ||||
|     if (!this.video) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     this.video.addEventListener('loadeddata', this.handleLoadedData); | ||||
|   }, | ||||
| 
 | ||||
|   componentDidUpdate () { | ||||
|     if (!this.video) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     this.video.addEventListener('loadeddata', this.handleLoadedData); | ||||
|   }, | ||||
| 
 | ||||
|   componentWillUnmount () { | ||||
|     if (!this.video) { | ||||
|       return; | ||||
|     } | ||||
| 
 | ||||
|     this.video.removeEventListener('loadeddata', this.handleLoadedData); | ||||
|   }, | ||||
| 
 | ||||
|   render () { | ||||
|     const { media, intl, width, height, sensitive } = this.props; | ||||
|     const { media, intl, width, height, sensitive, autoplay } = this.props; | ||||
| 
 | ||||
|     let spoilerButton = ( | ||||
|       <div style={spoilerButtonStyle} > | ||||
|  | @ -117,6 +154,16 @@ const VideoPlayer = React.createClass({ | |||
|       </div> | ||||
|     ); | ||||
| 
 | ||||
|     let muteButton = ''; | ||||
| 
 | ||||
|     if (this.state.hasAudio) { | ||||
|       muteButton = ( | ||||
|         <div style={muteStyle}> | ||||
|           <IconButton title={intl.formatMessage(messages.toggle_sound)} icon={this.state.muted ? 'volume-off' : 'volume-up'} onClick={this.handleClick} /> | ||||
|         </div> | ||||
|       ); | ||||
|     } | ||||
| 
 | ||||
|     if (!this.state.visible) { | ||||
|       if (sensitive) { | ||||
|         return ( | ||||
|  | @ -137,7 +184,7 @@ const VideoPlayer = React.createClass({ | |||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (this.state.preview) { | ||||
|     if (this.state.preview && !autoplay) { | ||||
|       return ( | ||||
|         <div style={{ cursor: 'pointer', position: 'relative', marginTop: '8px', width: `${width}px`, height: `${height}px`, background: `url(${media.get('preview_url')}) no-repeat center`, backgroundSize: 'cover' }} onClick={this.handleOpen}> | ||||
|           {spoilerButton} | ||||
|  | @ -149,8 +196,8 @@ const VideoPlayer = React.createClass({ | |||
|     return ( | ||||
|       <div style={{ cursor: 'default', marginTop: '8px', overflow: 'hidden', width: `${width}px`, height: `${height}px`, boxSizing: 'border-box', background: '#000', position: 'relative' }}> | ||||
|         {spoilerButton} | ||||
|         <div style={muteStyle}><IconButton title={intl.formatMessage(messages.toggle_sound)} icon={this.state.muted ? 'volume-off' : 'volume-up'} onClick={this.handleClick} /></div> | ||||
|         <video src={media.get('url')} autoPlay='true' loop={true} muted={this.state.muted} style={videoStyle} onClick={this.handleVideoClick} /> | ||||
|         {muteButton} | ||||
|         <video ref={this.setRef} src={media.get('url')} autoPlay='true' loop={true} muted={this.state.muted} style={videoStyle} onClick={this.handleVideoClick} /> | ||||
|       </div> | ||||
|     ); | ||||
|   } | ||||
|  |  | |||
|  | @ -39,7 +39,7 @@ const DetailedStatus = React.createClass({ | |||
| 
 | ||||
|     if (status.get('media_attachments').size > 0) { | ||||
|       if (status.getIn(['media_attachments', 0, 'type']) === 'video') { | ||||
|         media = <VideoPlayer sensitive={status.get('sensitive')} media={status.getIn(['media_attachments', 0])} width={317} height={178} />; | ||||
|         media = <VideoPlayer sensitive={status.get('sensitive')} media={status.getIn(['media_attachments', 0])} width={300} height={150} autoplay />; | ||||
|       } else { | ||||
|         media = <MediaGallery sensitive={status.get('sensitive')} media={status.get('media_attachments')} height={300} onOpenMedia={this.props.onOpenMedia} />; | ||||
|       } | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue