diff --git a/app/libs/aliyun_vod/service/video_manage.rb b/app/libs/aliyun_vod/service/video_manage.rb index f3ec9d735..02a4bac49 100644 --- a/app/libs/aliyun_vod/service/video_manage.rb +++ b/app/libs/aliyun_vod/service/video_manage.rb @@ -45,9 +45,9 @@ module AliyunVod::Service::VideoManage VideoId: video_id, StartTime: start_time, EndTime: end_time, - Interval: 'day' }.merge(base_params) + puts params result = request(:post, params) result diff --git a/db/migrate/20200206110845_add_play_url_to_videos.rb b/db/migrate/20200206110845_add_play_url_to_videos.rb new file mode 100644 index 000000000..b2b3048d8 --- /dev/null +++ b/db/migrate/20200206110845_add_play_url_to_videos.rb @@ -0,0 +1,5 @@ +class AddPlayUrlToVideos < ActiveRecord::Migration[5.2] + def change + add_column :videos, :play_url, :string + end +end \ No newline at end of file diff --git a/lib/tasks/get_video_data.rake b/lib/tasks/get_video_data.rake index 56af0a192..05c33fb27 100644 --- a/lib/tasks/get_video_data.rake +++ b/lib/tasks/get_video_data.rake @@ -33,8 +33,8 @@ namespace :video do task :sample => :environment do if ENV['args'] video_id = ENV['args'].split(",")[0] - start_time = ENV['args'].split(",")[1].to_s.to_time.utc.strftime('%Y-%m-%dT%H:%M:%SZ') # 表示参与人数 - end_time = ENV['args'].split(",")[2].to_s.to_time.utc.strftime('%Y-%m-%dT%H:%M:%SZ') # 表示通过人数 + start_time = ENV['args'].split(",")[1].to_s.to_time.utc.iso8601 # 表示开始时间 + end_time = ENV['args'].split(",")[2].to_s.to_time.utc.iso8601 # 表示结束时间 video=Video.find video_id data = AliyunVod::Service.video_data(video.uuid, start_time, end_time) @@ -42,4 +42,21 @@ namespace :video do puts data end end + + task :get_play_url => :environment do + Video.all.each do |video| + if video.uuid.present? + + end + result = AliyunVod::Service.get_play_info(video.uuid) rescue nil + if result.present? && result["PlayInfoList"]["PlayInfo"].present? + puts result + play_url = result["PlayInfoList"]["PlayInfo"].first["PlayURL"] + puts play_url + # play_url = (result.dig('PlayInfoList', 'PlayInfo') || []).first&.[]('PlayURL') + + video.update!(play_url: play_url) if play_url.present? + end + end + end end \ No newline at end of file diff --git a/public/react/src/common/UrlTool.js b/public/react/src/common/UrlTool.js index e56e3f1b8..27be52c43 100644 --- a/public/react/src/common/UrlTool.js +++ b/public/react/src/common/UrlTool.js @@ -100,6 +100,10 @@ export function Railsgettimes() { railsgettimess(`${getUrl()}/api/main/first_stamp.json`); // railsgettimess(`https://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp`); } +export function getmyUrl(geturl) { + + return `${getUrl()}${geturl}`; +} export function getUploadActionUrl(path, goTest) { Railsgettimes() @@ -180,4 +184,4 @@ export function publicSearchs(Placeholder,onSearch,onInputs,onChanges,loadings) loading={loadings||false} allowClear={true} >) -} \ No newline at end of file +} diff --git a/public/react/src/common/educoder.js b/public/react/src/common/educoder.js index ded33c43a..2cb074a6a 100644 --- a/public/react/src/common/educoder.js +++ b/public/react/src/common/educoder.js @@ -2,7 +2,7 @@ // export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil'; -export { getImageUrl as getImageUrl, getRandomNumber as getRandomNumber,getUrl as getUrl, publicSearchs as publicSearchs,getRandomcode as getRandomcode,getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl +export { getImageUrl as getImageUrl,getmyUrl as getmyUrl, getRandomNumber as getRandomNumber,getUrl as getUrl, publicSearchs as publicSearchs,getRandomcode as getRandomcode,getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl , getUploadActionUrl as getUploadActionUrl,getUploadActionUrltwo as getUploadActionUrltwo ,getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth , getTaskUrlById as getTaskUrlById, TEST_HOST ,htmlEncode as htmlEncode ,getupload_git_file as getupload_git_file} from './UrlTool'; diff --git a/public/react/src/modules/courses/Resource/Fileslistitem.js b/public/react/src/modules/courses/Resource/Fileslistitem.js index e7e31baab..fe0574f56 100644 --- a/public/react/src/modules/courses/Resource/Fileslistitem.js +++ b/public/react/src/modules/courses/Resource/Fileslistitem.js @@ -1,102 +1,150 @@ import React,{ Component } from "react"; -import { WordsBtn } from 'educoder'; -import {Tooltip,message} from 'antd'; +import { WordsBtn,ActionBtn,getmyUrl } from 'educoder'; +import {Tooltip,message,Input, Button} from 'antd'; import {Link} from 'react-router-dom'; -import {getImageUrl} from 'educoder'; import axios from 'axios' -import {getUrl} from 'educoder'; import moment from 'moment' import CoursesListType from '../coursesPublic/CoursesListType'; import Showoldfiles from "../coursesPublic/Showoldfiles"; import Modals from '../../modals/Modals'; - +import HeadlessModal from '../../user/usersInfo/common/HeadlessModal' +import ClipboardJS from 'clipboard' +import '../../user/usersInfo/video/InfosVideo.css' +let _clipboard = null; class Fileslistitem extends Component{ - constructor(props){ - super(props); - this.state = { - - } - } - - settingList=()=>{ - let {discussMessage}=this.props - - this.setState({ - discussMessageid:discussMessage.id - }) - this.props.Settingtypes(discussMessage.id) - } - - showfiles=(list)=>{ - if(this.props.checkIfLogin()===false){ - this.props.showLoginDialog() - return - } - // if(this.props.checkIfProfileCompleted()===false){ - // this.setState({ - // AccountProfiletype:true - // }) - // return - // } - // if(this.props.checkIfProfessionalCertification()===false){ - // this.props.showProfileCompleteDialog() - // return - // } - - if(list.is_history_file===false){ - // this.props.DownloadFileA(list.title,list.url) - //window.location.href=list.url; - window.open(list.url, '_blank'); + constructor(props){ + super(props); + this.state = { + videoModalObj:false, + file_url:null, + } + } + setVisible=(bool)=>{ + this.setState({ + videoModalObj:bool + }) + } + + settingList=()=>{ + let {discussMessage}=this.props + + this.setState({ + discussMessageid:discussMessage.id + }) + this.props.Settingtypes(discussMessage.id) + } + + showfiles=(list)=>{ + // console.log("showfiles"); + // console.log(list); + + if(this.props.checkIfLogin()===false){ + this.props.showLoginDialog() + return + } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } + + if(list.is_history_file===false){ + // this.props.DownloadFileA(list.title,list.url) + //window.location.href=list.url; + if(list.content_type){ + if(list.content_type==="video/mp4"){ + this.setState({ + videoModalObj:true, + file_url:"https://"+document.domain+list.url+'?file_name='+list.title, + }) + return + }else{ + window.open(list.url, '_blank'); + } + }else{ - let {discussMessage,coursesId}=this.props - let file_id=discussMessage.id - let url="/files/"+file_id+"/histories.json" - axios.get(url,{ - params:{ - course_id:coursesId - }, - }).then((result)=>{ - - if(result.data.attachment_histories.length===0){ - // if(result.data.is_pdf===true){ - // this.props.ShowOnlinePdf(result.data.url) - // //预览pdf - // }else{ - // - // } - // this.props.DownloadFileA(result.data.title,result.data.url) - window.open(list.url, '_blank'); + window.open(list.url, '_blank'); + } + }else{ + let {discussMessage,coursesId}=this.props + let file_id=discussMessage.id + let url="/files/"+file_id+"/histories.json" + axios.get(url,{ + params:{ + course_id:coursesId + }, + }).then((result)=>{ + + if(result.data.attachment_histories.length===0){ + // if(result.data.is_pdf===true){ + // this.props.ShowOnlinePdf(result.data.url) + // //预览pdf + // }else{ + // + // } + // this.props.DownloadFileA(result.data.title,result.data.url) + if(list.content_type){ + if(list.content_type==="video/mp4"){ + this.setState({ + videoModalObj:true, + file_url:"https://"+document.domain+list.url+'?file_name='+list.title, + }) + return + }else{ + window.open(list.url, '_blank'); + } + }else{ - this.setState({ - Showoldfiles:true, - allfiles:result.data - }) + window.open(list.url, '_blank'); } - }).catch((error)=>{ - console.log(error) - }) - } + }else{ + this.setState({ + Showoldfiles:true, + allfiles:result.data + }) + } + + + }).catch((error)=>{ + console.log(error) + }) + } + + } + + closaoldfilesprops=()=>{ + this.setState({ + Showoldfiles:false, + }) + } - } + Clicktobroadcastthevideo=(bool,url)=>{ + this.setState({ + videoModalObj:bool, + file_url:"https://"+document.domain+url, + }) + } - closaoldfilesprops=()=>{ - this.setState({ - Showoldfiles:false, - }) - } - onDelete = (id) => { - this.setState({ - Modalstype:true, - Modalstopval:"是否确认删除?", - ModalCancel:this.cancelmodel, - ModalSave:()=>this.savedelete(id), - }) - } + onDelete = (id) => { + + this.setState({ + Modalstype:true, + Modalstopval:"是否确认删除?", + ModalCancel:this.cancelmodel, + ModalSave:()=>this.savedelete(id), + }) + + } cancelmodel=()=>{ @@ -111,6 +159,17 @@ class Fileslistitem extends Component{ } + copyurls =()=>{ + //复制网络链接 + setTimeout(() => { + if (!_clipboard) { + _clipboard = new ClipboardJS('.copybtn'); + _clipboard.on('success', (e) => { + this.props.showNotification("复制成功"); + }); + } + }, 200) + } savedelete=(id)=>{ this.setState({ @@ -145,37 +204,65 @@ class Fileslistitem extends Component{ .catch(function (error) { console.log(error); }); - } - - eventStop = (event) =>{ - event.stopPropagation() - } + } + + eventStop = (event) =>{ + event.stopPropagation() + } render(){ + const {videoModalObj,file_url}=this.state + const { checkBox, + discussMessage,index + } = this.props; + // console.log("Fileslistitem"); + // console.log( document.domain); + // console.log(this.props.imhost); + // console.log( window.location.href); + + return( +
+ { + videoModalObj&&videoModalObj===true? + this.setVisible(bool)} + className="showVideoModal" + width={800 - 1} + > + +
+ + this.copyurls()}>复制视频地址 +
+
+ + :"" + } - const { checkBox, - discussMessage,index - } = this.props; - - return( -
- - {/*提示*/} - {this.state.Modalstype&&this.state.Modalstype===true?:""} - - - - {/**/} - {/**/} - {/**/} - - -
window.$(`.sourceitem${index} input`).click() }> -
this.eventStop(event)}> +
window.$(`.sourceitem${index} input`).click() }> +
this.eventStop(event)}> {checkBox} - { - this.props.isAdmin ? this.showfiles(discussMessage)} - title={discussMessage.title} - className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.title} : "" - } - { - this.props.isStudent? this.showfiles(discussMessage)} - title={discussMessage.title} - className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.title} :"" - } - - { - this.props.isNotMember===true? - discussMessage.is_lock === true ? - {discussMessage.title} - :this.showfiles(discussMessage)} - title={discussMessage.title} - className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.title}:"" - } - - - { - discussMessage.is_lock === true ? - - - - :"" - } - {discussMessage.is_publish===false?:""} - - {this.props.isAdmin? - this.eventStop(event)}> + { + this.props.isAdmin ? this.showfiles(discussMessage)} + title={discussMessage.title} + className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.title} : "" + } + { + this.props.isStudent? this.showfiles(discussMessage)} + title={discussMessage.title} + className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.title} :"" + } + + { + this.props.isNotMember===true? + discussMessage.is_lock === true ? + {discussMessage.title} + :this.showfiles(discussMessage)} + title={discussMessage.title} + className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.title}:"" + } + + + { + discussMessage.is_lock === true ? + + + + :"" + } + {discussMessage.is_publish===false?:""} + + {this.props.isAdmin? + this.eventStop(event)}> this.settingList()}>设置 :""} - {this.props.isStudent===true&&this.props.current_user.login===discussMessage.author.login? - this.eventStop(event)}> + {this.props.isStudent===true&&this.props.current_user.login===discussMessage.author.login? + this.eventStop(event)}> :""} -
- + } + - - {/*资源分班*/} - {/*{discussMessage.course_groups.length===0?"":*/} - {/*

*/} - {/*{discussMessage.course_groups.map((item,key)=>{*/} - {/*return(*/} - {/*

*/} - {/*{item.course_group_name}*/} - {/*将发布于 { moment(item.course_group_publish_time).format('YYYY-MM-DD HH:mm')}*/} - {/*
*/} - {/*)*/} - {/*})}*/} - - {/*

}*/} - -

+ } + + {/*资源分班*/} + {/*{discussMessage.course_groups.length===0?"":*/} + {/*

*/} + {/*{discussMessage.course_groups.map((item,key)=>{*/} + {/*return(*/} + {/*

*/} + {/*{item.course_group_name}*/} + {/*将发布于 { moment(item.course_group_publish_time).format('YYYY-MM-DD HH:mm')}*/} + {/*
*/} + {/*)*/} + {/*})}*/} + + {/*

}*/} + +

{discussMessage.author.name} 大小 {discussMessage.filesize} 下载 {discussMessage.downloads_count} - {/*引用 {discussMessage.quotes}*/} - + {/*引用 {discussMessage.quotes}*/} + {/*{moment(discussMessage.publish_time).format('YYYY-MM-DD HH:mm:ss')}*/} - {/*{moment(discussMessage.publish_time).fromNow()}*/} - { discussMessage.publish_time===null?"": - discussMessage.is_publish===true?"":"发布于"} - { discussMessage.publish_time===null?"":discussMessage.is_publish===true?moment(discussMessage.publish_time).fromNow():moment(discussMessage.publish_time).format('YYYY-MM-DD HH:mm')} + {/*{moment(discussMessage.publish_time).fromNow()}*/} + { discussMessage.publish_time===null?"": + discussMessage.is_publish===true?"":"发布于"} + { discussMessage.publish_time===null?"":discussMessage.is_publish===true?moment(discussMessage.publish_time).fromNow():moment(discussMessage.publish_time).format('YYYY-MM-DD HH:mm')} - {discussMessage&&discussMessage.category_name===null?"":this.props.child===false?

所属目录:{discussMessage&&discussMessage.category_name} -
:""} -

+ {discussMessage&&discussMessage.category_name===null?"":this.props.child===false?
所属目录:{discussMessage&&discussMessage.category_name} +
:""} +

-

- - 资源描述 :{discussMessage.description===null?"暂无描述":discussMessage.description} - {/**/} - {/*/!**!/*/} - {/**/} - - {/**/} - {/*/!*{this.props.isAdmin ?this.settingList()}>:""}*!/*/} - {/**/} -

- - -
-
- ) - } + } + + 资源描述 :{discussMessage.description===null?"暂无描述":discussMessage.description} + {/**/} + {/*/!**!/*/} + {/**/} + + {/**/} + {/*/!*{this.props.isAdmin ?this.settingList()}>:""}*!/*/} + {/**/} +

+ + +
+
+ ) + } } -export default Fileslistitem; \ No newline at end of file +export default Fileslistitem; + diff --git a/public/react/src/modules/courses/Resource/index.js b/public/react/src/modules/courses/Resource/index.js index 501176882..8187cd5af 100644 --- a/public/react/src/modules/courses/Resource/index.js +++ b/public/react/src/modules/courses/Resource/index.js @@ -1,6 +1,6 @@ import React,{ Component } from "react"; import { Input, Checkbox, Table, Tooltip, Pagination,Spin } from "antd"; -import { WordsBtn,on, off, trigger } from 'educoder'; +import { WordsBtn,on, off, trigger ,getUrl} from 'educoder'; import axios from 'axios'; import Modals from '../../modals/Modals'; import Sendtofilesmodal from "../coursesPublic/SendToFilesModal"; @@ -15,7 +15,6 @@ import _ from 'lodash' import './style.css'; import '../css/members.css'; import moment from 'moment'; - class Fileslists extends Component{ constructor(props){ super(props); @@ -1062,4 +1061,4 @@ export default Fileslists; {/*
*/} {/**/} {/*

暂时还没有相关数据哦!

*/} -{/**/} \ No newline at end of file +{/**/} diff --git a/public/react/src/modules/courses/coursesPublic/Showoldfiles.js b/public/react/src/modules/courses/coursesPublic/Showoldfiles.js index cb054964e..3b4928d4d 100644 --- a/public/react/src/modules/courses/coursesPublic/Showoldfiles.js +++ b/public/react/src/modules/courses/coursesPublic/Showoldfiles.js @@ -45,11 +45,15 @@ class Showoldfiles extends Component{ showfiless=(url)=>{ this.props.ShowOnlinePdf(url) } + + isaboxonClick=(item)=>{ + this.props.Clicktobroadcastthevideo(true,item.url+'&file_name='+item.title); + } render(){ let {visible,allfiles}=this.props; return( -
+
{/*提示*/}