feat: integrate Meting API and refactor api.php (#214)

add some music platforms, add netease-cloud-music cookies option.
Integrate Meting API into theme, now you can use aplayer play other
platform's music, refactor theme built-in api interface.
BREAKING CHANGE: refactor api.php, close #211
This commit is contained in:
Spirit 2020-04-06 23:35:23 +08:00 committed by GitHub
parent 689fc6319d
commit 9abded81ec
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 2447 additions and 668 deletions

View File

@ -148,11 +148,11 @@
<div class="show-hide-wrap"><button class="show-hide"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 32 32"><path d="M22 16l-10.105-10.6-1.895 1.987 8.211 8.613-8.211 8.612 1.895 1.988 8.211-8.613z"></path></svg></button></div>
</aside>
<?php endif; ?>
<?php if (akina_option('playlist_id', '')): ?>
<?php if (akina_option('aplayer_server') != 'off'): ?>
<div id="aplayer-float" style="z-index: 100;"
class="aplayer"
data-id="<?php echo akina_option('playlist_id', ''); ?>"
data-server="netease"
data-id="<?php echo akina_option('aplayer_playlistid', ''); ?>"
data-server="<?php echo akina_option('aplayer_server'); ?>"
data-type="playlist"
data-fixed="true"
data-theme="orange">

View File

@ -1,5 +1,18 @@
<?php
/**
* Classes
*/
include_once('classes/Aplayer.php');
include_once('classes/Bilibili.php');
include_once('classes/Cache.php');
include_once('classes/Images.php');
include_once('classes/QQ.php');
use Sakura\API\Images;
use Sakura\API\QQ;
use Sakura\API\Cache;
/**
* Router
*/
@ -36,63 +49,16 @@ add_action('rest_api_init', function () {
'methods' => 'POST',
'callback' => 'bgm_bilibili',
));
register_rest_route('sakura/v1', '/meting/aplayer', array(
'methods' => 'GET',
'callback' => 'meting_aplayer',
));
});
/**
* QQ info
* https://sakura.2heng.xin/wp-json/sakura/v1/qqinfo/json
*/
function get_qq_info(WP_REST_Request $request)
{
if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
$output = array(
'status' => 403,
'success' => false,
'message' => 'Unauthorized client.'
);
} elseif ($_GET['qq']) {
$qq = $_GET['qq'];
/**
* TODO: 设置host国外服务器默认解析的不是国内IP可能无法获取数据
* 182.254.92.32 r.qzone.qq.com
* 参考https://www.php.net/manual/zh/function.file-get-contents.php#108309
*/
$get_info = file_get_contents('http://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?get_nick=1&uins=' . $qq);
$get_info = mb_convert_encoding($get_info, "UTF-8", "GBK");
$name = json_decode(substr($get_info, 17, -1), true);
if ($name) {
$output = array(
'status' => 200,
'success' => true,
'message' => 'success',
'avatar' => 'https://q.qlogo.cn/headimg_dl?dst_uin=' . $qq . '&spec=100',
'name' => $name[$qq][6],
);
} else {
$output = array(
'status' => 404,
'success' => false,
'message' => 'QQ number not exist.'
);
}
} else {
$output = array(
'status' => 400,
'success' => false,
'message' => 'Bad Request'
);
}
$result = new WP_REST_Response($output, $output['status']);
$result->set_headers(array('Content-Type' => 'application/json'));
return $result;
}
/**
* Image uploader response
*/
function upload_image(WP_REST_Request $request)
{
function upload_image(WP_REST_Request $request) {
// see: https://developer.wordpress.org/rest-api/requests/
// handle file params $file === $_FILES
@ -114,19 +80,19 @@ function upload_image(WP_REST_Request $request)
$result->set_headers(array('Content-Type' => 'application/json'));
return $result;
}
$images = new \Sakura\API\Images();
switch (akina_option("img_upload_api")) {
case 'imgur':
$image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
$API_Request = Imgur_API($image);
$API_Request = $images->Imgur_API($image);
break;
case 'smms':
$image = $_FILES;
$API_Request = SMMS_API($image);
$API_Request = $images->SMMS_API($image);
break;
case 'chevereto':
$image = file_get_contents($_FILES["cmt_img_file"]["tmp_name"]);
$API_Request = Chevereto_API($image);
$API_Request = $images->Chevereto_API($image);
break;
}
@ -135,244 +101,13 @@ function upload_image(WP_REST_Request $request)
return $result;
}
/**
* Chevereto upload interface
*/
function Chevereto_API($image)
{
$upload_url = akina_option('cheverto_url') . '/api/1/upload';
$args = array(
'body' => array(
'source' => base64_encode($image),
'key' => akina_option('chevereto_api_key'),
),
);
$response = wp_remote_post($upload_url, $args);
$reply = json_decode($response["body"]);
if ($reply->status_txt == 'OK' && $reply->status_code == 200) {
$status = 200;
$success = true;
$message = "success";
$link = $reply->image->image->url;
$proxy = akina_option('cmt_image_proxy') . $link;
} else {
$status = $reply->status_code;
$success = false;
$message = $reply->error->message;
$link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$proxy = akina_option('cmt_image_proxy') . $link;
}
$output = array(
'status' => $status,
'success' => $success,
'message' => $message,
'link' => $link,
'proxy' => $proxy,
);
return $output;
}
/**
* Imgur upload interface
*/
function Imgur_API($image)
{
$client_id = akina_option('imgur_client_id');
$upload_url = akina_option('imgur_upload_image_proxy');
$args = array(
'headers' => array(
'Authorization' => 'Client-ID ' . $client_id,
),
'body' => array(
'image' => base64_encode($image),
),
);
$response = wp_remote_post($upload_url, $args);
$reply = json_decode($response["body"]);
if ($reply->success && $reply->status == 200) {
$status = 200;
$success = true;
$message = "success";
$link = $reply->data->link;
$proxy = akina_option('cmt_image_proxy') . $link;
} else {
$status = $reply->status;
$success = false;
$message = $reply->data->error;
$link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$proxy = akina_option('cmt_image_proxy') . $link;
}
$output = array(
'status' => $status,
'success' => $success,
'message' => $message,
'link' => $link,
'proxy' => $proxy,
);
return $output;
}
/**
* smms upload interface
*/
function SMMS_API($image)
{
$client_id = akina_option('smms_client_id');
$upload_url = "https://sm.ms/api/v2/upload";
$filename = $image['cmt_img_file']['name'];
$filedata = $image['cmt_img_file']['tmp_name'];
$Boundary = wp_generate_password();
$bits = file_get_contents($filedata);
$args = array(
"headers" => "Content-Type: multipart/form-data; boundary=$Boundary\r\n\r\nAuthorization: Basic $client_id\r\n\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97",
"body" => "--$Boundary\r\nContent-Disposition: form-data; name=\"smfile\"; filename=\"$filename\"\r\n\r\n$bits\r\n\r\n--$Boundary--"
);
$response = wp_remote_post($upload_url, $args);
$reply = json_decode($response["body"]);
if ($reply->success && $reply->code == 'success') {
$status = 200;
$success = true;
$message = $reply->message;
$link = $reply->data->url;
$proxy = akina_option('cmt_image_proxy') . $link;
} else if (preg_match("/Image upload repeated limit/i", $reply->message, $matches)) {
$status = 200; // sm.ms 接口不规范,建议检测到重复的情况下返回标准化的 code并单独把 url 放进一个字段
$success = true;
$message = $reply->message;
$link = str_replace('Image upload repeated limit, this image exists at: ', '', $reply->message);
$proxy = akina_option('cmt_image_proxy') . $link;
} else {
$status = 400;
$success = false;
$message = $reply->message;
$link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$proxy = akina_option('cmt_image_proxy') . $link;
}
$output = array(
'status' => $status,
'success' => $success,
'message' => $message,
'link' => $link,
'proxy' => $proxy,
);
return $output;
}
/*
* 定制实时搜索 rest api
* @rest api接口路径https://sakura.2heng.xin/wp-json/sakura/v1/cache_search/json
* @可在cache_search_json()函数末尾通过设置 HTTP header 控制 json 缓存时间
*/
function cache_search_json()
{
global $more;
$vowels = array("[", "{", "]", "}", "<", ">", "\r\n", "\r", "\n", "-", "'", '"', '`', " ", ":", ";", '\\', " ", "toc");
$regex = <<<EOS
/<\/?[a-zA-Z]+("[^"]*"|'[^']*'|[^'">])*>|begin[\S\s]*\/begin|hermit[\S\s]*\/hermit|img[\S\s]*\/img|{{.*?}}|:.*?:/m
EOS;
$more = 1;
$output = array();
$posts = new WP_Query('posts_per_page=-1&post_status=publish&post_type=post');
while ($posts->have_posts()): $posts->the_post();
$output[] = array(
"type" => "post",
"link" => get_permalink(),
"title" => get_the_title(),
"comments" => get_comments_number('0', '1', '%'),
"text" => str_replace($vowels, " ", preg_replace($regex, ' ', apply_filters( 'the_content', get_the_content())))
);
endwhile;
wp_reset_postdata();
$pages = new WP_Query('posts_per_page=-1&post_status=publish&post_type=page');
while ($pages->have_posts()): $pages->the_post();
$output[] = array(
"type" => "page",
"link" => get_permalink(),
"title" => get_the_title(),
"comments" => get_comments_number('0', '1', '%'),
"text" => str_replace($vowels, " ", preg_replace($regex, ' ', apply_filters( 'the_content', get_the_content())))
);
endwhile;
wp_reset_postdata();
$tags = get_tags();
foreach ($tags as $tag) {
$output[] = array(
"type" => "tag",
"link" => get_term_link($tag),
"title" => $tag->name,
"comments" => "",
"text" => ""
);
}
$categories = get_categories();
foreach ($categories as $category) {
$output[] = array(
"type" => "category",
"link" => get_term_link($category),
"title" => $category->name,
"comments" => "",
"text" => ""
);
}
if (akina_option('live_search_comment')) {
$comments = get_comments();
foreach ($comments as $comment) {
$is_private = get_comment_meta($comment->comment_ID, '_private', true);
$output[] = array(
"type" => "comment",
"link" => get_comment_link($comment),
"title" => get_the_title($comment->comment_post_ID),
"comments" => "",
"text" => $is_private ? ($comment->comment_author . ": " . __('The comment is private', 'sakura')) : str_replace($vowels, ' ', preg_replace($regex, ' ', $comment->comment_author . "" . $comment->comment_content))
);
}
}
$result = new WP_REST_Response($output, 200);
$result->set_headers(
array(
'Content-Type' => 'application/json',
'Cache-Control' => 'max-age=3600', // json 缓存控制
)
);
return $result;
}
/*
* 随机封面图 rest api
* @rest api接口路径https://sakura.2heng.xin/wp-json/sakura/v1/image/cover
*/
function cover_gallery() {
if(akina_option('cover_cdn_options')=="type_2"){
$img_array = glob(get_template_directory() . "/manifest/gallary/*.{gif,jpg,png}",GLOB_BRACE);
$img = array_rand($img_array);
$imgurl = trim($img_array[$img]);
$imgurl = str_replace(get_template_directory(), get_template_directory_uri(), $imgurl);
}elseif(akina_option('cover_cdn_options')=="type_3"){
$imgurl = akina_option('cover_cdn');
}else{
global $sakura_image_array;
$img_array = json_decode($sakura_image_array, true);
$img = array_rand($img_array);
$img_domain = akina_option('cover_cdn') ? akina_option('cover_cdn') : get_template_directory_uri();
if(strpos($_SERVER['HTTP_ACCEPT'], 'image/webp')) {
$imgurl = $img_domain . "/manifest/" . $img_array[$img]["webp"][0];
} else {
$imgurl = $img_domain . "/manifest/" . $img_array[$img]["jpeg"][0];
}
}
$imgurl = Images::cover_gallery();
$data = array('cover image');
$response = new WP_REST_Response($data);
$response->set_status(302);
@ -393,50 +128,76 @@ function feature_gallery() {
* @rest api接口路径https://sakura.2heng.xin/wp-json/sakura/v1/database/update
*/
function update_database() {
if(akina_option('cover_cdn_options')=="type_1"){
global $wpdb;
$sakura_table_name = $wpdb->base_prefix.'sakura';
$img_domain = akina_option('cover_cdn') ? akina_option('cover_cdn') : get_template_directory();
$manifest = file_get_contents($img_domain . "/manifest/manifest.json");
if($manifest) {
$manifest = array(
"mate_key" => "manifest_json",
"mate_value" => $manifest
);
$time = array(
"mate_key" => "json_time",
"mate_value" => date("Y-m-d H:i:s",time())
);
$wpdb->query("DELETE FROM $sakura_table_name WHERE `mate_key` ='manifest_json'");
$wpdb->query("DELETE FROM $sakura_table_name WHERE `mate_key` ='json_time'");
$wpdb->insert($sakura_table_name,$manifest);
$wpdb->insert($sakura_table_name,$time);
$output = "manifest.json has been stored into database.";
}else{
$output = "manifest.json not found, please ensure your url ($img_domain) is corrent.";
}
if (akina_option('cover_cdn_options') == "type_1") {
$output = Cache::update_database();
$result = new WP_REST_Response($output, 200);
return $result;
}else{
} else {
return new WP_REST_Response("Invalid access", 200);
}
}
/*
* 定制实时搜索 rest api
* @rest api接口路径https://sakura.2heng.xin/wp-json/sakura/v1/cache_search/json
* @可在cache_search_json()函数末尾通过设置 HTTP header 控制 json 缓存时间
*/
function cache_search_json() {
if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
$output = array(
'status' => 403,
'success' => false,
'message' => 'Unauthorized client.'
);
$result = new WP_REST_Response($output, 403);
} else {
$output = Cache::search_json();
$result = new WP_REST_Response($output, 200);
}
$result->set_headers(
array(
'Content-Type' => 'application/json',
'Cache-Control' => 'max-age=3600', // json 缓存控制
)
);
return $result;
}
/**
* QQ info
* https://sakura.2heng.xin/wp-json/sakura/v1/qqinfo/json
*/
function get_qq_info(WP_REST_Request $request) {
if (!check_ajax_referer('wp_rest', '_wpnonce', false)) {
$output = array(
'status' => 403,
'success' => false,
'message' => 'Unauthorized client.'
);
} elseif ($_GET['qq']) {
$qq = $_GET['qq'];
$output = QQ::get_qq_info($qq);
} else {
$output = array(
'status' => 400,
'success' => false,
'message' => 'Bad Request'
);
}
$result = new WP_REST_Response($output, $output['status']);
$result->set_headers(array('Content-Type' => 'application/json'));
return $result;
}
/**
* QQ头像链接解密
* https://sakura.2heng.xin/wp-json/sakura/v1/qqinfo/avatar
*/
function get_qq_avatar(){
global $sakura_privkey;
$encrypted=$_GET["qq"];
if(isset($encrypted)){
$iv = str_repeat($sakura_privkey, 2);
$encrypted = base64_decode(urldecode($encrypted));
$qq_number = openssl_decrypt($encrypted, 'aes-128-cbc', $sakura_privkey, 0, $iv);
preg_match('/^\d{3,}$/', $qq_number, $matches);
$imgurl='https://q2.qlogo.cn/headimg_dl?dst_uin='.$matches[0].'&spec=100';
if(akina_option('qq_avatar_link')=='type_2'){
function get_qq_avatar() {
$encrypted = $_GET["qq"];
$imgurl = QQ::get_qq_avatar($encrypted);
if (akina_option('qq_avatar_link') == 'type_2') {
$imgdata = file_get_contents($imgurl);
$response = new WP_REST_Response();
$response->set_headers(array(
@ -444,71 +205,57 @@ function get_qq_avatar(){
'Cache-Control' => 'max-age=86400'
));
echo $imgdata;
return $response;
}else{
} else {
$response = new WP_REST_Response();
$response->set_status(301);
$response->header('Location', $imgurl);
}
return $response;
}
}
}
function get_the_bgm_items($page = 1){
$cookies = akina_option('bilibili_cookie');
$url = 'https://api.bilibili.com/x/space/bangumi/follow/list?type=1&pn=' . $page . '&ps=15&follow_status=0&vmid=' . akina_option('bilibili_id');
$args = array(
'headers' => array(
'Cookie' => $cookies,
'Host' => 'api.bilibili.com',
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97'
)
function bgm_bilibili() {
if (!check_ajax_referer('wp_rest', 'r', false)) {
$output = array(
'status' => 403,
'success' => false,
'message' => 'Unauthorized client.'
);
$response = wp_remote_get($url, $args);
$bgmdata = json_decode($response["body"])->data;
return json_encode($bgmdata);
}
function get_bgm_items($page = 1){
$bgm = json_decode(get_the_bgm_items($page),true);
$totalpage = $bgm["total"] / 15;
if($totalpage - $page < 0){
$next = '<span>共追番' . $bgm["total"] .'部,继续加油吧!٩(ˊᗜˋ*)و</span>';
}else{
$next = '<a class="bangumi-next" href="' . rest_url('sakura/v1/bangumi/bilibili') . '?page=' . ++$page . '"><i class="fa fa-bolt" aria-hidden="true"></i> NEXT </a>';
}
$lists = $bgm["list"];
foreach ((array)$lists as $list) {
if(preg_match('/看完/m',$list["progress"], $matches_finish)){
$percent = 100;
}else{
preg_match('/第(\d+)./m',$list['progress'], $matches_progress);
preg_match('/第(\d+)./m',$list["new_ep"]['index_show'], $matches_new);
$progress = is_numeric($matches_progress[1]) ? $matches_progress[1] : 0;
$total = is_numeric($matches_new[1]) ? $matches_new[1] : $list['total_count'];
$percent = $progress / $total * 100;
}
$html .= '<div class="column">
<a class="bangumi-item" href="https://bangumi.bilibili.com/anime/' . $list['season_id'] . '/" target="_blank" rel="nofollow">
<img class="bangumi-image" src="' . str_replace('http://', 'https://', $list['cover']) . '"/>
<div class="bangumi-info">
<h3 class="bangumi-title" title="' . $list['title'] . '">' . $list['title'] . '</h2>
<div class="bangumi-summary"> '. $list['evaluate'] .' </div>
<div class="bangumi-status">
<div class="bangumi-status-bar" style="width: '. $percent .'%"></div>
<p>' . $list['new_ep']['index_show'] . '</p>
</div>
</div>
</a>
</div>';
}
$html .= '</div><br><div id="bangumi-pagination">' . $next .'</div>';
return $html;
}
function bgm_bilibili(){
$response = new WP_REST_Response($output, 403);
} else {
$page = $_GET["page"] ?: 2;
$html = preg_replace("/\s+|\n+|\r/", ' ', get_bgm_items($page));
return $response = new WP_REST_Response($html,200);
$bgm = new \Sakura\API\Bilibili();
$html = preg_replace("/\s+|\n+|\r/", ' ', $bgm->get_bgm_items($page));
$response = new WP_REST_Response($html, 200);
}
return $response;
}
function meting_aplayer() {
$type = $_GET['type'];
$id = $_GET['id'];
if (check_ajax_referer('wp_rest', '_wpnonce', false) || !wp_verify_nonce($_GET['meting_pnonce'], $type . '#:' . $id)) {
$Meting_API = new \Sakura\API\Aplayer();
$data = $Meting_API->get_data($type, $id);
if ($type === 'playlist') {
$response = new WP_REST_Response($data, 200);
$response->set_headers(array('cache-control' => 'max-age=3600'));
} elseif ($type === 'lyric') {
$response = new WP_REST_Response();
$response->set_headers(array('cache-control' => 'max-age=3600'));
echo $data;
} else {
$data = str_replace('http://', 'https://', $data);
$response = new WP_REST_Response();
$response->set_status(301);
$response->header('Location', $data);
}
} else {
$output = array(
'status' => 403,
'success' => false,
'message' => 'Unauthorized client.'
);
$response = new WP_REST_Response($output, 403);
}
return $response;
}

136
inc/classes/Aplayer.php Normal file
View File

@ -0,0 +1,136 @@
<?php
namespace Sakura\API;
class Aplayer
{
public $server;
public $playlist_id;
private $cookies;
public $api_url;
public function __construct() {
$this->server = akina_option('aplayer_server');
$this->playlist_id = akina_option('aplayer_playlistid');
$this->cookies = akina_option('aplayer_cookie');
$this->api_url = rest_url('sakura/v1/meting/aplayer');
require('Meting.php');
}
public function get_data($type, $id) {
$server = $this->server;
$cookies = $this->cookies;
$playlist_id = $this->playlist_id;
$api = new \Sakura\API\Meting($server);
if (!empty($cookies) && $server === "netease") $api->cookie($cookies);
switch ($type) {
case 'song':
$data = $api->format(true)->song($id);
$data = json_decode($data, true)["url"];
break;
// case 'album':
// $data = $api->format(true)->album($id);
// $data=json_decode($data, true)["url"];
// break;
case 'playlist':
$data = $api->format(true)->playlist($playlist_id);
$data = $this->format_playlist($data);
break;
case 'lyric':
$data = $api->format(true)->lyric($id);
$data = $this->format_lyric($data);
break;
case 'pic':
$data = $api->format(true)->pic($id);
$data = json_decode($data, true)["url"];
break;
// case 'search':
// $data = $api->format(true)->search($id);
// $data=json_decode($data, true)["url"];
// break;
default:
$data = $api->format(true)->url($id);
$data = json_decode($data, true)["url"];
break;
}
return $data;
}
private function format_playlist($data) {
$server = $this->server;
$api_url = $this->api_url;
$data = json_decode($data);
$playlist = array();
foreach ((array)$data as $value) {
$name = $value->name;
$artists = implode(" / ", (array)$value->artist);
$mp3_url = "$api_url?server=$server&type=url&id=" . $value->url_id . '&meting_nonce=' . wp_create_nonce('url#:' . $value->url_id);
$cover = "$api_url?server=$server&type=pic&id=" . $value->pic_id . '&meting_nonce=' . wp_create_nonce('pic#:' . $value->url_id);
$lyric = "$api_url?server=$server&type=lyric&id=" . $value->lyric_id . '&meting_nonce=' . wp_create_nonce('lyric#:' . $value->url_id);
$playlist[] = array(
"name" => $name,
"artist" => $artists,
"url" => $mp3_url,
"cover" => $cover,
"lrc" => $lyric
);
}
return $playlist;
}
private function format_lyric($data) {
$server = $this->server;
$data = json_decode($data, true);
$data = $this->lrctran($data['lyric'], $data['tlyric']);
if (empty($data)) {
$data = "[00:00.000]此歌曲暂无歌词,请您欣赏";
}
if ($server === 'tencent') {
$data = html_entity_decode($data, ENT_QUOTES | ENT_HTML5);
}
return $data;
}
private function lrctran($lyric, $tlyric) {
$lyric = $this->lrctrim($lyric);
$tlyric = $this->lrctrim($tlyric);
$len1 = count($lyric);
$len2 = count($tlyric);
$result = "";
for ($i = 0, $j = 0; $i < $len1 && $j < $len2; $i++) {
while ($lyric[$i][0] > $tlyric[$j][0] && $j + 1 < $len2) {
$j++;
}
if ($lyric[$i][0] == $tlyric[$j][0]) {
$tlyric[$j][2] = str_replace('/', '', $tlyric[$j][2]);
if (!empty($tlyric[$j][2])) {
$lyric[$i][2] .= " ({$tlyric[$j][2]})";
}
$j++;
}
}
for ($i = 0; $i < $len1; $i++) {
$t = $lyric[$i][0];
$result .= sprintf("[%02d:%02d.%03d]%s\n", $t / 60000, $t % 60000 / 1000, $t % 1000, $lyric[$i][2]);
}
return $result;
}
private function lrctrim($lyrics) {
$lyrics = explode("\n", $lyrics);
$data = array();
foreach ($lyrics as $key => $lyric) {
preg_match('/\[(\d{2}):(\d{2}[\.:]?\d*)]/', $lyric, $lrcTimes);
$lrcText = preg_replace('/\[(\d{2}):(\d{2}[\.:]?\d*)]/', '', $lyric);
if (empty($lrcTimes)) {
continue;
}
$lrcTimes = intval($lrcTimes[1]) * 60000 + intval(floatval($lrcTimes[2]) * 1000);
$lrcText = preg_replace('/\s\s+/', ' ', $lrcText);
$lrcText = trim($lrcText);
$data[] = array($lrcTimes, $key, $lrcText);
}
sort($data);
return $data;
}
}

68
inc/classes/Bilibili.php Normal file
View File

@ -0,0 +1,68 @@
<?php
namespace Sakura\API;
class Bilibili
{
private $uid;
private $cookies;
public function __construct() {
$this->uid = akina_option('bilibili_id');
$this->cookies = akina_option('bilibili_cookie');
}
public function get_the_bgm_items($page = 1) {
$uid = $this->uid;
$cookies = $this->cookies;
$url = 'https://api.bilibili.com/x/space/bangumi/follow/list?type=1&pn=' . $page . '&ps=15&follow_status=0&vmid=' . $uid;
$args = array(
'headers' => array(
'Cookie' => $cookies,
'Host' => 'api.bilibili.com',
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97'
)
);
$response = wp_remote_get($url, $args);
$bgmdata = json_decode($response["body"])->data;
return json_encode($bgmdata);
}
public function get_bgm_items($page = 1) {
$bgm = json_decode($this->get_the_bgm_items($page), true);
$totalpage = $bgm["total"] / 15;
if ($totalpage - $page < 0) {
$next = '<span>共追番' . $bgm["total"] . '部,继续加油吧!٩(ˊᗜˋ*)و</span>';
} else {
$next = '<a class="bangumi-next" href="' . rest_url('sakura/v1/bangumi/bilibili') . '?page=' . ++$page . '"><i class="fa fa-bolt" aria-hidden="true"></i> NEXT </a>';
}
$lists = $bgm["list"];
$html = "";
foreach ((array)$lists as $list) {
if (preg_match('/看完/m', $list["progress"], $matches_finish)) {
$percent = 100;
} else {
preg_match('/第(\d+)./m', $list['progress'], $matches_progress);
preg_match('/第(\d+)./m', $list["new_ep"]['index_show'], $matches_new);
$progress = is_numeric($matches_progress[1]) ? $matches_progress[1] : 0;
$total = is_numeric($matches_new[1]) ? $matches_new[1] : $list['total_count'];
$percent = $progress / $total * 100;
}
$html .= '<div class="column">
<a class="bangumi-item" href="https://bangumi.bilibili.com/anime/' . $list['season_id'] . '/" target="_blank" rel="nofollow">
<img class="bangumi-image" src="' . str_replace('http://', 'https://', $list['cover']) . '"/>
<div class="bangumi-info">
<h3 class="bangumi-title" title="' . $list['title'] . '">' . $list['title'] . '</h2>
<div class="bangumi-summary"> ' . $list['evaluate'] . ' </div>
<div class="bangumi-status">
<div class="bangumi-status-bar" style="width: ' . $percent . '%"></div>
<p>' . $list['new_ep']['index_show'] . '</p>
</div>
</div>
</a>
</div>';
}
$html .= '</div><br><div id="bangumi-pagination">' . $next . '</div>';
return $html;
}
}

103
inc/classes/Cache.php Normal file
View File

@ -0,0 +1,103 @@
<?php
namespace Sakura\API;
class Cache
{
public static function search_json() {
global $more;
$vowels = array("[", "{", "]", "}", "<", ">", "\r\n", "\r", "\n", "-", "'", '"', '`', " ", ":", ";", '\\', " ", "toc");
$regex = <<<EOS
/<\/?[a-zA-Z]+("[^"]*"|'[^']*'|[^'">])*>|begin[\S\s]*\/begin|hermit[\S\s]*\/hermit|img[\S\s]*\/img|{{.*?}}|:.*?:/m
EOS;
$more = 1;
$output = array();
$posts = new \WP_Query('posts_per_page=-1&post_status=publish&post_type=post');
while ($posts->have_posts()): $posts->the_post();
$output[] = array(
"type" => "post",
"link" => get_permalink(),
"title" => get_the_title(),
"comments" => get_comments_number('0', '1', '%'),
"text" => str_replace($vowels, " ", preg_replace($regex, ' ', apply_filters('the_content', get_the_content())))
);
endwhile;
wp_reset_postdata();
$pages = new \WP_Query('posts_per_page=-1&post_status=publish&post_type=page');
while ($pages->have_posts()): $pages->the_post();
$output[] = array(
"type" => "page",
"link" => get_permalink(),
"title" => get_the_title(),
"comments" => get_comments_number('0', '1', '%'),
"text" => str_replace($vowels, " ", preg_replace($regex, ' ', apply_filters('the_content', get_the_content())))
);
endwhile;
wp_reset_postdata();
$tags = get_tags();
foreach ($tags as $tag) {
$output[] = array(
"type" => "tag",
"link" => get_term_link($tag),
"title" => $tag->name,
"comments" => "",
"text" => ""
);
}
$categories = get_categories();
foreach ($categories as $category) {
$output[] = array(
"type" => "category",
"link" => get_term_link($category),
"title" => $category->name,
"comments" => "",
"text" => ""
);
}
if (akina_option('live_search_comment')) {
$comments = get_comments();
foreach ($comments as $comment) {
$is_private = get_comment_meta($comment->comment_ID, '_private', true);
$output[] = array(
"type" => "comment",
"link" => get_comment_link($comment),
"title" => get_the_title($comment->comment_post_ID),
"comments" => "",
"text" => $is_private ? ($comment->comment_author . ": " . __('The comment is private', 'sakura')) : str_replace($vowels, ' ', preg_replace($regex, ' ', $comment->comment_author . "" . $comment->comment_content))
);
}
}
return $output;
}
public static function update_database() {
global $wpdb;
$sakura_table_name = $wpdb->base_prefix . 'sakura';
$img_domain = akina_option('cover_cdn') ? akina_option('cover_cdn') : get_template_directory();
$manifest = file_get_contents($img_domain . "/manifest/manifest.json");
if ($manifest) {
$manifest = array(
"mate_key" => "manifest_json",
"mate_value" => $manifest
);
$time = array(
"mate_key" => "json_time",
"mate_value" => date("Y-m-d H:i:s", time())
);
$wpdb->query("DELETE FROM $sakura_table_name WHERE `mate_key` ='manifest_json'");
$wpdb->query("DELETE FROM $sakura_table_name WHERE `mate_key` ='json_time'");
$wpdb->insert($sakura_table_name, $manifest);
$wpdb->insert($sakura_table_name, $time);
$output = "manifest.json has been stored into database.";
} else {
$output = "manifest.json not found, please ensure your url ($img_domain) is corrent.";
}
return $output;
}
}

165
inc/classes/Images.php Normal file
View File

@ -0,0 +1,165 @@
<?php
namespace Sakura\API;
class Images
{
private $chevereto_api_key;
private $imgur_client_id;
private $smms_client_id;
public function __construct() {
$this->chevereto_api_key = akina_option('chevereto_api_key');
$this->imgur_client_id = akina_option('imgur_client_id');
$this->smms_client_id = akina_option('smms_client_id');
}
/**
* Chevereto upload interface
*/
public function Chevereto_API($image) {
$upload_url = akina_option('cheverto_url') . '/api/1/upload';
$args = array(
'body' => array(
'source' => base64_encode($image),
'key' => $this->chevereto_api_key,
),
);
$response = wp_remote_post($upload_url, $args);
$reply = json_decode($response["body"]);
if ($reply->status_txt == 'OK' && $reply->status_code == 200) {
$status = 200;
$success = true;
$message = "success";
$link = $reply->image->image->url;
$proxy = akina_option('cmt_image_proxy') . $link;
} else {
$status = $reply->status_code;
$success = false;
$message = $reply->error->message;
$link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$proxy = akina_option('cmt_image_proxy') . $link;
}
$output = array(
'status' => $status,
'success' => $success,
'message' => $message,
'link' => $link,
'proxy' => $proxy,
);
return $output;
}
/**
* Imgur upload interface
*/
public function Imgur_API($image) {
$upload_url = akina_option('imgur_upload_image_proxy');
$args = array(
'headers' => array(
'Authorization' => 'Client-ID ' . $this->imgur_client_id,
),
'body' => array(
'image' => base64_encode($image),
),
);
$response = wp_remote_post($upload_url, $args);
$reply = json_decode($response["body"]);
if ($reply->success && $reply->status == 200) {
$status = 200;
$success = true;
$message = "success";
$link = $reply->data->link;
$proxy = akina_option('cmt_image_proxy') . $link;
} else {
$status = $reply->status;
$success = false;
$message = $reply->data->error;
$link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$proxy = akina_option('cmt_image_proxy') . $link;
}
$output = array(
'status' => $status,
'success' => $success,
'message' => $message,
'link' => $link,
'proxy' => $proxy,
);
return $output;
}
/**
* smms upload interface
*/
public function SMMS_API($image) {
$client_id = $this->smms_client_id;
$upload_url = "https://sm.ms/api/v2/upload";
$filename = $image['cmt_img_file']['name'];
$filedata = $image['cmt_img_file']['tmp_name'];
$Boundary = wp_generate_password();
$bits = file_get_contents($filedata);
$args = array(
"headers" => "Content-Type: multipart/form-data; boundary=$Boundary\r\n\r\nAuthorization: Basic $client_id\r\n\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97",
"body" => "--$Boundary\r\nContent-Disposition: form-data; name=\"smfile\"; filename=\"$filename\"\r\n\r\n$bits\r\n\r\n--$Boundary--"
);
$response = wp_remote_post($upload_url, $args);
$reply = json_decode($response["body"]);
if ($reply->success && $reply->code == 'success') {
$status = 200;
$success = true;
$message = $reply->message;
$link = $reply->data->url;
$proxy = akina_option('cmt_image_proxy') . $link;
} else if (preg_match("/Image upload repeated limit/i", $reply->message, $matches)) {
$status = 200; // sm.ms 接口不规范,建议检测到重复的情况下返回标准化的 code并单独把 url 放进一个字段
$success = true;
$message = $reply->message;
$link = str_replace('Image upload repeated limit, this image exists at: ', '', $reply->message);
$proxy = akina_option('cmt_image_proxy') . $link;
} else {
$status = 400;
$success = false;
$message = $reply->message;
$link = 'https://view.moezx.cc/images/2019/10/28/default_d_h_large.gif';
$proxy = akina_option('cmt_image_proxy') . $link;
}
$output = array(
'status' => $status,
'success' => $success,
'message' => $message,
'link' => $link,
'proxy' => $proxy,
);
return $output;
}
public static function cover_gallery() {
if (akina_option('cover_cdn_options') == "type_2") {
$img_array = glob(get_template_directory() . "/manifest/gallary/*.{gif,jpg,png}", GLOB_BRACE);
$img = array_rand($img_array);
$imgurl = trim($img_array[$img]);
$imgurl = str_replace(get_template_directory(), get_template_directory_uri(), $imgurl);
} elseif (akina_option('cover_cdn_options') == "type_3") {
$imgurl = akina_option('cover_cdn');
} else {
global $sakura_image_array;
$img_array = json_decode($sakura_image_array, true);
$img = array_rand($img_array);
$img_domain = akina_option('cover_cdn') ? akina_option('cover_cdn') : get_template_directory_uri();
if (strpos($_SERVER['HTTP_ACCEPT'], 'image/webp')) {
$imgurl = $img_domain . "/manifest/" . $img_array[$img]["webp"][0];
} else {
$imgurl = $img_domain . "/manifest/" . $img_array[$img]["jpeg"][0];
}
}
return $imgurl;
}
}

1365
inc/classes/Meting.php Executable file

File diff suppressed because it is too large Load Diff

40
inc/classes/QQ.php Normal file
View File

@ -0,0 +1,40 @@
<?php
namespace Sakura\API;
class QQ
{
public static function get_qq_info($qq) {
$get_info = file_get_contents('http://r.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?get_nick=1&uins=' . $qq);
$get_info = mb_convert_encoding($get_info, "UTF-8", "GBK");
$name = json_decode(substr($get_info, 17, -1), true);
if ($name) {
$output = array(
'status' => 200,
'success' => true,
'message' => 'success',
'avatar' => 'https://q.qlogo.cn/headimg_dl?dst_uin=' . $qq . '&spec=100',
'name' => $name[$qq][6],
);
} else {
$output = array(
'status' => 404,
'success' => false,
'message' => 'QQ number not exist.'
);
}
return $output;
}
public static function get_qq_avatar($encrypted) {
global $sakura_privkey;
if (isset($encrypted)) {
$iv = str_repeat($sakura_privkey, 2);
$encrypted = base64_decode(urldecode($encrypted));
$qq_number = openssl_decrypt($encrypted, 'aes-128-cbc', $sakura_privkey, 0, $iv);
preg_match('/^\d{3,}$/', $qq_number, $matches);
$imgurl = 'https://q2.qlogo.cn/headimg_dl?dst_uin=' . $matches[0] . '&spec=100';
return $imgurl;
}
}
}

View File

@ -67,8 +67,9 @@ mashiro_option.jsdelivr_css_src = "<?php echo get_template_directory_uri() ?>/cd
<?php } else { ?>
mashiro_option.jsdelivr_css_src = "https://cdn.jsdelivr.net/gh/mashirozx/Sakura@<?php echo SAKURA_VERSION; ?>/cdn/css/lib.min.css";
<?php } ?>
<?php if (akina_option('playlist_id', '')): ?>
<?php if (akina_option('aplayer_server') != 'off'): ?>
mashiro_option.float_player_on = true;
mashiro_option.meting_api_url = "<?php echo rest_url('sakura/v1/meting/aplayer'); ?>";
<?php endif; ?>
mashiro_option.cover_api = "<?php echo rest_url('sakura/v1/image/cover'); ?>";

View File

@ -819,7 +819,7 @@ if (mashiro_option.float_player_on) {
}
});
}
var b = 'https://api.i-meto.com/meting/api?server=:server&type=:type&id=:id&r=:r';
var b = mashiro_option.meting_api_url + '?server=:server&type=:type&id=:id&_wpnonce=' + Poi.nonce;
'undefined' != typeof meting_api && (b = meting_api);
for (var f = 0; f < aplayers.length; f++) try {
aplayers[f].destroy()
@ -832,7 +832,7 @@ if (mashiro_option.float_player_on) {
f = d.dataset.id;
if (f) {
var g = d.dataset.api || b;
g = g.replace(':server', d.dataset.server), g = g.replace(':type', d.dataset.type), g = g.replace(':id', d.dataset.id), g = g.replace(':auth', d.dataset.auth), g = g.replace(':r', Math.random());
g = g.replace(':server', d.dataset.server), g = g.replace(':type', d.dataset.type), g = g.replace(':id', d.dataset.id);
var h = new XMLHttpRequest;
h.onreadystatechange = function () {
if (4 === h.readyState && (200 <= h.status && 300 > h.status || 304 === h.status)) {
@ -997,7 +997,7 @@ function load_bangumi() {
$('body').on('click', '#bangumi-pagination a', function () {
$("#bangumi-pagination a").addClass("loading").text("");
var xhr = new XMLHttpRequest();
xhr.open('POST', this.href, true);
xhr.open('POST', this.href + "&_wpnonce=" + Poi.nonce, true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4 && xhr.status == 200) {
var html = JSON.parse(xhr.responseText);
@ -1396,7 +1396,7 @@ var home = location.href,
$('html').css('overflow-y', 'hidden');
if (mashiro_option.live_search) {
var QueryStorage = [];
search_a(Poi.api + "sakura/v1/cache_search/json");
search_a(Poi.api + "sakura/v1/cache_search/json?_wpnonce=" + Poi.nonce);
var otxt = addComment.I("search-input"),
list = addComment.I("PostlistBox"),

Binary file not shown.

View File

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Sakura\n"
"POT-Creation-Date: 2020-04-05 11:52+0800\n"
"PO-Revision-Date: 2020-04-05 11:52+0800\n"
"POT-Creation-Date: 2020-04-06 17:56+0800\n"
"PO-Revision-Date: 2020-04-06 17:56+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en_US\n"
@ -222,10 +222,6 @@ msgstr ""
msgid "page %s "
msgstr ""
#: inc/api.php:337 inc/theme_plus.php:727
msgid "The comment is private"
msgstr ""
#: inc/categories-images.php:45 inc/categories-images.php:66
msgid "category/tag image"
msgstr ""
@ -247,6 +243,10 @@ msgstr ""
msgid "no image"
msgstr ""
#: inc/classes/Cache.php:70 inc/theme_plus.php:727
msgid "The comment is private"
msgstr ""
#: inc/options-framework.php:182 inc/options-framework.php:183
#: inc/options-framework.php:412
msgid "Sakura Options"
@ -923,7 +923,7 @@ msgstr ""
msgid "Whether to turn on the top-feature"
msgstr ""
#: options.php:446 options.php:1104
#: options.php:446 options.php:1126
msgid "Default on"
msgstr ""
@ -1380,198 +1380,239 @@ msgid "Footer float music player"
msgstr ""
#: options.php:926
msgid ""
"If you don't need the player just leave it blank.Fill in the \"song list\" "
"ID of Netease Cloud Music, eg: https://music.163.com/#/playlist?"
"id=2288037900 The ID is 2288037900"
msgid "Choose which platform you'll use."
msgstr ""
#: options.php:931
msgid "Netease Cloud Music (default)"
msgstr ""
#: options.php:932
msgid "Version Control"
msgid "Xiami Music"
msgstr ""
#: options.php:933
msgid "KuGou Music"
msgstr ""
#: options.php:934
msgid "Baidu Music"
msgstr ""
#: options.php:935
msgid "QQ Music (may fail) "
msgstr ""
#: options.php:936
msgid "Off"
msgstr ""
#: options.php:940
msgid "Song list ID"
msgstr ""
#: options.php:941
msgid ""
"Fill in the \"song list\" ID, eg: https://music.163.com/#/playlist?"
"id=2288037900 The ID is 2288037900"
msgstr ""
#: options.php:947
msgid "Netease Cloud Music cookie"
msgstr ""
#: options.php:948
msgid ""
"For Netease Cloud Music, fill in your vip account's cookies if you want to "
"play special tracks.<b>If you don't know what does mean, left it blank.</b>"
msgstr ""
#: options.php:954
msgid "Version Control"
msgstr ""
#: options.php:955
msgid ""
"Used to update frontend cookies and browser caches, any string can be used"
msgstr ""
#: options.php:939
#: options.php:961
msgid "Enable PJAX (recommand on)"
msgstr ""
#: options.php:940
#: options.php:962
msgid "The principle is the same as Ajax"
msgstr ""
#: options.php:946
#: options.php:968
msgid "Enable NProgress progress bar"
msgstr ""
#: options.php:947 options.php:954 options.php:961
#: options.php:969 options.php:976 options.php:983
msgid "Default off, check on"
msgstr ""
#: options.php:953
#: options.php:975
msgid "Enable sidebar widget"
msgstr ""
#: options.php:960
#: options.php:982
msgid "Enable Announcement"
msgstr ""
#: options.php:967
#: options.php:989
msgid "Announcement content"
msgstr ""
#: options.php:968
#: options.php:990
msgid ""
"Announcement content, the text exceeds 142 bytes will be scrolled display "
"(mobile device is invalid)"
msgstr ""
#: options.php:973
#: options.php:995
msgid "Bilibili UID"
msgstr ""
#: options.php:974
#: options.php:996
msgid ""
"Fill in your UID, eg.https://space.bilibili.com/13972644/, only fill in with "
"the number part."
msgstr ""
#: options.php:980
#: options.php:1002
msgid "Bilibili Cookie"
msgstr ""
#: options.php:981
#: options.php:1003
msgid ""
"Fill in your Cookies, go to your bilibili homepage, you can get cookies in "
"brownser network pannel with pressing F12. If left this blank, you'll not "
"get the progress."
msgstr ""
#: options.php:986
#: options.php:1008
msgid "The categories of articles that don't not show on homepage"
msgstr ""
#: options.php:987 options.php:994
#: options.php:1009 options.php:1016
msgid "Fill in category ID, multiple IDs are divided by a comma \",\""
msgstr ""
#: options.php:993
#: options.php:1015
msgid "Images category"
msgstr ""
#: options.php:1000
#: options.php:1022
msgid "Statistics Interface"
msgstr ""
#: options.php:1005
#: options.php:1027
msgid ""
"WP-Statistics plugin (Professional statistics, can exclude invalid access)"
msgstr ""
#: options.php:1006
#: options.php:1028
msgid "Theme built-in (simple statistics, calculate each page access request)"
msgstr ""
#: options.php:1010
#: options.php:1032
msgid "Statistical data display format"
msgstr ""
#: options.php:1015
#: options.php:1037
msgid "23333 Views (default)"
msgstr ""
#: options.php:1016
#: options.php:1038
msgid "23,333 Views (britain)"
msgstr ""
#: options.php:1017
#: options.php:1039
msgid "23 333 Views (french)"
msgstr ""
#: options.php:1018
#: options.php:1040
msgid "23k Views (chinese)"
msgstr ""
#: options.php:1022
#: options.php:1044
msgid "Gravatar avatar proxy"
msgstr ""
#: options.php:1023
#: options.php:1045
msgid ""
"A front-ed proxy for Gravatar, eg. gravatar.2heng.xin/avatar . Leave it "
"blank if you do not need."
msgstr ""
#: options.php:1029
#: options.php:1051
msgid "Comment image upload API"
msgstr ""
#: options.php:1034
#: options.php:1056
msgid "Imgur (https://imgur.com)"
msgstr ""
#: options.php:1035
#: options.php:1057
msgid "SM.MS (https://sm.ms)"
msgstr ""
#: options.php:1036
#: options.php:1058
msgid "Chevereto (https://chevereto.com)"
msgstr ""
#: options.php:1040
#: options.php:1062
msgid "Imgur Client ID"
msgstr ""
#: options.php:1041
#: options.php:1063
msgid ""
"Register your application <a href=\"https://api.imgur.com/oauth2/addclient"
"\">here</a>, note we only need the Client ID here."
msgstr ""
#: options.php:1047
#: options.php:1069
msgid "SM.MS Secret Token"
msgstr ""
#: options.php:1048
#: options.php:1070
msgid ""
"Register your application <a href=\"https://sm.ms/home/apitoken\">here</a>."
msgstr ""
#: options.php:1054
#: options.php:1076
msgid "Chevereto API v1 key"
msgstr ""
#: options.php:1055
#: options.php:1077
msgid "Get your API key here: "
msgstr ""
#: options.php:1061
#: options.php:1083
msgid "Chevereto URL"
msgstr ""
#: options.php:1062
#: options.php:1084
msgid ""
"Your Chevereto homepage url, no slash in the end, eg. https://your.cherverto."
"com"
msgstr ""
#: options.php:1068
#: options.php:1090
msgid "Comment images proxy"
msgstr ""
#: options.php:1069
#: options.php:1091
msgid ""
"A front-ed proxy for the uploaded images. Leave it blank if you do not need."
msgstr ""
#: options.php:1075
#: options.php:1097
msgid "Imgur upload proxy"
msgstr ""
#: options.php:1076
#: options.php:1098
msgid ""
"A back-ed proxy to upload images. You may set a self hosted proxy with "
"Nginx, following my <a href=\"https://2heng.xin/2018/06/06/javascript-upload-"
@ -1581,151 +1622,151 @@ msgid ""
"a>】"
msgstr ""
#: options.php:1082
#: options.php:1104
msgid "Enable live search"
msgstr ""
#: options.php:1083
#: options.php:1105
msgid ""
"Real-time search in the foreground, call the Rest API to update the cache "
"every hour, you can manually set the cache time in api.php"
msgstr ""
#: options.php:1089
#: options.php:1111
msgid "Include comments in live search"
msgstr ""
#: options.php:1090
#: options.php:1112
msgid ""
"Search for comments in real-time search (not recommended if there are too "
"many comments on the site)"
msgstr ""
#: options.php:1096
#: options.php:1118
msgid "Enable baguetteBox"
msgstr ""
#: options.php:1097
#: options.php:1119
msgid ""
"Default off<a href=\"https://github.com/mashirozx/Sakura/wiki/Fancybox"
"\">please read wiki</a>"
msgstr ""
#: options.php:1103
#: options.php:1125
msgid "Enable lazyload in posts"
msgstr ""
#: options.php:1110
#: options.php:1132
msgid "lazyload spinner"
msgstr ""
#: options.php:1111
#: options.php:1133
msgid "The placeholder to display when the image loads, fill in the image url"
msgstr ""
#: options.php:1117
#: options.php:1139
msgid "Whether to enable the clipboard copyright"
msgstr ""
#: options.php:1118
#: options.php:1140
msgid ""
"Automatically add a copyright to the clipboard when copying more than 30 "
"bytes, which is enabled by default."
msgstr ""
#: options.php:1124
#: options.php:1146
msgid "Email address prefix"
msgstr ""
#: options.php:1125
#: options.php:1147
msgid ""
"For sending system mail, the sender address displayed in the user's mailbox, "
"do not use Chinese, the default system email address is bibi@your_domain_name"
msgstr ""
#: options.php:1131
#: options.php:1153
msgid "Comments reply notification"
msgstr ""
#: options.php:1132
#: options.php:1154
msgid ""
"WordPress will use email to notify users when their comments receive a reply "
"by default. Tick this item allows users to set their own comments reply "
"notification"
msgstr ""
#: options.php:1138
#: options.php:1160
msgid "Administrator comment notification"
msgstr ""
#: options.php:1139
#: options.php:1161
msgid ""
"Whether to use email notification when the administrator's comments receive "
"a reply"
msgstr ""
#: options.php:1145
#: options.php:1167
msgid "Enable private comment"
msgstr ""
#: options.php:1146
#: options.php:1168
msgid "Allow users to set their own comments to be invisible to others"
msgstr ""
#: options.php:1152
#: options.php:1174
msgid "Human verification"
msgstr ""
#: options.php:1153
#: options.php:1175
msgid "Enable human verification"
msgstr ""
#: options.php:1159
#: options.php:1181
msgid "QQ avatar link encryption"
msgstr ""
#: options.php:1160
#: options.php:1182
msgid "Do not display the user's qq avatar links directly."
msgstr ""
#: options.php:1165
#: options.php:1187
msgid "Off (default)"
msgstr ""
#: options.php:1166
#: options.php:1188
msgid "use redirect (general security)"
msgstr ""
#: options.php:1167
#: options.php:1189
msgid "fetch data at backend (high security)"
msgstr ""
#: options.php:1168
#: options.php:1190
msgid "fetch data at backend (high securityslow)"
msgstr ""
#: options.php:1172
#: options.php:1194
msgid "Comment UA infomation"
msgstr ""
#: options.php:1173
#: options.php:1195
msgid ""
"Check to enable, display the user's browser, operating system information"
msgstr ""
#: options.php:1179
#: options.php:1201
msgid "Enable disqus"
msgstr ""
#: options.php:1180
#: options.php:1202
msgid "Enable disqus for comment"
msgstr ""
#: options.php:1186
#: options.php:1208
msgid "Time Zone adjustment"
msgstr ""
#: options.php:1187
#: options.php:1209
msgid ""
"If the comment has a time difference problem adjust here, fill in an "
"integer, the calculation method: actual_time = display_error_time - "
@ -1784,7 +1825,7 @@ msgstr ""
msgid "Attribution-NonCommercial-ShareAlike 4.0 International"
msgstr ""
#: user/page-bangumi.php:27
#: user/page-bangumi.php:30
msgid "Please fill in the Bilibili UID in Sakura Options."
msgstr ""

View File

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
"Project-Id-Version: Sakura\n"
"POT-Creation-Date: 2020-04-05 11:50+0800\n"
"POT-Creation-Date: 2020-04-06 17:55+0800\n"
"PO-Revision-Date: 2019-11-01 14:27+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
@ -220,10 +220,6 @@ msgstr ""
msgid "page %s "
msgstr ""
#: inc/api.php:337 inc/theme_plus.php:727
msgid "The comment is private"
msgstr ""
#: inc/categories-images.php:45 inc/categories-images.php:66
msgid "category/tag image"
msgstr ""
@ -244,6 +240,10 @@ msgstr ""
msgid "no image"
msgstr ""
#: inc/classes/Cache.php:70 inc/theme_plus.php:727
msgid "The comment is private"
msgstr ""
#: inc/options-framework.php:182 inc/options-framework.php:183 inc/options-framework.php:412
msgid "Sakura Options"
msgstr ""
@ -911,7 +911,7 @@ msgstr ""
msgid "Whether to turn on the top-feature"
msgstr ""
#: options.php:446 options.php:1104
#: options.php:446 options.php:1126
msgid "Default on"
msgstr ""
@ -1359,189 +1359,231 @@ msgid "Footer float music player"
msgstr ""
#: options.php:926
msgid ""
"If you don't need the player just leave it blank.Fill in the \"song list\" ID of Netease Cloud "
"Music, eg: https://music.163.com/#/playlist?id=2288037900 The ID is 2288037900"
msgid "Choose which platform you'll use."
msgstr ""
#: options.php:931
msgid "Netease Cloud Music (default)"
msgstr ""
#: options.php:932
msgid "Version Control"
msgid "Xiami Music"
msgstr ""
#: options.php:933
msgid "Used to update frontend cookies and browser caches, any string can be used"
msgid "KuGou Music"
msgstr ""
#: options.php:939
msgid "Enable PJAX (recommand on)"
#: options.php:934
msgid "Baidu Music"
msgstr ""
#: options.php:935
msgid "QQ Music (may fail) "
msgstr ""
#: options.php:936
msgid "Off"
msgstr ""
#: options.php:940
msgid "Song list ID"
msgstr ""
#: options.php:941
msgid ""
"Fill in the \"song list\" ID, eg: https://music.163.com/#/playlist?id=2288037900 The ID is "
"2288037900"
msgstr ""
#: options.php:947
msgid "Netease Cloud Music cookie"
msgstr ""
#: options.php:948
msgid ""
"For Netease Cloud Music, fill in your vip account's cookies if you want to play special tracks."
"<b>If you don't know what does mean, left it blank.</b>"
msgstr ""
#: options.php:954
msgid "Version Control"
msgstr ""
#: options.php:955
msgid "Used to update frontend cookies and browser caches, any string can be used"
msgstr ""
#: options.php:961
msgid "Enable PJAX (recommand on)"
msgstr ""
#: options.php:962
msgid "The principle is the same as Ajax"
msgstr ""
#: options.php:946
#: options.php:968
msgid "Enable NProgress progress bar"
msgstr ""
#: options.php:947 options.php:954 options.php:961
#: options.php:969 options.php:976 options.php:983
msgid "Default off, check on"
msgstr ""
#: options.php:953
#: options.php:975
msgid "Enable sidebar widget"
msgstr ""
#: options.php:960
#: options.php:982
msgid "Enable Announcement"
msgstr ""
#: options.php:967
#: options.php:989
msgid "Announcement content"
msgstr ""
#: options.php:968
#: options.php:990
msgid ""
"Announcement content, the text exceeds 142 bytes will be scrolled display (mobile device is "
"invalid)"
msgstr ""
#: options.php:973
#: options.php:995
msgid "Bilibili UID"
msgstr ""
#: options.php:974
#: options.php:996
msgid ""
"Fill in your UID, eg.https://space.bilibili.com/13972644/, only fill in with the number part."
msgstr ""
#: options.php:980
#: options.php:1002
msgid "Bilibili Cookie"
msgstr ""
#: options.php:981
#: options.php:1003
msgid ""
"Fill in your Cookies, go to your bilibili homepage, you can get cookies in brownser network "
"pannel with pressing F12. If left this blank, you'll not get the progress."
msgstr ""
#: options.php:986
#: options.php:1008
msgid "The categories of articles that don't not show on homepage"
msgstr ""
#: options.php:987 options.php:994
#: options.php:1009 options.php:1016
msgid "Fill in category ID, multiple IDs are divided by a comma \",\""
msgstr ""
#: options.php:993
#: options.php:1015
msgid "Images category"
msgstr ""
#: options.php:1000
#: options.php:1022
msgid "Statistics Interface"
msgstr ""
#: options.php:1005
#: options.php:1027
msgid "WP-Statistics plugin (Professional statistics, can exclude invalid access)"
msgstr ""
#: options.php:1006
#: options.php:1028
msgid "Theme built-in (simple statistics, calculate each page access request)"
msgstr ""
#: options.php:1010
#: options.php:1032
msgid "Statistical data display format"
msgstr ""
#: options.php:1015
#: options.php:1037
msgid "23333 Views (default)"
msgstr ""
#: options.php:1016
#: options.php:1038
msgid "23,333 Views (britain)"
msgstr ""
#: options.php:1017
#: options.php:1039
msgid "23 333 Views (french)"
msgstr ""
#: options.php:1018
#: options.php:1040
msgid "23k Views (chinese)"
msgstr ""
#: options.php:1022
#: options.php:1044
msgid "Gravatar avatar proxy"
msgstr ""
#: options.php:1023
#: options.php:1045
msgid ""
"A front-ed proxy for Gravatar, eg. gravatar.2heng.xin/avatar . Leave it blank if you do not "
"need."
msgstr ""
#: options.php:1029
#: options.php:1051
msgid "Comment image upload API"
msgstr ""
#: options.php:1034
#: options.php:1056
msgid "Imgur (https://imgur.com)"
msgstr ""
#: options.php:1035
#: options.php:1057
msgid "SM.MS (https://sm.ms)"
msgstr ""
#: options.php:1036
#: options.php:1058
msgid "Chevereto (https://chevereto.com)"
msgstr ""
#: options.php:1040
#: options.php:1062
msgid "Imgur Client ID"
msgstr ""
#: options.php:1041
#: options.php:1063
msgid ""
"Register your application <a href=\"https://api.imgur.com/oauth2/addclient\">here</a>, note we "
"only need the Client ID here."
msgstr ""
#: options.php:1047
#: options.php:1069
msgid "SM.MS Secret Token"
msgstr ""
#: options.php:1048
#: options.php:1070
msgid "Register your application <a href=\"https://sm.ms/home/apitoken\">here</a>."
msgstr ""
#: options.php:1054
#: options.php:1076
msgid "Chevereto API v1 key"
msgstr ""
#: options.php:1055
#: options.php:1077
msgid "Get your API key here: "
msgstr ""
#: options.php:1061
#: options.php:1083
msgid "Chevereto URL"
msgstr ""
#: options.php:1062
#: options.php:1084
msgid "Your Chevereto homepage url, no slash in the end, eg. https://your.cherverto.com"
msgstr ""
#: options.php:1068
#: options.php:1090
msgid "Comment images proxy"
msgstr ""
#: options.php:1069
#: options.php:1091
msgid "A front-ed proxy for the uploaded images. Leave it blank if you do not need."
msgstr ""
#: options.php:1075
#: options.php:1097
msgid "Imgur upload proxy"
msgstr ""
#: options.php:1076
#: options.php:1098
msgid ""
"A back-ed proxy to upload images. You may set a self hosted proxy with Nginx, following my <a "
"href=\"https://2heng.xin/2018/06/06/javascript-upload-images-with-imgur-api/\">turtal</a>. "
@ -1550,146 +1592,146 @@ msgid ""
"</a>】"
msgstr ""
#: options.php:1082
#: options.php:1104
msgid "Enable live search"
msgstr ""
#: options.php:1083
#: options.php:1105
msgid ""
"Real-time search in the foreground, call the Rest API to update the cache every hour, you can "
"manually set the cache time in api.php"
msgstr ""
#: options.php:1089
#: options.php:1111
msgid "Include comments in live search"
msgstr ""
#: options.php:1090
#: options.php:1112
msgid ""
"Search for comments in real-time search (not recommended if there are too many comments on the "
"site)"
msgstr ""
#: options.php:1096
#: options.php:1118
msgid "Enable baguetteBox"
msgstr ""
#: options.php:1097
#: options.php:1119
msgid ""
"Default off<a href=\"https://github.com/mashirozx/Sakura/wiki/Fancybox\">please read wiki</a>"
msgstr ""
#: options.php:1103
#: options.php:1125
msgid "Enable lazyload in posts"
msgstr ""
#: options.php:1110
#: options.php:1132
msgid "lazyload spinner"
msgstr ""
#: options.php:1111
#: options.php:1133
msgid "The placeholder to display when the image loads, fill in the image url"
msgstr ""
#: options.php:1117
#: options.php:1139
msgid "Whether to enable the clipboard copyright"
msgstr ""
#: options.php:1118
#: options.php:1140
msgid ""
"Automatically add a copyright to the clipboard when copying more than 30 bytes, which is "
"enabled by default."
msgstr ""
#: options.php:1124
#: options.php:1146
msgid "Email address prefix"
msgstr ""
#: options.php:1125
#: options.php:1147
msgid ""
"For sending system mail, the sender address displayed in the user's mailbox, do not use "
"Chinese, the default system email address is bibi@your_domain_name"
msgstr ""
#: options.php:1131
#: options.php:1153
msgid "Comments reply notification"
msgstr ""
#: options.php:1132
#: options.php:1154
msgid ""
"WordPress will use email to notify users when their comments receive a reply by default. Tick "
"this item allows users to set their own comments reply notification"
msgstr ""
#: options.php:1138
#: options.php:1160
msgid "Administrator comment notification"
msgstr ""
#: options.php:1139
#: options.php:1161
msgid "Whether to use email notification when the administrator's comments receive a reply"
msgstr ""
#: options.php:1145
#: options.php:1167
msgid "Enable private comment"
msgstr ""
#: options.php:1146
#: options.php:1168
msgid "Allow users to set their own comments to be invisible to others"
msgstr ""
#: options.php:1152
#: options.php:1174
msgid "Human verification"
msgstr ""
#: options.php:1153
#: options.php:1175
msgid "Enable human verification"
msgstr ""
#: options.php:1159
#: options.php:1181
msgid "QQ avatar link encryption"
msgstr ""
#: options.php:1160
#: options.php:1182
msgid "Do not display the user's qq avatar links directly."
msgstr ""
#: options.php:1165
#: options.php:1187
msgid "Off (default)"
msgstr ""
#: options.php:1166
#: options.php:1188
msgid "use redirect (general security)"
msgstr ""
#: options.php:1167
#: options.php:1189
msgid "fetch data at backend (high security)"
msgstr ""
#: options.php:1168
#: options.php:1190
msgid "fetch data at backend (high securityslow)"
msgstr ""
#: options.php:1172
#: options.php:1194
msgid "Comment UA infomation"
msgstr ""
#: options.php:1173
#: options.php:1195
msgid "Check to enable, display the user's browser, operating system information"
msgstr ""
#: options.php:1179
#: options.php:1201
msgid "Enable disqus"
msgstr ""
#: options.php:1180
#: options.php:1202
msgid "Enable disqus for comment"
msgstr ""
#: options.php:1186
#: options.php:1208
msgid "Time Zone adjustment"
msgstr ""
#: options.php:1187
#: options.php:1209
msgid ""
"If the comment has a time difference problem adjust here, fill in an integer, the calculation "
"method: actual_time = display_error_time - the_integer_you_entered (unit: hour)"
@ -1743,7 +1785,7 @@ msgstr ""
msgid "Attribution-NonCommercial-ShareAlike 4.0 International"
msgstr ""
#: user/page-bangumi.php:27
#: user/page-bangumi.php:30
msgid "Please fill in the Bilibili UID in Sakura Options."
msgstr ""

Binary file not shown.

View File

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Sakura\n"
"POT-Creation-Date: 2020-04-05 11:52+0800\n"
"PO-Revision-Date: 2020-04-05 11:52+0800\n"
"POT-Creation-Date: 2020-04-06 17:55+0800\n"
"PO-Revision-Date: 2020-04-06 17:56+0800\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: zh_CN\n"
@ -227,10 +227,6 @@ msgstr ""
msgid "page %s "
msgstr "第 %s 页 "
#: inc/api.php:337 inc/theme_plus.php:727
msgid "The comment is private"
msgstr "该评论为私密评论"
#: inc/categories-images.php:45 inc/categories-images.php:66
msgid "category/tag image"
msgstr "分类/标签图像"
@ -252,6 +248,10 @@ msgstr "图像"
msgid "no image"
msgstr "暂无"
#: inc/classes/Cache.php:70 inc/theme_plus.php:727
msgid "The comment is private"
msgstr "该评论为私密评论"
#: inc/options-framework.php:182 inc/options-framework.php:183
#: inc/options-framework.php:412
msgid "Sakura Options"
@ -938,7 +938,7 @@ msgstr "点点"
msgid "Whether to turn on the top-feature"
msgstr "是否开启聚焦"
#: options.php:446 options.php:1104
#: options.php:446 options.php:1126
msgid "Default on"
msgstr "默认开启"
@ -1412,52 +1412,95 @@ msgid "Footer float music player"
msgstr "页脚悬浮播放器"
#: options.php:926
msgid ""
"If you don't need the player just leave it blank.Fill in the \"song list\" "
"ID of Netease Cloud Music, eg: https://music.163.com/#/playlist?"
"id=2288037900 The ID is 2288037900"
msgstr ""
"如果不需要播放器留空即可。填写网易云音乐的「歌单」IDeghttps://music.163."
"com/#/playlist?id=2288037900的ID是2288037900"
msgid "Choose which platform you'll use."
msgstr "选择你要使用的平台。"
#: options.php:931
msgid "Netease Cloud Music (default)"
msgstr "网易云音乐(默认)"
#: options.php:932
msgid "Xiami Music"
msgstr "虾米音乐"
#: options.php:933
msgid "KuGou Music"
msgstr "酷狗音乐"
#: options.php:934
msgid "Baidu Music"
msgstr "百度音乐"
#: options.php:935
msgid "QQ Music (may fail) "
msgstr "QQ音乐可能解析失败 "
#: options.php:936
msgid "Off"
msgstr "关闭"
#: options.php:940
msgid "Song list ID"
msgstr "「歌单」ID"
#: options.php:941
msgid ""
"Fill in the \"song list\" ID, eg: https://music.163.com/#/playlist?"
"id=2288037900 The ID is 2288037900"
msgstr ""
"填写「歌单」IDeghttps://music.163.com/#/playlist?id=2288037900的ID是"
"2288037900"
#: options.php:947
msgid "Netease Cloud Music cookie"
msgstr "网易云音乐 Cookies"
#: options.php:948
msgid ""
"For Netease Cloud Music, fill in your vip account's cookies if you want to "
"play special tracks.<b>If you don't know what does mean, left it blank.</b>"
msgstr ""
"针对网易云音乐如果你想播放特殊曲目填入你的vip帐号Cookies。<b>如果不知道这"
"是什么意思,忽略即可。</b>"
#: options.php:954
msgid "Version Control"
msgstr "版本控制"
#: options.php:933
#: options.php:955
msgid ""
"Used to update frontend cookies and browser caches, any string can be used"
msgstr "用于更新前端 cookie 及浏览器缓存,可使用任意字符串"
#: options.php:939
#: options.php:961
msgid "Enable PJAX (recommand on)"
msgstr "开启PJAX局部刷新建议开启"
#: options.php:940
#: options.php:962
msgid "The principle is the same as Ajax"
msgstr "原理与Ajax相同"
#: options.php:946
#: options.php:968
msgid "Enable NProgress progress bar"
msgstr "开启NProgress加载进度条"
#: options.php:947 options.php:954 options.php:961
#: options.php:969 options.php:976 options.php:983
msgid "Default off, check on"
msgstr "默认不开启,勾选开启"
#: options.php:953
#: options.php:975
msgid "Enable sidebar widget"
msgstr "支持侧栏小部件"
#: options.php:960
#: options.php:982
msgid "Enable Announcement"
msgstr "开启公告"
#: options.php:967
#: options.php:989
msgid "Announcement content"
msgstr "公告内容"
#: options.php:968
#: options.php:990
msgid ""
"Announcement content, the text exceeds 142 bytes will be scrolled display "
"(mobile device is invalid)"
@ -1465,22 +1508,22 @@ msgstr ""
"公告内容文字超出142个字节将会被滚动显示移动端无效一个汉字 = 3字节一"
"个字母 = 1字节自己计算吧"
#: options.php:973
#: options.php:995
msgid "Bilibili UID"
msgstr ""
#: options.php:974
#: options.php:996
msgid ""
"Fill in your UID, eg.https://space.bilibili.com/13972644/, only fill in with "
"the number part."
msgstr ""
"填写你的UID,例如https://space.bilibili.com/13972644/,只需填写数字部分。"
#: options.php:980
#: options.php:1002
msgid "Bilibili Cookie"
msgstr ""
#: options.php:981
#: options.php:1003
msgid ""
"Fill in your Cookies, go to your bilibili homepage, you can get cookies in "
"brownser network pannel with pressing F12. If left this blank, you'll not "
@ -1489,56 +1532,56 @@ msgstr ""
"填写你的帐号Cookies。F12打开浏览器网络面板前往你的B站主页获取Cookies。如果"
"留空,将不会显示追番进度。"
#: options.php:986
#: options.php:1008
msgid "The categories of articles that don't not show on homepage"
msgstr "首页不显示的分类文章"
#: options.php:987 options.php:994
#: options.php:1009 options.php:1016
msgid "Fill in category ID, multiple IDs are divided by a comma \",\""
msgstr "填写分类ID多个用英文“ , ”分开"
#: options.php:993
#: options.php:1015
msgid "Images category"
msgstr "图片展示分类"
#: options.php:1000
#: options.php:1022
msgid "Statistics Interface"
msgstr "统计接口"
#: options.php:1005
#: options.php:1027
msgid ""
"WP-Statistics plugin (Professional statistics, can exclude invalid access)"
msgstr "WP-Statistics 插件(专业性统计,可排除无效访问)"
#: options.php:1006
#: options.php:1028
msgid "Theme built-in (simple statistics, calculate each page access request)"
msgstr "主题内建(简单的统计,计算每一次页面访问请求)"
#: options.php:1010
#: options.php:1032
msgid "Statistical data display format"
msgstr "统计数据显示格式"
#: options.php:1015
#: options.php:1037
msgid "23333 Views (default)"
msgstr "23333 次访问(默认)"
#: options.php:1016
#: options.php:1038
msgid "23,333 Views (britain)"
msgstr "23,333 次访问(英式)"
#: options.php:1017
#: options.php:1039
msgid "23 333 Views (french)"
msgstr "23 333 次访问(法式)"
#: options.php:1018
#: options.php:1040
msgid "23k Views (chinese)"
msgstr "23k 次访问(中式)"
#: options.php:1022
#: options.php:1044
msgid "Gravatar avatar proxy"
msgstr "Gravatar头像代理"
#: options.php:1023
#: options.php:1045
msgid ""
"A front-ed proxy for Gravatar, eg. gravatar.2heng.xin/avatar . Leave it "
"blank if you do not need."
@ -1546,27 +1589,27 @@ msgstr ""
"填写Gravatar头像的代理地址例如gravatar.2heng.xin/avatar。留空则不使用代"
"理。"
#: options.php:1029
#: options.php:1051
msgid "Comment image upload API"
msgstr "评论上传图片接口"
#: options.php:1034
#: options.php:1056
msgid "Imgur (https://imgur.com)"
msgstr ""
#: options.php:1035
#: options.php:1057
msgid "SM.MS (https://sm.ms)"
msgstr ""
#: options.php:1036
#: options.php:1058
msgid "Chevereto (https://chevereto.com)"
msgstr ""
#: options.php:1040
#: options.php:1062
msgid "Imgur Client ID"
msgstr ""
#: options.php:1041
#: options.php:1063
msgid ""
"Register your application <a href=\"https://api.imgur.com/oauth2/addclient"
"\">here</a>, note we only need the Client ID here."
@ -1574,48 +1617,48 @@ msgstr ""
"在<a href=\"https://api.imgur.com/oauth2/addclient\">这里</a>注册你的 "
"application , 注意此处只需要填写 Client ID."
#: options.php:1047
#: options.php:1069
msgid "SM.MS Secret Token"
msgstr ""
#: options.php:1048
#: options.php:1070
msgid ""
"Register your application <a href=\"https://sm.ms/home/apitoken\">here</a>."
msgstr "在<a href=\"https://sm.ms/home/apitoken\">这里</a>获取 key."
#: options.php:1054
#: options.php:1076
msgid "Chevereto API v1 key"
msgstr ""
#: options.php:1055
#: options.php:1077
msgid "Get your API key here: "
msgstr "在这里获取你的 API key "
#: options.php:1061
#: options.php:1083
msgid "Chevereto URL"
msgstr ""
#: options.php:1062
#: options.php:1084
msgid ""
"Your Chevereto homepage url, no slash in the end, eg. https://your.cherverto."
"com"
msgstr ""
"你的 Chevereto 首页 url, 注意结尾没有 /, 例如https://your.cherverto.com"
#: options.php:1068
#: options.php:1090
msgid "Comment images proxy"
msgstr "评论图片代理"
#: options.php:1069
#: options.php:1091
msgid ""
"A front-ed proxy for the uploaded images. Leave it blank if you do not need."
msgstr "前端显示的图片的代理。"
#: options.php:1075
#: options.php:1097
msgid "Imgur upload proxy"
msgstr "Imgur 上传代理"
#: options.php:1076
#: options.php:1098
msgid ""
"A back-ed proxy to upload images. You may set a self hosted proxy with "
"Nginx, following my <a href=\"https://2heng.xin/2018/06/06/javascript-upload-"
@ -1630,11 +1673,11 @@ msgstr ""
"端显示都需要代理!如果服务器在国外不需要上传代理,此处填写默认值即可:【<a "
"href=\"https://api.imgur.com/3/image/\">https://api.imgur.com/3/image/</a>】"
#: options.php:1082
#: options.php:1104
msgid "Enable live search"
msgstr "启用实时搜索"
#: options.php:1083
#: options.php:1105
msgid ""
"Real-time search in the foreground, call the Rest API to update the cache "
"every hour, you can manually set the cache time in api.php"
@ -1642,21 +1685,21 @@ msgstr ""
"前台实现实时搜索,调用 Rest API 每小时更新一次缓存,可在 api.php 里手动设置缓"
"存时间"
#: options.php:1089
#: options.php:1111
msgid "Include comments in live search"
msgstr "实时搜索包含评论"
#: options.php:1090
#: options.php:1112
msgid ""
"Search for comments in real-time search (not recommended if there are too "
"many comments on the site)"
msgstr "在实时搜索中搜索评论(如果网站评论数量太多不建议开启)"
#: options.php:1096
#: options.php:1118
msgid "Enable baguetteBox"
msgstr "启用 baguetteBox"
#: options.php:1097
#: options.php:1119
msgid ""
"Default off<a href=\"https://github.com/mashirozx/Sakura/wiki/Fancybox"
"\">please read wiki</a>"
@ -1664,33 +1707,33 @@ msgstr ""
"默认禁用,<a href=\"https://github.com/mashirozx/Sakura/wiki/Fancybox\">请阅"
"读说明</a>"
#: options.php:1103
#: options.php:1125
msgid "Enable lazyload in posts"
msgstr "文章内图片启用 lazyload"
#: options.php:1110
#: options.php:1132
msgid "lazyload spinner"
msgstr "lazyload 占位图"
#: options.php:1111
#: options.php:1133
msgid "The placeholder to display when the image loads, fill in the image url"
msgstr "图片加载时要显示的占位图,填写图片 url"
#: options.php:1117
#: options.php:1139
msgid "Whether to enable the clipboard copyright"
msgstr "是否开启剪贴板版权标识"
#: options.php:1118
#: options.php:1140
msgid ""
"Automatically add a copyright to the clipboard when copying more than 30 "
"bytes, which is enabled by default."
msgstr "复制超过30个字节时自动向剪贴板添加版权标识默认开启。"
#: options.php:1124
#: options.php:1146
msgid "Email address prefix"
msgstr "发件地址前缀"
#: options.php:1125
#: options.php:1147
msgid ""
"For sending system mail, the sender address displayed in the user's mailbox, "
"do not use Chinese, the default system email address is bibi@your_domain_name"
@ -1698,11 +1741,11 @@ msgstr ""
"用于发送系统邮件,在用户的邮箱中显示的发件人地址,不要使用中文,默认系统邮件"
"地址为 bibi@你的域名"
#: options.php:1131
#: options.php:1153
msgid "Comments reply notification"
msgstr "邮件回复通知"
#: options.php:1132
#: options.php:1154
msgid ""
"WordPress will use email to notify users when their comments receive a reply "
"by default. Tick this item allows users to set their own comments reply "
@ -1711,78 +1754,78 @@ msgstr ""
"WordPress默认会使用邮件通知用户评论收到回复开启此项允许用户设置自己的评论收"
"到回复时是否使用邮件通知"
#: options.php:1138
#: options.php:1160
msgid "Administrator comment notification"
msgstr "邮件回复通知管理员"
#: options.php:1139
#: options.php:1161
msgid ""
"Whether to use email notification when the administrator's comments receive "
"a reply"
msgstr "当管理员评论收到回复时是否使用邮件通知"
#: options.php:1145
#: options.php:1167
msgid "Enable private comment"
msgstr "允许私密评论"
#: options.php:1146
#: options.php:1168
msgid "Allow users to set their own comments to be invisible to others"
msgstr "允许用户设置自己的评论对其他人不可见"
#: options.php:1152
#: options.php:1174
msgid "Human verification"
msgstr "机器人验证"
#: options.php:1153
#: options.php:1175
msgid "Enable human verification"
msgstr "开启机器人验证"
#: options.php:1159
#: options.php:1181
msgid "QQ avatar link encryption"
msgstr "QQ头像链接加密"
#: options.php:1160
#: options.php:1182
msgid "Do not display the user's qq avatar links directly."
msgstr "不直接暴露用户QQ头像链接"
msgstr "不直接暴露用户QQ头像链接"
#: options.php:1165
#: options.php:1187
msgid "Off (default)"
msgstr "关闭(默认)"
#: options.php:1166
#: options.php:1188
msgid "use redirect (general security)"
msgstr "使用重定向(安全性低)"
#: options.php:1167
#: options.php:1189
msgid "fetch data at backend (high security)"
msgstr "后端获取头像数据(安全性高)"
#: options.php:1168
#: options.php:1190
msgid "fetch data at backend (high securityslow)"
msgstr "后端解析QQ头像接口安全性高"
#: options.php:1172
#: options.php:1194
msgid "Comment UA infomation"
msgstr "评论UA信息"
#: options.php:1173
#: options.php:1195
msgid ""
"Check to enable, display the user's browser, operating system information"
msgstr "勾选开启,显示用户的浏览器,操作系统信息"
#: options.php:1179
#: options.php:1201
msgid "Enable disqus"
msgstr "开启多说插件支持"
#: options.php:1180
#: options.php:1202
msgid "Enable disqus for comment"
msgstr "多说已经凉了~~"
#: options.php:1186
#: options.php:1208
msgid "Time Zone adjustment"
msgstr "时区调整"
#: options.php:1187
#: options.php:1209
msgid ""
"If the comment has a time difference problem adjust here, fill in an "
"integer, the calculation method: actual_time = display_error_time - "
@ -1842,7 +1885,7 @@ msgstr ""
msgid "Attribution-NonCommercial-ShareAlike 4.0 International"
msgstr "知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议"
#: user/page-bangumi.php:27
#: user/page-bangumi.php:30
msgid "Please fill in the Bilibili UID in Sakura Options."
msgstr "请在后台设置填写 Bilibili UID 后继续。"

View File

@ -923,11 +923,33 @@ function optionsframework_options()
$options[] = array(
'name' => __('Footer float music player', 'sakura'), /*页脚悬浮播放器*/
'desc' => __('If you don\'t need the player just leave it blank.Fill in the "song list" ID of Netease Cloud Music, eg: https://music.163.com/#/playlist?id=2288037900 The ID is 2288037900', 'sakura'), /*如果不需要播放器留空即可。填写网易云音乐的「歌单」IDeghttps://music.163.com/#/playlist?id=2288037900的ID是2288037900*/
'id' => 'playlist_id',
'desc' => __('Choose which platform you\'ll use.', 'sakura'),
'id' => 'aplayer_server',
'std' => "netease",
'type' => "select",
'options' => array(
'netease' => __('Netease Cloud Music (default)', 'sakura'),
'xiami' => __('Xiami Music', 'sakura'),
'kugou' => __('KuGou Music', 'sakura'),
'baidu' => __('Baidu Music', 'sakura'),
'tencent' => __('QQ Music (may fail) ', 'sakura'),
'off' => __('Off', 'sakura'),
));
$options[] = array(
'name' => __('Song list ID', 'sakura'),
'desc' => __('Fill in the "song list" ID, eg: https://music.163.com/#/playlist?id=2288037900 The ID is 2288037900', 'sakura'),
'id' => 'aplayer_playlistid',
'std' => '2288037900',
'type' => 'text');
$options[] = array(
'name' => __('Netease Cloud Music cookie', 'sakura'),
'desc' => __('For Netease Cloud Music, fill in your vip account\'s cookies if you want to play special tracks.<b>If you don\'t know what does mean, left it blank.</b>', 'sakura'),
'id' => 'aplayer_cookie',
'std' => '',
'type' => 'textarea');
$options[] = array(
'name' => __('Version Control', 'sakura'), /*版本控制*/
'desc' => __('Used to update frontend cookies and browser caches, any string can be used', 'sakura'), /*用于更新前端 cookie 及浏览器缓存,可使用任意字符串*/

View File

@ -5,7 +5,7 @@ Theme URI: https://github.com/mashirozx/Sakura/
Author: Mashiro, Spirit, Louie, Fuzzz
Author URI: http://2heng.xin
Description: A wonderful branch of theme Akina
Version: 3.3.7
Version: 3.3.8
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Text Domain: sakura
@ -8721,8 +8721,11 @@ h1[id*=toc-head]::before,h2[id*=toc-head]::before,h3[id*=toc-head]::before,h4[id
max-width: 33.3333%;
flex: 0 0 33.3333%;
}
.bangumi-title {
height: 30%;
}
.bangumi-item .bangumi-info{
height: 50%;
height: 45%;
transform: translateY(140%);
}
}

View File

@ -21,7 +21,10 @@ get_header();
<section class="bangumi">
<?php if (akina_option('bilibili_id') ):?>
<div class="row">
<?php echo get_bgm_items(); ?>
<?php
$bgm = new \Sakura\API\Bilibili();
echo $bgm->get_bgm_items();
?>
<?php else: ?>
<div class="row">
<p> <?php _e("Please fill in the Bilibili UID in Sakura Options.","sakura"); ?></p>