Initial commit

This commit is contained in:
vsphim 2026-05-20 12:51:54 +07:00
commit 7e9bc5c8e0
57 changed files with 4180 additions and 0 deletions

BIN
.DS_Store vendored Normal file

Binary file not shown.

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

42
README.md Executable file
View File

@ -0,0 +1,42 @@
# THEME - XING KONG 2024 - VSMOV CMS
## Demo
https://forum.ophim.cc/d/30-theme-xingkong
## Requirements
https://github.com/vsphim/vsmov-core
## Install
1. Tại thư mục của Project: `composer require vsmov/theme-xingkong`
2. Kích hoạt giao diện trong Admin Panel
## Update
1. Tại thư mục của Project: `composer update vsmov/theme-xingkong`
2. Re-Activate giao diện trong Admin Panel
## Note
- Một vài lưu ý quan trọng của các nút chức năng:
+ `Activate``Re-Activate` sẽ publish toàn bộ file js,css trong themes ra ngoài public của laravel.
+ `Reset` reset lại toàn bộ cấu hình của themes
## Document
### List
- Home page: `display_label|display_description|relation|find_by_field|value|sort_by_field|sort_algo|limit|show_more_url|section_template(default|with_top)`
####
Phim chiếu rạp mới||is_shown_in_theater|1|created_at|desc|12|/danh-sach/phim-chieu-rap|default
Phim bộ mới||type|series|updated_at|desc|10|/danh-sach/phim-bo|with_top
Phim lẻ mới||type|single|updated_at|desc|10|/danh-sach/phim-le|with_top
Phim hoạt hình mới|categories|slug|hoat-hinh|updated_at|desc|10|/the-loai/hoat-hinh|with_top
####
- Cột phải: `Label|relation|find_by_field|value|sort_by_field|sort_algo|limit`
####
Top phim lẻ||type|single|view_week|desc|8
Top phim bộ||type|series|view_week|desc|8
Phim sắp chiếu||status|trailer|publish_year|desc|8
####
### Custom View Blade
- File blade gốc trong Package: `/vendor/vsmov/theme-xingkong/resources/views/themexingkong`
- Copy file cần custom đến: `/resources/views/vendor/themes/xingkong`

32
composer.json Executable file
View File

@ -0,0 +1,32 @@
{
"name": "vsmov/theme-xingkong",
"description": "VsMov's xingkong theme",
"type": "library",
"authors": [
{
"name": "vsmov",
"email": "vsmov@gmail.com"
}
],
"require": {
"laravel/framework": "^6|^7|^8",
"ckfinder/ckfinder-laravel-package": "v3.5.2.1",
"vsmov/vsmov-core": "^1.0.0"
},
"license": "MIT",
"autoload": {
"psr-4": {
"VsMov\\ThemeXingKong\\": "src/",
"VsMov\\ThemeXingKong\\Database\\Factories\\": "database/factories/",
"VsMov\\ThemeXingKong\\Database\\Seeders\\": "database/seeders/"
}
},
"extra": {
"laravel": {
"providers": [
"VsMov\\ThemeXingKong\\ThemeXingKongServiceProvider"
]
}
},
"minimum-stability": "stable"
}

BIN
resources/.DS_Store vendored Normal file

Binary file not shown.

BIN
resources/assets/.DS_Store vendored Normal file

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

View File

@ -0,0 +1,519 @@
/*!
* v3.0 Copyright http://v.shoutu.cn
* email 726662013@qq.com
*/
@charset "utf-8";
/* all */
body, html{width:100%;}
body{ margin: 0; font-family:"Roboto", sans-serif; font-size:14px; line-height: 140%}
ul,ol,li,p,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,img,tr,dl,dd,dt{margin:0;padding:0; font-weight:normal}
input,select{font-size:12px;vertical-align:middle; border:none;}
ul,li{list-style-type:none;}
img{border:0 none;}
p{margin:0 0 10px;}
/* container */
*{-webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box}
:after,:before{-webkit-box-sizing:border-box; -moz-box-sizing:border-box; box-sizing:border-box}
.container {position: relative; padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto;}
.row{position: relative; margin-right: -15px; margin-left: -15px;}
.container:before,.container:after,.row:before,.row:after,.clearfix:before, .clearfix:after{ display: table; content: " "; clear: both;}
/* col */
.col-pd,.col-lg-1,.col-lg-10,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding:10px}.col-xs-1,.col-xs-10,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-wide-1,.col-xs-wide-10,.col-xs-wide-15,.col-xs-wide-2,.col-xs-wide-25,.col-xs-wide-3,.col-xs-wide-35,.col-xs-wide-4,.col-xs-wide-45,.col-xs-wide-5,.col-xs-wide-55,.col-xs-wide-6,.col-xs-wide-65,.col-xs-wide-7,.col-xs-wide-75,.col-xs-wide-8,.col-xs-wide-85,.col-xs-wide-9,.col-xs-wide-95{float:left}.col-xs-10{width:10%}.col-xs-9{width:11.1111111%}.col-xs-8{width:12.5%}.col-xs-7{width:14.2857143%}.col-xs-6{width:16.6666667%}.col-xs-5{width:20%}.col-xs-4{width:25%}.col-xs-3{width:33.3333333%}.col-xs-2{width:50%}.col-xs-1{width:100%}.col-xs-wide-10{width:10%}.col-xs-wide-9{width:90%}.col-xs-wide-8{width:80%}.col-xs-wide-7{width:70%}.col-xs-wide-6{width:60%}.col-xs-wide-5{width:50%}.col-xs-wide-4{width:40%}.col-xs-wide-3{width:30%}.col-xs-wide-2{width:20%}.col-xs-wide-15{width:15%}.col-xs-wide-95{width:95%}.col-xs-wide-85{width:85%}.col-xs-wide-75{width:75%}.col-xs-wide-65{width:65%}.col-xs-wide-55{width:55%}.col-xs-wide-45{width:45%}.col-xs-wide-35{width:35%}.col-xs-wide-25{width:25%}
@media (min-width: 768px){
.col-sm-1,.col-sm-10,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-wide-1,.col-sm-wide-10,.col-sm-wide-15,.col-sm-wide-2,.col-sm-wide-25,.col-sm-wide-3,.col-sm-wide-35,.col-sm-wide-4,.col-sm-wide-45,.col-sm-wide-5,.col-sm-wide-55,.col-sm-wide-6,.col-sm-wide-65,.col-sm-wide-7,.col-sm-wide-75,.col-sm-wide-8,.col-sm-wide-85,.col-sm-wide-9,.col-sm-wide-95{float:left}.col-sm-10{width:10%}.col-sm-9{width:11.1111111%}.col-sm-8{width:12.5%}.col-sm-7{width:14.2857143%}.col-sm-6{width:16.6666667%}.col-sm-5{width:20%}.col-sm-4{width:25%}.col-sm-3{width:33.3333333%}.col-sm-2{width:50%}.col-sm-1{width:100%}.col-sm-wide-10{width:10%}.col-sm-wide-9{width:90%}.col-sm-wide-8{width:80%}.col-sm-wide-7{width:70%}.col-sm-wide-6{width:60%}.col-sm-wide-5{width:50%}.col-sm-wide-4{width:40%}.col-sm-wide-3{width:30%}.col-sm-wide-2{width:20%}.col-sm-wide-15{width:15%}.col-sm-wide-95{width:95%}.col-sm-wide-85{width:85%}.col-sm-wide-75{width:75%}.col-sm-wide-65{width:65%}.col-sm-wide-55{width:55%}.col-sm-wide-45{width:45%}.col-sm-wide-35{width:35%}.col-sm-wide-25{width:25%}}
@media (min-width: 992px){
.col-md-1,.col-md-10,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-wide-1,.col-md-wide-10,.col-md-wide-15,.col-md-wide-2,.col-md-wide-25,.col-md-wide-3,.col-md-wide-35,.col-md-wide-4,.col-md-wide-45,.col-md-wide-5,.col-md-wide-55,.col-md-wide-6,.col-md-wide-65,.col-md-wide-7,.col-md-wide-75,.col-md-wide-8,.col-md-wide-85,.col-md-wide-9,.col-md-wide-95{float:left}.col-md-10{width:10%}.col-md-9{width:11.1111111%}.col-md-8{width:12.5%}.col-md-7{width:14.2857143%}.col-md-6{width:16.6666667%}.col-md-5{width:20%}.col-md-4{width:25%}.col-md-3{width:33.3333333%}.col-md-2{width:50%}.col-md-1{width:100%}.col-md-wide-10{width:10%}.col-md-wide-9{width:90%}.col-md-wide-8{width:80%}.col-md-wide-7{width:70%}.col-md-wide-6{width:60%}.col-md-wide-5{width:50%}.col-md-wide-4{width:40%}.col-md-wide-3{width:30%}.col-md-wide-2{width:20%}.col-md-wide-15{width:15%}.col-md-wide-95{width:95%}.col-md-wide-85{width:85%}.col-md-wide-75{width:75%}.col-md-wide-65{width:65%}.col-md-wide-55{width:55%}.col-md-wide-45{width:45%}.col-md-wide-35{width:35%}.col-md-wide-25{width:25%}}
@media (min-width: 1200px){
.col-lg-1,.col-lg-10,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-wide-1,.col-lg-wide-10,.col-lg-wide-15,.col-lg-wide-2,.col-lg-wide-25,.col-lg-wide-3,.col-lg-wide-35,.col-lg-wide-4,.col-lg-wide-45,.col-lg-wide-5,.col-lg-wide-55,.col-lg-wide-6,.col-lg-wide-65,.col-lg-wide-7,.col-lg-wide-75,.col-lg-wide-8,.col-lg-wide-85,.col-lg-wide-9,.col-lg-wide-95{float:left}.col-lg-10{width:10%}.col-lg-9{width:11.1111111%}.col-lg-8{width:12.5%}.col-lg-7{width:14.2857143%}.col-lg-6{width:16.6666667%}.col-lg-5{width:20%}.col-lg-4{width:25%}.col-lg-3{width:33.3333333%}.col-lg-2{width:50%}.col-lg-1{width:100%}.col-lg-wide-10{width:10%}.col-lg-wide-9{width:90%}.col-lg-wide-8{width:80%}.col-lg-wide-7{width:70%}.col-lg-wide-6{width:60%}.col-lg-wide-5{width:50%}.col-lg-wide-4{width:40%}.col-lg-wide-3{width:30%}.col-lg-wide-2{width:20%}.col-lg-wide-15{width:15%}.col-lg-wide-95{width:95%}.col-lg-wide-85{width:85%}.col-lg-wide-75{width:75%}.col-lg-wide-65{width:65%}.col-lg-wide-55{width:55%}.col-lg-wide-45{width:45%}.col-lg-wide-35{width:35%}.col-lg-wide-25{width:25%}}
@media (max-width: 767px){[class*=col-]{padding:5px}}
/* text */
h1{ font-size:22px; line-height: 28px;}
h2{ font-size:20px; line-height: 26px;}
h3{ font-size:18px; line-height: 24px;}
h4{ font-size:16px; line-height: 22px;}
h5{ font-size:14px; line-height: 20px;}
h6{ font-size:12px; line-height: 18px;}
h1,h2,h3,h4,h5,h6{ font-weight: 400; margin-top:10px; margin-bottom:10px}
a,button{ text-decoration:none; outline:none; -webkit-tap-highlight-color:rgba(0,0,0,0)}
button:hover{ cursor: pointer;}
a:focus,a:hover,a:active{ text-decoration:none;}
.icon{ font-size: 16px; vertical-align: -1px;}
.font-16{ font-size: 16px;}
.font-14{ font-size: 14px;}
.font-12{ font-size: 12px;}
.text-center{ text-align: center;}
.text-left{ text-align: left;}
.text-right{ text-align: right;}
.text-overflow{ width:100%; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
/* img */
img{border: 0; vertical-align:middle}
.img-circle{ border-radius: 50%;}
.img-rounded{ border-radius: 5px;}
.img-thumbnail{ padding: 5px; border-radius: 5px;}
.img-responsive{ max-width: 100%;}
/* form */
input,textarea{outline: medium none; outline: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);}
input.form-control,input.btn{ outline:0px; -webkit-appearance: none;}
input[type="checkbox"]{ vertical-align: -2px;}
.form-control{display:block; width:100%; height:30px; padding: 10px; font-size:12px; line-height: 25px; border-radius:4px; transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;}
textarea.form-control{ height: auto;}
.input-list{ margin-bottom: 20px;}
.input-list li{ padding: 10px 20px;}
.input-list li input.form-control{ height: 40px;}
#form-filter .form-control{padding: 5px;}
/* line */
.split-line{display: inline-block; margin-left: 12px; margin-right: 12px; width: 1px; height: 14px; vertical-align: -2px;}
.top-line,.top-line-dot,.bottom-line,.bottom-line-dot{ position: relative;}
.top-line:before,.top-line-dot:before{content: " "; position: absolute; left: 0; top: 0; right: 0; width: 100%; height: 1px;}
.bottom-line:after,.bottom-line-dot:before{content: " "; position: absolute; left: 0; bottom: 0; right: 0; width: 100%; height: 1px;}
/* badge */
.badge{display: inline-block; margin-right: 10px; width: 18px; height: 18px; text-align: center; line-height: 18px; border-radius: 2px; font-size: 12px;}
.badge-radius{ border-radius: 50%;}
/* btn */
.btn{display: inline-block; padding: 6px 30px; font-size: 12px; border-radius: 4px;}
.btn .icon{ font-size: 12px;}
.btn-min{ padding: 4px 15px;}
.btn-lg{ padding: 12px 30px;}
.btn-block{ display: block; width: 100%; text-align: center;}
.btn.disabled{cursor: not-allowed;}
/* tag */
.tag{ padding-left: 10px;}
.tag li{ float: left;}
.tag-btn,.tag-type{ padding-top: 10px; padding-left: 10px;}
.tag-btn li ,.tag-type li{ padding:0 10px 10px 0;}
.tag-btn li a ,.tag-type li a{ display: block; padding:0 10px; height: 30px; line-height: 30px; text-align: center; font-size: 12px; border-radius: 2px;}
.tag-btn.active li a,.tag-type.active li a{ border-radius: 14px;}
.tag-text li{ padding-right: 10px; padding-bottom: 10px;}
/* nav */
.nav{ height: 30px;}
.nav > li{ float: left;}
.nav-head > li{ margin-top: 5px; margin-right: 30px;}
.nav-head > li > a{ padding-bottom: 12px; font-size: 16px;}
.nav-tabs > li{margin-left: 30px;}
.nav-tabs > li > a{display: inline-block; padding: 8px 0 10px;}
.nav-tag > li{ margin-left: 10px;}
.nav-tag > li > a{ display: inline-block; padding:0 10px; height: 25px; line-height: 23px; font-size: 12px; border-radius: 20px;}
.nav-text > li{line-height: 30px;}
.nav-text > li.active > a{ color: #f80;}
.nav-page{ margin-left: 10px;}
.nav-page > li{ margin-left: 5px;}
.nav-page > li > a{ display: inline-block; font-size: 12px; padding: 0 6px; height: 25px; line-height: 23px;}
.nav-page > li > a > .icon{ font-size: 12px;}
.nav-page > li:first-child{ margin-left: 0;}
.nav-page > li:first-child > a{ border-radius: 4px 0 0 4px;}
.nav-page > li:last-child > a{ border-radius: 0 4px 4px 0;}
/* pic-tag */
.pic-tag{ position: absolute; z-index: 99; padding:2px 5px; font-size: 12px; border-radius: 2px;}
.pic-tag-t{top: 5px; left: 5px;}
.pic-tag-l{bottom: 5px; left: 5px;}
.pic-tag-b{bottom: 5px; right: 5px;}
.pic-tag-r{top: 5px; right: 5px;}
.pic-tag-h{left: 0; top: 0; padding:2px 8px; border-radius: 0 0 8px 0;}
.pic-tag-lg{ padding: 4px 10px;}
.pic-text{display: block; width: 100%; position: absolute; bottom: 0; left: 0; padding:5px 10px; font-size: 12px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
.pic-text-silde{ padding-bottom: 20px; font-size: 14px;}
.pic-text-lg{ padding: 8px 20px; font-size: 14px;}
.pic-title-t{display: block; width: 100%; position: absolute; top: 0; left: 0; padding:5px 10px 10px; font-size: 12px; word-break:break-all; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;}
.pic-title-b{display: block; width: 100%; position: absolute; bottom: 0; left: 0; padding:5px 10px; font-size: 12px; word-break:break-all; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;}
/* pannel */
.stui-pannel{position: relative; margin-bottom: 20px;}
.stui-pannel.stui-pannel-x{ margin: -10px -10px 10px;}
.stui-pannel-bg{border-radius: 2px;}
.stui-pannel-side{ padding: 0 0 0 20px;}
.stui-pannel-box{ padding: 10px;}
.stui-pannel-box.active{ padding: 0; margin: -10px;}
.stui-pannel_hd{ padding: 10px;}
.stui-pannel_ft{ margin-top: 10px; padding: 10px 10px 0; text-align: center;}
/* pannel-head */
.stui-pannel__head{ position: relative; height: 30px;}
.stui-pannel__head.active{height: 40px;}
.stui-pannel__head .title{float: left; margin:0; padding-right: 10px; line-height: 24px;}
.stui-pannel__head .title img{ display: inline-block; width: 24px; height: 24px; margin-right: 10px; vertical-align: -5px;}
.stui-pannel__head .more{ line-height: 30px;}
/* tabbar */
.stui_nav__taddar .item{ display: block; text-align: center;}
.stui_nav__taddar .item .icon{ display: block; text-align: center; font-size: 20px; line-height: 20px;}
.stui_nav__taddar .item .icon-img{display: inline-block; width: 24px; height: 24px;}
.stui_nav__taddar .item .title{ display: block; margin-top: 3px; font-size: 12px;;}
.stui_nav__taddar.fixed{ position: fixed; bottom: 0; width: 100%; padding: 5px 0 0;}
/* vod-list */
.stui-vodlist__thumb{display: block; position: relative; padding-top: 150%; background: url(/themes/xingkong/img/load.gif) no-repeat; background-position: 50% 50%; background-size: cover;}
.stui-vodlist__thumb.square{ padding-top: 100%; background: url(/themes/xingkong/img/load_f.gif) no-repeat; background-position: 50% 50%; background-size: cover;}
.stui-vodlist__thumb.active{ padding-top: 60%; background: url(/themes/xingkong/img/load_w.gif) no-repeat; background-position: 50% 50%; background-size: cover;}
.stui-vodlist__thumb.picture {background: none; overflow: hidden;}
.stui-vodlist__thumb.picture img{position: absolute; top: 0; left: 0; width: 100%; height: 100%;}
.stui-vodlist__thumb .play{display: none; position: absolute; top: 0; z-index: 1; width: 100%; height: 100%; background: rgba(0,0,0,0.1) url(/themes/xingkong/img/play.png) center no-repeat;}
.stui-vodlist__thumb .play.active{ display: block;}
.stui-vodlist__thumb:hover .play{ display: block;}
.stui-vodlist__detail.active{ padding: 0 10px 10px;}
.stui-vodlist__detail .title{ font-size: 14px; margin-bottom: 0;}
.stui-vodlist__detail .title.active{ font-size: 16px; margin-bottom: 10px;}
.stui-vodlist__detail .text{ min-height: 19px; font-size: 12px; margin-bottom: 0; margin-top: 5px;}
.stui-vodlist__detail .text-title{ font-size: 14px; line-height: 18px; margin:11px 0 0; height: 36px; overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-box-orient:vertical; -webkit-line-clamp:2;}
/* text-list */
.stui-vodlist__text li a{ display: block; padding: 10px 15px 10px 0;}
.stui-vodlist__text.active li a{ padding: 10px 0 10px;}
.stui-vodlist__text.active li:first-child a{ padding-top: 0;}
.stui-vodlist__text.striped li{ padding: 10px 0 10px;}
.stui-vodlist__text.striped li a{ display: inline-block; padding: 0;}
.stui-vodlist__text.striped .striped-head{ padding: 10px; border-radius: 5px;}
.stui-vodlist__text.to-color li{ padding: 10px; border-radius: 5px;}
.stui-vodlist__text.to-color li a{ padding: 0;}
.stui-vodlist__text.downlist{ padding-top: 0;}
.stui-vodlist__text.downlist li{ padding: 10px 0;}
.stui-vodlist__text.downlist li .text{ line-height: 30px; overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
.stui-vodlist__text.downlist li a{ display: inline-block; padding: 0;}
.stui-vodlist__text.downlist li a.btn{ padding: 4px 12px; margin-left: 10px;}
/* media-list */
.stui-vodlist__media li { padding: 10px 0 10px;}
.stui-vodlist__media.active li:first-child{ padding-top: 0;}
.stui-vodlist__media.active li:last-child{ padding-bottom: 0;}
.stui-vodlist__media li .thumb,.stui-vodlist__media .detail{display: table-cell; vertical-align: top;}
.stui-vodlist__media li .thumb .w-thumb{ width: 190px;}
.stui-vodlist__media li .thumb .v-thumb{ width: 120px;}
.stui-vodlist__media li .thumb .f-thumb{ width: 120px;}
.stui-vodlist__media li .thumb .m-thumb{ width: 65px;}
.stui-vodlist__media li .detail{ width: 100%; padding:0 20px 0;}
.stui-vodlist__media li .detail-side{ padding:0 10px 0;}
.stui-vodlist__media li .detail-left{ padding: 0 20px 0 0;}
.stui-vodlist__media li .detail .title{ margin: 10px 0 10px;}
/* screen-list */
.stui-vodlist__screen { padding:10px 0 5px;}
.stui-vodlist__screen:first-child{ padding-top: 0;}
.stui-vodlist__screen:last-child{ padding-bottom: 0;}
.stui-vodlist__screen li{ float: left; width: 25%; margin-bottom: 5px;}
/* rank-list */
.stui-vodlist__rank li{ margin-bottom: 10px;}
.stui-vodlist__rank li:last-child{ margin-bottom: 0;}
/* link-list */
.stui-link__text li{ float: left; margin-right: 15px; margin-bottom: 10px;}
.stui-link__pic li a{ display: block; padding:10px 20px; border-radius: 4px;}
.stui-link__pic li a img{ max-width: 100%;}
/* play-list */
.stui-content__playlist{ position: relative;}
.stui-content__playlist.overflow{ max-height: 300px; overflow-y: scroll;}
.stui-content__playlist li{float:left; margin-bottom:10px; margin-right:10px}
.stui-content__playlist li a{display:inline-block; padding:5px 20px;border-radius:5px}
.stui-content__playlist.full li{ float: none; width: 100%; margin-right: 0;}
.stui-content__playlist.column3 li{ width: 33.3333333%; padding: 0 5px; margin-right: 0;}
.stui-content__playlist.column6 li{ width: 16.6666667%; padding: 0 5px; margin-right: 0;}
.stui-content__playlist.column8 li{ width: 12.5%; padding: 0 5px; margin-right: 0;}
.stui-content__playlist.column8 li.more,.stui-content__playlist.column10 li.narrow{ width: 15%;}
.stui-content__playlist.column10 li{ width: 10%; padding: 0 5px; margin-right: 0;}
.stui-content__playlist.column10 li.more,.stui-content__playlist.column10 li.narrow{ width: 20%;}
.stui-content__playlist.column12 li{ width: 8.33333333%; padding: 0 5px; margin-right: 0;}
.stui-content__playlist.column12 li.more,.stui-content__playlist.column12 li.narrow{ width: 16.6666667%;}
.stui-content__playlist.column3,.stui-content__playlist.column6,.stui-content__playlist.column8,.stui-content__playlist.column10,.stui-content__playlist.column12{ margin: 0 -5px;}
.stui-content__playlist.column3 li a,.stui-content__playlist.column6 li a,.stui-content__playlist.column8 li a,.stui-content__playlist.column10 li a,.stui-content__playlist.column12 li a{ padding: 5px;}
.stui-content__playlist.full li a,.stui-content__playlist.column3 li a,.stui-content__playlist.column6 li a,.stui-content__playlist.column8 li a,.stui-content__playlist.column10 li a,.stui-content__playlist.column12 li a{ display: block; text-align: center;overflow:hidden; text-overflow:ellipsis; -o-text-overflow:ellipsis; white-space:nowrap;}
/* screen */
.stui-screen__list{position:relative;padding:10px 0 0;}
.stui-screen__list li{float:left;margin-right:10px;margin-bottom:10px}
.stui-screen__list li span{display:inline-block;padding:3px 0 3px}
.stui-screen__list li a{display:inline-block;padding:3px 10px;border-radius:2px}
.stui-screen__list.letter-list li{ margin: 0;}
.stui-screen__list.letter-list li:first-child{ margin-right: 10px;}
.stui-screen__list.letter-list li.active a{padding:3px 10px}
/* page */
.stui-page{margin-bottom:30px;display: flex;justify-content: center;justify-items: center;}.stui-page li{display:inline-block;margin-left:10px}
.stui-page li .num,.stui-page li a{display:inline-block;padding:5px 15px;border-radius:5px}
.stui-page-text{ padding:0 20px 20px;}
.stui-page-text a,.stui-page-text em,.stui-page-text span{font-style:normal;display:inline-block;margin:0;padding:6px 12px;border-radius:2px;cursor:pointer}
.stui-page-text .pagego{ padding: 6px; margin-right: 5px;border-radius: 5;}
.stui-page-text .pagebtn{ padding: 6px 12px; cursor: pointer;}
/* extra */
.stui-extra{position:fixed;right:50px;bottom:50px}
.stui-extra li{position:relative;padding:15px 10px 0}
.stui-extra li a,.stui-extra li span{display:block;width:50px;height:50px;line-height:50px;text-align:center;border-radius:4px;font-size:18px;cursor:pointer}
.stui-extra li a .icon,.stui-extra li span .icon{font-size:18px}
.stui-extra li a img{margin-top:15px;width:20px;height:20px}
.stui-extra li .sideslip{display:none;position:absolute;bottom:0;right:100%;width: 160px;}
.stui-extra li .sideslip:before{content:" ";width:10px;height:10px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);border-width:0 1px 1px 0;position:absolute;bottom:20px;right:-6px;border-style:solid}
.stui-extra li:hover .sideslip{display:block}
/* flickity */
.flickity-enabled{position:relative;}
.flickity-enabled:focus{outline:0}
.flickity-viewport{overflow:hidden;position:relative;height:100%}
.flickity-slider{position:absolute;width:100%;height:100%}
.flickity-viewport.is-pointer-down{cursor:-webkit-grabbing;cursor:grabbing}
.flickity-prev-next-button{position:absolute;top:50%;width:30px;height:60px;border:none; background-color: rgba(0,0,0,.6); cursor:pointer;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}
.flickity-prev-next-button.previous{left:10px;border-radius:0 10px 10px 0}
.flickity-prev-next-button.next{right:10px;border-radius:10px 0 0 10px}
.flickity-prev-next-button:disabled{opacity:0;cursor:auto}
.flickity-prev-next-button svg{position:absolute;left:20%;top:20%;width:60%;height:60%}
.flickity-prev-next-button .arrow{fill:#fff}
.flickity-prev-next-button.no-svg{color:#fff;font-size:18px}
.flickity-page-dots{position:absolute;width:100%;bottom:20px;left:0;padding:0;margin:0;list-style:none;text-align:center;line-height:1}
.flickity-page-dots .dot{display:inline-block;width:15px;height:3px;margin:0 5px;background:#f80;opacity:.25;cursor:pointer}
.flickity-page-dots .dot.is-selected{opacity:1}
.flickity-page{ padding-bottom: 15px; overflow: hidden;}
.flickity-page .flickity-page-dots{ bottom: 5px;}
/* carousel */
.carousel{ position: relative; width: 100%; height:100%; overflow: hidden; white-space: nowrap;}
.carousel [class^="col-"]{ float: none; display: inline-block;}
.carousel .list{ padding: 0; margin-right: 20px;}
.carousel .wide{ width: 100%; display: inline-block;}
.carousel_center{ padding-bottom: 20px;}
.carousel_center .list a{ position: relative;}
.carousel_center .list a:before{ content: ""; position: absolute; z-index: 1; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0,0,0,.6);}
.carousel_center .list.is-selected a:before{ display: none;}
/* popup */
.popup{position: fixed; right: -100%; top: 0; z-index: 1001; width: 100%; height: 100%; overflow-y: scroll; -webkit-overflow-scrolling: touch; -webkit-transition:.5s; -o-transition:.5s; -moz-transition:.5s; -ms-transition:.5s; transition:.5s;}
.popup-visible{ right: 0;}
.popup-head { padding: 15px 10px; margin-bottom: 10px;}
.popup-head .title{ display: inline-block; margin: 0;}
.popup-head .icon{ font-size: 20px;}
/* embed */
.embed-responsive{position:relative;display:block;overflow:hidden;padding:0;height:0}
.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}
.embed-responsive-16by9{padding-bottom:56.25%}
.embed-responsive-4by3{padding-bottom:75%}
/* bootstrap.js */
.fade{opacity: 0;-webkit-transition: opacity .15s linear;-o-transition: opacity .15s linear;transition: opacity .15s linear;}
.fade.in{opacity: 1;}
.tab-content>.tab-pane,.carousel-inner>.item{ display: none;}
.tab-content>.tab-pane.active,.carousel-inner>.item.active{ display: block;}
.dropdown{ position: relative;}
.dropdown-menu{display: none; position:absolute; top:100%; left:-80%; z-index:1000; padding: 10px 0; border-radius: 2px;}
.dropdown-menu:before{ content:" "; width:10px; height:10px; -webkit-transform:rotate(-45deg); -ms-transform:rotate(-45deg); transform:rotate(-45deg); border-width:1px 1px 0 0; position: absolute; top:-6px; right: 20px; border-style: solid;}
.dropdown-menu>li>a{display: block; padding: 6px 20px; text-align: center;}
.open>.dropdown-menu {display: block;}
.carousel-side{ position: absolute; z-index: 99; top: 0; bottom: 0; display: block; width: 100px; height: 100%;}
.carousel-side .icon{ position: absolute; top: 50%; margin-top: -25px; display: block; width: 50px; height: 50px; text-align: center; font-size: 30px; line-height: 50px; background-color: rgba(0,0,0,0.6); color: #fff; border-radius: 50%;}
.carousel-side.left{ left: 0;}
.carousel-side.left .icon{ left: 30px;}
.carousel-side.right{ right: 0; }
.carousel-side.right .icon{ right: 30px;}
.carousel-bootom{ position: absolute; width: 100%; bottom: 20px; left: 0; text-align: center;}
.carousel-bootom li{ display: inline-block; margin: 0 5px; width:15px; height:3px; background: #f80; opacity:.25; cursor:pointer}
.carousel-bootom li.active{ opacity:1;}
/* modal */
.stui-modal{position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 9999; display: none; overflow: hidden; -webkit-overflow-scrolling: touch; outline: 0;}
.stui-modal__dialog{position: relative; width: 350px; margin: 140px auto; }
.stui-modal__content{ position: relative; background-color: #fff; border-radius: 6px; outline: 0; box-shadow: 0 3px 9px rgba(0,0,0,.5);}
.modal-open{ overflow: hidden;}
.modal-backdrop{position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000;}
.modal-backdrop.fade{ opacity: 0;}
.modal-backdrop.fade.in{ opacity: .5;}
/* mobile-share */
.mobile-share{ position: fixed; z-index: 999; top: 0; bottom: 0; left: 0; width: 100%; height: 100%; animation: fade-in; animation-duration: .5s; -webkit-animation:fade-in .5s;}
.share-weixin{ background: url(../img/share_weixin.png) rgba(0, 0, 0, .8) no-repeat; background-position: right top 10px; background-size: 80%;}
.share-other{ background: url(../img/share_other.png) rgba(0, 0, 0, .8) no-repeat; background-position: center bottom 10px; background-size: 80%;}
/* more */
.relative{ position: relative;}
.top-fixed-up{ margin-top: 0 !important;}
.top-fixed{ -webkit-transition:.5s; -o-transition:.5s; -moz-transition:.5s; -ms-transition:.5s; transition:.5s;}
.pull-left{ float: left !important;}
.pull-right{ float: right !important;}
.margin-0{ margin: 0 !important;}
.padding-0{ padding: 0 !important;}
.margin-t0{ margin: 0 !important;}
.padding-t0{ padding: 0 !important;}
.margin-b0{ margin: 0 !important;}
.padding-b0{ padding: 0 !important;}
.block{ display: block !important;}
.inline-block{ display: inline-block !important;}
.hide,.visible-lg, .visible-md, .visible-sm, .visible-xs, .visible-mi{ display: none !important;}
.mask{ position: fixed; top: 0; left: 0; bottom: 0; z-index: 999; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.2); animation: fade-in; animation-duration: .5s; -webkit-animation:fade-in .5s;}
@keyframes fade-in {0% {opacity: 0;}40% {opacity: 0;}100% {opacity: 1;}}
@-webkit-keyframes fade-in { 0% {opacity: 0;} 40% {opacity: 0;}100% {opacity: 1;}}
@media (min-width: 1200px){
.visible-lg { display: block !important;}
.hidden-lg {display: none !important;}
}
@media (max-width: 1199px) and (min-width: 992px){
.visible-md { display: block !important;}
.hidden-md {display: none!important;}
}
@media (max-width: 991px) and (min-width: 768px){
.visible-sm{ display: block !important;}
.hidden-sm {display: none !important;}
}
@media (max-width: 991px){
.stui-pannel-side{ padding: 0;}
/* screen */
.stui-screen__list{ height: 40px; padding:10px 0 10px; overflow:hidden; white-space: nowrap;}
.stui-screen__list:last-child{ padding: 10px 0 0;}
.stui-screen__list li{ float: none; display: inline-block; margin-right:10px; margin-bottom:0}
.stui-screen__list li span{padding:2px 5px 2px 0}
.stui-screen__list li a{padding:2px 5px 2px; white-space:nowrap}
.stui-screen__list.letter-list li{ margin-right: 5px; margin-bottom: 0;}
.stui-screen__list.letter-list li a,.stui-screen__list.letter-list li.active a{padding:2px 5px 2px}
/* vod-list */
.stui-vodlist__detail .title.active{ font-size: 14px; margin-bottom: 0;}
/* media-list */
.stui-vodlist__media li .thumb .v-thumb{ width: 110px;}
.stui-vodlist__media li .thumb .w-thumb{ width: 130px;}
.stui-vodlist__media li .thumb .f-thumb{ width: 70px;}
/* play-list */
.stui-content__playlist{ -webkit-overflow-scrolling : touch;}
.stui-content__playlist.column3 li{ width: 50%;}
.stui-content__playlist.column6 li{ width: 25%;}
.stui-content__playlist.column8 li{ width: 20%;}
.stui-content__playlist.column10 li{ width: 16.6666667%;}
/* modal */
.stui-modal__dialog{ width: 320px; margin: 50px auto;}
@media (max-width: 767px){
.visible-xs { display: block !important;}
.hidden-xs {display: none!important;}
/* all */
body{ font-size: 12px;}
/* text */
h1{ font-size:20px; line-height: 24px;}
h2{ font-size:18px; line-height: 22px;}
h3{ font-size:16px; line-height: 20px;}
h4{ font-size:14px; line-height: 18px;}
h5{ font-size:12px; line-height: 16px;}
h6{ font-size:10px; line-height: 14px;}
/* btn */
.btn{padding: 6px 20px;}
.btn-min{ padding: 3px 8px;}
.btn-lg{ padding: 12px 24px;}
/*nav*/
.nav{ height: 20px;}
.nav-head > li{ margin-top: 2px; margin-right: 20px;}
.nav-head > li > a{ padding-bottom: 10px; font-size: 14px;}
.nav-tabs > li{ margin-left: 20px;}
.nav-tabs > li > a{padding: 6px 0 6px;}
.nav-page > li > a{ padding: 0 3px; height: 20px; line-height: 18px;}
/* pic-text */
.pic-text-silde{ font-size: 12px;}
/* line */
.split-line{ height: 12px; margin-left: 5px; margin-right: 5px;}
.top-line:before,.top-line-dot:before{-webkit-transform-origin: 0 0;transform-origin: 0 0;-webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
.bottom-line:after,.bottom-line-dot:before{ -webkit-transform-origin: 0 100%;transform-origin: 0 100%; -webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
.m-top-line,.m-top-line-dot,.m-bottom-line,.m-bottom-line-dot{ position: relative;}
.m-top-line:before,.m-top-line-dot:before{content: " "; position: absolute; left: 0; top: 0; right: 0; width: 100%; height: 1px; -webkit-transform-origin: 0 0;transform-origin: 0 0;-webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
.m-bottom-line:after,.m-bottom-line-dot:before{content: " "; position: absolute; left: 0; bottom: 0; right: 0; width: 100%; height: 1px; -webkit-transform-origin: 0 100%;transform-origin: 0 100%; -webkit-transform: scaleY(0.5);transform: scaleY(0.5);}
/* pannel */
.stui-pannel{ margin-bottom: 10px;}
.stui-pannel.stui-pannel-x{ margin: 0 0 5px;}
.stui-pannel-bg{border-radius: 0;}
.stui-pannel-box{ padding:10px 5px;}
.stui-pannel-box.active{ margin:5px;}
.stui-pannel_hd{ padding:0 5px 10px;}
/* pannel-head */
.stui-pannel__head{ height: 20px;}
.stui-pannel__head.active{height: 30px;}
.stui-pannel__head .title,.stui-pannel__head .title a{font-size: 16px;}
.stui-pannel__head .title img{ width: 18px; height: 18px; margin-right: 5px; vertical-align: -3px;}
.stui-pannel__head .more{ line-height: 20px;}
/* vod-list */
.stui-vodlist__thumb .tag{ padding: 0 5px;}
.stui-vodlist__thumb .silde-title{ font-size: 12px;}
.stui-vodlist__detail .title,.stui-vodlist__detail .title.active{margin-bottom: 0; font-size: 12px;}
/* media-list */
.stui-vodlist__media li .thumb .v-thumb{ width: 100px;}
.stui-vodlist__media li .thumb .w-thumb{ width: 130px;}
.stui-vodlist__media li .thumb .f-thumb{ width: 70px;}
.stui-vodlist__media li .detail{ padding: 0 10px;}
.stui-vodlist__media li .detail.active{ padding-left: 0; padding-right: 10px;}
/* text-list */
.stui-vodlist__text li a{ padding:10px 0;}
.stui-vodlist__text.downlist li{ padding: 5px 0 0;}
/* play-list */
.stui-content__playlist li a{padding:5px 10px;font-size:12px}
.stui-content__playlist.column3 li{ float: none; width: 100%;}
.stui-content__playlist.column6 li,.stui-content__playlist.column8 li,.stui-content__playlist.column10 li,.stui-content__playlist.column12 li{ width: 25%;}
/* page */
.stui-page li{float:left;width:20%;margin:0;padding:0 5px 0 5px}
.stui-page li a,.stui-page__box li .num{display:block;padding:5px 0;text-align:center}
.stui-page li.page-item{ width: auto; margin-bottom: 5px;}
.stui-page li.page-item a{ padding: 5px 15px;}
/* extra */
.stui-extra{right:15px;bottom:15px}
.stui-extra li{padding:8px 0 0}
.stui-extra li a,.stui-extra li span{width:35px;height:35px;line-height:35px;font-size:16px}
.stui-extra li a .icon,.stui-extra li span .icon{font-size:16px}
.stui-extra li a img{margin-top:8px;width:18px;height:18px}
/* carousel */
.carousel .list{ margin-right: 10px;}
/* flickity */
.flickity-prev-next-button{display: none;}
.flickity-prev-next-button.previous{left:5px;border-radius:0 5px 5px 0}
.flickity-prev-next-button.next{right:5px;border-radius:5px 0 0 5px}
.flickity-page-dots{ bottom: 15px;}
/* modal */
.stui-modal__dialog{ width: 100%; margin: 0; padding: 50px 20px;}
.carousel-control{ width: 50px; height: 100%;}
.carousel-control .icon{ margin-top: -15px; width: 30px; height: 30px; font-size: 20px; line-height: 30px;}
.carousel-control.left .icon{ left: 10px;}
.carousel-control.right .icon{ right: 10px;}
}
@media (max-width: 374px){
.visible-mi{ display: block !important;}
.hidden-mi{display: none !important;}
/* media-list */
.stui-vodlist__media li .thumb .v-thumb{ width: 90px;}
.stui-vodlist__media li .thumb .w-thumb{ width: 100px;}
.stui-vodlist__media li .thumb .f-thumb{ width: 50px;}
}

View File

@ -0,0 +1,183 @@
/*!
* Edition v3.0 Copyright 2016-2018 http://v.shoutu.cn
* Email 726662013@qq.com,admin@shoutu.cn
*/
@charset "utf-8";
/* all */
body{ background: url(/themes/xingkong/img/bg_icon.jpg); color: #666;}
/* text */
a,h1, h2, h3, h4, h5, h6{ color: #333333;}
a:hover{ color: #FF9900;}
.text-red{ color: red;}
.text-muted{ color: #999999;}
/* form */
.form-control{ background-color: #F5F5F5; color: #999999; border: 1px solid #EEEEEE;}
.form-control.colorfff{ background-color: #FFFFFF;}
.form-control:focus{border-color:#FF9900; -webkit-box-shadow:inset 0 1px 1px rgba(255,136,0,.075),0 0 8px rgba(255,136,0,.6);}
/* btn */
.btn,.btn:hover,.btn .icon{ color: #333333;}
.btn{ border: 1px solid #EEEEEE;}
.btn-default{ background-color: #f5f5f5; color: #333333;}
.btn-default:hover{ background-color: #f0eeee;}
.btn-primary{ background-color: #FF9900; border: 1px solid #FF9900; color: #FFFFFF;}
.btn-primary .icon{ color: #FFFFFF;}
.btn-primary:hover{ background-color: #FF6600; border: 1px solid #FF6600; color: #FFFFFF;}
.btn-primary:hover .icon{ color: #FFFFFF;}
/* dropdown */
.dropdown-menu{ background-color: #FFFFFF; border: 1px solid #EEEEEE;}
.dropdown-menu:before{background-color: #FFFFFF; border-color: #EEEEEE;}
.dropdown-menu>.active>a, .dropdown-menu>.active>a:focus, .dropdown-menu>.active>a:hover{ background-color: #FF9900; color: #FFFFFF;}
/* line */
.split-line{ background-color: #EEEEEE;}
.top-line:before{ border-top: 1px solid #EEEEEE;}
.bottom-line:after{ border-bottom: 1px solid #EEEEEE;}
.top-line-dot:before{ border-top: 1px dotted #EEEEEE;}
.bottom-line-dot:before{ border-bottom: 1px dotted #EEEEEE;}
/* badge */
.badge{ background-color: #EEEEEE;}
.badge-first{ background-color: #FF4A4A; color: #FFFFFF;}
.badge-second{ background-color: #FF7701; color: #FFFFFF;}
.badge-third{ background-color: #FFB400; color: #FFFFFF;}
/* nav */
.nav-head > li.active > a,.nav-tabs > li.active > a{ border-bottom: 2px solid #FF9900; color: #FF9900;}
.nav-tag > li > a,.nav-page > li > a{ background-color: #FFFFFF; border: 1px solid #EEEEEE; color: #333333;}
.nav-tag > li > a:hover,.nav-tag > li.active a,.nav-page > li > a:hover,.nav-page > li.active > a{ background-color: #FF9900; border: 1px solid #FF9900; color: #FFFFFF;}
.nav-page > li > a:hover > .icon{ color: #fff;}
/* tag */
.tag-type li a{ background-color: #FFFFFF; border: 1px solid #EEEEEE; color: #666666;}
.tag-type li a:hover,.tag-type li.active a{ background-color: #FF9900; border: 1px solid #FF9900; color: #FFFFFF;}
.tag-btn li a{ background-color: #F8F8F8; color: #666666;}
.tag-btn li a.active,.tag-text li a.active,.tag-type li a.active{ color: #FF9900;}
.tag-btn li a:hover,.tag li.active a{ background-color: #FF9900; color: #FFFFFF;}
/* pic-tag */
.pic-tag{ background-color: rgba(0,0,0,0.6); color: #FFFFFF;}
.pic-tag.active,.pic-tag-h{ background-color: #FF9900; color: #FFFFFF;}
.pic-text,.pic-title-b{ background-repeat: no-repeat; background-image: linear-gradient(transparent,rgba(0,0,0,.5)); color: #FFFFFF;}
.pic-text.active{ background: rgba(0,0,0,0.6); color: #FFFFFF;}
.pic-title-t{background: linear-gradient(to bottom, rgba(0,0,0,0.7) 0%,rgba(0,0,0,0) 100%); color: #FFFFFF;}
/* pannel */
.stui-pannel-bg{background-color: #FFFFFF; border: 1px solid #EEEEEE;}
/* tabbar */
.stui_nav__taddar .item .icon,.stui_nav__taddar .item .title{ color: #999;}
.stui_nav__taddar .item.active .title,.stui_nav__taddar .item.active .icon{color: #FF9900;}
.stui_nav__taddar.fixed{ background-color: #FFFFFF;}
/* vodlist */
.stui-vodlist__bg{background-color: #FFFFFF; box-shadow: 0 1px 2px rgba(0,0,0,.05);}
.stui-vodlist__bg:hover{ box-shadow: 0 3px 5px rgba(0,0,0,.08);}
/* text-list */
.stui-vodlist__text.striped .striped-head,.stui-vodlist__text.to-color li:nth-of-type(odd){ background-color: #f5f5f5;}
/* link */
.stui-link__pic li a{ background-color: #FFFFFF; border: 1px solid #F5F5F5;}
.stui-link__pic li a:hover{ border: 1px solid #FF9900;}
/* screen */
.stui-screen__list li a{ color: #333333;}
.stui-screen__list li.active a{ background-color: #FF9900; color: #FFFFFF;}
/* playlist */
.stui-content__playlist li a{ border: 1px solid #EEEEEE;}
.stui-content__playlist li a:hover,.stui-content__playlist li.active a{ border: 1px solid #FF9900; background-color: #FF9900; color: #FFFFFF;}
/* player */
.stui-player__video{ background-color: #000000;}
/* page */
.stui-page li a,.stui-page li .num,.stui-page-text a,.stui-page-text em,.stui-page-text span{background-color: #FFFFFF; border: 1px solid #EEEEEE;}
.stui-page li a:hover,.stui-page li.active a,.stui-page li.active .num,.stui-page li.disabled a,.stui-page-text span.pagenow{ background-color: #FF9900; color: #FFFFFF; border: 1px solid #FF9900;}
.stui-page-text .pagego{ border: 1px solid #EEEEEE;}
.stui-page-text .pagebtn{background-color: #FFFFFF; border: 1px solid #EEEEEE;}
/* extra */
.stui-extra li a,.stui-extra li span{ background-color: #FFFFFF; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);}
.stui-extra li a.backtop{ background-color: rgba(0,0,0,0.6); color: #FFFFFF; }
.stui-extra li .sideslip{ background-color: #FFFFFF; box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);}
.stui-extra li .sideslip:before{ background-color: #FFFFFF; border-color: rgba(0, 0, 0, 0.1);}
/* popup */
.popup{ background-color: #F8F8F8;}
.popup-head{ background-color: #FFFFFF;}
.maskkkk {
position: fixed;
bottom: 0;
left:0px;
width: 100%;
height: 128px;
z-index: 1001;
}
.closeee{
background: url("images/closesanjiao.png") no-repeat center center;
}
.maskkkk .gotoCenter {
display: block;
width: 100%;
height: 140px;
margin: 0 auto;
}
.maskkkk .closeee {
position: absolute;
top: 0;
left: 20px;
margin-left: 0px;
width: 40px;
height: 100%;
cursor: pointer;
}
.clickarea{
position: absolute;
top: 0;
left: 200px;
margin-left: 0px;
width: 100%;
height: 100%;
cursor: pointer;
}
.thumbnail {
position: fixed;
right: 0px;
bottom: 0px;
width: 184px;
height: 124px;
cursor: pointer;
/*display: none;*/
}
.fd_gb
{ width:20px; height:20px; margin:10px 0 0 0; position:absolute; right:0; top:0;}
@-webkit-keyframes rotate {
from {-webkit-transform:rotate(0deg);}
to {-webkit-transform:rotate(360deg);}
}
@media (max-width: 767px){
/* form */
.form-control{ background-color:#F8F8F8; color: #999999; border: 0;}
/*pannel*/
.stui-pannel-bg,.stui-vodlist__bg,.stui-vodlist__bg:hover{box-shadow: none;border: 0;}
/* line */
.m-top-line:before{ border-top: 1px solid #EEEEEE;}
.m-bottom-line:after{ border-bottom: 1px solid #EEEEEE;}
.m-top-line-dot:before{ border-top: 1px dotted #EEEEEE;}
.m-bottom-line-dot:before{ border-bottom: 1px dotted #EEEEEE;}
}

View File

@ -0,0 +1,170 @@
@charset "utf-8";
/* header */
.stui-header__top{position: relative; margin-bottom: 20px; background-color: #fff;}
/* header-logo */
.stui-header__logo{float:left;}
.stui-header__logo{margin: 20px 0;}
/* header-menu */
.stui-header__menu{position:relative; background-color: #333; color: #fff;}
.stui-header__menu li{float:left;}
.stui-header__menu li a{display:inline-block; padding: 15px 25px; font-size:15px; color: #fff;}
.stui-header__menu li.active a, .stui-header__menu li:hover{ background-color: #222;}
.stui-header__menu .more{ position: absolute; top: 0; right: 0; padding: 15px 0; color: #999;}
.stui-header__menu .submenu {
display: none;
position: absolute;
top: 100%;
left: -100%;
background-color: #222;
z-index: 10;
width: 50vw;
}
.stui-header__menu .submenu li {
width: 20%;
padding: 2px;
}
.stui-header__menu .submenu li a{
padding: 4px 6px !important;
}
.stui-header__menu li.dropdown:hover .submenu{
display: block;
}
/* header-seacrh */
.stui-header__search{ float:left; position:relative; width: 380px; margin: 25px 30px 25px 50px; }
.stui-header__search .form-control{display:block; width:100%; height: 38px; padding: 0 45px 0 10px; font-size:12px; line-height: 25px; border-radius: 5px; transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s; background-color:#f5f5f5; color: #999; border: 0;}
.stui-header__search .submit{display:block; position:absolute; top: 0; right: 0; width:35px; height: 38px; border: 0; cursor: pointer; border: 0; background: none; color: #999;}
/* header-user */
.stui-header__user{float:right}
.stui-header__user > li{ float:left; position: relative; padding: 35px 0 10px; margin-left: 30px}
.stui-header__user > li .icon{ font-size: 24px; line-height: 24px; vertical-align: -2px; color: #999;}
.stui-header__user > li .dropdown{ display: none; position: absolute; z-index: 999; width: 240px; top: 100%; right: -15px; padding: 15px; font-size: 12px; color: #999; background-color: #fff; box-shadow: 0 2px 8px rgba(0,0,0,.2); border-radius: 4px; background-color: #fff; box-shadow: 0 2px 8px rgba(0,0,0,.2);}
.stui-header__user > li .dropdown:before{ content:" "; width:10px; height:10px; -webkit-transform:rotate(-45deg); -ms-transform:rotate(-45deg); transform:rotate(-45deg); position: absolute; top:-5px; right: 30px; background-color: #fff; border-top: 1px solid #eee; border-right: 1px solid #eee;}
.stui-header__user > li:hover .dropdown{ display: block;}
.stui-header__user .dropdown li{ position: relative; padding: 10px 0;}
.stui-header__user .dropdown li:first-child{ margin-top: 10px;}
.stui-header__user .dropdown li:last-child{ padding-bottom: 0;}
/* media */
.stui-vodlist__media li .score{ position: relative;}
.stui-vodlist__media li .score .star{zoom: 50%; display: inline-block; position: relative; top: 5px; width: 160px; height: 25px; background: url(/themes/xingkong/img/star1.png) 0 0 no-repeat;}
.stui-vodlist__media li .score .branch{ display: inline-block; font-size: 12px; color: red;}
.stui-vodlist__media li .score .star .star-cur{display: inline-block; background: url(/themes/xingkong/img/star.png) 0 0 no-repeat; height: 25px; position: absolute; top: 0; z-index: 1;}
/* content */
.stui-content__detail,.stui-content__thumb{display:table-cell;vertical-align:top}
.stui-content__thumb .v-thumb{width:190px}
.stui-content__thumb .w-thumb{width:300px}
.stui-content__detail{width:100%;padding:10px 20px;}
.stui-content__detail .title{margin: 0 0 10px; font-size: 24px; line-height:30px; font-weight: 700;}
.stui-content__detail .data{margin-bottom:10px}
.stui-content__detail .data li{float:left;margin-right:20px}
.stui-content__detail .desc{padding-left:42px}
.stui-content__detail .desc .left{margin-left:-42px}
/* .stui-content__detail .play-btn{padding-left:65px;margin-top:20px} */
.stui-content__detail .play-btn .share{margin-top:5px}
.stui-content__detail .play-btn .btn{ margin-right: 10px;}
.stui-content h2 {font-size: 14px;line-height: 14px;}
/* player */
.stui-player__video{ background-color: #000}
.stui-player__detail{ margin-top: 20px;}
.stui-player__detail .more-btn{ float: right; padding-top: 10px;}
.stui-player__detail .more-btn li{ display: inline-block; margin-left: 10px;}
.stui-player__detail .more-btn .btn{ padding: 6px 15px;}
.stui-player__detail .title{margin:0 0 10px}
.stui-player__detail .detail-content{padding-top:10px}
.stui-player__detail .desc{padding-left:42px}
.stui-player__detail .desc .left{margin-left:-42px}
/* autocomplete */
.autocomplete-suggestions{ padding: 0 10px; margin-top: 5px; border-radius:4px; background-color: #FFFFFF; box-shadow: 0 2px 10px rgba(0,0,0,.05);}
.autocomplete-suggestions.active{position: absolute; z-index: 9999; top: 100%; width: 100%;}
.autocomplete-suggestion{padding:10px 0; cursor:pointer; border-top: 1px solid #EEEEEE;}
.autocomplete-suggestion:first-child{border-top:0}
.mac_results{ z-index: 9999; padding: 0 10px; margin-top: 5px; border-radius:4px; background-color: #FFFFFF; border:1px solid #EEEEEE; box-shadow: 0 2px 10px rgba(0,0,0,.05);}
.mac_results li{padding:10px 0; cursor:pointer; border-top: 1px solid #EEEEEE;}
.mac_results li:first-child{ border: 0;}
@media (min-width:768px){
.container{width:750px}
}
@media (min-width:992px){
.container{width:920px}
}
@media (min-width:1200px){
.container{width:1170px}
}
@media (max-width:1024px){
/* header */
.stui-header__top{ margin-bottom: 10px;}
.stui-header__logo{margin:10px 0 10px}
.stui-header__search{ margin: 10px 0 10px 30px; width: 200px;}
.stui-header__search .form-control{ height: 30px;}
.stui-header__search .submit{ width: 30px; height: 30px;}
/* .stui-header__menu ul{ overflow:hidden; white-space: nowrap;} */
.stui-header__menu li{ float: none; display: inline-block;}
.stui-header__menu li a{ padding: 12px 15px; font-size: 14px; white-space:nowrap;}
.stui-header__user > li{ padding: 15px 0 10px; margin-right: 10px;}
.stui-header__user > li .dropdown{ right: 0;}
.stui-header__user > li .icon{ font-size: 18px; line-height: 18px;}
.stui-header__menu li:hover .dropdown,.stui-header__user > li:hover .dropdown{ display: none;}
.stui-header__menu .submenu {
left: 0;
max-width: 75vw;
max-height: 50vh;
overflow: auto;
}
.stui-header__menu .submenu li {
width: 100%;
padding: 2px;
}
}
@media (max-width:767px){
/* header */
.stui-header__logo{ margin-left:10px}
.stui-header__search{ margin: 0; position:absolute; top: 15px; left: 170px; right:30px; width:auto;}
.stui-header__user{padding-right:10px}
.stui-header__user > li{ padding: 14px 0; margin: 0;}
.stui-header__user > li .dropdown:before{ right: 8px;}
.stui-header__user > li .icon{ font-size: 24px; line-height: 24px;}
/* content */
.stui-content__thumb .v-thumb{width:115px}
.stui-content__thumb .w-thumb{width:160px}
.stui-content__detail{padding:0 10px}
.stui-content__detail .title{ margin:0 0 8px; font-size:18px; line-height:18px; font-weight: 700;}
.stui-content__detail .data{margin:0 0 8px;font-size:12px}
.stui-content__detail .play-btn{margin:0;padding:0}
/* player */
.stui-player__detail.detail .title{ margin-top: 10px; font-size: 16px;}
.stui-player__detail{ margin-top: 0;}
.stui-player__detail .title{ font-size:18px; font-weight: 700;}
.stui-player__detail .more-btn{ margin-bottom: 10px;}
.stui-player__detail .more-btn{ float: none; padding: 10px; background-color: #222; display: -webkit-box; display: -webkit-flex; display: flex;}
.stui-player__detail .more-btn li{ margin: 0; padding: 0 5px; -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; text-align: center;}
.stui-player__detail .more-btn .btn{ display: block; padding: 6px;}
/* type */
.stui-mobile__type li{padding:0 20px}
.stui-mobile__type li a{display:block;padding:10px 0;text-align:center}
/* foot */
.stui-foot{padding:20px 0}
}
.text_single-line {display: inline-block;white-space: nowrap;overflow: hidden;text-overflow: ellipsis;-o-text-overflow: ellipsis;max-width: 140px;}

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

2
resources/assets/js/jquery.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,319 @@
/*!
* v3.0 Copyright 2016-2018 http://v.shoutu.cn
* Email 726662013@qq.com
*/
var playerhigh = "1";
//是否开启播放器高度自适应0关闭1开启开启后将播放器设置100%关闭填写固定高度)
var lazyswitch = "1";
//是否开启图片懒加载0关闭1开启关闭后会通过js直接加载图片速度较慢
var playcolumn = "8";
//是否开启有序播放列表0关闭3、6、8、10、12开启并指定列数数字代表每行列数手机强制4列
var qrcode1 = "1";
//右侧悬浮二维码1自动生成当前页面二维码填写路径将加载指定图片建议尺寸150*150px/statics/img/wxcode.png
var qrcode2 = "1";
//内容页二维码1自动生成当前页面二维码填写路径将加载指定图片建议尺寸160*160px/statics/img/wxcode.png
var copyshort = "0"
//是否开启自动生成短链接0关闭1开启开启后点击分享按钮将会复制短链否则复制默认链接
var baidushare = "0";
//是否开启百度分享0关闭启用本地分享填写/statics/api/js/share.js启用官网分享填写http://bdimg.share.baidu.com/static/api/js/share.js不支持https
var stui = {
'browser': {//浏览器
url: document.URL,
domain: document.domain,
title: document.title,
language: (navigator.browserLanguage || navigator.language).toLowerCase(),
canvas: function() {
return !!document.createElement("canvas").getContext
}(),
useragent: function() {
var a = navigator.userAgent;
return {
mobile: !! a.match(/AppleWebKit.*Mobile.*/),
ios: !! a.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
android: -1 < a.indexOf("Android") || -1 < a.indexOf("Linux"),
iPhone: -1 < a.indexOf("iPhone") || -1 < a.indexOf("Mac"),
iPad: -1 < a.indexOf("iPad"),
trident: -1 < a.indexOf("Trident"),
presto: -1 < a.indexOf("Presto"),
webKit: -1 < a.indexOf("AppleWebKit"),
gecko: -1 < a.indexOf("Gecko") && -1 == a.indexOf("KHTML"),
weixin: -1 < a.indexOf("MicroMessenger")
}
}()
},
'mobile': {//移动端
'popup': function() {
$popblock = $(".popup");
$(".open-popup").click(function() {
$popblock.addClass("popup-visible");
$("body").append('<div class="mask"></div>');
$(".close-popup").click(function() {
$popblock.removeClass("popup-visible");
$(".mask").remove();
$("body").removeClass("modal-open");
});
$(".mask").click(function() {
$popblock.removeClass("popup-visible");
$(this).remove();
$("body").removeClass("modal-open");
});
})
},
'slide': function() {
$(".type-slide").each(function(a) {
$index = $(this).find('.active').index()*1;
if($index > 3){
$index = $index-3;
}else{
$index = 0;
}
$(this).flickity({
cellAlign: 'left',
freeScroll: true,
contain: true,
prevNextButtons: false,
pageDots: false,
initialIndex: $index
});
});
},
'mshare': function() {
$(".open-share").click(function() {
stui.browser.useragent.weixin ? $("body").append('<div class="mobile-share share-weixin"></div>') : $("body").append('<div class="mobile-share share-other"></div>');
$(".mobile-share").click(function() {
$(".mobile-share").remove();
$("body").removeClass("modal-open");
});
});
}
},
'images': {//图片处理
'lazyload': function() {
if(lazyswitch==1){
$(".lazyload").lazyload({
effect: "fadeIn",
threshold: 200,
failurelimit: 15,
skip_invisible: false
});
}else{
$(".lazyload").each(function(){
var original = $(this).attr("data-original");
$(this).css("background-image","url("+original+")");
$(this).attr("data-original","");
if($(this).attr("src")!= undefined){
$(this).attr("src",original);
}
});
}
},
'carousel': function() {
$('.carousel_default').flickity({
cellAlign: 'left',
contain: true,
wrapAround: true,
autoPlay: true,
prevNextButtons: false
});
$('.carousel_wide').flickity({
cellAlign: 'center',
contain: true,
wrapAround: true,
autoPlay: true
});
$('.carousel_center').flickity({
cellAlign: 'center',
contain: true,
wrapAround: true,
autoPlay: true,
prevNextButtons: false
});
$('.carousel_right').flickity({
cellAlign: 'left',
wrapAround: true,
contain: true,
pageDots: false
});
},
'qrcode': function() {
if(qrcode1==1){
if($("#qrcode").length){
var qrcode = new QRCode('qrcode', {
text: stui.browser.url,
width: 150,
height: 150,
colorDark : '#000000',
colorLight : '#ffffff',
correctLevel : QRCode.CorrectLevel.H
});
$("#qrcode img").attr("class","img-responsive");
}
} else {
if($("#qrcode").length){
$("#qrcode").append("<img class='img-responsive' src='"+qrcode1+"' width='150' height='150' />");
}
}
if(qrcode2==1){
if($("#qrcode2").length){
var qrcode = new QRCode('qrcode2', {
text: stui.browser.url,
width: 160,
height: 160,
colorDark : '#000000',
colorLight : '#ffffff',
correctLevel : QRCode.CorrectLevel.H
});
$("#qrcode2 img").attr("class","img-responsive").css({"padding":"10px","background-color":"#fff"});
}
} else {
if($("#qrcode2").length){
$("#qrcode2").append("<img class='img-responsive' src='"+qrcode2+"' width='160' height='160' />");
}
}
}
},
'common': {//公共基础
'bootstrap': function() {
$('a[data-toggle="tab"]').on("shown.bs.tab", function(a) {
var b = $(a.target).text();
$(a.relatedTarget).text();
$("span.active-tab").html(b);
});
},
'headroom': function() {
if($("#header-top").length){
var header = document.querySelector("#header-top");
var headroom = new Headroom(header, {
tolerance: 5,
offset: 205,
classes: {
initial: "top-fixed",
pinned: "top-fixed-up",
unpinned: "top-fixed-down"
}
});
headroom.init();
}
},
'history': function() {
if($("#stui_history").length){
if($.cookie("recente")){
var json=eval("("+$.cookie("recente")+")");
var list="";
for(i=0;i<json.length;i++){
list = list + "<li class='top-line'><a href='"+json[i].vod_url+"' title='"+json[i].vod_name+"'><span class='pull-right text-red'>"+json[i].vod_part+"</span>"+json[i].vod_name+"</a></li>";
}
$("#stui_history").append(list);
}
else
$("#stui_history").append("<p style='padding: 80px 0; text-align: center'>您还没有看过影片哦</p>");
$(".historyclean").on("click",function(){
$.cookie("recente",null,{expires:-1,path: '/'});
});
}
},
'collapse': function() {
if($(".detail").length){
$(".detail").find("a.detail-more").on("click",function(){
$(this).parent().find(".detail-sketch").addClass("hide");
$(this).parent().find(".detail-content").css("display","");
$(this).remove();
});
}
},
'scrolltop': function() {
var a = $(window);
$scrollTopLink = $("a.backtop");
a.scroll(function() {
500 < $(this).scrollTop() ? $scrollTopLink.css("display", "") : $scrollTopLink.css("display", "none");
});
$scrollTopLink.on("click", function() {
$("html, body").animate({
scrollTop: 0
}, 400);
return !1
});
},
'copylink': function(){
if(copyshort==1){
if($(".copylink").length){
$.ajax({
type : 'GET',
url : 'https://api.weibo.com/2/short_url/shorten.json?source=2849184197&url_long='+encodeURIComponent(stui.browser.url),
dataType : 'JSONP',
success : function(r) {
url_short = r.data.urls[0].url_short;
var clipboard = new Clipboard('.copylink', {
text: function() {
return url_short;
}
});
clipboard.on('success', function(e) {
alert("地址复制成功,赶快分享给小伙伴吧!");
});
}
});
}
} else {
if($(".copylink").length){
var url_short = stui.browser.url;
var clipboard = new Clipboard('.copylink', {
text: function() {
return url_short;
}
});
clipboard.on('success', function(e) {
alert("地址复制成功,赶快分享给小伙伴吧!");
});
}
}
},
'share': function(){
if(baidushare!=0){
$(".share").html('<span class="bds_shere"></span><a class="bds_qzone" data-cmd="qzone" title="分享到QQ空间"></a><a class="bds_tsina" data-cmd="tsina" title="分享到新浪微博"></a><a class="bds_weixin" data-cmd="weixin" title="分享到微信"></a><a class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博"></a><a class="bds_sqq" data-cmd="sqq" title="分享到QQ好友"></a><a class="bds_bdhome" data-cmd="bdhome" title="分享到百度新首页"></a><a class="bds_tqf" data-cmd="tqf" title="分享到腾讯朋友"></a><a class="bds_youdao" data-cmd="youdao" title="分享到有道云笔记"></a><a class="bds_more" data-cmd="more" title="更多"></a>');
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"24"},"share":{}};with(document)0[(getElementsByTagName("head")[0]||body).appendChild(createElement('script')).src=''+baidushare+'?cdnversion='+~(-new Date()/36e5)];
}
}
}
};
/* if(window.console&&window.console.log){
console.log('\u9996\u6d82\u7f51\uff08v.shoutu.cn\uff09\u539f\u521b\u4f5c\u54c1');
console.log('\u4f5c\u8005\uff1a\u5c0f\u4e8c\u54e5\uff0cQQ\uff1a726662013');
console.log("%c\u539f\u521b\u4f5c\u54c1\u8bf7\u5c0a\u91cd\u4f5c\u8005\u52b3\u52a8\u6210\u679c\uff0c\u52ff\u5012\u5356\u5206\u4eab\uff0c\u8c22\u8c22\uff01","color:red");
}*/
$(document).ready(function() {
if(stui.browser.useragent.mobile){
stui.mobile.slide();
stui.mobile.popup();
stui.mobile.mshare();
}
stui.images.lazyload();
stui.images.carousel();
stui.images.qrcode();
stui.common.bootstrap();
stui.common.headroom();
stui.common.history();
stui.common.collapse();
stui.common.scrolltop();
stui.common.copylink();
stui.common.share();
});

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -0,0 +1,15 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata>Generated by IcoMoon</metadata>
<defs>
<font id="raty" horiz-adv-x="512">
<font-face units-per-em="512" ascent="480" descent="-32" />
<missing-glyph horiz-adv-x="512" />
<glyph unicode="&#x20;" d="" horiz-adv-x="256" />
<glyph unicode="&#xe600;" d="M256 16c-114.88 0-208 93.12-208 208s93.12 208 208 208 208-93.12 208-208-93.12-208-208-208zM351.376 284.656c3.904 3.904 3.904 10.256 0 14.16l-21.248 21.232c-3.904 3.904-10.256 3.904-14.16 0l-60.176-60.176-60.176 60.176c-3.904 3.904-10.256 3.904-14.16 0l-21.248-21.232c-3.904-3.904-3.904-10.256 0-14.16l60.192-60.192-60.192-60.16c-3.904-3.904-3.904-10.256 0-14.16l21.248-21.248c3.904-3.904 10.256-3.904 14.16 0l60.176 60.192 60.176-60.192c3.904-3.904 10.256-3.904 14.16 0l21.248 21.248c3.904 3.904 3.904 10.256 0 14.16l-60.192 60.16 60.192 60.192z" />
<glyph unicode="&#xe601;" d="M256 16c-114.88 0-208 93.12-208 208s93.12 208 208 208 208-93.12 208-208-93.12-208-208-208zM256 384c-88.352 0-160-71.648-160-160s71.648-160 160-160c88.368 0 160 71.648 160 160s-71.632 160-160 160zM328.592 167.44l-16.224-16.224c-2.976-2.976-7.808-2.976-10.8 0l-45.92 45.92-45.92-45.92c-2.992-2.976-7.808-2.976-10.8 0l-16.224 16.224c-2.976 2.976-2.976 7.808 0 10.8l45.936 45.904-45.936 45.92c-2.976 2.992-2.976 7.824 0 10.816l16.224 16.208c2.992 2.992 7.808 2.992 10.8 0l45.92-45.92 45.92 45.92c2.992 2.992 7.824 2.992 10.8 0l16.224-16.208c2.976-2.992 2.976-7.824 0-10.816l-45.936-45.92 45.936-45.904c2.976-2.992 2.976-7.84 0-10.8z" />
<glyph unicode="&#xf005;" d="M475.428 290.572q0-6.286-7.428-13.714l-103.714-101.143 24.572-142.857q0.286-2 0.286-5.714 0-6-3-10.143t-8.714-4.143q-5.428 0-11.428 3.428l-128.286 67.428-128.286-67.428q-6.285-3.428-11.428-3.428-6 0-9 4.143t-3 10.143q0 1.714 0.572 5.714l24.572 142.857-104 101.143q-7.143 7.714-7.143 13.714 0 10.572 16 13.143l143.428 20.857 64.286 130q5.428 11.714 14 11.714t14-11.714l64.286-130 143.429-20.857q16-2.572 16-13.143z" horiz-adv-x="476" />
<glyph unicode="&#xf006;" d="M324.857 188.572l87.428 84.857-120.572 17.715-54 109.143-54-109.143-120.572-17.714 87.428-84.857-20.857-120.286 108 56.857 107.714-56.857zM475.428 290.572q0-6.286-7.428-13.714l-103.714-101.143 24.572-142.857q0.286-2 0.286-5.714 0-14.286-11.714-14.286-5.428 0-11.428 3.428l-128.286 67.428-128.286-67.428q-6.285-3.428-11.428-3.428-6 0-9 4.143t-3 10.143q0 1.714 0.572 5.714l24.572 142.857-104 101.143q-7.143 7.714-7.143 13.714 0 10.572 16 13.143l143.428 20.857 64.286 130q5.428 11.714 14 11.714t14-11.714l64.286-130 143.429-20.857q16-2.572 16-13.143z" horiz-adv-x="476" />
<glyph unicode="&#xf123;" d="M338.857 202l73.428 71.428-120.572 17.714-8.572 17.143-45.428 92v-275.143l16.857-8.857 90.857-48-17.143 101.428-3.428 18.857zM468 276.857l-103.714-101.143 24.572-142.857q1.428-9.428-1.714-14.714t-9.714-5.286q-4.857 0-11.428 3.428l-128.286 67.428-128.286-67.428q-6.572-3.428-11.428-3.428-6.572 0-9.715 5.286t-1.715 14.714l24.572 142.857-104 101.143q-9.143 9.143-6.572 17t15.428 9.857l143.429 20.857 64.286 130q5.714 11.714 14 11.714 8 0 14-11.714l64.286-130 143.429-20.857q12.857-2 15.428-9.857t-6.857-17z" horiz-adv-x="476" />
</font></defs></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 781 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -0,0 +1,46 @@
.cancel-on-png, .cancel-off-png, .star-on-png, .star-off-png, .star-half-png {
font-size: 2em;
}
@font-face {
font-family: "raty";
font-style: normal;
font-weight: normal;
src: url("./fonts/raty.eot");
src: url("./fonts/raty.eot?#iefix") format("embedded-opentype");
src: url("./fonts/raty.svg#raty") format("svg");
src: url("./fonts/raty.ttf") format("truetype");
src: url("./fonts/raty.woff") format("woff");
}
.cancel-on-png, .cancel-off-png, .star-on-png, .star-off-png, .star-half-png {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
font-family: "raty";
font-style: normal;
font-variant: normal;
font-weight: normal;
line-height: 1;
speak: none;
text-transform: none;
}
.cancel-on-png:before {
content: "\e600";
}
.cancel-off-png:before {
content: "\e601";
}
.star-on-png:before {
content: "\f005";
}
.star-off-png:before {
content: "\f006";
}
.star-half-png:before {
content: "\f123";
}

View File

@ -0,0 +1,777 @@
/*!
* Raty - A Star Rating Plugin
*
* The MIT License
*
* author: Washington Botelho
* github: wbotelhos/raty
* version: 3.1.0
*
*/
(function(root, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('jquery'));
} else {
factory(root.jQuery);
}
}(this, function($) {
'use strict';
$.raty = {
cancelButton: false,
cancelClass: 'raty-cancel',
cancelHint: 'Cancel this rating!',
cancelOff: 'cancel-off.png',
cancelOn: 'cancel-on.png',
cancelPlace: 'left',
click: undefined,
half: false,
halfShow: true,
hints: ['bad', 'poor', 'regular', 'good', 'gorgeous'],
iconRange: undefined,
iconRangeSame: false,
mouseout: undefined,
mouseover: undefined,
noRatedMsg: 'Not rated yet!',
number: 5,
numberMax: 20,
path: undefined,
precision: false,
readOnly: false,
round: { down: 0.25, full: 0.6, up: 0.76 },
score: undefined,
scoreName: 'score',
single: false,
space: true,
starHalf: 'star-half.png',
starOff: 'star-off.png',
starOn: 'star-on.png',
starType: 'img',
target: undefined,
targetFormat: '{score}',
targetKeep: false,
targetScore: undefined,
targetText: '',
targetType: 'hint'
};
$.fn.raty = function(options) {
return this.each(function() {
var instance = new $.raty.Raty(this, options);
return instance._create();
});
};
$.raty.Raty = (function() {
var Raty = function(element, options) {
this.element = element;
this.self = $(element);
this.opt = $.extend(true, {}, $.raty, options, this.self.data());
};
Raty.prototype = {
_create: function() {
this._executeCallbacks();
this._adjustNumber();
this._adjustHints();
this.opt.score = this._adjustedScore(this.opt.score);
if (this.opt.starType !== 'img') {
this._adjustStarName();
}
this._setPath();
this._createStars();
if (this.opt.cancelButton) {
this._createCancel();
}
if (this.opt.precision) {
this._adjustPrecision();
}
this._createScore();
this._apply(this.opt.score);
this._setTitle(this.opt.score);
this._target(this.opt.score);
if (this.opt.readOnly) {
this._lock();
} else {
this.element.style.cursor = 'pointer';
this._binds();
}
this.self.data('raty', this);
},
// TODO: model spec
_adjustedScore: function(score) {
if (score || score === 0) {
return this._between(score, 0, this.opt.number);
}
},
_adjustHints: function() {
if (!this.opt.hints) {
this.opt.hints = [];
}
if (!this.opt.halfShow && !this.opt.half) {
return;
}
var steps = this.opt.precision ? 10 : 2;
for (var i = 0; i < this.opt.number; i++) {
var group = this.opt.hints[i];
if (Object.prototype.toString.call(group) !== '[object Array]') {
group = [group];
}
this.opt.hints[i] = [];
for (var j = 0; j < steps; j++) {
var hint = group[j];
var last = group[group.length - 1];
if (last === undefined) {
last = null;
}
this.opt.hints[i][j] = hint === undefined ? last : hint;
}
}
},
_adjustNumber: function() {
this.opt.number = this._between(this.opt.number, 1, this.opt.numberMax);
},
_adjustPrecision: function() {
this.opt.half = true;
},
_adjustStarName: function() {
var replaces = ['cancelOff', 'cancelOn', 'starHalf', 'starOff', 'starOn'];
this.opt.path = '';
for (var i = 0; i < replaces.length; i++) {
this.opt[replaces[i]] = this.opt[replaces[i]].replace('.', '-');
}
},
// TODO: model spec
_apply: function(score) {
this._fill(score);
if (score) {
if (score > 0) {
this.scoreField.val(score);
}
this._roundStars(score);
}
},
_attributesForIndex: function(i) {
var name = this._nameForIndex(i);
var attributes = { alt: i, src: this.opt.path + this.opt[name] };
if (this.opt.starType !== 'img') {
attributes = { 'data-alt': i, 'class': this.opt[name] };
}
attributes.title = this._getHint(i);
return attributes;
},
_between: function(value, min, max) {
return Math.min(Math.max(parseFloat(value), min), max);
},
// TODO: model spec
_binds: function() {
if (this.cancelButton) {
this._bindOverCancel();
this._bindClickCancel();
this._bindOutCancel();
}
this._bindOver();
this._bindClick();
this._bindOut();
},
// TODO: model spec
_bindClick: function() {
var that = this;
this.stars.on('click.raty', function(evt) {
if (that.self.data('readonly')) {
return;
}
var execute = true;
var score = (that.opt.half || that.opt.precision) ? that.self.data('score') : (this.alt || $(this).data('alt'));
if (that.opt.half && !that.opt.precision) {
score = that._roundHalfScore(score);
}
if (that.opt.click) {
execute = that.opt.click.call(that.element, +score, evt);
}
if (execute || execute === undefined) {
that._apply(+score);
}
});
},
// TODO: model spec
_bindClickCancel: function() {
this.cancelButton.on('click.raty', function(evt) {
this.scoreField.removeAttr('value');
if (this.opt.click) {
this.opt.click.call(this.element, null, evt);
}
}.bind(this));
},
// TODO: model spec
_bindOut: function() {
this.self.on('mouseleave.raty', function(evt) {
var score = +this.scoreField.val() || undefined;
this._apply(score);
this._target(score, evt);
this._resetTitle();
if (this.opt.mouseout) {
this.opt.mouseout.call(this.element, score, evt);
}
}.bind(this));
},
// TODO: model spec
_bindOutCancel: function() {
var that = this;
this.cancelButton.on('mouseleave.raty', function(evt) {
var icon = that.opt.cancelOff;
if (that.opt.starType !== 'img') {
icon = that.opt.cancelClass + ' ' + icon;
}
that._setIcon(this, icon);
if (that.opt.mouseout) {
var score = +that.scoreField.val() || undefined;
that.opt.mouseout.call(that.element, score, evt);
}
});
},
// TODO: model spec
_bindOver: function() {
var that = this;
var action = that.opt.half ? 'mousemove.raty' : 'mouseover.raty';
this.stars.on(action, function(evt) {
var score = that._getScoreByPosition(evt, this);
that._fill(score);
if (that.opt.half) {
that._roundStars(score, evt);
that._setTitle(score, evt);
that.self.data('score', score);
}
that._target(score, evt);
if (that.opt.mouseover) {
that.opt.mouseover.call(that.element, score, evt);
}
});
},
// TODO: model spec
_bindOverCancel: function() {
var that = this;
this.cancelButton.on('mouseover.raty', function(evt) {
if (that.self.data('readonly')) {
return;
}
var starOff = that.opt.path + that.opt.starOff;
var icon = that.opt.cancelOn;
if (that.opt.starType === 'img') {
that.stars.attr('src', starOff);
} else {
icon = that.opt.cancelClass + ' ' + icon;
that.stars.attr('class', starOff);
}
that._setIcon(this, icon);
that._target(null, evt);
if (that.opt.mouseover) {
that.opt.mouseover.call(that.element, null);
}
});
},
// TODO: model spec
_buildScoreField: function() {
return $('<input />', { name: this.opt.scoreName, type: 'hidden' }).appendTo(this.self);
},
// TODO: model spec
_createCancel: function() {
var icon = this.opt.path + this.opt.cancelOff;
var button = $('<' + this.opt.starType + ' />', { title: this.opt.cancelHint, 'class': this.opt.cancelClass });
if (this.opt.starType === 'img') {
button.attr({ src: icon, alt: 'x' });
} else {
// TODO: use $.data
button.attr('data-alt', 'x').addClass(icon);
}
if (this.opt.cancelPlace === 'left') {
this.self.prepend('&#160;').prepend(button);
} else {
this.self.append('&#160;').append(button);
}
this.cancelButton = button;
},
// TODO: model spec
_createScore: function() {
var score = $(this.opt.targetScore);
this.scoreField = score.length ? score : this._buildScoreField();
},
_createStars: function() {
for (var i = 1; i <= this.opt.number; i++) {
var attributes = this._attributesForIndex(i);
$('<' + this.opt.starType + ' />', attributes).appendTo(this.element);
if (this.opt.space && i < this.opt.number) {
this.self.append('&#160;');
}
}
this.stars = this.self.children(this.opt.starType);
},
// TODO: model spec
_error: function(message) {
$(this).text(message);
$.error(message);
},
_executeCallbacks: function() {
var options = ['number', 'readOnly', 'score', 'scoreName', 'target', 'path'];
for (var i = 0; i < options.length; i++) {
if (typeof this.opt[options[i]] === 'function') {
var value = this.opt[options[i]].call(this.element);
if (value) {
this.opt[options[i]] = value;
} else {
delete this.opt[options[i]];
}
}
}
},
// TODO: model spec
_fill: function(score) {
var hash = 0;
if (this.opt.iconRangeSame && this.opt.iconRange) {
while (hash < this.opt.iconRange.length && this.opt.iconRange[hash].range < score) {
hash++;
}
}
for (var i = 1; i <= this.stars.length; i++) {
var icon;
var star = this.stars[i - 1];
var turnOn = this._turnOn(i, score);
if (this.opt.iconRange && this.opt.iconRange.length > hash) {
var irange = this.opt.iconRange[hash];
icon = this._getRangeIcon(irange, turnOn);
if (i <= irange.range) {
this._setIcon(star, icon);
}
if (i === irange.range) {
hash++;
}
} else {
icon = this.opt[turnOn ? 'starOn' : 'starOff'];
this._setIcon(star, icon);
}
}
},
_getDecimal: function(number, fractions) {
var decimal = number.toString().split('.')[1];
var result = 0;
if (decimal) {
result = parseInt(decimal.slice(0, fractions), 10);
if (decimal.slice(1, 5) === '9999') {
result++;
}
}
return result;
},
// TODO: model spec
_getRangeIcon: function(irange, turnOn) {
return turnOn ? irange.on || this.opt.starOn : irange.off || this.opt.starOff;
},
// TODO: model spec
_getScoreByPosition: function(evt, icon) {
var score = parseInt(icon.alt || icon.getAttribute('data-alt'), 10);
if (this.opt.half) {
var size = this._getWidth();
var percent = parseFloat((evt.pageX - $(icon).offset().left) / size);
score = score - 1 + percent;
}
return score;
},
// TODO: model spec
_getHint: function(score, evt) {
if (score !== 0 && !score) {
return this.opt.noRatedMsg;
}
var decimal = this._getDecimal(score, 1);
var integer = Math.ceil(score);
var group = this.opt.hints[(integer || 1) - 1];
var hint = group;
var set = !evt || this.isMove;
if (this.opt.precision) {
if (set) {
decimal = decimal === 0 ? 9 : decimal - 1;
}
hint = group[decimal];
} else if (this.opt.halfShow || this.opt.half) {
decimal = set && decimal === 0 ? 1 : decimal > 5 ? 1 : 0;
hint = group[decimal];
}
return hint === '' ? '' : hint || score;
},
// TODO: model spec
_getWidth: function() {
var width = this.stars[0].width || parseFloat(this.stars.eq(0).css('font-size'));
if (!width) {
this._error('Could not get the icon width!');
}
return width;
},
// TODO: model spec
_lock: function() {
var hint = this._getHint(this.scoreField.val());
this.element.style.cursor = '';
this.element.title = hint;
this.scoreField.prop('readonly', true);
this.stars.prop('title', hint);
if (this.cancelButton) {
this.cancelButton.hide();
}
this.self.data('readonly', true);
},
_nameForIndex: function(i) {
return this.opt.score && this.opt.score >= i ? 'starOn' : 'starOff';
},
// TODO: model spec
_resetTitle: function() {
for (var i = 0; i < this.opt.number; i++) {
this.stars[i].title = this._getHint(i + 1);
}
},
// TODO: model spec
_roundHalfScore: function(score) {
var integer = parseInt(score, 10);
var decimal = this._getDecimal(score, 1);
if (decimal !== 0) {
decimal = decimal > 5 ? 1 : 0.5;
}
return integer + decimal;
},
// TODO: model spec
_roundStars: function(score, evt) {
var name = this._starName(score, evt);
if (name) {
var icon = this.opt[name];
var star = this.stars[Math.ceil(score) - 1];
this._setIcon(star, icon);
} // Full down: [x.00 .. x.25]
},
// TODO: model spec
_setIcon: function(star, icon) {
star[this.opt.starType === 'img' ? 'src' : 'className'] = this.opt.path + icon;
},
_setPath: function() {
this.opt.path = this.opt.path || '';
if (this.opt.path && this.opt.path.slice(-1)[0] !== '/') {
this.opt.path += '/';
}
},
// TODO: model spec
_setTarget: function(target, score) {
if (score) {
score = this.opt.targetFormat.toString().replace('{score}', score);
}
if (target.is(':input')) {
target.val(score);
} else {
target.html(score);
}
},
// TODO: model spec
_setTitle: function(score, evt) {
if (score) {
var integer = parseInt(Math.ceil(score), 10);
var star = this.stars[integer - 1];
star.title = this._getHint(score, evt);
}
},
_starName: function(score, evt) {
var decimal = +(score % 1).toFixed(2);
if (evt || this.isMove) {
return decimal > 0.5 ? 'starOn' : 'starHalf';
}
if (decimal <= this.opt.round.down) { // Down: [x.00 ... x.25]
return;
}
if (this.opt.halfShow && decimal < this.opt.round.up) { // Half: [x.26 ... x.75]
return 'starHalf';
}
if (decimal < this.opt.round.full) { // Off: [x.26 .. x.6]
return 'starOff';
}
return 'starOn'; // Up: [x.26 ...] || [x.6 ...]
},
// TODO: model spec
_target: function(score, evt) {
if (this.opt.target) {
var target = $(this.opt.target);
if (!target.length) {
this._error('Target selector invalid or missing!');
}
var mouseover = evt && evt.type === 'mouseover';
if (score === undefined) {
score = this.opt.targetText;
} else if (score === null) {
score = mouseover ? this.opt.cancelHint : this.opt.targetText;
} else {
if (this.opt.targetType === 'hint') {
score = this._getHint(score, evt);
} else if (this.opt.precision) {
score = parseFloat(score).toFixed(1);
}
var mousemove = evt && evt.type === 'mousemove';
if (!mouseover && !mousemove && !this.opt.targetKeep) {
score = this.opt.targetText;
}
}
this._setTarget(target, score);
}
},
// TODO: model spec
_turnOn: function(i, score) {
return this.opt.single ? (i === score) : (i <= score);
},
// TODO: model spec
_unlock: function() {
this.element.style.cursor = 'pointer';
this.element.removeAttribute('title');
this.scoreField.removeAttr('readonly');
this.self.data('readonly', false);
this._resetTitle();
if (this.cancelButton) {
this.cancelButton.css('display', '');
}
},
// TODO: model spec
cancel: function(click) {
if (this.self.data('readonly') !== true) {
this[click ? 'click' : 'score'].call(this, null);
this.scoreField.removeAttr('value');
}
},
// TODO: model spec
click: function(score) {
if (this.self.data('readonly') !== true) {
score = this._adjustedScore(score);
this._apply(score);
if (this.opt.click) {
this.opt.click.call(this.element, score, $.Event('click'));
}
this._target(score);
}
},
// TODO: model spec
getScore: function() {
var score = [];
var value ;
value = this.scoreField.val();
score.push(value ? +value : undefined);
return (score.length > 1) ? score : score[0];
},
// TODO: model spec
move: function(score) {
var integer = parseInt(score, 10);
var decimal = this._getDecimal(score, 1);
if (integer >= this.opt.number) {
integer = this.opt.number - 1;
decimal = 10;
}
var width = this._getWidth();
var steps = width / 10;
var star = $(this.stars[integer]);
var percent = star.offset().left + steps * decimal;
var evt = $.Event('mousemove', { pageX: percent });
this.isMove = true;
star.trigger(evt);
this.isMove = false;
},
// TODO: model spec
readOnly: function(readonly) {
if (this.self.data('readonly') !== readonly) {
if (readonly) {
this.self.off('.raty').children(this.opt.starType).off('.raty');
this._lock();
} else {
this._binds();
this._unlock();
}
this.self.data('readonly', readonly);
}
},
// TODO: model spec
score: function() {
return arguments.length ? this.setScore.apply(this, arguments) : this.getScore();
},
setScore: function(score) {
if (this.self.data('readonly') !== true) {
score = this._adjustedScore(score);
this._apply(score);
this._target(score);
}
}
};
return Raty;
})();
}));

View File

@ -0,0 +1,58 @@
@extends('themes::themexingkong.layout')
@php
$years = Cache::remember('all_years', \Backpack\Settings\app\Models\Setting::get('site_cache_ttl', 5 * 60), function () {
return \VsMov\Core\Models\Movie::select('publish_year')->distinct()->pluck('publish_year')->sortDesc();
});
@endphp
@push('header')
@endpush
@section('content')
<div class="col-lg-wide-8 col-xs-1 padding-0">
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box">
<div class="stui-pannel_hd">
@include('themes::themexingkong.inc.catalog_filter')
</div>
<div class="stui-pannel_hd">
<h1>{{ $section_name }}</h1>
</div>
<div class="stui-pannel_bd">
<ul class="stui-vodlist clearfix">
@foreach ($data as $movie)
<li class="col-md-5 col-sm-4 col-xs-3">
<div class="stui-vodlist__box">
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
<span class="play hidden-xs"></span>
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
</a>
<div class="stui-vodlist__detail">
<h4 class="title text-overflow">
<a href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}">{{ $movie->name }}</a>
</h4>
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}</p>
</div>
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>
{{ $data->appends(request()->all())->links('themes::themexingkong.inc.pagination') }}
</div>
@include('themes::themexingkong.inc.right_bar')
@endsection
@push('scripts')
<script type="text/javascript">
$(".score").each(function() {
var star = $(this).find(".branch").text().replace(".", "0.");
$(this).find("#score").css("width", "" + star + "%");
});
</script>
@endpush

View File

@ -0,0 +1,425 @@
@extends('themes::themexingkong.layout')
@push('header')
<style>
#wrapper-video {
height: 505px !important;
}
@media only screen and (max-width: 500px) {
#wrapper-video {
height: 210px !important;
}
}
@media only screen and (min-width: 501px) and (max-width: 767px) {
#wrapper-video {
height: 286px !important;
}
}
@media only screen and (min-width: 768px) and (max-width: 991px) {
#wrapper-video {
height: 388px !important;
}
}
@media only screen and (min-width: 992px) and (max-width: 1199px) {
#wrapper-video {
height: 525px !important;
}
}
</style>
@endpush
@section('content')
<div class="col-lg-wide-8 col-xs-1 padding-0">
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box">
<div class="stui-pannel-bd">
<div class="stui-player col-pd">
<div id="wrapper-video" class="stui-player__video clearfix">
</div>
<div class="stui-player__detail detail">
<ul class="more-btn">
<li>
<div class="" style="display: flex;gap:5px">
@foreach ($currentMovie->episodes->where('slug', $episode->slug)->where('server', $episode->server) as $server)
<button onclick="chooseStreamingServer(this)" data-type="{{ $server->type }}"
data-id="{{ $server->id }}" data-link="{{ $server->link }}"
class="streaming-server btn btn-default">VIP
#{{ $loop->index + 1 }}</button>
@endforeach
</div>
</li>
<li>
<button class="btn btn-default" id="report_error">Báo lỗi
<i class="icon iconfont icon-close "></i>
</button>
</li>
</ul>
<h1 class="title">
<a href="{{ $episode->getUrl() }}">Tập {{ $episode->name }}</a>
</h1>
<p>
<span class="title">Đổi nguồn phát VIP #1, VIP #2 khi lỗi.</span>
</p>
<div class="col-sm-12">
<div id="movies-rating-star"></div>
({{ $currentMovie->getRatingStar() }}
sao
/
{{ $currentMovie->getRatingCount() }} đánh giá)
</div>
</div>
</div>
</div>
</div>
</div>
@foreach ($currentMovie->episodes->sortBy([['server', 'asc']])->groupBy('server') as $server => $data)
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box b playlist mb">
<div class="stui-pannel_hd">
<div class="stui-pannel__head bottom-line active clearfix">
<span class="more text-muted pull-right"></span>
<h3 class="title"> Phim {{ $currentMovie->name }} - {{ $server }} </h3>
</div>
</div>
<div class="stui-pannel_bd col-pd clearfix">
<ul class="stui-content__playlist clearfix">
@foreach ($data->sortByDesc('name', SORT_NATURAL)->groupBy('name') as $name => $item)
<li class="@if ($item->contains($episode)) active @endif"><a
href="{{ $item->sortByDesc('type')->first()->getUrl() }}">Tập
{{ $name }}</a>
</li>
@endforeach
</ul>
</div>
</div>
</div>
@endforeach
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box">
<div class="stui-pannel_hd">
<div class="stui-pannel__head clearfix">
<h3 class="title">
<img src="{{ asset('themes/xingkong/img/icon_30.png') }}" /> Nội dung phim
</h3>
</div>
</div>
<div class="stui-pannel_bd">
<p class="col-pd detail">
<span class="detail-sketch">
{!! Str::limit(strip_tags($currentMovie->content), 300, '...') !!}
</span>
<span class="detail-content" style="display: none;">
{!! strip_tags($currentMovie->content) !!}
</span>
<a class="detail-more" href="javascript:;">Xem thêm <i class="icon iconfont icon-moreunfold"></i>
</a>
</p>
</div>
</div>
</div>
@include('themes::themexingkong.inc.related_movie')
@include('themes::themexingkong.inc.comment')
</div>
@include('themes::themexingkong.inc.right_bar')
@endsection
@push('scripts')
<script src="/themes/xingkong/player/js/p2p-media-loader-core.min.js"></script>
<script src="/themes/xingkong/player/js/p2p-media-loader-hlsjs.min.js"></script>
<script src="/js/jwplayer-8.9.3.js"></script>
<script src="/js/hls.min.js"></script>
<script src="/js/jwplayer.hlsjs.min.js"></script>
<script>
var episode_id = {{ $episode->id }};
const wrapper = document.getElementById('wrapper-video');
const vastAds = "{{ Setting::get('jwplayer_advertising_file') }}";
function chooseStreamingServer(el) {
const type = el.dataset.type;
const link = el.dataset.link.replace(/^http:\/\//i, 'https://');
const id = el.dataset.id;
const newUrl =
location.protocol +
"//" +
location.host +
location.pathname.replace(`-${episode_id}`, `-${id}`);
history.pushState({
path: newUrl
}, "", newUrl);
episode_id = id;
Array.from(document.getElementsByClassName('streaming-server')).forEach(server => {
server.classList.remove('btn-primary');
})
el.classList.add('btn-primary');
renderPlayer(type, link, id);
}
function renderPlayer(type, link, id) {
if (type == 'embed') {
if (vastAds) {
wrapper.innerHTML = `<div id="fake_jwplayer"></div>`;
const fake_player = jwplayer("fake_jwplayer");
const objSetupFake = {
key: "{{ Setting::get('jwplayer_license') }}",
aspectratio: "16:9",
width: "100%",
file: "/themes/xingkong/player/1s_blank.mp4",
volume: 100,
mute: false,
autostart: true,
advertising: {
tag: "{{ Setting::get('jwplayer_advertising_file') }}",
client: "vast",
vpaidmode: "insecure",
skipoffset: {{ (int) Setting::get('jwplayer_advertising_skipoffset') ?: 5 }}, // Bỏ qua quảng cáo trong vòng 5 giây
skipmessage: "Bỏ qua sau xx giây",
skiptext: "Bỏ qua"
}
};
fake_player.setup(objSetupFake);
fake_player.on('complete', function(event) {
$("#fake_jwplayer").remove();
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
allowfullscreen="" allow='autoplay'></iframe>`
fake_player.remove();
});
fake_player.on('adSkipped', function(event) {
$("#fake_jwplayer").remove();
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
allowfullscreen="" allow='autoplay'></iframe>`
fake_player.remove();
});
fake_player.on('adComplete', function(event) {
$("#fake_jwplayer").remove();
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
allowfullscreen="" allow='autoplay'></iframe>`
fake_player.remove();
});
} else {
if (wrapper) {
wrapper.innerHTML = `<iframe width="100%" height="100%" src="${link}" frameborder="0" scrolling="no"
allowfullscreen="" allow='autoplay'></iframe>`
}
}
return;
}
if (type == 'm3u8' || type == 'mp4') {
wrapper.innerHTML = `<div id="jwplayer"></div>`;
const player = jwplayer("jwplayer");
const objSetup = {
key: "{{ Setting::get('jwplayer_license') }}",
aspectratio: "16:9",
width: "100%",
file: link,
playbackRateControls: true,
playbackRates: [0.25, 0.75, 1, 1.25],
sharing: {
sites: [
"reddit",
"facebook",
"twitter",
"googleplus",
"email",
"linkedin",
],
},
volume: 100,
mute: false,
autostart: true,
logo: {
file: "{{ Setting::get('jwplayer_logo_file') }}",
link: "{{ Setting::get('jwplayer_logo_link') }}",
position: "{{ Setting::get('jwplayer_logo_position') }}",
},
advertising: {
tag: "{{ Setting::get('jwplayer_advertising_file') }}",
client: "vast",
vpaidmode: "insecure",
skipoffset: {{ (int) Setting::get('jwplayer_advertising_skipoffset') ?: 5 }}, // Bỏ qua quảng cáo trong vòng 5 giây
skipmessage: "Bỏ qua sau xx giây",
skiptext: "Bỏ qua"
}
};
if (type == 'm3u8') {
const segments_in_queue = 50;
var engine_config = {
debug: !1,
segments: {
forwardSegmentCount: 50,
},
loader: {
cachedSegmentExpiration: 864e5,
cachedSegmentsCount: 1e3,
requiredSegmentsPriority: segments_in_queue,
httpDownloadMaxPriority: 9,
httpDownloadProbability: 0.06,
httpDownloadProbabilityInterval: 1e3,
httpDownloadProbabilitySkipIfNoPeers: !0,
p2pDownloadMaxPriority: 50,
httpFailedSegmentTimeout: 500,
simultaneousP2PDownloads: 20,
simultaneousHttpDownloads: 2,
// httpDownloadInitialTimeout: 12e4,
// httpDownloadInitialTimeoutPerSegment: 17e3,
httpDownloadInitialTimeout: 0,
httpDownloadInitialTimeoutPerSegment: 17e3,
httpUseRanges: !0,
maxBufferLength: 300,
// useP2P: false,
},
};
if (Hls.isSupported() && p2pml.hlsjs.Engine.isSupported()) {
var engine = new p2pml.hlsjs.Engine(engine_config);
player.setup(objSetup);
jwplayer_hls_provider.attach();
p2pml.hlsjs.initJwPlayer(player, {
liveSyncDurationCount: segments_in_queue, // To have at least 7 segments in queue
maxBufferLength: 300,
loader: engine.createLoaderClass(),
});
} else {
player.setup(objSetup);
}
} else {
player.setup(objSetup);
}
const resumeData = 'OPCMS-PlayerPosition-' + id;
player.on('ready', function() {
if (typeof(Storage) !== 'undefined') {
if (localStorage[resumeData] == '' || localStorage[resumeData] == 'undefined') {
console.log("No cookie for position found");
var currentPosition = 0;
} else {
if (localStorage[resumeData] == "null") {
localStorage[resumeData] = 0;
} else {
var currentPosition = localStorage[resumeData];
}
console.log("Position cookie found: " + localStorage[resumeData]);
}
player.once('play', function() {
console.log('Checking position cookie!');
console.log(Math.abs(player.getDuration() - currentPosition));
if (currentPosition > 180 && Math.abs(player.getDuration() - currentPosition) >
5) {
player.seek(currentPosition);
}
});
window.onunload = function() {
localStorage[resumeData] = player.getPosition();
}
} else {
console.log('Your browser is too old!');
}
});
player.on('complete', function() {
if (typeof(Storage) !== 'undefined') {
localStorage.removeItem(resumeData);
} else {
console.log('Your browser is too old!');
}
})
function formatSeconds(seconds) {
var date = new Date(1970, 0, 1);
date.setSeconds(seconds);
return date.toTimeString().replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
}
}
}
</script>
<script>
document.addEventListener("DOMContentLoaded", function() {
const episode = '{{ $episode->id }}';
let playing = document.querySelector(`[data-id="${episode}"]`);
if (playing) {
playing.click();
return;
}
const servers = document.getElementsByClassName('streaming-server');
if (servers[0]) {
servers[0].click();
}
});
</script>
<script src="/themes/xingkong/plugins/jquery-raty/jquery.raty.js"></script>
<link href="/themes/xingkong/plugins/jquery-raty/jquery.raty.css" rel="stylesheet" type="text/css" />
<script>
var rated = false;
$('#movies-rating-star').raty({
score: {{ $currentMovie->getRatingStar() }},
number: 10,
numberMax: 10,
hints: ['quá tệ', 'tệ', 'không hay', 'không hay lắm', 'bình thường', 'xem được', 'có vẻ hay', 'hay',
'rất hay', 'siêu phẩm'
],
starOff: '/themes/xingkong/plugins/jquery-raty/images/star-off.png',
starOn: '/themes/xingkong/plugins/jquery-raty/images/star-on.png',
starHalf: '/themes/xingkong/plugins/jquery-raty/images/star-half.png',
click: function(score, evt) {
if (rated) return
fetch("{{ route('movie.rating', ['movie' => $currentMovie->slug]) }}", {
method: 'POST',
headers: {
"Content-Type": "application/json",
'X-CSRF-TOKEN': document.querySelector(
'meta[name="csrf-token"]')
.getAttribute(
'content')
},
body: JSON.stringify({
rating: score
})
});
rated = true;
$('#movies-rating-star').data('raty').readOnly(true);
alert(`Bạn đã đánh giá ${score} sao cho phim này!`);
}
});
</script>
<script>
$("#report_error").click(() => {
fetch("{{ route('episodes.report', ['movie' => $currentMovie->slug, 'episode' => $episode->slug, 'id' => $episode->id]) }}", {
method: 'POST',
headers: {
"Content-Type": "application/json",
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute(
'content')
},
body: JSON.stringify({
message: ''
})
});
$("#report_error").remove();
alert("Báo lỗi thành công!")
})
</script>
{!! setting('site_scripts_facebook_sdk') !!}
@endpush

View File

@ -0,0 +1,59 @@
<div>
<h2 class="title">Bộ lọc phim</h2>
<form action="/" method="GET" id="form-filter">
<div class="row">
<div class="form-group col-md-6 col-sm-3 col-xs-2">
<select class="form-control" id="sort" name="filter[sort]" form="form-filter">
<option value="">Sắp xếp</option>
<option value="update" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'update') selected @endif>Thời gian cập nhật
</option>
<option value="create" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'create') selected @endif>Thời gian đăng</option>
<option value="year" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'year') selected @endif>Năm sản xuất</option>
<option value="view" @if (isset(request('filter')['sort']) && request('filter')['sort'] == 'view') selected @endif>Lượt xem</option>
</select>
</div>
<div class="form-group col-md-6 col-sm-3 col-xs-2">
<select class="form-control" id="type" name="filter[type]" form="form-filter">
<option value="">Mọi định dạng</option>
<option value="series" @if (isset(request('filter')['type']) && request('filter')['type'] == 'series') selected @endif>Phim bộ</option>
<option value="single" @if (isset(request('filter')['type']) && request('filter')['type'] == 'single') selected @endif>Phim lẻ</option>
</select>
</div>
<div class="form-group col-md-6 col-sm-3 col-xs-2">
<select class="form-control" id="category" name="filter[category]" form="form-filter">
<option value="">Tất cả thể loại</option>
@foreach (\VsMov\Core\Models\Category::fromCache()->all() as $item)
<option value="{{ $item->id }}" @if (
(isset(request('filter')['category']) && request('filter')['category'] == $item->id) ||
(isset($category) && $category->id == $item->id)) selected @endif>
{{ $item->name }}</option>
@endforeach
</select>
</div>
<div class="form-group col-md-6 col-sm-3 col-xs-2">
<select class="form-control" name="filter[region]" form="form-filter">
<option value="">Tất cả quốc gia</option>
@foreach (\VsMov\Core\Models\Region::fromCache()->all() as $item)
<option value="{{ $item->id }}" @if (
(isset(request('filter')['region']) && request('filter')['region'] == $item->id) ||
(isset($region) && $region->id == $item->id)) selected @endif>
{{ $item->name }}</option>
@endforeach
</select>
</div>
<div class="form-group col-md-6 col-sm-3 col-xs-2">
<select class="form-control" name="filter[year]" form="form-filter">
<option value="">Tất cả năm</option>
@foreach ($years as $year)
<option value="{{ $year }}" @if (isset(request('filter')['year']) && request('filter')['year'] == $year) selected @endif>
{{ $year }}</option>
@endforeach
</select>
</div>
<div class="form-group col-md-6 col-sm-3 col-xs-2 text-center">
<button type="submit" form="form-filter" class="btn btn-primary">Lọc</button>
</div>
</div>
</form>
</div>

View File

@ -0,0 +1,20 @@
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box clearfix">
<div class="stui-pannel_bd clearfix">
<div class="stui-pannel_hd">
<div class="stui-pannel__head clearfix">
<h3 class="title">
<img src="{{ asset('themes/xingkong/img/icon_30.png') }}" /> Bình luận
</h3>
</div>
</div>
<div class="stui-pannel_bd">
<div style="width: 100%; background-color: #fff">
<div style="width: 100%; background-color: #fff" class="fb-comments"
data-href="{{ $currentMovie->getUrl() }}" data-width="100%" data-colorscheme="light"
data-numposts="5" data-order-by="reverse_time" data-lazy="true"></div>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,59 @@
@php
$logo = setting('site_logo', '');
$brand = setting('site_brand', '');
$title = isset($title) ? $title : setting('site_homepage_title', '');
@endphp
<header class="stui-header__top clearfix">
<div class="stui-header__bar clearfix">
<div class="container">
<div class="row">
<div class="stui-header__logo">
<a href="/">
@if ($logo)
{!! $logo !!}
@else
{!! $brand !!}
@endif
</a>
</div>
<div class="stui-header__search">
<form action="/" method="GET">
<input type="text" name="search" class="mac_wd form-control" value="{{ request('search') }}"
placeholder="Tìm kiếm phim..." />
<button class="submit" type="submit">
<i class="icon iconfont icon-search"></i>
</button>
</form>
</div>
</div>
</div>
</div>
<div class="stui-header__menu clearfix">
<div class="container">
<div class="row">
<ul class="">
@foreach ($menu as $key => $item)
@if (count($item['children']))
<li class="dropdown">
<a href="{{ $item['link'] }}">{{ $item['name'] }} <i
class="icon iconfont icon-moreunfold"></i></a>
<ul class="submenu">
@foreach ($item['children'] as $children)
<li class="">
<a href="{{ $children['link'] }}">{{ $children['name'] }}</a>
</li>
@endforeach
</ul>
</li>
@else
<li>
<a href="{{ $item['link'] }}">{{ $item['name'] }}</a>
</li>
@endif
@endforeach
</ul>
</div>
</div>
</div>
</header>

View File

@ -0,0 +1,42 @@
@php
$pageRange = 3;
@endphp
@if ($paginator->hasPages())
<ul class="stui-page text-center clearfix">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
@else
<li><a title="Trang trước" href="{{ $paginator->previousPageUrl() }}"> &lt;&lt; </a></li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="hidden-xs active"><a title="Trang {{ $page }}"
href="#">{{ $page }}</a></li>
<li class="active visible-xs">
<span class="num">{{ $page }}/{{ $paginator->total() }}</span>
</li>
@else
@if (
($page > $paginator->currentPage() && $page < $paginator->currentPage() + $pageRange) ||
($page < $paginator->currentPage() && $page > $paginator->currentPage() - $pageRange))
<li class="hidden-xs">
<a title="Trang {{ $page }}" href="{{ $url }}">{{ $page }}</a>
</li>
@endif
@endif
@endforeach
@endif
@endforeach
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li><a title="Trang tiếp" href="{{ $paginator->nextPageUrl() }}">&gt;&gt;</a></li>
@else
@endif
</ul>
@endif

View File

@ -0,0 +1,32 @@
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box">
<div class="stui-pannel_hd">
<div class="stui-pannel__head bottom-line active clearfix">
<h3 class="title">
<img src="{{ asset('themes/xingkong/img/icon_6.png') }}" /> thể bạn sẽ thích?
</h3>
</div>
</div>
<div class="stui-pannel_bd">
<ul class="stui-vodlist__bd clearfix">
@foreach ($movie_related as $movie)
<li class="col-md-6 col-sm-4 col-xs-3 ">
<div class="stui-vodlist__box">
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
<span class="play hidden-xs"></span>
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
</a>
<div class="stui-vodlist__detail">
<h4 class="title text-overflow">
<a href="{{ $movie->getUrl() }}" title="{{ $movie->name }}">{{ $movie->name }}</a>
</h4>
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}</p>
</div>
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>

View File

@ -0,0 +1,37 @@
<div class="col-lg-wide-2 col-xs-1 stui-pannel-side visible-lg">
@foreach ($tops as $top)
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="col-pd clearfix">
<div class="stui-pannel_hd">
<div class="stui-pannel__head bottom-line active clearfix">
<h3 class="title"> {{ $top['label'] }} </h3>
</div>
</div>
<div class="stui-pannel_bd">
<ul class="stui-vodlist__media active col-pd clearfix">
@foreach ($top['data'] as $movie)
<li class="top-line-dot">
<div class="thumb">
<a class="stui-vodlist__thumb" href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}"
style="width: 33.5px; background-image: url({{ $movie->getThumbUrl() }});"></a>
</div>
<div class="detail detail-side" style="padding-top: 5px;">
<p class="margin-0 text_single-line">
<a href="{{ $movie->getUrl() }}">{{ $movie->name }}</a>
</p>
<div class="score">
<div class="star">
<span class="star-cur" id="score"></span>
</div>
<span class="branch">{{ $movie->getRatingStar() }}</span>
</div>
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>
@endforeach
</div>

View File

@ -0,0 +1,42 @@
<div class="stui-pannel clearfix">
<div class="stui-pannel-box padding-0">
<div class="col-lg-wide-9.5 col-xs-1 padding-0">
<div class="col-pd stui-pannel-bg">
<div class="stui-pannel_hd">
<div class="stui-pannel__head bottom-line active clearfix">
<a class="more text-muted pull-right" href="{{ $item['link'] }}">Xem thêm <i
class="icon iconfont icon-more"></i>
</a>
<h3 class="title">
<img src="{{ asset('themes/xingkong/img/icon_1.png') }}" alt="{{ $item['label'] }}" />
<a href="{{ $item['link'] }}">{{ $item['label'] }}</a>
</h3>
</div>
</div>
<div class="stui-pannel_bd clearfix">
<ul class="stui-vodlist clearfix">
@foreach ($item['data'] as $movie)
<li class="col-md-6 col-sm-4 col-xs-3 ">
<div class="stui-vodlist__box">
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
<span class="play hidden-xs"></span>
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
</a>
<div class="stui-vodlist__detail">
<h4 class="title text-overflow">
<a href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}">{{ $movie->name }}</a>
</h4>
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}
</p>
</div>
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,75 @@
<div class="stui-pannel clearfix">
<div class="stui-pannel-box padding-0">
<div class="col-lg-wide-8 col-xs-1 padding-0">
<div class="col-pd stui-pannel-bg">
<div class="stui-pannel_hd">
<div class="stui-pannel__head bottom-line active clearfix">
<a class="more text-muted pull-right" href="{{ $item['link'] }}">Xem thêm <i
class="icon iconfont icon-more"></i>
</a>
<h3 class="title">
<img src="{{ asset('themes/xingkong/img/icon_1.png') }}" alt="{{ $item['label'] }}" />
<a href="{{ $item['link'] }}">{{ $item['label'] }}</a>
</h3>
</div>
</div>
<div class="stui-pannel_bd clearfix">
<ul class="stui-vodlist clearfix">
@foreach ($item['data'] as $movie)
<li class="col-md-5 col-sm-4 col-xs-3 ">
<div class="stui-vodlist__box">
<a class="stui-vodlist__thumb lazyload" href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}" data-original="{{ $movie->getThumbUrl() }}">
<span class="play hidden-xs"></span>
<span class="pic-text text-right">{{ $movie->episode_current }}</span>
</a>
<div class="stui-vodlist__detail">
<h4 class="title text-overflow">
<a href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}">{{ $movie->name }}</a>
</h4>
<p class="text text-overflow text-muted hidden-xs">{{ $movie->origin_name }}
</p>
</div>
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>
<div class="col-lg-wide-2 stui-pannel-side hidden-md hidden-sm hidden-xs">
<div class="col-pd stui-pannel-bg clearfix">
<div class="stui-pannel_hd">
<div class="stui-pannel__head bottom-line active clearfix">
<h3 class="title"> Top tuần </h3>
</div>
</div>
<div class="stui-pannel_bd">
<ul class="stui-vodlist__media active col-pd clearfix">
@foreach ($item['top'] as $movie)
<li class="top-line-dot">
<div class="thumb">
<a class="stui-vodlist__thumb" href="{{ $movie->getUrl() }}"
title="{{ $movie->name }}"
style="width: 33.5px; background-image: url({{ $movie->getThumbUrl() }});"></a>
</div>
<div class="detail detail-side" style="padding-top: 5px;">
<p class="margin-0 text_single-line">
<a href="{{ $movie->getUrl() }}">{{ $movie->name }}</a>
</p>
<div class="score">
<div class="star">
<span class="star-cur" id="score"></span>
</div>
<span class="branch">{{ $movie->getRatingStar() }}</span>
</div>
</div>
</li>
@endforeach
</ul>
</div>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,16 @@
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box clearfix">
<div class="stui-pannel-bd">
<div class="carousel carousel_default flickity-page">
@foreach ($recommendations as $movie)
<div class="col-xs-1">
<a href="{{ $movie->getUrl() }}" class="stui-vodlist__thumb banner" title="{{ $movie->name }}"
style="background: url({{ $movie->getPosterUrl() }}) no-repeat; background-position:50% 50%; background-size: cover;">
<span class="pic-text text-center">{{ $movie->name }}</span>
</a>
</div>
@endforeach
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,85 @@
@extends('themes::themexingkong.layout')
@php
use VsMov\Core\Models\Movie;
$recommendations = Cache::remember('site.movies.recommendations', setting('site_cache_ttl', 5 * 60), function () {
return Movie::where('is_recommended', true)->limit(get_theme_option('recommendations_limit', 10))->orderBy('updated_at', 'desc')->get();
});
$data = Cache::remember('site.movies.latest', setting('site_cache_ttl', 5 * 60), function () {
$lists = preg_split('/[\n\r]+/', get_theme_option('latest'));
$data = [];
foreach ($lists as $list) {
if (trim($list)) {
$list = explode('|', $list);
[$label, $relation, $field, $val, $sortKey, $alg, $limit, $link, $template] = array_merge($list, ['Phim mới cập nhật', '', 'type', 'series', 'created_at', 'desc', 8, '/', 'default']);
try {
$top = null;
if ($template === 'with_top') {
$top = Movie::when($relation, function ($query) use ($relation, $field, $val) {
$query->whereHas($relation, function ($rel) use ($field, $val) {
$rel->where($field, $val);
});
})
->when(!$relation, function ($query) use ($field, $val) {
$query->where($field, $val);
})
->orderBy('view_week', 'desc')
->limit(9)
->get();
}
$data[] = [
'label' => $label,
'data' => Movie::when($relation, function ($query) use ($relation, $field, $val) {
$query->whereHas($relation, function ($rel) use ($field, $val) {
$rel->where($field, $val);
});
})
->when(!$relation, function ($query) use ($field, $val) {
$query->where($field, $val);
})
->orderBy($sortKey, $alg)
->limit($limit)
->get(),
'top' => $top,
'link' => $link ?: '#',
'template' => $template,
];
} catch (\Exception $e) {
}
}
}
return $data;
});
@endphp
@push('header')
<style type="text/css">
.stui-vodlist__thumb.banner {
padding-top: 30%;
}
@media (max-width:767px) {
.stui-vodlist__thumb.banner {
padding-top: 45%;
}
}
</style>
@endpush
@section('content')
@include('themes::themexingkong.inc.slider_recommended')
@foreach ($data as $item)
@include('themes::themexingkong.inc.sections.' . $item['template'])
@endforeach
@endsection
@push('scripts')
<script type="text/javascript">
$(".score").each(function() {
var star = $(this).find(".branch").text().replace(".", "0.");
$(this).find("#score").css("width", "" + star + "%");
});
</script>
@endpush

View File

@ -0,0 +1,54 @@
@extends('themes::layout')
@php
@endphp
@push('header')
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link
href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/iconfont.css') }}" type="text/css" />
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/stui_block.css') }}" type="text/css" />
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/stui_block_color.css') }}" type="text/css" />
<link rel="stylesheet" href="{{ asset('themes/xingkong/css/stui_default.css') }}" type="text/css" />
<script type="text/javascript" src="{{ asset('themes/xingkong/js/jquery.min.js') }}"></script>
<script type="text/javascript" src="{{ asset('themes/xingkong/js/stui_default.js') }}"></script>
<script type="text/javascript" src="{{ asset('themes/xingkong/js/stui_block.js') }}"></script>
@endpush
@section('body')
@include('themes::themexingkong.inc.header')
@if (get_theme_option('ads_header'))
<div class="container">
<div id="top-banner">
{!! get_theme_option('ads_header') !!}
</div>
</div>
@endif
<div class="container">
<div class="row">
@yield('content')
</div>
</div>
@endsection
@push('scripts')
@endpush
@section('footer')
{!! get_theme_option('footer') !!}
@if (get_theme_option('ads_catfish'))
<div class="container">
<div id="catfish-banner">
{!! get_theme_option('ads_catfish') !!}
</div>
</div>
@endif
{!! setting('site_scripts_google_analytics') !!}
@endsection

View File

@ -0,0 +1,221 @@
@extends('themes::themexingkong.layout')
@php
$watch_url = '';
if (!$currentMovie->is_copyright && count($currentMovie->episodes) && $currentMovie->episodes[0]['link'] != '') {
$watch_url = $currentMovie->episodes
->sortBy([['server', 'asc']])
->groupBy('server')
->first()
->sortByDesc('name', SORT_NATURAL)
->groupBy('name')
->last()
->sortByDesc('type')
->first()
->getUrl();
}
@endphp
@push('header')
@endpush
@section('content')
<div class="col-lg-wide-8 col-xs-1 padding-0">
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box clearfix">
<div class="stui-pannel_bd clearfix">
<div class="stui-content col-pd clearfix">
<div class="stui-content__thumb">
<a class="stui-vodlist__thumb picture v-thumb" href="{{ $watch_url }}"
title="{{ $currentMovie->name }}">
<img class="lazyload" src="{{ asset('themes/xingkong/img/load.gif') }}"
data-original="{{ $currentMovie->getThumbUrl() }}" />
<span class="play active hidden-xs"></span>
<span class="pic-text text-right">{{ $currentMovie->episode_current }}</span>
</a>
</div>
<div class="stui-content__detail">
<h1 class="title">{{ $currentMovie->name }}</h1>
<p class="data">
<h2>{{ $currentMovie->origin_name }}</h2>
</p>
<p class="movie-rating">
<span id="movies-rating-star"></span>
</p>
<p class="data">
<span class="text-muted hidden-xs">Thể Loại: </span>
{!! $currentMovie->categories->map(function ($category) {
return '<a href="' . $category->getUrl() . '">' . $category->name . '</a>';
})->implode(', ') !!}
<span class="split-line"></span>
<span class="text-muted hidden-xs">Quốc gia: </span>
{!! $currentMovie->regions->map(function ($region) {
return '<a href="' . $region->getUrl() . '">' . $region->name . '</a>';
})->implode(', ') !!}
<span class="split-line"></span>
<span class="text-muted hidden-xs">Năm: </span>{{ $currentMovie->publish_year }}
</p>
<p class="data">
</p>
<p class="data">
<span class="text-muted">Ngôn ngữ: </span>{{ $currentMovie->language }} <span
class="split-line"></span>
<span class="text-muted hidden-xs">Chất lượng: </span>{{ $currentMovie->quality }}
</p>
<p class="data">
<span class="text-muted">Diễn viên: </span>
{!! $currentMovie->actors->map(function ($actor) {
return '<a href="' . $actor->getUrl() . '">' . $actor->name . '</a>';
})->implode(', ') !!}
</p>
<p class="data">
<span class="text-muted">Đạo diễn: </span>
{!! $currentMovie->directors->map(function ($director) {
return '<a href="' . $director->getUrl() . '">' . $director->name . '</a>';
})->implode(', ') !!}
</p>
<p class="desc detail hidden-xs">
<span class="left text-muted">Nội dung:</span>
<span class="detail-sketch">
{!! Str::limit(strip_tags($currentMovie->content), 60, '...') !!}
</span>
<span class="detail-content" style="display: none;">
{!! strip_tags($currentMovie->content) !!}
</span>
<a class="detail-more" href="javascript:;">Xem thêm <i
class="icon iconfont icon-moreunfold"></i>
</a>
</p>
<div class="play-btn clearfix">
<div class="share bdsharebuttonbox hidden-sm hidden-xs pull-right"></div>
@if ($watch_url)
<a class="btn btn-primary" href="{{ $watch_url }}">Xem Phim</a>
@endif
@if (strpos($currentMovie->trailer_url, 'youtube'))
<a href="javascript:void(0);" class="btn btn-default" id="show-trailer">Trailer</a>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
@if ($watch_url)
<div class="stui-pannel stui-pannel-bg clearfix">
<div class="stui-pannel-box b playlist mb">
<div class="stui-pannel_hd">
<div class="stui-pannel__head bottom-line active clearfix">
<span class="more text-muted pull-right"></span>
<h3 class="title"> Xem phim {{ $currentMovie->name }} </h3>
</div>
</div>
<div class="stui-pannel_bd col-pd clearfix">
<ul class="stui-content__playlist clearfix">
@php
$currentMovie->episodes
->sortBy([['name', 'desc'], ['type', 'desc']])
->sortByDesc('name', SORT_NATURAL)
->unique('name')
->take(8)
->map(function ($episode) {
echo '<li><a href="' . $episode->getUrl() . '">Tập ' . $episode->name . '</a></li>';
});
@endphp
</ul>
</div>
</div>
</div>
@endif
@include('themes::themexingkong.inc.related_movie')
@include('themes::themexingkong.inc.comment')
</div>
@include('themes::themexingkong.inc.right_bar')
@if (strpos($currentMovie->trailer_url, 'youtube'))
@php
try {
parse_str(parse_url($currentMovie->trailer_url, PHP_URL_QUERY), $parse_url);
$trailer_id = $parse_url['v'];
} catch (\Throwable $th) {
$trailer_id = '';
}
@endphp
<div class="stui-modal fade" id="modal-trailer" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"
aria-hidden="true">
<div class="stui-modal__dialog">
<div class="stui-modal__content">
<div class="stui-pannel clearfix">
<div class="stui-pannel-box clearfix">
<div class="stui-pannel_hd">
<div class="stui-pannel__head active bottom-line clearfix">
<a href="javascript:;" class="more close pull-right" data-dismiss="modal"
aria-hidden="true">
<i class="icon iconfont icon-close"></i>
</a>
<h3 class="title">Trailer phim {{ $currentMovie->name }}</h3>
</div>
</div>
<div class="stui-pannel_bd clearfix">
<iframe src="https://www.youtube.com/embed/{{ $trailer_id }}"
style="width: 100%;height: 100%;" frameborder="0"
allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen></iframe>
</div>
</div>
</div>
</div>
</div>
</div>
@endif
@endsection
@push('scripts')
<script>
$(function() {
$("#show-trailer").click(function() {
$("#modal-trailer").modal('show');
})
})
</script>
<script src="/themes/xingkong/plugins/jquery-raty/jquery.raty.js"></script>
<link href="/themes/xingkong/plugins/jquery-raty/jquery.raty.css" rel="stylesheet" type="text/css" />
<script>
var rated = false;
$('#movies-rating-star').raty({
score: {{ $currentMovie->getRatingStar() }},
number: 10,
numberMax: 10,
hints: ['quá tệ', 'tệ', 'không hay', 'không hay lắm', 'bình thường', 'xem được', 'có vẻ hay', 'hay',
'rất hay', 'siêu phẩm'
],
starOff: '/themes/xingkong/plugins/jquery-raty/images/star-off.png',
starOn: '/themes/xingkong/plugins/jquery-raty/images/star-on.png',
starHalf: '/themes/xingkong/plugins/jquery-raty/images/star-half.png',
click: function(score, evt) {
if (rated) return
fetch("{{ route('movie.rating', ['movie' => $currentMovie->slug]) }}", {
method: 'POST',
headers: {
"Content-Type": "application/json",
'X-CSRF-TOKEN': document.querySelector(
'meta[name="csrf-token"]')
.getAttribute(
'content')
},
body: JSON.stringify({
rating: score
})
});
rated = true;
$('#movies-rating-star').data('raty').readOnly(true);
alert(`Bạn đã đánh giá ${score} sao cho phim này!`);
}
});
</script>
{!! setting('site_scripts_facebook_sdk') !!}
@endpush

53
routes/web.php Executable file
View File

@ -0,0 +1,53 @@
<?php
use Illuminate\Support\Facades\Route;
use VsMov\ThemeXingKong\Controllers\ThemeXingKongController;
// --------------------------
// Custom Backpack Routes
// --------------------------
// This route file is loaded automatically by Backpack\Base.
// Routes you generate using Backpack\Generators will be placed here.
Route::group([
'middleware' => array_merge(
(array) config('backpack.base.web_middleware', 'web'),
),
], function () {
Route::get('/', [ThemeXingKongController::class, 'index']);
Route::get(setting('site_routes_category', '/the-loai/{category}'), [ThemeXingKongController::class, 'getMovieOfCategory'])
->where(['category' => '.+', 'id' => '[0-9]+'])
->name('categories.movies.index');
Route::get(setting('site_routes_region', '/quoc-gia/{region}'), [ThemeXingKongController::class, 'getMovieOfRegion'])
->where(['region' => '.+', 'id' => '[0-9]+'])
->name('regions.movies.index');
Route::get(setting('site_routes_tag', '/tu-khoa/{tag}'), [ThemeXingKongController::class, 'getMovieOfTag'])
->where(['tag' => '.+', 'id' => '[0-9]+'])
->name('tags.movies.index');
Route::get(setting('site_routes_types', '/danh-sach/{type}'), [ThemeXingKongController::class, 'getMovieOfType'])
->where(['type' => '.+', 'id' => '[0-9]+'])
->name('types.movies.index');
Route::get(setting('site_routes_actors', '/dien-vien/{actor}'), [ThemeXingKongController::class, 'getMovieOfActor'])
->where(['actor' => '.+', 'id' => '[0-9]+'])
->name('actors.movies.index');
Route::get(setting('site_routes_directors', '/dao-dien/{director}'), [ThemeXingKongController::class, 'getMovieOfDirector'])
->where(['director' => '.+', 'id' => '[0-9]+'])
->name('directors.movies.index');
Route::get(setting('site_routes_episode', '/phim/{movie}/{episode}-{id}'), [ThemeXingKongController::class, 'getEpisode'])
->where(['movie' => '.+', 'movie_id' => '[0-9]+', 'episode' => '.+', 'id' => '[0-9]+'])
->name('episodes.show');
Route::post(sprintf('/%s/{movie}/{episode}/report', config('vsmov.routes.movie', 'phim')), [ThemeXingKongController::class, 'reportEpisode'])->name('episodes.report');
Route::post(sprintf('/%s/{movie}/rate', config('vsmov.routes.movie', 'phim')), [ThemeXingKongController::class, 'rateMovie'])->name('movie.rating');
Route::get(setting('site_routes_movie', '/phim/{movie}'), [ThemeXingKongController::class, 'getMovieOverview'])
->where(['movie' => '.+', 'id' => '[0-9]+'])
->name('movies.show');
});

View File

@ -0,0 +1,290 @@
<?php
namespace VsMov\ThemeXingKong\Controllers;
use Backpack\Settings\app\Models\Setting;
use Illuminate\Http\Request;
use VsMov\Core\Models\Actor;
use VsMov\Core\Models\Catalog;
use VsMov\Core\Models\Category;
use VsMov\Core\Models\Director;
use VsMov\Core\Models\Episode;
use VsMov\Core\Models\Movie;
use VsMov\Core\Models\Region;
use VsMov\Core\Models\Tag;
use Illuminate\Support\Facades\Cache;
class ThemeXingKongController
{
public function index(Request $request)
{
if ($request['search'] || $request['filter']) {
$data = Movie::when(!empty($request['filter']['category']), function ($movie) {
$movie->whereHas('categories', function ($categories) {
$categories->where('id', request('filter')['category']);
});
})->when(!empty($request['filter']['region']), function ($movie) {
$movie->whereHas('regions', function ($regions) {
$regions->where('id', request('filter')['region']);
});
})->when(!empty($request['filter']['year']), function ($movie) {
$movie->where('publish_year', request('filter')['year']);
})->when(!empty($request['filter']['type']), function ($movie) {
$movie->where('type', request('filter')['type']);
})->when(!empty($request['search']), function ($query) {
$query->where(function ($query) {
$query->whereRaw("MATCH(name, origin_name) AGAINST(? IN BOOLEAN MODE)", [request('search')]);
});
})->when(!empty($request['filter']['sort']), function ($movie) {
if (request('filter')['sort'] == 'create') {
return $movie->orderBy('created_at', 'desc');
}
if (request('filter')['sort'] == 'update') {
return $movie->orderBy('updated_at', 'desc');
}
if (request('filter')['sort'] == 'year') {
return $movie->orderBy('publish_year', 'desc');
}
if (request('filter')['sort'] == 'view') {
return $movie->orderBy('view_total', 'desc');
}
})->paginate(get_theme_option('per_page_limit'));
return view('themes::themexingkong.catalog', [
'data' => $data,
'search' => $request['search'],
'section_name' => "Tìm kiếm phim: $request->search"
]);
}
return view('themes::themexingkong.index', [
'title' => Setting::get('site_homepage_title')
]);
}
public function getMovieOverview(Request $request)
{
/** @var Movie */
$movie = Movie::fromCache()->find($request->movie ?: $request->id);
if (is_null($movie)) abort(404);
$movie->generateSeoTags();
$movie->increment('view_total', 1);
$movie->increment('view_day', 1);
$movie->increment('view_week', 1);
$movie->increment('view_month', 1);
$movie_related_cache_key = 'movie_related:' . $movie->id;
$movie_related = Cache::get($movie_related_cache_key);
if (is_null($movie_related)) {
$movie_related = $movie->categories[0]->movies()->inRandomOrder()->limit(get_theme_option('movie_related_limit', 10))->get();
Cache::put($movie_related_cache_key, $movie_related, setting('site_cache_ttl', 5 * 60));
}
return view('themes::themexingkong.single', [
'currentMovie' => $movie,
'title' => $movie->getTitle(),
'movie_related' => $movie_related
]);
}
public function getEpisode(Request $request)
{
$movie = Movie::fromCache()->find($request->movie ?: $request->movie_id)->load('episodes');
if (is_null($movie)) abort(404);
/** @var Episode */
$episode_id = $request->id;
$episode = $movie->episodes->when($episode_id, function ($collection, $episode_id) {
return $collection->where('id', $episode_id);
})->firstWhere('slug', $request->episode);
if (is_null($episode)) abort(404);
$episode->generateSeoTags();
$movie->increment('view_total', 1);
$movie->increment('view_day', 1);
$movie->increment('view_week', 1);
$movie->increment('view_month', 1);
$movie_related_cache_key = 'movie_related:' . $movie->id;
$movie_related = Cache::get($movie_related_cache_key);
if (is_null($movie_related)) {
$movie_related = $movie->categories[0]->movies()->inRandomOrder()->limit(get_theme_option('movie_related_limit', 10))->get();
Cache::put($movie_related_cache_key, $movie_related, setting('site_cache_ttl', 5 * 60));
}
return view('themes::themexingkong.episode', [
'currentMovie' => $movie,
'movie_related' => $movie_related,
'episode' => $episode,
'title' => $episode->getTitle()
]);
}
public function getMovieOfCategory(Request $request)
{
/** @var Category */
$category = Category::fromCache()->find($request->category ?: $request->id);
if (is_null($category)) abort(404);
$category->generateSeoTags();
$movies = $category->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
return view('themes::themexingkong.catalog', [
'data' => $movies,
'category' => $category,
'title' => $category->seo_title ?: $category->getTitle(),
'section_name' => "Phim thể loại $category->name"
]);
}
public function getMovieOfRegion(Request $request)
{
/** @var Region */
$region = Region::fromCache()->find($request->region ?: $request->id);
if (is_null($region)) abort(404);
$region->generateSeoTags();
$movies = $region->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
return view('themes::themexingkong.catalog', [
'data' => $movies,
'region' => $region,
'title' => $region->seo_title ?: $region->getTitle(),
'section_name' => "Phim quốc gia $region->name"
]);
}
public function getMovieOfActor(Request $request)
{
/** @var Actor */
$actor = Actor::fromCache()->find($request->actor ?: $request->id);
if (is_null($actor)) abort(404);
$actor->generateSeoTags();
$movies = $actor->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
return view('themes::themexingkong.catalog', [
'data' => $movies,
'person' => $actor,
'title' => $actor->getTitle(),
'section_name' => "Diễn viên $actor->name"
]);
}
public function getMovieOfDirector(Request $request)
{
/** @var Director */
$director = Director::fromCache()->find($request->director ?: $request->id);
if (is_null($director)) abort(404);
$director->generateSeoTags();
$movies = $director->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
return view('themes::themexingkong.catalog', [
'data' => $movies,
'person' => $director,
'title' => $director->getTitle(),
'section_name' => "Đạo diễn $director->name"
]);
}
public function getMovieOfTag(Request $request)
{
/** @var Tag */
$tag = Tag::fromCache()->find($request->tag ?: $request->id);
if (is_null($tag)) abort(404);
$tag->generateSeoTags();
$movies = $tag->movies()->orderBy('created_at', 'desc')->paginate(get_theme_option('per_page_limit'));
return view('themes::themexingkong.catalog', [
'data' => $movies,
'tag' => $tag,
'title' => $tag->getTitle(),
'section_name' => "Tags: $tag->name"
]);
}
public function getMovieOfType(Request $request)
{
/** @var Catalog */
$catalog = Catalog::fromCache()->find($request->type ?: $request->id);
if (is_null($catalog)) abort(404);
$catalog->generateSeoTags();
$cache_key = 'catalog:' . $catalog->id . ':page:' . ($request['page'] ?: 1);
$movies = Cache::get($cache_key);
if (is_null($movies)) {
$value = explode('|', trim($catalog->value));
[$relation_config, $field, $val, $sortKey, $alg] = array_merge($value, ['', 'is_copyright', 0, 'created_at', 'desc']);
$relation_config = explode(',', $relation_config);
[$relation_table, $relation_field, $relation_val] = array_merge($relation_config, ['', '', '']);
try {
$movies = \VsMov\Core\Models\Movie::when($relation_table, function ($query) use ($relation_table, $relation_field, $relation_val, $field, $val) {
$query->whereHas($relation_table, function ($rel) use ($relation_field, $relation_val, $field, $val) {
$rel->where($relation_field, $relation_val)->where(array_combine(explode(",", $field), explode(",", $val)));
});
})->when(!$relation_table, function ($query) use ($field, $val) {
$query->where(array_combine(explode(",", $field), explode(",", $val)));
})
->orderBy($sortKey, $alg)
->paginate($catalog->paginate);
Cache::put($cache_key, $movies, setting('site_cache_ttl', 5 * 60));
} catch (\Exception $e) {
}
}
return view('themes::themexingkong.catalog', [
'data' => $movies,
'section_name' => "Danh sách $catalog->name"
]);
}
public function reportEpisode(Request $request, $movie, $slug)
{
$movie = Movie::fromCache()->find($movie)->load('episodes');
$episode = $movie->episodes->when(request('id'), function ($collection) {
return $collection->where('id', request('id'));
})->firstWhere('slug', $slug);
$episode->update([
'report_message' => request('message', ''),
'has_report' => true
]);
return response([], 204);
}
public function rateMovie(Request $request, $movie)
{
$movie = Movie::fromCache()->find($movie);
$movie->refresh()->increment('rating_count', 1, [
'rating_star' => $movie->rating_star + ((int) request('rating') - $movie->rating_star) / ($movie->rating_count + 1)
]);
return response([], 204);
}
}

View File

@ -0,0 +1,229 @@
<?php
namespace VsMov\ThemeXingKong;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Cache;
class ThemeXingKongServiceProvider extends ServiceProvider
{
public function register()
{
$this->setupDefaultThemeCustomizer();
}
public function boot()
{
$this->loadViewsFrom(__DIR__ . '/../resources/views/', 'themes');
$this->publishes([
__DIR__ . '/../resources/assets' => public_path('themes/xingkong')
], 'xingkong-assets');
view()->composer('themes::themexingkong.*', function ($view) {
$view->with('menu', \VsMov\Core\Models\Menu::getTree());
});
view()->composer(['themes::themexingkong.inc.right_bar'], function ($view) {
$tops = Cache::remember('site.movies.tops', setting('site_cache_ttl', 5 * 60), function () {
$lists = preg_split('/[\n\r]+/', get_theme_option('hotest'));
$data = [];
foreach ($lists as $list) {
if (trim($list)) {
$list = explode('|', $list);
[$label, $relation, $field, $val, $sortKey, $alg, $limit] = array_merge($list, ['Phim hot', '', 'type', 'series', 'view_total', 'desc', 4]);
try {
$data[] = [
'label' => $label,
'data' => \VsMov\Core\Models\Movie::when($relation, function ($query) use ($relation, $field, $val) {
$query->whereHas($relation, function ($rel) use ($field, $val) {
$rel->where($field, $val);
});
})
->when(!$relation, function ($query) use ($field, $val) {
$query->where($field, $val);
})
->orderBy($sortKey, $alg)
->limit($limit)
->get(),
];
} catch (\Exception $e) {
# code
}
}
}
return $data;
});
$view->with('tops', $tops);
});
}
protected function setupDefaultThemeCustomizer()
{
config(['themes' => array_merge(config('themes', []), [
'xingkong' => [
'name' => 'Theme XingKong',
'author' => 'vsmov@gmail.com',
'package_name' => 'vsmov/theme-xingkong',
'publishes' => ['xingkong-assets'],
'preview_image' => '',
'options' => [
[
'name' => 'recommendations_limit',
'label' => 'Recommended movies limit',
'type' => 'number',
'value' => 10,
'wrapperAttributes' => [
'class' => 'form-group col-md-4',
],
'tab' => 'List'
],
[
'name' => 'per_page_limit',
'label' => 'Pages limit',
'type' => 'number',
'value' => 30,
'wrapperAttributes' => [
'class' => 'form-group col-md-4',
],
'tab' => 'List'
],
[
'name' => 'movie_related_limit',
'label' => 'Movies related limit',
'type' => 'number',
'value' => 12,
'wrapperAttributes' => [
'class' => 'form-group col-md-4',
],
'tab' => 'List'
],
[
'name' => 'latest',
'label' => 'Home Page',
'type' => 'code',
'hint' => 'display_label|display_description|relation|find_by_field|value|sort_by_field|sort_algo|limit|show_more_url|section_template(default|with_top)',
'value' => <<<EOT
Phim chiếu rạp mới||is_shown_in_theater|1|created_at|desc|12|/danh-sach/phim-chieu-rap|default
Phim bộ mới||type|series|updated_at|desc|10|/danh-sach/phim-bo|with_top
Phim lẻ mới||type|single|updated_at|desc|10|/danh-sach/phim-le|with_top
Phim hoạt hình mới|categories|slug|hoat-hinh|updated_at|desc|10|/the-loai/hoat-hinh|with_top
EOT,
'attributes' => [
'rows' => 5
],
'tab' => 'List'
],
[
'name' => 'hotest',
'label' => 'Danh sách hot',
'type' => 'code',
'hint' => 'Label|relation|find_by_field|value|sort_by_field|sort_algo|limit',
'value' => <<<EOT
Phim sắp chiếu||status|trailer|publish_year|desc|8
Top phim lẻ||type|single|view_week|desc|8
Top phim bộ||type|series|view_week|desc|8
EOT,
'attributes' => [
'rows' => 5
],
'tab' => 'List'
],
[
'name' => 'additional_css',
'label' => 'Additional CSS',
'type' => 'code',
'value' => "",
'tab' => 'Custom CSS'
],
[
'name' => 'body_attributes',
'label' => 'Body attributes',
'type' => 'text',
'value' => '',
'tab' => 'Custom CSS'
],
[
'name' => 'additional_header_js',
'label' => 'Header JS',
'type' => 'code',
'value' => "",
'tab' => 'Custom JS'
],
[
'name' => 'additional_body_js',
'label' => 'Body JS',
'type' => 'code',
'value' => "",
'tab' => 'Custom JS'
],
[
'name' => 'additional_footer_js',
'label' => 'Footer JS',
'type' => 'code',
'value' => "",
'tab' => 'Custom JS'
],
[
'name' => 'footer',
'label' => 'Footer',
'type' => 'code',
'value' => <<<EOT
<footer>
<div class="container">
<div class="row">
<div class="stui-foot clearfix">
<p class="text-center hidden-xs">
<a class="fed-font-xiv" href="#" target="_blank">Textlink</a>
<span class="fed-font-xiv"> - </span>
<a class="fed-font-xiv" href="#" target="_blank">Textlink</a>
<span class="fed-font-xiv fed-hide-xs"> - </span>
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
<span class="fed-font-xiv fed-hide-xs"> - </span>
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
<span class="fed-font-xiv fed-hide-xs"> - </span>
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
<span class="fed-font-xiv fed-hide-xs"> - </span>
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
<span class="fed-font-xiv fed-hide-xs"> - </span>
<a class="fed-font-xiv fed-hide-xs" href="#" target="_blank">Textlink</a>
</p>
</div>
<div class="stui-foot clearfix">
<div class="col-pd text-center hidden-xs">
Dữ liệu phim miễn phí vĩnh viễn. Cập nhật nhanh, chất lượng cao, ổn định lâu dài. Tốc độ phát cực nhanh với đường truyền băng thông cao, đảm bảo đáp ứng được lượng xem phim trực tuyến lớn. Đồng thời giúp nhà phát triển website phim giảm thiểu chi phí của các dịch vụ lưu trữ stream.
</div>
<p class="share bdsharebuttonbox text-center margin-0 hidden-sm hidden-xs"></p>
<p class="text-muted text-center visible-xs">Copyright © 2015-2024 <a href="/" target="_blank">VsMov</a>
</p>
</div>
</div>
</div>
</footer>
EOT,
'tab' => 'Custom HTML'
],
[
'name' => 'ads_header',
'label' => 'Ads header',
'type' => 'code',
'value' => <<<EOT
EOT,
'tab' => 'Ads'
],
[
'name' => 'ads_catfish',
'label' => 'Ads catfish',
'type' => 'code',
'value' => <<<EOT
EOT,
'tab' => 'Ads'
]
],
]
])]);
}
}

BIN
src/screenshot.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 615 KiB