├── .editorconfig ├── .gitignore ├── .travis.yml ├── LICENSE ├── README.md ├── app ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── cron-sorry ├── process.yml ├── public │ ├── 404.html │ ├── cookies.js │ ├── dagong │ │ └── example.png │ ├── diandongche │ │ └── example.png │ ├── favicon.ico │ ├── image │ │ └── 404.png │ ├── invalid.html │ ├── jinkela │ │ └── example.png │ ├── kongming │ │ └── example.png │ ├── main.js │ ├── marmot │ │ └── example.png │ ├── robots.txt │ ├── sorry │ │ └── example.png │ ├── w3.css │ └── wangjingze │ │ └── example.png ├── site_config.yml ├── sources.list ├── src │ ├── serve.rkt │ ├── sorry.rb │ ├── sorry.rkt │ └── sorry │ │ ├── cache.rb │ │ ├── check_deps.rb │ │ ├── config.rb │ │ ├── make_gif.rb │ │ └── version.rb ├── templates │ ├── dagong │ │ ├── template.ass │ │ ├── template.mp4 │ │ └── template_origin.mp4 │ ├── diandongche │ │ ├── template.ass │ │ ├── template.mp4 │ │ └── template_origin.mp4 │ ├── jinkela │ │ ├── template.ass │ │ ├── template.mp4 │ │ └── template_origin.mp4 │ ├── kongming │ │ ├── template.ass │ │ ├── template.mp4 │ │ └── template_origin.mp4 │ ├── marmot │ │ ├── template.ass │ │ ├── template.mp4 │ │ └── template_origin.mp4 │ ├── sorry │ │ ├── template.ass │ │ ├── template.erb │ │ ├── template.mp4 │ │ ├── template_origin.mp4 │ │ └── wechat │ │ │ ├── template.ass │ │ │ └── template.mp4 │ └── wangjingze │ │ ├── template.ass │ │ ├── template.erb │ │ ├── template.mp4 │ │ └── template_origin.mp4 └── views │ ├── dagong.erb │ ├── diandongche.erb │ ├── jinkela.erb │ ├── kongming.erb │ ├── layout.erb │ ├── marmot.erb │ ├── sorry.erb │ └── wangjingze.erb ├── docker-compose.yml ├── media ├── 1.gif ├── 2.png ├── 3.png ├── 4.png └── gh_b404536005f9_258.jpg └── temp ├── 35c615e5237fa4ca747c4a5544b08e41.gif.ass ├── 3aff7060f2ff31c5f8ee4d280f4aec0d.gif.ass ├── 3cfab5c16f5148f88b72640c51cefde4.gif.ass ├── 460ce56b5ef38a60c7408db76a46ec95.gif.ass ├── 4ecec26d173b8353e88479b0996afcbf.gif.ass ├── 6ebd255556083c4c62f870462777ae19.gif.ass ├── c3669261f48eac82c555975e9dffebc3.gif.ass ├── cc59cba5c49aedc60cabd70cd4b9ee40.gif.ass ├── e1b2909f4ccbb2db6cf6410b39975458.gif.ass └── f8b3b607a5a65ecf7224e1a39352ffaf.gif.ass /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.cr] 2 | charset = utf-8 3 | end_of_line = lf 4 | insert_final_newline = true 5 | indent_style = space 6 | indent_size = 4 7 | trim_trailing_whitespace = true 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /doc/ 2 | /lib/ 3 | /bin/ 4 | /.vscode/ 5 | out-0.log 6 | err-0.log 7 | *.gif 8 | temp/*.ass 9 | *~ 10 | *# 11 | 12 | !media/* -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: crystal 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 xuty 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | ![图片](https://raw.githubusercontent.com/xtyxtyx/sorry/master/media/1.gif) 3 | 4 | [V2EX](https://www.v2ex.com/t/431802) 5 | 6 | ## 微信小程序试用 7 | 小程序在 2019 年因为「内容安全」被下线了,2023.4 刚申诉上线,大家可以扫码试用一下。 8 | 9 | ![图片](https://github.com/xtyxtyx/sorry/blob/master/media/gh_b404536005f9_258.jpg) 10 | 11 | 12 | ## 常用特效代码 13 | 出现在句子中的特效代码会对其后的字符产生影响 14 | ``` 15 | 咕咕{\i1}{\fs40}咕咕咕{\r}咕 16 | ``` 17 | ![示例](https://raw.githubusercontent.com/xtyxtyx/sorry/master/media/2.png) 18 | ``` 19 | \n 折行 20 | \h 空格 21 | 22 | {\i1} 斜体 23 | {\i0} 取消斜体 24 | 25 | {\b1} 粗体 26 | {\b0} 取消粗体 27 | 28 | {\u1} 下划线 29 | {\u0} 取消下划线 30 | 31 | {\fs60} 调整字号 32 | 33 | {\fad(100,200)} 100ms淡入,200ms淡出 34 | 35 | {\r} 重置所有特效 36 | ``` 37 | ## 源代码库 38 | 39 | ``` 40 | ├── Gemfile 41 | ├── Gemfile.lock 42 | ├── LICENSE 43 | ├── public # 静态文件目录 44 | ├── views # 主页目录 45 | ├── templates # 模板目录 46 | ├── README.md 47 | ├── site_config.yml # 站点配置文件 48 | ├── src # 这里就是源代码 49 | └── temp # 把临时文件安放在这里 50 | ``` 51 | 另有 52 | - [python版](https://github.com/East196/sorrypy),由@East196编写 53 | - [java版](https://github.com/li24361/sorryJava),由@li24361编写 54 | - [nodejs版](https://github.com/q809198545/node-sorry),由@q809198545编写 55 | - [C# ASP.NET版](https://github.com/shuangrain/SorryNet),由@shuangrain编写 56 | - [微信小程序](https://github.com/CoXier/iemoji-wechat),由@CoXier编写 57 | - [微信小程序](https://github.com/trumanwong/remix-mini-program),由@trumanwong编写 58 | - [nodejs版(使用Drawtext filter渲染)](https://github.com/SnailDev/SnailDev.GifMaker),由@SnailDev编写 59 | - [网页版(使用Canvas渲染)](https://coding.net/u/hhhhhg/p/wjzGif-JavaScript/git),由@hhhhhg编写 60 | - [PHP版](https://github.com/PrintNow/php-sorry-gif),由@PrintNow编写 61 | - [Golang版](https://github.com/Hentioe/sorry-generator),由@Hentioe编写 62 | - [AlfredWork版](https://github.com/BlackDragonF/AlfredWorkflows),由@BlackDragonF编写 63 | - [nodejs版(使用koa2)](https://github.com/wadejs/sorry-template),由@wadejs编写 64 | - [VuePress版](https://github.com/fritx/SorryPress),由@fritx编写 65 | - [网页版](https://github.com/WincerChan/Meme-generator),由@WincerChan编写 66 | 67 | ## API 68 | 69 | 制作GIF: 70 | ``` 71 | POST https://sorry.xuty.tk/api//make 72 | { 73 | "0": "好啊", 74 | "1": "...", 75 | ... 76 | } 77 | 78 | # 返回GIF下载地址 79 | -> 200 /cache/c2f4069ed207dc38e0f2d9359a2fa6b7.gif 80 | 81 | # 或服务器忙 82 | -> 503 83 | ``` 84 | 目前支持的template_name有: 85 | ``` 86 | - sorry 87 | - wangjingze 88 | - jinkela # 金坷垃 89 | - marmot # 土拨鼠 90 | - dagong # 窃格瓦拉 91 | - diandongche # 窃格瓦拉偷电动车 92 | ``` 93 | 94 | ## 部署指南 95 | 96 | ### 使用Docker 97 | ``` 98 | docker build -t sorry ./app 99 | docker run --rm -it -p 4567:4567 sorry 100 | ``` 101 | 102 | ### docker-compose 一键启动 103 | ``` 104 | docker-compose up 105 | ``` 106 | 107 | ### 手工部署 108 | 首先,机器上得安装好ruby :gem: 109 | 110 | 接下来: 111 | ```bash 112 | cd ./app 113 | 114 | # 安装bundler 115 | gem install bundler 116 | 117 | # [可选] 使用国内镜像 118 | gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ 119 | 120 | # [可选] Linux服务器一般需要安装中文字体 121 | apt install ttf-wqy-microhei 122 | 123 | # 安装编译依赖 124 | apt install ruby-dev build-essential 125 | 126 | # 安装ffmpeg 127 | apt install ffmpeg 128 | 129 | # 安装依赖 130 | bundle install 131 | 132 | # 运行 133 | ruby src/sorry.rb 134 | 135 | # 生产环境 136 | APP_ENV=production ruby src/sorry.rb 137 | 138 | ``` 139 | 140 | #### [可选] 使用PM2监控&自动重启 141 | 142 | ``` 143 | npm install pm2 -g 144 | 145 | pm2 start process.yml --env production 146 | 147 | # [可选] 非root用户使用80端口 148 | sudo apt-get install authbind 149 | sudo touch /etc/authbind/byport/80 150 | sudo chown %user% /etc/authbind/byport/80 151 | sudo chmod 755 /etc/authbind/byport/80 152 | 153 | alias pm2='authbind --deep pm2' 154 | authbind --deep pm2 update 155 | 156 | # [可选] 定时重启服务 157 | crontab -e 158 | 10 22 * * * pm2 start sorry 159 | ``` 160 | 161 | ### 定时清除缓存 162 | ``` 163 | crontab -e 164 | 165 | # 在每小时的第10分钟 清除700分钟以前的gif 166 | 167 | 10 * * * * find /root/sorry/public/cache -name '*.gif' -mmin +700 -exec rm {} \; 168 | ``` 169 | 170 | ## 添加GIF模板 171 | 向网站中添加模板需要加入以下文件 172 | 173 | ``` 174 | templates//template.mp4 # 视频模板 175 | templates//template.ass # 字幕模板 176 | public//example.png # 展示图片 177 | views/.erb # 模板主页 178 | ``` 179 | 180 | 其中`index.erb` 参考其他模板主页,增减``的数量即可 181 | 182 | 然后发个Pull request 183 | 184 | 如果你不熟悉aegisub的使用,也可以只提供视频模板。如果你是github用户,可以发个issue, 也可以[发送邮件](mailto:xty50337@hotmail.com) 185 | 186 | ## 制作字幕模板template.ass 187 | 首先使用aegisub为模板视频创建字幕,保存为template.ass(aegisub教程可以看这个 https://tieba.baidu.com/p/1360405931 ) 188 | ![图片](https://raw.githubusercontent.com/xtyxtyx/sorry/master/media/3.png) 189 | 190 | 然后把文本替换成模板字符串 <%= sentences[n] %> 191 | ![图片](https://raw.githubusercontent.com/xtyxtyx/sorry/master/media/4.png) 192 | 193 | ## TODO 194 | 195 | - [ ] 重新设计主页 196 | - [ ] 重新设计404页面 197 | - [ ] 把gif的渲染弄成队列,提高响应速度 198 | - [x] 定时删除缓存,不然有多少硬盘空间也不够用 199 | - [ ] 写个脚本,自动配置新的gif 200 | - [ ] 写测试 201 | 202 | ## 服务器 203 | 204 | - [Cloudcone](https://app.cloudcone.com/?ref=940) sorry.xuty.tk部署在Cloudcone上 205 | - [Vultr 最低2.5$/月](https://www.vultr.com/?ref=7019614) 206 | - [DigitalOcean 注册送10美金](https://m.do.co/c/67a58d6cf3da) 207 | -------------------------------------------------------------------------------- /app/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:bionic 2 | 3 | ADD ./Gemfile /app/ 4 | WORKDIR /app 5 | 6 | # 使用国内清华源加快apt速度 7 | COPY ./sources.list /etc/apt/sources.list 8 | RUN apt-get update 9 | RUN apt-get install -y \ 10 | locales \ 11 | locales-all \ 12 | ttf-wqy-microhei \ 13 | ffmpeg \ 14 | cron \ 15 | build-essential \ 16 | ruby-dev 17 | 18 | # 使用国内Gem镜像 19 | RUN gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ 20 | RUN gem install bundler 21 | RUN bundle config mirror.https://rubygems.org https://gems.ruby-china.com 22 | RUN bundle install 23 | 24 | ADD ./ /app 25 | 26 | # 定时任务 27 | RUN crontab cron-sorry 28 | CMD cron && ruby src/sorry.rb 29 | -------------------------------------------------------------------------------- /app/Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | gem 'sinatra' 3 | gem 'thin' -------------------------------------------------------------------------------- /app/Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | concurrent-ruby (1.0.5) 5 | daemons (1.2.6) 6 | eventmachine (1.2.5) 7 | mustermann (1.0.2) 8 | psych (3.0.2) 9 | rack (2.0.4) 10 | rack-protection (2.0.1) 11 | rack 12 | sinatra (2.0.1) 13 | mustermann (~> 1.0) 14 | rack (~> 2.0) 15 | rack-protection (= 2.0.1) 16 | tilt (~> 2.0) 17 | thin (1.7.2) 18 | daemons (~> 1.0, >= 1.0.9) 19 | eventmachine (~> 1.0, >= 1.0.4) 20 | rack (>= 1, < 3) 21 | tilt (2.0.8) 22 | 23 | PLATFORMS 24 | ruby 25 | 26 | DEPENDENCIES 27 | concurrent-ruby 28 | psych 29 | sinatra 30 | thin 31 | 32 | BUNDLED WITH 33 | 1.16.1 34 | -------------------------------------------------------------------------------- /app/cron-sorry: -------------------------------------------------------------------------------- 1 | 10 * * * * find /app/public/cache -name '*.gif' -mmin +700 -exec rm {} \; 2 | -------------------------------------------------------------------------------- /app/process.yml: -------------------------------------------------------------------------------- 1 | # Config file for pm2 2 | 3 | apps: 4 | - script: ./src/sorry.rb 5 | max_restarts: 10 6 | 7 | instances: 1 8 | exec_mode: fork 9 | max_memory_restart: 2G 10 | 11 | error_file: ./err.log 12 | out_file: ./out.log 13 | 14 | watch: false 15 | 16 | env_production: 17 | APP_ENV: production 18 | -------------------------------------------------------------------------------- /app/public/404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 26 | 27 | 28 | 29 | 30 |

404 Not Found

31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /app/public/cookies.js: -------------------------------------------------------------------------------- 1 | /*\ 2 | |*| 3 | |*| :: cookies.js :: 4 | |*| 5 | |*| A complete cookies reader/writer framework with full unicode support. 6 | |*| 7 | |*| Revision #3 - July 13th, 2017 8 | |*| 9 | |*| https://developer.mozilla.org/en-US/docs/Web/API/document.cookie 10 | |*| https://developer.mozilla.org/User:fusionchess 11 | |*| https://github.com/madmurphy/cookies.js 12 | |*| 13 | |*| This framework is released under the GNU Public License, version 3 or later. 14 | |*| http://www.gnu.org/licenses/gpl-3.0-standalone.html 15 | |*| 16 | |*| Syntaxes: 17 | |*| 18 | |*| * docCookies.setItem(name, value[, end[, path[, domain[, secure]]]]) 19 | |*| * docCookies.getItem(name) 20 | |*| * docCookies.removeItem(name[, path[, domain]]) 21 | |*| * docCookies.hasItem(name) 22 | |*| * docCookies.keys() 23 | |*| 24 | \*/ 25 | 26 | var docCookies = { 27 | getItem: function (sKey) { 28 | if (!sKey) { return null; } 29 | return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null; 30 | }, 31 | setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) { 32 | if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; } 33 | var sExpires = ""; 34 | if (vEnd) { 35 | switch (vEnd.constructor) { 36 | case Number: 37 | sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; max-age=" + vEnd; 38 | /* 39 | Note: Despite officially defined in RFC 6265, the use of `max-age` is not compatible with any 40 | version of Internet Explorer, Edge and some mobile browsers. Therefore passing a number to 41 | the end parameter might not work as expected. A possible solution might be to convert the the 42 | relative time to an absolute time. For instance, replacing the previous line with: 43 | */ 44 | /* 45 | sExpires = vEnd === Infinity ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT" : "; expires=" + (new Date(vEnd * 1e3 + Date.now())).toUTCString(); 46 | */ 47 | break; 48 | case String: 49 | sExpires = "; expires=" + vEnd; 50 | break; 51 | case Date: 52 | sExpires = "; expires=" + vEnd.toUTCString(); 53 | break; 54 | } 55 | } 56 | document.cookie = encodeURIComponent(sKey) + "=" + encodeURIComponent(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : ""); 57 | return true; 58 | }, 59 | removeItem: function (sKey, sPath, sDomain) { 60 | if (!this.hasItem(sKey)) { return false; } 61 | document.cookie = encodeURIComponent(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : ""); 62 | return true; 63 | }, 64 | hasItem: function (sKey) { 65 | if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return false; } 66 | return (new RegExp("(?:^|;\\s*)" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie); 67 | }, 68 | keys: function () { 69 | var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/); 70 | for (var nLen = aKeys.length, nIdx = 0; nIdx < nLen; nIdx++) { aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]); } 71 | return aKeys; 72 | } 73 | }; -------------------------------------------------------------------------------- /app/public/dagong/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/dagong/example.png -------------------------------------------------------------------------------- /app/public/diandongche/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/diandongche/example.png -------------------------------------------------------------------------------- /app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/favicon.ico -------------------------------------------------------------------------------- /app/public/image/404.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/image/404.png -------------------------------------------------------------------------------- /app/public/invalid.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 26 | 27 | 28 | 29 | 30 |

链接失效啦😥

31 | 32 | 33 | -------------------------------------------------------------------------------- /app/public/jinkela/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/jinkela/example.png -------------------------------------------------------------------------------- /app/public/kongming/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/kongming/example.png -------------------------------------------------------------------------------- /app/public/main.js: -------------------------------------------------------------------------------- 1 | var submit_btn = document.getElementById("submit_btn") 2 | var show_sidebar_btn = document.getElementById("show_sidebar") 3 | var sidebar_close_btn = document.getElementById("sidebar_close") 4 | var sidebar = document.getElementById("sidebar") 5 | var result = document.getElementById("result") 6 | var wechat_checkbox = document.getElementById("wechat-checkbox") 7 | 8 | function make_body() { 9 | var body = {} 10 | 11 | var inputs = document.getElementsByTagName("input") 12 | for (var i = 0; i < inputs.length; i++) { 13 | var elem = inputs[i]; 14 | 15 | var text = elem.value === "" ? elem.placeholder : elem.value; 16 | body[i] = text; 17 | } 18 | 19 | return JSON.stringify(body); 20 | } 21 | 22 | function calculate_duration(begin_time) { 23 | return Date.now() - begin_time; 24 | } 25 | 26 | function submit() { 27 | submit_btn.disabled = true; 28 | submit_btn.innerHTML = "请稍候" 29 | 30 | var begin_time = Date.now(); 31 | 32 | var xhttp = new XMLHttpRequest(); 33 | 34 | xhttp.onreadystatechange = function() { 35 | if (this.readyState == 4) { 36 | if (this.status == 521 || this.status == 404) { 37 | result.innerHTML = "

请求出错!😵

"; 38 | } else { 39 | result.innerHTML = this.responseText; 40 | } 41 | submit_btn.innerHTML = "生成"; 42 | submit_btn.disabled = false; 43 | } 44 | }; 45 | 46 | save_input() 47 | 48 | if (wechat_checkbox && wechat_checkbox.checked) { 49 | xhttp.open("POST", "wechat/make", true); 50 | } else { 51 | xhttp.open("POST", "make", true); 52 | } 53 | 54 | xhttp.send(make_body()); 55 | } 56 | 57 | function restore_input() { 58 | var item = "input"; 59 | 60 | if (docCookies.hasItem(item)) { 61 | var stored_input = JSON.parse(docCookies.getItem(item)); 62 | 63 | var inputs = document.getElementsByTagName("input") 64 | for (var i = 0; i < inputs.length; i++) { 65 | var elem = inputs[i]; 66 | elem.value = stored_input[i] || ""; 67 | } 68 | } 69 | 70 | } 71 | 72 | function save_input() { 73 | var obj = {} 74 | 75 | var inputs = document.getElementsByTagName("input") 76 | for (var i = 0; i < inputs.length; i++) { 77 | var elem = inputs[i]; 78 | 79 | var text = elem.value; 80 | obj[i] = text; 81 | } 82 | docCookies.setItem("input", JSON.stringify(obj)); 83 | } 84 | 85 | function sidebar_open() { 86 | sidebar.style.display = "block"; 87 | } 88 | 89 | function sidebar_close() { 90 | sidebar.style.display = "none"; 91 | } 92 | 93 | submit_btn.onclick = submit; 94 | show_sidebar_btn.onclick = sidebar_open; 95 | sidebar_close_btn.onclick = sidebar_close; 96 | 97 | restore_input() 98 | -------------------------------------------------------------------------------- /app/public/marmot/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/marmot/example.png -------------------------------------------------------------------------------- /app/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /cacge/ 3 | Disallow: /image/ -------------------------------------------------------------------------------- /app/public/sorry/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/sorry/example.png -------------------------------------------------------------------------------- /app/public/w3.css: -------------------------------------------------------------------------------- 1 | /* W3.CSS 4.10 February 2018 by Jan Egil and Borge Refsnes */ 2 | html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} 3 | /* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ 4 | html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} 5 | article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block} 6 | audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} 7 | audio:not([controls]){display:none;height:0}[hidden],template{display:none} 8 | a{background-color:transparent;-webkit-text-decoration-skip:objects} 9 | a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} 10 | dfn{font-style:italic}mark{background:#ff0;color:#000} 11 | small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} 12 | sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}svg:not(:root){overflow:hidden} 13 | code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} 14 | button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold} 15 | button,input{overflow:visible}button,select{text-transform:none} 16 | button,html [type=button],[type=reset],[type=submit]{-webkit-appearance:button} 17 | button::-moz-focus-inner, [type=button]::-moz-focus-inner, [type=reset]::-moz-focus-inner, [type=submit]::-moz-focus-inner{border-style:none;padding:0} 18 | button:-moz-focusring, [type=button]:-moz-focusring, [type=reset]:-moz-focusring, [type=submit]:-moz-focusring{outline:1px dotted ButtonText} 19 | fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} 20 | legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} 21 | [type=checkbox],[type=radio]{padding:0} 22 | [type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} 23 | [type=search]{-webkit-appearance:textfield;outline-offset:-2px} 24 | [type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none} 25 | ::-webkit-input-placeholder{color:inherit;opacity:0.54} 26 | ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} 27 | /* End extract */ 28 | html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} 29 | h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}.w3-serif{font-family:serif} 30 | h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} 31 | hr{border:0;border-top:1px solid #eee;margin:20px 0} 32 | .w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} 33 | .w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} 34 | .w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} 35 | .w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} 36 | .w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} 37 | .w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} 38 | .w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} 39 | .w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} 40 | .w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} 41 | .w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} 42 | .w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} 43 | .w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} 44 | .w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} 45 | .w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} 46 | .w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} 47 | .w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} 48 | .w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} 49 | .w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} 50 | .w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} 51 | .w3-dropdown-hover:hover .w3-dropdown-content{display:block} 52 | .w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} 53 | .w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} 54 | .w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} 55 | .w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} 56 | .w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} 57 | .w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} 58 | .w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} 59 | .w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} 60 | .w3-main,#main{transition:margin-left .4s} 61 | .w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} 62 | .w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} 63 | .w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} 64 | .w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} 65 | .w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} 66 | .w3-bar .w3-button{white-space:normal} 67 | .w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} 68 | .w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} 69 | .w3-responsive{display:block;overflow-x:auto} 70 | .w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, 71 | .w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} 72 | .w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} 73 | .w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} 74 | .w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} 75 | .w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} 76 | @media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} 77 | .w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} 78 | .w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} 79 | @media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} 80 | .w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} 81 | .w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} 82 | .w3-content{max-width:980px;margin:auto}.w3-rest{overflow:hidden} 83 | .w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} 84 | .w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} 85 | .w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} 86 | @media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} 87 | .w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} 88 | .w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} 89 | .w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} 90 | @media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} 91 | @media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} 92 | @media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} 93 | @media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}} 94 | .w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} 95 | .w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} 96 | .w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} 97 | .w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} 98 | .w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} 99 | .w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} 100 | .w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} 101 | .w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} 102 | .w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} 103 | .w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} 104 | .w3-display-position{position:absolute} 105 | .w3-circle{border-radius:50%} 106 | .w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} 107 | .w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} 108 | .w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} 109 | .w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} 110 | .w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} 111 | .w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} 112 | .w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} 113 | .w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} 114 | .w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} 115 | .w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} 116 | .w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} 117 | .w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} 118 | .w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} 119 | .w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} 120 | .w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} 121 | .w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} 122 | .w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} 123 | .w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} 124 | .w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} 125 | .w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} 126 | .w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} 127 | .w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} 128 | .w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} 129 | .w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} 130 | .w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} 131 | .w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} 132 | .w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} 133 | .w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} 134 | .w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} 135 | .w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} 136 | .w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} 137 | .w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} 138 | .w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} 139 | .w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} 140 | .w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} 141 | .w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} 142 | .w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} 143 | .w3-left{float:left!important}.w3-right{float:right!important} 144 | .w3-button:hover{color:#000!important;background-color:#ccc!important} 145 | .w3-transparent,.w3-hover-none:hover{background-color:transparent!important} 146 | .w3-hover-none:hover{box-shadow:none!important} 147 | /* Colors */ 148 | .w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} 149 | .w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} 150 | .w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} 151 | .w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} 152 | .w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} 153 | .w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} 154 | .w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} 155 | .w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} 156 | .w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} 157 | .w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} 158 | .w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} 159 | .w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} 160 | .w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} 161 | .w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} 162 | .w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} 163 | .w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} 164 | .w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} 165 | .w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} 166 | .w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} 167 | .w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} 168 | .w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} 169 | .w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} 170 | .w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} 171 | .w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} 172 | .w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} 173 | .w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} 174 | .w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} 175 | .w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} 176 | .w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} 177 | .w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} 178 | .w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} 179 | .w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} 180 | .w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} 181 | .w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} 182 | .w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} 183 | .w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} 184 | .w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} 185 | .w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} 186 | .w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} 187 | .w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} 188 | .w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} 189 | .w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} 190 | .w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} 191 | .w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} 192 | .w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} 193 | .w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} 194 | .w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} 195 | .w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} 196 | .w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} 197 | .w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} 198 | .w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} 199 | .w3-text-white,.w3-hover-text-white:hover{color:#fff!important} 200 | .w3-text-black,.w3-hover-text-black:hover{color:#000!important} 201 | .w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} 202 | .w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} 203 | .w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} 204 | .w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} 205 | .w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} 206 | .w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} 207 | .w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} 208 | .w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} 209 | .w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} 210 | .w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} 211 | .w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} 212 | .w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} 213 | .w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} 214 | .w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} 215 | .w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} 216 | .w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} 217 | .w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} 218 | .w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} 219 | .w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} 220 | .w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} 221 | .w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} 222 | .w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} 223 | .w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} 224 | .w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} 225 | .w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} 226 | .w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} 227 | .w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} 228 | .w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} 229 | .w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} 230 | .w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} 231 | .w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} -------------------------------------------------------------------------------- /app/public/wangjingze/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/public/wangjingze/example.png -------------------------------------------------------------------------------- /app/site_config.yml: -------------------------------------------------------------------------------- 1 | page_404: public/404.html 2 | page_invalid: public/invalid.html 3 | 4 | server_ip: 0.0.0.0 5 | server_port: 4567 6 | 7 | max_jobs: 8 8 | 9 | ffmpeg_command: ffmpeg -------------------------------------------------------------------------------- /app/sources.list: -------------------------------------------------------------------------------- 1 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted 2 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted 3 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic universe 4 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates universe 5 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic multiverse 6 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates multiverse 7 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse 8 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-security main restricted 9 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-security universe 10 | deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-security multiverse 11 | 12 | -------------------------------------------------------------------------------- /app/src/serve.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | 3 | (require racket/date) 4 | 5 | (define (go) 6 | 'yep-it-works) 7 | 8 | (define (serve port-no) 9 | (define main-cust (make-custodian)) 10 | (parameterize ([current-custodian main-cust]) 11 | (define listener (tcp-listen port-no 5 #t)) 12 | (define (loop) 13 | (accept-and-handle listener) 14 | (loop)) 15 | (thread loop)) 16 | (lambda () 17 | (custodian-shutdown-all main-cust))) 18 | 19 | (define (accept-and-handle listener) 20 | (define cust (make-custodian)) 21 | (parameterize ([current-custodian cust]) 22 | (define-values (in out) (tcp-accept listener)) 23 | (thread 24 | (lambda () (handle in out) 25 | (close-input-port in) 26 | (close-output-port out)))) 27 | ;; Watcher thread 28 | (thread (lambda () 29 | (sleep 10) 30 | (custodian-shutdown-all cust)))) 31 | 32 | (define (handle in out) 33 | (regexp-match #rx"(\r\n|^)\r\n" in) 34 | 35 | (display "HTTP/1.0 200 Okay\r\n" out) 36 | (display "\r\n" out) 37 | (display 38 | (format "

~a

" (format-time)) 39 | out)) 40 | 41 | (define (format-time) 42 | (parameterize ([date-display-format 'chinese]) 43 | (date->string (current-date)))) 44 | 45 | (println "Server is running...") 46 | (define stop (serve 1234)) -------------------------------------------------------------------------------- /app/src/sorry.rb: -------------------------------------------------------------------------------- 1 | require 'sinatra' 2 | require 'json' 3 | require 'erb' 4 | 5 | require_relative "./sorry/make_gif.rb" 6 | require_relative "./sorry/config.rb" 7 | require_relative "./sorry/check_deps.rb" 8 | 9 | # 检查依赖 10 | DepsChecker.check_all() 11 | 12 | # 默认跳转到sorry模板 13 | get "/" do 14 | redirect to('/sorry/') 15 | end 16 | 17 | # 兼容旧版 18 | get "/index.html" do 19 | redirect to('/sorry/') 20 | end 21 | 22 | # 跳转到// 23 | get "/:template_name" do 24 | template_name = params['template_name'] 25 | redirect to("/#{template_name}/") 26 | end 27 | 28 | 29 | # 模板主页 30 | get "/:template_name/" do 31 | template_name = params['template_name'] 32 | path_to_file = "views/#{template_name}.erb" 33 | 34 | if File.exist?(path_to_file) 35 | erb params['template_name'].to_sym 36 | else 37 | send_file Config::PAGE_404 38 | end 39 | 40 | end 41 | 42 | # Gif制作请求 43 | post "/:template_name/make" do 44 | template_name = params['template_name'] 45 | 46 | body = JSON.parse(request.body.read) 47 | sentences = [] 48 | i = 0 49 | while sentence = body[i.to_s] 50 | sentences[i] = sentence 51 | i += 1 52 | end 53 | 54 | path_to_template_dir = "templates/#{template_name}/" 55 | if ! Dir.exist?(path_to_template_dir) 56 | halt 404 57 | end 58 | 59 | Sorry.render_gif("templates/#{template_name}/", sentences) 60 | end 61 | 62 | # Gif制作请求(微信兼容版) 63 | post "/sorry/wechat/make" do 64 | template_name = "sorry" 65 | 66 | body = JSON.parse(request.body.read) 67 | sentences = [] 68 | i = 0 69 | while sentence = body[i.to_s] 70 | sentences[i] = sentence 71 | i += 1 72 | end 73 | 74 | Sorry.render_gif("templates/sorry/wechat/", sentences) 75 | end 76 | 77 | # API 78 | post "/api/:template_name/make" do 79 | template_name = params['template_name'] 80 | 81 | body = JSON.parse(request.body.read) 82 | if body.is_a?(Array) 83 | sentences = body 84 | else 85 | sentences = [] 86 | i = 0 87 | while sentence = body[i.to_s] 88 | sentences[i] = sentence 89 | i += 1 90 | end 91 | end 92 | 93 | path_to_template_dir = "templates/#{template_name}/" 94 | if ! Dir.exist?(path_to_template_dir) 95 | halt 404 96 | end 97 | 98 | status_code, msg = Sorry.render_gif_api("templates/#{template_name}/", sentences) 99 | 100 | status(status_code) 101 | msg 102 | end 103 | 104 | # 兼容旧版 105 | post "/make" do 106 | "

请刷新或清空浏览器缓存🍃

" 107 | end 108 | 109 | 110 | # 404页面 111 | not_found do 112 | if %r<^/cache/.+> =~ request.path_info 113 | send_file Config::PAGE_INVALID 114 | else 115 | send_file Config::PAGE_404 116 | end 117 | end 118 | 119 | 120 | # 静态文件 121 | set :static, true 122 | set :public_folder, Dir.pwd + '/public' 123 | 124 | 125 | # 设置监听地址 126 | set :port, Config::SERVER_PORT 127 | set :bind, Config::SERVER_IP 128 | 129 | # 设置网页模板目录 130 | set :views, Dir.pwd + '/views' -------------------------------------------------------------------------------- /app/src/sorry.rkt: -------------------------------------------------------------------------------- 1 | #lang racket 2 | (require web-server/servlet 3 | web-server/servlet-env 4 | web-server/dispatch) 5 | 6 | (define (start req) 7 | (sorry-dispatch req)) 8 | 9 | (define-values (sorry-dispatch sorry-url) 10 | (dispatch-rules 11 | [((string-arg) "") show-page] 12 | [((string-arg) "make") make-gif])) 13 | 14 | (define (show-page req template-name) `(p "show")) 15 | 16 | (define template-table (make-hash)) 17 | 18 | (struct template (template-video 19 | template-subtitle 20 | example-image)) 21 | 22 | (define (load-templates dir) 23 | (map load-template (scan-directories))) 24 | 25 | (define (scan-directories) 26 | (filter directory-exists? (directory-list "templates"))) 27 | 28 | (define (load-template dir) 29 | (let ([t-name (path-string dir)] 30 | [t-video (build-path "templates" dir "template.mp4")] 31 | [t-subtitle (build-path "templates" dir "template.erb")] ;; FIX!! 32 | [t-image (build-path "templates" dir "example.png")]) 33 | (if (andmap file-exists? (list 34 | t-video 35 | t-subtitle 36 | t-image)) 37 | (hash-set! template-table t-name 38 | (template t-name t-video t-subtitle t-image)) 39 | (printf "Error loading template: ~a\n" t-name)))) 40 | 41 | (define (make-gif req template-name) 42 | (response/xexpr `(p 43 | (a ((href "/cache/...") (target "_blank")) 44 | (p "点击下载"))))) 45 | 46 | (serve/servlet start 47 | #:launch-browser? #f 48 | #:listen-ip "0.0.0.0" 49 | #:port 4567 50 | #:servlet-regexp #rx"" 51 | #:extra-files-paths 52 | (list 53 | (build-path (current-directory) "public"))) -------------------------------------------------------------------------------- /app/src/sorry/cache.rb: -------------------------------------------------------------------------------- 1 | require 'fileutils' 2 | 3 | require_relative "./cache.rb" 4 | require_relative "./config.rb" 5 | 6 | 7 | class Cache 8 | def file_exists?(filename) 9 | end 10 | 11 | def add_file(path, filename = nil) 12 | end 13 | 14 | def get_url(filename) 15 | end 16 | end 17 | 18 | 19 | class LocalCache < Cache 20 | def initialize() 21 | @cache_path = "cache/" 22 | @local_cache_path = "public/cache/" 23 | end 24 | 25 | # TODO: rewrite this 26 | def file_exists?(filename) 27 | File.exists?(@local_cache_path + filename) 28 | end 29 | 30 | def add_file(path, filename = nil) 31 | FileUtils.cp path, @local_cache_path 32 | end 33 | 34 | def get_url(filename) 35 | "/" + @cache_path + filename 36 | end 37 | end -------------------------------------------------------------------------------- /app/src/sorry/check_deps.rb: -------------------------------------------------------------------------------- 1 | require_relative "./config.rb" 2 | 3 | # 检查依赖的安装情况 4 | 5 | module DepsChecker 6 | def DepsChecker.check_ffmpeg 7 | if system "#{Config::FFMPEG_COMMAND} -version" 8 | return 9 | end 10 | 11 | print <<-MSG 12 | 看起来系统中没有安装ffmpeg😥 13 | 14 | 安装方式: 15 | # Ubuntu 16 | apt install ffmpeg 17 | 18 | # CentOS 19 | yum install ffmpeg 20 | MSG 21 | exit 22 | end 23 | 24 | def check_all() 25 | check_ffmpeg() 26 | end 27 | 28 | module_function :check_all 29 | end -------------------------------------------------------------------------------- /app/src/sorry/config.rb: -------------------------------------------------------------------------------- 1 | require "yaml" 2 | 3 | module Config 4 | config = YAML.load(File.read "site_config.yml") 5 | 6 | PAGE_404 = config["page_404"] 7 | PAGE_INVALID = config["page_invalid"] 8 | 9 | SERVER_PORT = config["server_port"].to_i 10 | SERVER_IP = config["server_ip"] 11 | 12 | MAX_JOBS = config['max_jobs'] 13 | 14 | FFMPEG_COMMAND = config['ffmpeg_command'] 15 | end -------------------------------------------------------------------------------- /app/src/sorry/make_gif.rb: -------------------------------------------------------------------------------- 1 | require 'erb' 2 | require 'digest' 3 | require "thread" 4 | 5 | require_relative './cache.rb' 6 | require_relative './config.rb' 7 | 8 | module Sorry 9 | 10 | $cache = LocalCache.new 11 | 12 | $jobs = 0 13 | $mutex = Mutex.new 14 | 15 | def Sorry.calculate_hash(template_dir,sentences) 16 | Digest::MD5.hexdigest(template_dir + sentences.to_s) 17 | end 18 | 19 | def Sorry.ffmpeg_avaliable? 20 | $jobs < Config::MAX_JOBS 21 | end 22 | 23 | def Sorry.make_gif_with_ffmpeg(template_dir, sentences, filename) 24 | $mutex.lock 25 | $jobs += 1 26 | $mutex.unlock 27 | 28 | gif_path = "temp/" + filename 29 | ass_path = render_ass(template_dir, sentences, filename) 30 | video_path = template_dir + "template.mp4" 31 | 32 | cmd = <<-CMD 33 | #{Config::FFMPEG_COMMAND} -i #{video_path} \ 34 | -vf ass=#{ass_path} -y #{gif_path} 35 | CMD 36 | 37 | pid = spawn(cmd, [:out, :err]=>"/dev/null") 38 | Process.wait(pid) 39 | 40 | gif_path 41 | ensure 42 | $mutex.lock 43 | $jobs -= 1 44 | $mutex.unlock 45 | puts "[ Current jobs ] #{$jobs}" 46 | end 47 | 48 | def Sorry.ass_text(template_dir) 49 | File.read(template_dir + "template.ass") 50 | end 51 | 52 | def Sorry.render_ass(template_dir, sentences, filename) 53 | output_file_path = "temp/" + filename + ".ass" 54 | 55 | rendered_ass_text = ERB.new(ass_text(template_dir)).result(binding) 56 | 57 | File.write(output_file_path, rendered_ass_text) 58 | 59 | output_file_path 60 | end 61 | 62 | def render_gif(template_dir, sentences) 63 | gif_file = calculate_hash(template_dir, sentences) + ".gif" 64 | 65 | if !$cache.file_exists?(gif_file) 66 | if ffmpeg_avaliable? 67 | path = make_gif_with_ffmpeg(template_dir, sentences, gif_file) 68 | $cache.add_file(path) 69 | File.delete(path) 70 | else 71 | return <<-HTML 72 |

服务器忙!等下说不定就能用了⏳

73 | HTML 74 | end 75 | end 76 | 77 | <<-HTML 78 |

点击下载

79 | HTML 80 | end 81 | 82 | def render_gif_api(template_dir, sentences) 83 | gif_file = calculate_hash(template_dir, sentences) + ".gif" 84 | 85 | if !$cache.file_exists?(gif_file) 86 | if ffmpeg_avaliable? 87 | path = make_gif_with_ffmpeg(template_dir, sentences, gif_file) 88 | $cache.add_file(path) 89 | File.delete(path) 90 | else 91 | return 503, "" 92 | end 93 | end 94 | 95 | return 200, $cache.get_url(gif_file) 96 | end 97 | 98 | 99 | module_function :render_gif 100 | module_function :render_gif_api 101 | end 102 | -------------------------------------------------------------------------------- /app/src/sorry/version.rb: -------------------------------------------------------------------------------- 1 | module Sorry 2 | VERSION = "0.1.0" 3 | end 4 | -------------------------------------------------------------------------------- /app/templates/dagong/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 296 10 | PlayResY: 182 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.619565 17 | Video Zoom Percent: 2.500000 18 | Active Line: 2 19 | Video Position: 85 20 | 21 | [V4+ Styles] 22 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 23 | Style: sorry,WenQuanYi Micro Hei,23,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.18696,0.593478,2,5,5,5,1 24 | 25 | [Events] 26 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 27 | Dialogue: 0,0:00:00.00,0:00:01.80,sorry,,0,0,0,,<%= sentences[0] %> 28 | Dialogue: 0,0:00:01.88,0:00:03.76,sorry,,0,0,0,,<%= sentences[1] %> 29 | Dialogue: 0,0:00:03.81,0:00:04.66,sorry,,0,0,0,,<%= sentences[2] %> 30 | Dialogue: 0,0:00:04.66,0:00:05.90,sorry,,0,0,0,,<%= sentences[3] %> 31 | Dialogue: 0,0:00:06.02,0:00:08.42,sorry,,0,0,0,,<%= sentences[4] %> 32 | Dialogue: 0,0:00:08.42,0:00:10.75,sorry,,0,0,0,,<%= sentences[5] %> 33 | -------------------------------------------------------------------------------- /app/templates/dagong/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/dagong/template.mp4 -------------------------------------------------------------------------------- /app/templates/dagong/template_origin.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/dagong/template_origin.mp4 -------------------------------------------------------------------------------- /app/templates/diandongche/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 298 10 | PlayResY: 184 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 2.750000 18 | Active Line: 4 19 | Video Position: 83 20 | 21 | [V4+ Styles] 22 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 23 | Style: sorry,WenQuanYi Micro Hei,25,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.20476,0.547619,2,5,5,6,1 24 | 25 | [Events] 26 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 27 | Dialogue: 0,0:00:00.00,0:00:02.50,sorry,,0,0,0,,<%= sentences[0] %> 28 | Dialogue: 0,0:00:02.98,0:00:04.90,sorry,,0,0,0,,<%= sentences[1] %> 29 | Dialogue: 0,0:00:05.36,0:00:07.34,sorry,,0,0,0,,<%= sentences[2] %> 30 | Dialogue: 0,0:00:07.34,0:00:09.85,sorry,,0,0,0,,<%= sentences[3] %> 31 | Dialogue: 0,0:00:10.33,0:00:12.35,sorry,,0,0,0,,<%= sentences[4] %> 32 | Dialogue: 0,0:00:12.83,0:00:15.24,sorry,,0,0,0,,<%= sentences[5] %> 33 | -------------------------------------------------------------------------------- /app/templates/diandongche/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/diandongche/template.mp4 -------------------------------------------------------------------------------- /app/templates/diandongche/template_origin.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/diandongche/template_origin.mp4 -------------------------------------------------------------------------------- /app/templates/jinkela/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 300 10 | PlayResY: 186 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 2.500000 18 | 19 | [V4+ Styles] 20 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 21 | Style: sorry,WenQuanYi Micro Hei,25,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.21786,0.553571,2,5,5,6,1 22 | 23 | [Events] 24 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 25 | Dialogue: 0,0:00:00.00,0:00:02.56,sorry,,0,0,0,,<%= sentences[0] %> 26 | Dialogue: 0,0:00:02.56,0:00:04.31,sorry,,0,0,0,,<%= sentences[1] %> 27 | Dialogue: 0,0:00:04.31,0:00:05.56,sorry,,0,0,0,,<%= sentences[2] %> 28 | Dialogue: 0,0:00:05.56,0:00:08.68,sorry,,0,0,0,,<%= sentences[3] %> 29 | Dialogue: 0,0:00:09.81,0:00:11.93,sorry,,0,0,0,,<%= sentences[4] %> 30 | Dialogue: 0,0:00:12.06,0:00:14.68,sorry,,0,0,0,,<%= sentences[5] %> 31 | -------------------------------------------------------------------------------- /app/templates/jinkela/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/jinkela/template.mp4 -------------------------------------------------------------------------------- /app/templates/jinkela/template_origin.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/jinkela/template_origin.mp4 -------------------------------------------------------------------------------- /app/templates/kongming/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 298 10 | PlayResY: 184 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 2.500000 18 | Video Position: 50 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,WenQuanYi Micro Hei,25,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.2,0.5,2,5,5,2,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.81,0:00:01.81,sorry,,0,0,0,,<%= sentences[0] %> 27 | Dialogue: 0,0:00:02.31,0:00:05.42,sorry,,0,0,0,,<%= sentences[1] %> 28 | -------------------------------------------------------------------------------- /app/templates/kongming/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/kongming/template.mp4 -------------------------------------------------------------------------------- /app/templates/kongming/template_origin.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/kongming/template_origin.mp4 -------------------------------------------------------------------------------- /app/templates/marmot/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 298 10 | PlayResY: 184 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 2.500000 18 | Active Line: 1 19 | Video Position: 58 20 | 21 | [V4+ Styles] 22 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 23 | Style: sorry,WenQuanYi Micro Hei,25,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.2,0.5,2,5,5,2,1 24 | 25 | [Events] 26 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 27 | Dialogue: 0,0:00:00.90,0:00:02.46,sorry,,0,0,0,,<%= sentences[0] %> 28 | Dialogue: 0,0:00:07.30,0:00:09.33,sorry,,0,0,0,,<%= sentences[1] %> 29 | -------------------------------------------------------------------------------- /app/templates/marmot/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/marmot/template.mp4 -------------------------------------------------------------------------------- /app/templates/marmot/template_origin.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/marmot/template_origin.mp4 -------------------------------------------------------------------------------- /app/templates/sorry/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 300 10 | PlayResY: 168 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 2.000000 18 | Active Line: 8 19 | Video Position: 25 20 | 21 | [V4+ Styles] 22 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 23 | Style: sorry,WenQuanYi Micro Hei,23,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.1,0.5,2,5,5,5,1 24 | 25 | [Events] 26 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 27 | Dialogue: 0,0:00:01.18,0:00:01.56,sorry,,0,0,0,,<%= sentences[0] %> 28 | Dialogue: 0,0:00:03.18,0:00:04.43,sorry,,0,0,0,,<%= sentences[1] %> 29 | Dialogue: 0,0:00:05.31,0:00:07.43,sorry,,0,0,0,,<%= sentences[2] %> 30 | Dialogue: 0,0:00:07.56,0:00:09.93,sorry,,0,0,0,,<%= sentences[3] %> 31 | Dialogue: 0,0:00:10.06,0:00:11.56,sorry,,0,0,0,,<%= sentences[4] %> 32 | Dialogue: 0,0:00:11.93,0:00:13.06,sorry,,0,0,0,,<%= sentences[5] %> 33 | Dialogue: 0,0:00:13.81,0:00:16.31,sorry,,0,0,0,,<%= sentences[6] %> 34 | Dialogue: 0,0:00:18.06,0:00:19.56,sorry,,0,0,0,,<%= sentences[7] %> 35 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,<%= sentences[8] %> 36 | -------------------------------------------------------------------------------- /app/templates/sorry/template.erb: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,<%= sentences[0] %> 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,<%= sentences[1] %> 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,<%= sentences[2] %> 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,<%= sentences[3] %> 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,<%= sentences[4] %> 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,<%= sentences[5] %> 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,<%= sentences[6] %> 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,<%= sentences[7] %> 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,<%= sentences[8] %> 35 | -------------------------------------------------------------------------------- /app/templates/sorry/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/sorry/template.mp4 -------------------------------------------------------------------------------- /app/templates/sorry/template_origin.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/sorry/template_origin.mp4 -------------------------------------------------------------------------------- /app/templates/sorry/wechat/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 236 10 | PlayResY: 132 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 2.375000 18 | Active Line: 8 19 | Video Position: 165 20 | 21 | [V4+ Styles] 22 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 23 | Style: sorry,WenQuanYi Micro Hei,23,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,0.8,0.4,2,4,4,2,1 24 | 25 | [Events] 26 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 27 | Dialogue: 0,0:00:01.18,0:00:01.56,sorry,,0,0,0,,<%= sentences[0] %> 28 | Dialogue: 0,0:00:03.18,0:00:04.43,sorry,,0,0,0,,<%= sentences[1] %> 29 | Dialogue: 0,0:00:05.31,0:00:07.43,sorry,,0,0,0,,<%= sentences[2] %> 30 | Dialogue: 0,0:00:07.56,0:00:09.93,sorry,,0,0,0,,<%= sentences[3] %> 31 | Dialogue: 0,0:00:10.06,0:00:11.56,sorry,,0,0,0,,<%= sentences[4] %> 32 | Dialogue: 0,0:00:11.93,0:00:13.06,sorry,,0,0,0,,<%= sentences[5] %> 33 | Dialogue: 0,0:00:13.81,0:00:16.31,sorry,,0,0,0,,<%= sentences[6] %> 34 | Dialogue: 0,0:00:18.06,0:00:19.56,sorry,,0,0,0,,<%= sentences[7] %> 35 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,<%= sentences[8] %> 36 | -------------------------------------------------------------------------------- /app/templates/sorry/wechat/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/sorry/wechat/template.mp4 -------------------------------------------------------------------------------- /app/templates/wangjingze/template.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 298 10 | PlayResY: 184 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.619565 17 | Video Zoom Percent: 2.500000 18 | Active Line: 3 19 | Video Position: 50 20 | 21 | [V4+ Styles] 22 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 23 | Style: sorry,WenQuanYi Micro Hei,23,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,1.2,0.6,2,5,5,5,1 24 | 25 | [Events] 26 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 27 | Dialogue: 0,0:00:00.00,0:00:01.04,sorry,,0,0,0,,<%= sentences[0] %> 28 | Dialogue: 0,0:00:01.46,0:00:02.90,sorry,,0,0,0,,<%= sentences[1] %> 29 | Dialogue: 0,0:00:03.09,0:00:04.33,sorry,,0,0,0,,<%= sentences[2] %> 30 | Dialogue: 0,0:00:04.59,0:00:05.93,sorry,,0,0,0,,<%= sentences[3] %> 31 | -------------------------------------------------------------------------------- /app/templates/wangjingze/template.erb: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 974 10 | PlayResY: 602 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: template.mp4 14 | Video File: template.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.617940 17 | Video Zoom Percent: 0.875000 18 | Video Position: 149 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Ubuntu,71,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,3.8,1.9,2,17,17,34,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.00,0:00:01.04,sorry,,0,0,0,,<%= sentences[0] %> 27 | Dialogue: 0,0:00:01.46,0:00:02.90,sorry,,0,0,0,,<%= sentences[1] %> 28 | Dialogue: 0,0:00:03.09,0:00:04.33,sorry,,0,0,0,,<%= sentences[2] %> 29 | Dialogue: 0,0:00:04.49,0:00:06.37,sorry,,0,0,0,,<%= sentences[3] %> 30 | -------------------------------------------------------------------------------- /app/templates/wangjingze/template.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/wangjingze/template.mp4 -------------------------------------------------------------------------------- /app/templates/wangjingze/template_origin.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/app/templates/wangjingze/template_origin.mp4 -------------------------------------------------------------------------------- /app/views/dagong.erb: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 |

7 | 8 |

9 | 12 | 13 |

14 | 15 |

16 | 19 | 20 |

21 | 22 |

23 | 26 | 27 |

28 | 29 |

30 | 33 | 34 |

35 | 36 |

37 | 40 | 41 |

42 | 43 |
44 | 45 |

46 | 47 |

-------------------------------------------------------------------------------- /app/views/diandongche.erb: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 |

7 | 8 |

9 | 12 | 13 |

14 | 15 |

16 | 19 | 20 |

21 | 22 |

23 | 26 | 27 |

28 | 29 |

30 | 33 | 34 |

35 | 36 |

37 | 40 | 41 |

42 | 43 |
44 | 45 |

46 | 47 |

-------------------------------------------------------------------------------- /app/views/jinkela.erb: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 |

7 | 8 |

9 | 12 | 13 |

14 | 15 |

16 | 19 | 20 |

21 | 22 |

23 | 26 | 27 |

28 | 29 |

30 | 33 | 34 |

35 | 36 |

37 | 40 | 41 |

42 | 43 |
44 | 45 |

46 | 47 |

-------------------------------------------------------------------------------- /app/views/kongming.erb: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 |

7 | 8 |

9 | 12 | 13 |

14 | 15 |
16 | 17 |

18 | 19 |

-------------------------------------------------------------------------------- /app/views/layout.erb: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Sorry! 在线生成 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 25 | 26 | 27 |
28 | 29 |
30 | 31 | 32 |
33 |
34 | Lights 35 |

在线生成Sorry,动图

36 |
37 | 38 |
39 | 40 | <%= yield %> 41 | 42 |
43 | 50 |
51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /app/views/marmot.erb: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 |

7 | 8 |

9 | 12 | 13 |

14 | 15 |
16 | 17 |

18 | 19 |

-------------------------------------------------------------------------------- /app/views/sorry.erb: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 |

7 | 8 |

9 | 12 | 13 |

14 | 15 |

16 | 19 | 20 |

21 | 22 |

23 | 26 | 27 |

28 | 29 |

30 | 33 | 34 |

35 | 36 |

37 | 40 | 41 |

42 | 43 |

44 | 47 | 48 |

49 | 50 |

51 | 54 | 55 |

56 | 57 |

58 | 61 | 62 |

63 | 64 | 65 | 66 | 67 |
68 | 69 |

70 | 71 |

-------------------------------------------------------------------------------- /app/views/wangjingze.erb: -------------------------------------------------------------------------------- 1 |

2 | 5 | 6 |

7 | 8 |

9 | 12 | 13 |

14 | 15 |

16 | 19 | 20 |

21 | 22 |

23 | 26 | 27 |

28 | 29 |
30 | 31 |

32 | 33 |

-------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.4" 2 | 3 | services: 4 | sorry: 5 | build: app 6 | restart: always 7 | ports: 8 | - 127.0.0.1:4567:4567 9 | volumes: 10 | - ./temp:/app/temp 11 | environment: 12 | APP_ENV: production 13 | LANG: UTF-8 -------------------------------------------------------------------------------- /media/1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/media/1.gif -------------------------------------------------------------------------------- /media/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/media/2.png -------------------------------------------------------------------------------- /media/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/media/3.png -------------------------------------------------------------------------------- /media/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/media/4.png -------------------------------------------------------------------------------- /media/gh_b404536005f9_258.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/xtyxtyx/sorry/2bc4afbe7ea862da3d94839996f13f7591a21dae/media/gh_b404536005f9_258.jpg -------------------------------------------------------------------------------- /temp/35c615e5237fa4ca747c4a5544b08e41.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,以后叫他天天改报告 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaaaaaaaa 35 | -------------------------------------------------------------------------------- /temp/3aff7060f2ff31c5f8ee4d280f4aec0d.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,aaaaa 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaaaaaaaaaaaaaa 35 | -------------------------------------------------------------------------------- /temp/3cfab5c16f5148f88b72640c51cefde4.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,以后叫他天天改报告 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,天天改 天天改 35 | -------------------------------------------------------------------------------- /temp/460ce56b5ef38a60c7408db76a46ec95.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,aaaaa 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaaaaaaaaaaa 35 | -------------------------------------------------------------------------------- /temp/4ecec26d173b8353e88479b0996afcbf.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,aaaaaaaaaaaaaaaaa 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,aaaaaa 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaaaaaaaaaaaaaa 35 | -------------------------------------------------------------------------------- /temp/6ebd255556083c4c62f870462777ae19.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,, 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,, 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,, 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,, 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,, 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,, 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,, 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,, 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,, 35 | -------------------------------------------------------------------------------- /temp/c3669261f48eac82c555975e9dffebc3.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,aaaaaa 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaaaaaaaaaaaaaa 35 | -------------------------------------------------------------------------------- /temp/cc59cba5c49aedc60cabd70cd4b9ee40.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,以后叫他天天改报告 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaaa 35 | -------------------------------------------------------------------------------- /temp/e1b2909f4ccbb2db6cf6410b39975458.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,以后叫他天天改报告 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaaaaaaaaaaa 35 | -------------------------------------------------------------------------------- /temp/f8b3b607a5a65ecf7224e1a39352ffaf.gif.ass: -------------------------------------------------------------------------------- 1 | [Script Info] 2 | ; Script generated by Aegisub 3.2.2 3 | ; http://www.aegisub.org/ 4 | Title: Default Aegisub file 5 | ScriptType: v4.00+ 6 | WrapStyle: 0 7 | ScaledBorderAndShadow: yes 8 | YCbCr Matrix: TV.601 9 | PlayResX: 570 10 | PlayResY: 320 11 | 12 | [Aegisub Project Garbage] 13 | Audio File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 14 | Video File: /home/xuty/codehouse/Project/Sorry/resource/sorry.mp4 15 | Video AR Mode: 4 16 | Video AR Value: 1.781250 17 | Video Zoom Percent: 1.500000 18 | Video Position: 410 19 | 20 | [V4+ Styles] 21 | Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding 22 | Style: sorry,Arial,35,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,1,2,10,10,12,1 23 | 24 | [Events] 25 | Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text 26 | Dialogue: 0,0:00:00.97,0:00:01.50,sorry,,0,0,0,,好啊 27 | Dialogue: 0,0:00:03.11,0:00:04.39,sorry,,0,0,0,,就算你是一流工程师 28 | Dialogue: 0,0:00:05.18,0:00:07.26,sorry,,0,0,0,,就算你出报告再完美 29 | Dialogue: 0,0:00:07.26,0:00:09.91,sorry,,0,0,0,,我叫你改报告你就要改 30 | Dialogue: 0,0:00:10.00,0:00:11.26,sorry,,0,0,0,,毕竟我是客户 31 | Dialogue: 0,0:00:11.63,0:00:12.70,sorry,,0,0,0,,客户了不起啊 32 | Dialogue: 0,0:00:13.61,0:00:16.01,sorry,,0,0,0,,sorry 客户真的了不起 33 | Dialogue: 0,0:00:18.08,0:00:19.60,sorry,,0,0,0,,以后叫他天天改报告 34 | Dialogue: 0,0:00:19.60,0:00:21.60,sorry,,0,0,0,,aaaaaaaaaaaaaaa 35 | --------------------------------------------------------------------------------