利用IPFS構建短視頻應用開發經歷(四)

本系列文章是針對 https://blog.csdn.net/weixin_43668031/article/details/83962959 內容的實現所編寫的。開發經歷包括思考過程、重構和推翻重來。

繼續智能合約的編寫:

  function createAlbum (string memory _title, string memory _cover, string memory _info) public returns (uint albumnum) {
        albums[albumNum++] = Album(_title, _cover, _info, msg.sender, 0);
        return albumNum - 1;
    }
    function editAlbum (uint _albumId, string memory _title, string memory _cover, string memory _info) public {
        if (msg.sender != albums[_albumId].author) return;
        albums[_albumId].title = _title;
        albums[_albumId].cover = _cover;
        albums[_albumId].info = _info;
    }
    function createAlbumVideo (uint _albumId, uint _videoId) public returns (uint videonum) {
        if (msg.sender != albums[_albumId].author) return (0);
        albums[_albumId].videos[albums[_albumId].videoNum++] = _videoId;
        return albums[_albumId].videoNum - 1;
    }
    function updateAlbumVideo (uint _albumId, uint _albumvideoId, uint _videoId) public {
        if (msg.sender != albums[_albumId].author || albums[_albumId].videoNum <= _albumvideoId) return;
        albums[_albumId].videos[_albumvideoId] = _videoId;
    }
    function getAlbum (uint _albumId) view public returns (string memory title, string memory cover, string memory info, address author, uint videonum, uint durationSum) {
        Album storage _album = albums[_albumId];
        for (uint i = 0; 0 < _album.videoNum; i++) {
            if (videos[_album.videos[i]].permission == 0) {
                durationSum += videos[_album.videos[i]].duration;
            }
        }
        return (_album.title, _album.cover, _album.info, _album.author, _album.videoNum, durationSum);
    }
    function getAlbumVideo (uint _albumId, uint _videoId) view public returns (uint videoId, string memory title, string memory cover, string memory videoinfo, string memory info, uint duration, uint timestamp, address author, uint commentsNum, uint gratuityNum, uint gratuitySum) {
        videoId = albums[_albumId].videos[_videoId];
        if (videos[videoId].permission == 0 || msg.sender == videos[videoId].author) {
            Video storage _video = videos[videoId];
            for (uint i = 0; i < _video.gratuityNum; i++) gratuitySum += _video.gratuitys[i].gratuity;
            return (videoId, _video.title, _video.cover, _video.videoinfo, _video.info, _video.duration, _video.timestamp, _video.author, _video.commentsNum, _video.gratuityNum, gratuitySum);
        }
    }

這裏完成了幾個操作專輯的方法,其中getAlbum 獲取專輯數據,並能夠實時計算出這個專輯中允許訪問的視頻的總長度。視頻如果不是公開權限的將不計入內,但如果這個視頻又是自己上傳的也是可以通過getAlbumVideo 方法來獲取到內容,這和getVideo方法基本一致。

到這裏合約編寫基本就告一段落了,接下去會着重開始編寫前端和中間件。

https://github.com/bill080307/douyinWithEth/blob/2a51da9119265c3665b03832dfd346befa4152fc/VideoShare.sol
這是合約現在的版本,除了在本文中提到的部分代碼,會對上節的代碼就行修正錯誤和概念,因此以目前的這個版本爲準,如果你通過本系列文章中的代碼片段就行組合,可以得到完整,但存在錯誤的代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章