提交 b9e8aeef 编写于 作者: C chao

Jvedio-5.0

上级
> **请勿上传任何暴力、色情、恐怖的信息或图片!**
### 反馈/建议
- 出现问题的版本:(如5.0.0.0)
- 电脑系统:(如 win 10)
- 提出的建议:xxx
### 描述:
> **请勿上传任何暴力、色情、恐怖的信息或图片!**
详细说明前因后果、操作步骤。
### 日志文件:
> **请勿上传任何暴力、色情、恐怖的信息或图片!**
请将对应的日志复制到此处,无则可不填,关于日志请看 [日志文件](https://github.com/hitchao/Jvedio/wiki/07_Log)
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
/Jvedio-WPF/Release/*
/Jvedio-WPF/Jvedio/sql/18+/*
/Jvedio-WPF/Jvedio/Sample/18+/*
/Jvedio-WPF/Jvedio/Test/DataBase/*
/Jvedio-WPF/Jvedio/Test/File/*
/Jvedio-WPF/Jvedio/Test/SecretTest/*
Version.md
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUNIT
*.VisualState.xml
TestResult.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# JustCode is a .NET coding add-in
.JustCode
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# ASP.NET Core default setup: bower directory is configured as wwwroot/lib/ and bower restore is true
**/wwwroot/lib/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# JetBrains Rider
.idea/
*.sln.iml
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Jvedio-Android
\ No newline at end of file
# Jvedio-Linux
\ No newline at end of file
[*.{js,jsx,ts,tsx,vue}]
indent_style = space
indent_size = 2
trim_trailing_whitespace = true
insert_final_newline = true
.DS_Store
node_modules
/dist
# local env files
.env.local
.env.*.local
# Log files
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
module.exports = {
plugins: {
autoprefixer: {}
}
}
FROM nginx:1.21.1
COPY dist /usr/share/nginx/html
COPY k8s/nginx/nginx.conf /etc/nginx/nginx.conf
COPY k8s/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
\ No newline at end of file
# jvedio-web
安装环境
```bash
npm run install
```
启动
```bash
yarn start
```
编译
```bash
yarn build
```
docker 运行
```bash
docker build -f Dockerfile -t jvedio-web .
docker rm -f jvedio-web
docker run --name jvedio-web -p 8099:80 -d jvedio-web
```
module.exports = {
presets: [
'@vue/app'
]
}
server {
server_name _; #表示匹配所有域名
#listen 80; #80 不用写
client_max_body_size 10M; # 默认限制上传附件大小
# ~* 为不区分大小写正则匹配,后面跟的正则表达式指以该后缀结尾
location ~* \.(?:jpg|jpeg|png|gif|ico|css|js|svg|json|zip)$ {
#配置跨域请求
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
root /usr/share/nginx/html;
expires 365d;#缓存365天
add_header Cache-Control "public"; #可以被任何缓存区缓存, 如: 浏览器、服务器、代理服务器等.
add_header Nginx-Cache "$upstream_cache_status"; #缓存命中分析
}
location ~ ^/(static|css|js|img)/ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
root /usr/share/nginx/html;
}
location / {
root /usr/share/nginx/html;
index index.html;
try_files $uri $uri/ /index.html =404;#依次匹配 $uri、$uri 路径下的资源,如果没有,则匹配 404
#禁止缓存
add_header Last-Modified $date_gmt;
add_header Cache-Control 'no-store, no-cache, must-revalidate, proxy-revalidate, max-age=0';
if_modified_since off;
expires off;
etag off;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
#error_page 405 =200 $uri;
}
\ No newline at end of file
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset utf8;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for $host $upstream_response_time $request_time';
access_log /var/log/nginx/access.log main;
# 设定请求缓冲
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 300m;
sendfile on;
tcp_nopush on;
keepalive_timeout 60;
tcp_nodelay on;
client_body_buffer_size 512k;
proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 1024k;
proxy_busy_buffers_size 1024k;
proxy_temp_file_write_size 1024k;
server_tokens off;
#对网页文件、CSS、JS、XML等启动gzip压缩,减少数据传输量,提高访问速度。
# gzip on;
# gzip_min_length 1k;
# gzip_buffers 4 16k;
# gzip_http_version 1.0;
# gzip_comp_level 2;
# gzip_types text/plain application/javascript text/css application/xml application/json;
# gzip_vary on;
# gzip_proxied any;
## gzip config
gzip on;
gzip_min_length 1000;
gzip_comp_level 5;
gzip_proxied any;
gzip_vary on;
gzip_disable msie6;
gzip_http_version 1.1;
gzip_types text/css text/javascript text/xml text/plain text/x-component application/javascript application/json application/xml application/rss+xml font/truetype font/opentype application/vnd.ms-fontobject image/svg+xml;
include /etc/nginx/conf.d/*.conf;
}
\ No newline at end of file
此差异已折叠。
{
"name": "jvedio-web",
"version": "0.1.0",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"start": "vue-cli-service serve",
"build-run": "vue-cli-service build && docker build -f Dockerfile -t jvedio-web . && docker rm -f jvedio-web && docker run --name jvedio-web -p 8099:80 -d jvedio-web",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint"
},
"dependencies": {
"axios": "^0.24.0",
"core-js": "^2.6.5",
"register-service-worker": "^1.6.2",
"vue": "^2.6.10",
"vue-router": "^3.0.3",
"vuex": "^3.0.1"
},
"devDependencies": {
"@vue/cli-plugin-babel": "^3.0.0",
"@vue/cli-plugin-pwa": "^3.0.0",
"@vue/cli-service": "^3.0.0",
"element-ui": "^2.15.6",
"node-sass": "^4.12.0",
"sass-loader": "^8.0.0",
"vue-template-compiler": "^2.6.10"
}
}
修改 config.json 并添加 zip 文件即可动态修改需要发布的应用及版本
\ No newline at end of file
{
"files": [
{
"device": "Windows",
"name": "Jvedio4.6.1.1.zip",
"date": "2021-06-16",
"version": "4.6.1.1",
"enable": true
},
{
"device": "Android",
"enable": false
},
{
"device": "Linux",
"enable": false
},
{
"device": "Mac",
"enable": false
}
]
}
\ No newline at end of file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Jvedio-视频管理软件</title>
</head>
<body>
<noscript>
<strong>We're sorry but jvedio-web doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
{
"name": "Jvedio",
"short_name": "Jvedio",
"icons": [
],
"start_url": "./index.html",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#4DBA87"
}
User-agent: *
Disallow:
<template>
<el-container>
<el-header>
<common-header></common-header>
</el-header>
<el-main>
<router-view />
</el-main>
</el-container>
</template>
<script>
import CommonHeader from "./components/CommonHeader.vue";
export default {
name: "Main",
components: { CommonHeader },
};
</script>
<style scoped>
.el-header{
padding: 0px;
background-color: #22252A;
}
</style>
<style>
html,body{
margin: 0px;
padding: 0px;
background-color: #1B1B1F;
}
</style>
/* custom scrollbar */
::-webkit-scrollbar {
height: 20px;
width: 20px;
}
::-webkit-scrollbar-track {
background-color: transparent;
}
::-webkit-scrollbar-thumb {
background-color: #d6dee1;
border-radius: 20px;
border: 6px solid transparent;
background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
background-color: #a8bbbf;
}
\ No newline at end of file
<template>
<div id="app">
<img @click="routeTo('/')" class="logo" :src="logo" />
<div class="nav">
<span @click="routeTo('/')">首页</span>
<span @click="routeTo('/download')">下载</span>
<span ><a style="color: #fff;" href="https://github.com/hitchao/Jvedio/wiki">使用说明</a></span>
<span><a style="color: #fff;" href="https://github.com/hitchao/Jvedio/issues">反馈</a></span>
</div>
</div>
</template>
<script>
export default {
data() {
return {
logo: require("../assets/logo.png"),
activeIndex: 0
}
}, methods: {
routeTo(path) {
this.$router.push({ path: path });
}
}
}
</script>
<style scoped>
.nav a {
text-decoration: none;
}
.nav {
margin-left: 20px;
user-select: none;
}
.nav span {
color: #fff;
font-size: 15px;
cursor: pointer;
padding: 10px 20px;
border-radius: 4px;
}
.nav span:hover {
background-color: #18191B;
}
.logo {
margin-left: 20px;
height: 30px;
cursor: pointer;
}
#app {
height: 100%;
width: 100%;
display: flex;
align-items: center;
justify-content: normal;
min-width: 200px;
}
.header {
background-color: #22252A;
}
</style>
\ No newline at end of file
export default {
title: 'Jvedio',
baseUrl: {
// 开发环境
dev: 'http://localhost:8001/api/',
pro: 'http://host.docker.internal:8089/api/'
}
}
\ No newline at end of file
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './registerServiceWorker'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);
import './assets/css/main.css'
Vue.config.productionTip = false
new Vue({
router,
store,
render: h => h(App)
}).$mount('#app')
import { register } from 'register-service-worker'
if (process.env.NODE_ENV === 'production') {
register(`${process.env.BASE_URL}service-worker.js`, {
ready () {
console.log(
'App is being served from cache by a service worker.\n' +
'For more details, visit https://goo.gl/AFskqB'
)
},
registered () {
console.log('Service worker has been registered.')
},
cached () {
console.log('Content has been cached for offline use.')
},
updatefound () {
console.log('New content is downloading.')
},
updated () {
console.log('New content is available; please refresh.')
},
offline () {
console.log('No internet connection found. App is running in offline mode.')
},
error (error) {
console.error('Error during service worker registration:', error)
}
})
}
import Vue from 'vue'
import Router from 'vue-router'
import Main from './views/Main.vue'
import Download from './views/Download.vue'
Vue.use(Router)
const originalPush = Router.prototype.push
Router.prototype.push = function push(location) {
return originalPush.call(this, location).catch(err => err)
}
export default new Router({
mode: 'history',
base: "/JvedioWebPage",
routes: [
{
path: '/',
name: 'main',
component: Main
},
{
path: '/download',
name: 'download',
component: Download
}
]
})
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
},
mutations: {
},
actions: {
}
})
<template>
<div id="app">
<div class="card" v-for="(item,index) in config.files">
<p>Jvedio for {{item.device}}</p>
<el-divider></el-divider>
<div v-if="!item.enable">
<p>敬请期待</p>
</div>
<div style="text-align: center;" v-if="item.enable">
<img :src="window_logo" style="width: 200px;" />
<p style="font-size: 20px;margin: 5px;font-weight: bold;">{{item.version}}</p>
<p style="font-size: 10px;margin: 5px;">{{item.date}}</p>
<el-button @click="downloadApp(index)" type="primary">下载</el-button>
</div>
</div>
</div>
</template>
<script>
import axios from "axios";
export default {
data() {
return {
window_logo: require("../assets/icons/Windows.png"),
config: {},
}
}, methods: {
downloadApp(idx) {
location.href="files/" + this.config.files[idx].name;
},
loadConfig() {
axios.request({
url: "files/config.json",
method: "get"
}).then((res) => {
this.config=res.data;
});
}
}, created() {
this.loadConfig();
}
}
</script>
<style scoped>
.el-divider {
background-color: gray;
}
.card {
background-color: #101013;
width: 300px;
height: 280px;
color: #9B9B9B;
padding: 10px 20px;
margin: 10px;
line-height: 30px;
border-radius: 5px;
box-shadow: 2px 2px 10px #000;
float: left;
}
#app {
padding: 0px;
}
</style>
\ No newline at end of file
<template>
<div id="app">
<h1 class="title">Jvedio-本地视频管理</h1>
<div class="desc">
<span>
Jvedio 是本地视频管理软件,支持扫描本地视频并导入软件,建立视频库, 提取出视频的<b>唯一识别码</b>,自动分类视频, 添加标签管理视频,使用人工智能识别演员,支持翻译信息, 基于 FFmpeg
截取视频图片,Window 桌面端流畅美观的应用软件
</span>
</div>
<el-carousel height="500px" :interval="5000" arrow="always"
trigger="click"
>
<el-carousel-item v-for="item in sample_list" :key="item">
<el-image
style="height: 500px"
:src="item"
fit="scale-down"></el-image>
</el-carousel-item>
</el-carousel>
</div>
</template>
<script>
export default {
data() {
return {
sample_list: [
require("../assets/imgs/sample1.png"),
require("../assets/imgs/sample2.png"),
require("../assets/imgs/sample3.png"),
require("../assets/imgs/sample4.png"),
]
}
}
}
</script>
<style scoped>
.el-carousel {
margin: 20px 5px;
box-shadow:2px 2px 10px #000;
text-align: center;
}
.el-carousel__item:nth-child(2n) {
background-color: #101013;
}
.el-carousel__item:nth-child(2n+1) {
background-color: #101013;
}
.desc {
font-size: 15px;
background-color: #101013;
color: #9B9B9B;
padding: 10px 20px;
line-height: 30px;
border-radius: 5px;
box-shadow:2px 2px 10px #000;
}
.title {
text-align: center;
color: #fff;
}
</style>
\ No newline at end of file
module.exports = {
devServer: {
disableHostCheck: true,
port: 8080
},
pwa: {
iconPaths: {
favicon32: 'favicon.ico',
favicon16: 'favicon.ico',
appleTouchIcon: 'favicon.ico',
maskIcon: 'favicon.ico',
msTileImage: 'favicon.ico'
}
},
publicPath: '/JvedioWebPage'
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>
\ No newline at end of file
<h1 align="center"><a href="http://hitchao.gitee.io/jvediowebpage/index.html" >Jvedio</a></h1>
<h3 align="center">本地视频与图片的管理</h3>
---
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jvedio 是本地视频管理软件,支持扫描本地视频并导入软件,建立视频库,提取出视频的 **唯一识别码**,自动分类视频,添加标签管理视频,使用人工智能识别演员,支持翻译信息,基于 FFmpeg 截取视频图片,Window 桌面端流畅美观的应用软件
---
**使用教程**】: [新手入门](Introduction_1) 【下载地址】:[前往下载](https://github.com/hitchao/Jvedio/releases)
[![点击查看软件效果图](https://s3.ax1x.com/2021/01/05/sFIEZV.png)](https://imgchr.com/i/sFIEZV)
[![点击查看软件效果图](https://s3.ax1x.com/2021/01/05/sFIVaT.png)](https://imgchr.com/i/sFIVaT)
## 更新日志
---
版本:**4.3.4.2**
时间:2020-01-06
内容:
* 修复:批处理的错误
* 功能:☆自定义背景图
* 美化:输入框的Owner和边距
* 修复:演员出生地同步不出来
* 功能:清空演员信息
* 修复:指定网址同步后,网址信息未保存的问题
* 修复:刷新扫描影片导致影片重复显示
---
版本:**4.3.4.1**
时间:2020-01-05
内容:
* 修复:按演员与详情页面点击演员显示数目不一致问题
* 修复:滚动到最后,再点击侧边栏,一直滚动
* 功能:详情页显示文件名
* 修复:清单打开详情页卡顿
* 修复:截图的一些问题
* 修复:-caribbean 中文问题
* 修复:拖动预览图到界面不实时显示
* 修复:侧边栏隐藏的问题
---
版本:**4.3.4.0**
时间:2020-12-25
内容:
* 功能:☆强制同步
* 修复:右键闪退问题
* 功能:快速添加影片
* 修复:移入清单的影片无法删除
* 修复:部分nfo 导入日期识别问题
* 功能:拖入 NFO 即可导入
* 修复:CW3D2DBD问题
* 修复:演员下载闪退
* 修复:批处理闪退的问题
---
版本:**4.3.3.0**
时间:2020-12-23
内容:
* 修复:☆刷新不再跳转到初始界面
* 功能:任务栏显示进度
* 功能:☆在当前影片列表中检索
* 优化:滚动时加载影片速度
* 修复:指定网址同步图片不强制下载的问题
* 修复:修改演员头像后,需要重启才能载入
* 功能:主界面加入【清空信息】
* 优化:底部信息显示(可播放、有图、仅分段)
* 功能:详情页面加入右键【加入清单】
* 修复:高清、中文、流出若为小写则不识别的问题
* 修复:bus 名称去除番号的问题
* 优化:编辑、详情页修改标签时更新主界面标签戳
* 修复:名称不为空时不同步的问题
* 功能:详情页显示标签戳
* 修复:识别码n0000识别问题
* 优化:搜索框UI
---
版本:**4.3.2.1**
时间:2020-12-17
内容:
* 修复:模糊搜索无结果
* 修复:去除00的小问题
* 修复:数据库创建的一些问题
* 优化:输入框、等待框的UI
* 修复:fc2官网没法取消启用的问题
* 功能:标题为空时将文件名作为标题
* 优化:超时最大值由10上升到40
---
版本:**4.3.2.0**
时间:2020-12-16
内容:
* 修复:无法启动Jvedio的问题
* 功能:去除识别码中5位数字的前2个0
* 功能:取消【搜索框变动时立即搜索】选项
* 修复:搜索的一些问题
* 修复:library 同步导致崩溃
* 修复:识别码无法修改
* 优化:DB无法测试通过提示 Cookie 失效
* 功能:☆我的清单
* 功能:☆演员可以收藏
* 功能:标题为空的时候显示文件名
* 修复:新增标签后,右键添加到现有标签不显示
* 修复:删除最后一个影片后,会继续加载影片
* 修复:编辑、添加标签、修改后详情界面图片问题
* 优化:WaitingPanel加入发光效果
* 优化:清除超于10天的日志文件
* 优化:清除超于10天的最近观看
* 修复:识别 NFO 中的num为识别码
* 修复:无法导入单个视频
---
版本:**4.3.1.0**
时间:2020-11-30
内容:
* ☆功能:增加对 FC2 官网的支持
* 修复:截图右键打开位置的问题
* 修复:SMBD 视频类型问题
* 修复:bus 刮削名称刮削到识别码的问题
* 修复:侧边栏隐藏后再次点击影片界面会弹出
* 修复:隐藏侧边栏后鼠标松开会打开影片详情
* 修复:点击搜索结果弹出详情窗口
* 修复:菜单小箭头未对齐问题
* 修复:组合筛选顺序问题
* 修复:点击演员、发行商等筛选被重置
* 优化:窗体的缩小放大关闭拖动等窗体效果
* 修复:筛选中年份有空格的问题
* 修复:演员下载问题
* 优化:演员下载信息提示的问题
* 修复:窗体的一些问题
* 修复:同步后,点击取消同步,关闭程序无法完全退出
* 功能:类别、标签里含有高清、中文、流出则显示标签戳
* 修复:打开一直显示正在初始化的问题
---
版本:**4.3.0.0**
时间:2020-11-25
内容:
* 修复:组合筛选无法清除演员、类别的问题
* 优化:侧边栏动画
* 功能:侧边栏可隐藏
* 功能:详情界面可显示(预览图/影片截图)
* 功能:清空影片信息
* 功能:添加强制刮削的选项
* 修复:信息编辑窗口的一些 Bug
* 优化:bus 欧美刮削的一些问题
* 修复:批处理打开卡顿
* 修复:刮削后,标签戳不显示
* 修复:详情界面刮削 bus 的问题
* 修复:DB刮削缩略图不成功的问题
* 优化:DB刮削问题
* 修复:DB刮削 FC2 无缩略图问题
* 优化:DB刮削过于频繁时提示
* 修复:Library 评分未保存问题
* 修复:Library 预览图地址不正确的问题
* 修复:Library 搜索结果有多个时无法刮削的问题
* 修复:LIbrary 无预览图时,进度条不消失
---
版本:**4.2.0.0**
时间:2020-11-24
内容:
* 修复:点击排序,当前页面不排序问题
* 功能:高级筛选
* 功能:多选生成截图
* 优化:视频截图功能
* ☆优化:影片展示卡顿问题
---
版本:**4.1.1.2**
时间:2020-11-17
内容:
* 功能:图片拖动到主界面的演员头像上可自定义
* 修复:演员信息无法保存、详情页面点击演员不显示头像信息
* 修复:详情页面点击演员,演员栏目无头像
* 功能:增加【导入时间】排序功能
* 修复:从 access 读取导入时间的格式问题
* ☆功能:命名影片功能
* 设置:增加【刷新时扫描本地影片】选项
* 功能:标签增加、清空、删除界面优化
* 修复:主界面信息有时候不提示的问题
* 优化:优化中文显示问题
---
版本:**4.1.1.1**
时间:2020-11-09
内容:
* 修复:演员下载闪退
* 优化:修改海报图、缩略图、头像的默认图片
* 修复:滚动时标签不显示问题
* 功能:详情页可浏览所有影片
---
版本:**4.1.1.0**
时间:2020-11-09
内容:
* 功能:详情界面显示视频信息(帧率、分辨率等)
* 修复:窗体记住大小
* 优化:详情窗体边缘
* 修复:分段视频只有 2 段的时候不显示的问题
* 修复:导入重复视频的 bug
* 功能:最近创建可清空
* 修复:服务器源添加了又消失了
* 修复:更新程序不复制文件夹的bug
* 优化:更新程序窗口更大,展示更多信息内容
* 修复:更新程序更新不全的问题
---
版本:**4.1.0.9**
时间:2020-11-06
内容:
* 修复:编辑界面切换视频后信息不更改
* 修复:拖动图片到海报图位置不显示
* 功能:手动填入刮削网址
* 修复:1970日期错误问题
* 修复:批量下载无法取消预览图
* 修复:删除分段视频的问题、详情页分段视频点击播放的问题
* 修复:详情页设置喜爱后主界面不更新
* 修复:删除文件但不删除信息
* 功能:仅显示分段视频
* 优化:优化判断中文、高清、流出的代码
* 修复:主窗体在 win10 分屏/全屏功能下窗体有间隙
* 修复:其他窗体在 win10 分屏/全屏功能下窗体有间隙
---
版本:**4.1.0.8**
时间:2020-10-25
内容:
* 修复:点击立即更新程序不最小化到托盘
* 修复:NFO导入的 bug
* 功能:预览图可删除
* 功能:数据库管理新增=>删除不位于【启动时扫描】目录中的影片
* 优化:修正 MsgBox 的外观和功能
* 优化:拖入文件到主界面卡顿问题
* 功能:批量同步预览图与信息
* 功能:批量生成 Gif, 影片截图
---
版本:**4.1.0.7**
时间:2020-10-25
内容:
* 修复:FocusVisualStyle="{x:Null}"
* 修复:公告无法复制
* 修复:详情页影片与信息滚动冲突
* 优化:扫描时显示导入详情
* 修复:详情页设置为海报/缩略,主界面会被覆盖
* 功能:添加到已有的标签
* 修复:标签点击无效
* 修复:每次滚动最大值为 25,每页最多显示100个影片
* 修复:窗口调节大小位置修正
* 修复:恢复部分自定义显示
---
版本:**4.1.0.6**
时间:2020-10-23
内容:
* 修复:异步翻页、异步加载图片、异步加载影片
* 修复:最大化后滚动不出影片
* 修复:有图/无图
* 优化:美化详情页面 UI
* ☆优化:影片展示速度、提高用户体验
* 修复:记住排序、优化排序
* 优化:类别/演员展示切换视频类型
* 修复:生成截图/gif 路径有空格的问题
* 无法解决:在外接的硬盘上使用导致无法弹出
* 暂不解决:超过30个gif图软件会卡死=>暂时取消 gif
* 修复:DB信息发行日期不正确
---
版本:**4.1.0.5**
时间:2020-10-22
内容:
* 修复:异步翻页、异步加载图片、异步加载影片
* 修复:最大化后滚动不出影片
* 修复:有图/无图
* 优化:美化详情页面 UI
* ☆优化:影片展示速度、提高用户体验
* 修复:记住排序、优化排序
* 优化:类别/演员展示切换视频类型
* 修复:生成截图/gif 路径有空格的问题
* 无法解决:在外接的硬盘上使用导致无法弹出
* 暂不解决:超过30个gif图软件会卡死=>暂时取消 gif
* 修复:DB信息发行日期不正确
---
版本:**4.1.0.5**
时间:2020-10-16
内容:
* 功能:Gif 模式
* 功能:显示最近播放
* 优化:可截图到预览图位置
* 修复:滚动后显示翻页结果
* 修复:搜刮好信息后,翻页信息消失的问题
* 修复:欧美女优名字分割开了
* 优化:欧美影片刮削问题
---
版本:**4.1.0.4**
时间:2020-10-15
内容:
* 功能:列表模式
* 功能:按文件夹分类
* 功能:搜索候选词
---
版本:**4.1.0.3**
时间:2020-10-12
内容:
* 修复:win7 设置无法打开
* 修复:win7 启动时一直显示“正在启动中”
* 优化:搜索时候卡顿、界面现实问题、一些其他问题
* 修复:截图问题、多线程截图
* 修复:win7、8 日志不自动换行问题
---
版本:**4.1.0.2**
时间:2020-10-12
内容:
* 功能:启用老板键
* 修复:添加右键快捷键、删除右键图标
* 优化:打开网址
* 修复:删除库提示出错
* 修复:主页修改识别码后,信息未更新
* 优化:更改视频日期不方便
* 修复:预览图模式下滚动载入新影片后不显示图片
---
版本:**4.1.0.1**
时间:2020-10-11
内容:
* 功能:设置预览图为海报/缩略
* 功能:拖动图片到软件可指定封面
* 修复:演员界面的信息手动修改后无效
* 功能:刷新文件夹剔除不存在影片
* 功能:从电脑删除的同时从数据库删除,并提示
* 修复:一直卡在“扫描指定文件夹”没反应
* 修复:演员信息修改加入数据验证
* 修复:演员信息多出的腰围
* 修复:最大化后不能铺满屏幕,调节大小
---
版本:**4.1.0.0**
时间:2020-10-10
内容:
* 自定义侧边栏
* 解决内存泄露问题
* 修改网址显示方式
* ☆主界面UI优化
* 优化窗体阴影
* 窗体四周可拖动大小
* 优化颜色UI
* 优化设置窗口的UI
* 双击标题栏可放大
---
版本:**4.0.1.0**
时间:2020-10-8
内容:
* NFO:支持下载 nfo;支持导入提示;支持NFO 放到视频目录下
* 主程序与更新程序互相更新
* 优化更新程序的 UI
* 优化随机展示
* 提醒更新
---
版本:**4.0.0.9**
时间:2020-10-3
内容:
* vaccum=> vacuum
* 随机功能
---
版本:**4.0.0.7**
时间:2020-10-1
内容:
* 下载超时自定义
* 优化视频库选择 UI
* 修复Access数据只能导入 info 中
---
版本:**4.0.0.6**
时间:2020-09-30
内容:
* 加入赞助
* ☆多视频库功能
* 扫描显示数据库已存在的
* 修改网址后 显示连接状态
* fc2club关站,无法刮削fc2资源
* 选择目录支持拖拽
* 修复更新后配置文件还原的 bug
---
版本:**4.0.0.2**
时间:2020-09-14
内容:
* 修复大部分番号无法识别导入的问题
* 扫描显示结果并停留
* 蓝色界面优化
* 图片大小可调
* 欧美提示番号类型、设置扫描选项
* 美化文件夹选择框
* 数目为 0 不显示 类别
* 设置、工具窗口选项记忆
* 搜索优化
* 重写数据库
* 优化显示效果
* 优化皮肤切换不成功问题
* 修复演员显示问题
* 修复一些bug
* 修复 qibing.txt 与 bubing.txt 中番号不存在时,番号无法识别导入问题
* 指定播放器下载
* 窗体渐变效果(默认)
* 优化分段视频识别
* 打开软件后搜索框获得焦点,滚动时,滚动条获得焦点
* 按演员排序
* 加入鸣谢
* 颜色切换问题
* window-showdialog() 问题
* 修改信息后,点击刷新无效
* 最小化后继续下载
* 提示框大小自适应
* 还原默认设置问题
* 设置 tooltip
---
版本:**4.0.0.1**
时间:2020-09-05
内容:
* 优化导入单个视频
* combobox 改为 FlatRadioButton
* 日期选择控件
* 设置-恢复默认提示文字
* 优化关于页面
* 编辑列表美化
* 主窗口:搜索细化
* 关闭加载影片的动画
* 输入框 changed 事件
* 键盘支持
* detail 最大化后问题
* 编辑窗口:搜索细化
---
版本:4.0.0.0
时间:2020-09-01
内容:暂无
---
版本:3.0.0.0
时间:2019-12-31
内容:暂无
---
版本:2.0.0.0
时间:2019-08-31
内容:暂无
---
版本:1.0.0.0
时间:2019-05-20
内容:暂无
\ No newline at end of file
# DB 获取 cookie 步骤
> 1. 打开浏览器(此步骤使用 360 浏览器),输入网址,注册后登入
> 2. 登录自己的账号
> 3. 在空白处右击点击审查元素
> 4. 分别点击 Network(在弹出的界面的第 1 行),Doc(在第 2 或第 3 行)
> 5. 刷新一下网页
> 6. 这时会在下面的列表里出现一个新的文件(文件名形如:xxxxx.com),点击该文件
> 7. 选择 Headers(第一个)
> 8. 滚动到 **Request Headers** 这块,复制 coookie 内容(cookie冒号之后)
> 8. 粘贴 cookie 到 软件中,并测试通过
\ No newline at end of file
# 百度AI 配置
> 1 访问 [百度AI开放平台](https://ai.baidu.com/),注册并登录,进入自己的控制台,左侧选择人脸识别
> 2 点击创建应用,随便填写信息
> 3 复制 API Key 和 Secret Key 到 Jvedio 中
\ No newline at end of file
# 有道翻译 API 配置
> 1 访问 [有道智云AI开放平台](https://ai.youdao.com/),注册并登录,进入自己的控制台,左侧选择应用管理-我的应用
> 2 创建应用,接入方式选择 API 类型,其他随便填,保存
> 3 左侧点击自然语言翻译-翻译实例,创建实例,随便填写
> 4 绑定刚才你创建的应用
> 5 回的我的应用,点击自己的应用,应用ID 和应用秘钥分别复制到 Jvedio 中,测试通过
\ No newline at end of file
# 新手入门
> 本教程面向刚接触 Jvedio 或者刚接触视频管理的用户
如果打开提示缺少 .NET FrameWork ,请看 [运行环境](Introduction_2)
## 1、扫描本地的视频到 Jvedio 中
>启动软件后,会显示要打开的视频库,我们选择默认的 Info
>点击扫描
>回到主界面,此时视频已经导入到软件中了,但是没有信息与图片,下一步需要刮削
## 2、配置信息下载的地址
>打开设置,选择同步信息
>点击添加,并填入网址,点击测试
## 3、同步信息
**同步(刮削)**:从网络上读取影片的信息与图片到本地,建立本地的数据库
>方法一:回到主界面,点击所有视频,点击刮削
>方法二:左键单击,点开一个视频的详情页,点击下载按钮
\ No newline at end of file
# 运行环境
>运行环境:.NET FrameWork 4.7 [点此下载](https://dotnet.microsoft.com/download/dotnet-framework)
## 系统支持
>本软件在 Win10 X64 上通过测试,在虚拟机的 Win7 X64 和 Win8 X64 上测试通过
| 操作系统 | 是否支持 |
| :------: | :------: |
| Win XP | × |
| Win 7 | √ |
| Win 8 | √ |
| Win 10 | √ |
## 最低配置
| 硬件配置 | 参数 |
| :------: | :------------------: |
| 处理器 | 1千兆赫 (GHz) 或更快 |
| 内存 | 2GB 以上 |
| 硬盘 | 16GB 以上 |
| 显卡 | DirectX 9 以上 |
\ No newline at end of file
# 软件设置
## 1. 基本
| | 说明 |
| :----------------------: | :----------------------------------------: |
| **启动后随机展示** | 展示数目为每页数目,仅显示 1 页 |
| **搜索框变动时立即查询** | 搜索框输入内容立即查询 |
| **开启时不显示库选择** | 若库设为默认打开,这里则会勾选 |
| **自动删除不存在影片** | 刷新或扫描的时候自动删除硬盘上不存在的影片 |
| **最近创建的天数** | 侧边栏中【最近创建】显示最近 `N` 天的影片 |
| **语言** | 目前仅支持中文 |
| **图片路径** | 存储图片的路径 |
| 编号 | 文件夹 | 分类 | 说明 |
| :--: | :--------: | :------: | :--------------------------: |
| 1 | Actresses | 演员头像 | 演员名.jpg |
| 2 | BigPic | 海报图 | 识别码(大写).jpg |
| 3 | ExtraPic | 预览图 | 识别码(大写)\ 任意图片.jpg |
| 4 | Gif | 动态图 | 识别码(大写).gif |
| 5 | ScreenShot | 影片截图 | 识别码(大写)\ 任意图片.jpg |
| 6 | SmallPic | 缩略图 | 识别码(大写).jpg |
## 2. 扫描
| | 说明 |
| :----------------: | :---------------------------------------------------: |
| **启动时扫描目录** | 可添加多个启动页面扫描的文件夹 |
| **最小文件大小** | 扫描时自动过滤掉小于该文件大小的视频 |
| **视频分隔符** | `-,_,cd,fhd,-fhd,_fhd` 软件默认可识别以下几种分段视频 |
> - XXX-001-1, XXX-001-2, XXX-001-3
> - XXX-001_1, XXX-001_2, XXX-001_3
> - XXX-001cd1, XXX-001cd2, XXX-001cd3
> - XXX-001fhd1, XXX-001fhd2, XXX-001fhd3
> - XXX-001A, XXX-001B, XXX-001C
## 3. 同步信息
| | 说明 |
| :---------------: | :----------------------------------------------------------: |
| **强制关闭链接** | 强制 `N` 秒后关闭当前同步项的网络传输 |
| **保存信息到NFO** | 勾选后,可指定保存 NFO 信息到指定目录,勾选后不填则指定为与视频目录 |
## 4.显示
| | 说明 |
| :--------------: | :------------------------------------------: |
| **每次滚动数目** | 默认每页显示 20 个,滚动到底部后再显示 20 个 |
| **仅显示可播放** | 勾选后,仅显示可以播放的影片,需要刷新页面 |
>每次滚动或翻页,会取消当前的信息同步
## 5.翻译
| | 说明 |
| :----------: | :----------------------------------------------------------: |
| **有道翻译** | 调用有道翻译 API 翻译名称和摘要,具体配置过程见 [有道翻译](HowToSetYoudaoTranslation) |
| **百度翻译** | 即将支持 |
## 6.人工智能
| | 说明 |
| :--------------: | :----------------------------------------------------------: |
| **百度人脸识别** | 调用百度 API 对海报进行识别,识别到人脸后生成缩略图和演员头像,并保存人脸信息,具体配置过程见 [百度AI](HowToSetBaiduAI) |
## 7.视频处理
* 前往 [微云](https://share.weiyun.com/QDVHNbfJ) 下载 ffmpeg.exe,添加该路径到软件中,或前往[FFMPEG官网](https://github.com/BtbN/FFmpeg-Builds/releases)下载对应压缩包并解压
| | 说明 |
| :----------: | :----------------------------------------------------------: |
| **视频处理** | 设置截图数目后,影片右键-截图,即可在 `Pic\ScreenShot\XXX-001` 中生成影片截图 |
## 8.关于日志文件
日志文件位于软件目录下的 Log 文件夹,包含四个文件夹 DataBase, File, NetWork, scanlog,具体如下
| 文件夹名称 | 说明 |
| ---------- | ------------------------------------------ |
| DataBase | 数据库日志(修改信息、库管理操作等) |
| File | 文件操作(重命名、复制、播放、截图等操作) |
| NetWork | 网络日志(下载错误、刮削错误等) |
| scanlog | 扫描日志 |
\ No newline at end of file
# 工具介绍
- **常规扫描**:扫描指定文件夹的视频,自动提取识别码,并自动识别是否有马赛克,并能导入分段视频
- **全盘扫描**:采用 Everything 引擎,快速扫描本地硬盘
- **Access 数据导入**:导入 Jvedio 4.0 以前的数据库文件
- **元数据导入(支持 javsdt等刮削好的 nfo 文件)**:扫描并导入 NFO 文件,并移动同目录下的 fanart 与 poster 图片到 Jvedio 的图片路径
- **欧美影片扫描**:文件名必须包含形如 BrazzersExxtra.20.07.22.mp4,否则只能手动导入影片
- **网络磁盘扫描(支持群晖)**:输入形如 `\\chao\\电影` 的网络地址,如果为欧美影片,则需指定视频类型
- **导入单个视频**:选择视频后,视频的识别码会自动提取,视频类型会自动设置,如果未提取出来,则需要手动填写
\ No newline at end of file
# 键盘操作
## 主界面
| 快捷键 | 功能 |
| :------------: | :----------: |
| `Left` | 上一页 |
| `Right` | 下一页 |
| `Ctrl + Left` | 首页 |
| `Ctrl + Right` | 末页 |
| `Up` | 向上滚动一格 |
| `Down` | 向下滚动一格 |
| `Ctrl + Up` | 滚动到顶部 |
| `Ctrl + Down` | 滚动到底部 |
## 详情页
* **海报图区域**:双击 => 退出,单击 => 移动界面,鼠标滚轮 => 切换图片
* **左右影片区域**:鼠标滚轮 => 切换影片
| 快捷键 | 功能 |
| :--------------: | :-------------: |
| `Esc` | 退出 |
| `Left` | 上一影片 |
| `Right` | 下一影片 |
| `Ctrl + Left` | 首个影片 |
| `Ctrl + Right` | 末尾影片 |
| `Space 或 Enter` | 播放 |
| `L` | 设置喜爱 (Love) |
| `E` | 编辑 (Edit) |
| `D` | 下载 (Download) |
\ No newline at end of file
# 常见问题
> 如何添加中字、高清、流出标签
- 在类别或者标签里面输入对应的标签(仅限于:中文、高清、流出),主界面标签戳即可显示
> 如何取消收藏
- 双击第一颗星即可取消
> 如何修改默认视频类型
- 右键【重命名】,修改后,Jvedio 所有视频类型都会相应替换
> 输入网址后无法保存
- 网址仅能保存指定服务器源的网址,如果输入诸如 百度、谷歌之类的网址,测试能通过,但无法保存
- 第一次测试通过后,网址即可保存
> 智能分类没有信息显示
- 请先同步信息,才能智能分类
> 常见网络返回码机器机器原因
| 网络返回码 | 原因 |
| ---------- | ---------------------------------------------- |
| 404 | 网址无该资源 |
| 403 | 此商品未在您的居住国家公开,需要特定国家的代理 |
| 503, 504 | 网关请求超时,网址可能被屏蔽了 |
| 302 | 检索过于频繁,服务器源拒绝了请求 |
> 图片无法同步 ?
- 晚上网络不畅
- 进入详情页面,右键-清空信息,然后再同步
> 视频无法导入 ?
- 视频的文件名中必须包含准确的识别码,如 XXX-001 等
- 视频格式仅支持:
3g2,3gp,3gp2,3gpp,amr,amv,asf,avi,bdmv,bik,d2v,divx,drc,dsa,dsm,dss,dsv,evo,f4v,flc,fli,flic,flv,hdmov,ifo,ivf,m1v,m2p,m2t,m2ts,m2v,m4b,m4p,m4v,mkv,mp2v,mp4,mp4v,mpe,mpeg,mpg,mpls,mpv2,mpv4,mov,mts,ogm,ogv,pss,pva,qt,ram,ratdvd,rm,rmm,rmvb,roq,rpm,smil,smk,swf,tp,tpr,ts,vob,vp6,webm,wm,wmp,wmv
- 对于欧美的影片,需要使用欧美扫描与导入,常规扫描无效
- 分段视频的分段规则是否为空,若为空,则填入 `-,_,cd,fhd,-fhd,_fhd`
- 具体问题可查看 `log\Scan` 下当天的 log 文件
> 影片无法成功刮削,图片信息无法下载 ?
- 检查网络是否畅通,网址是否正确输入,Cookie 是否正确输入,并成功测试网络
- 晚上 8:00-12:00 为高峰时间
- 具体问题可查看 `log\Network` 下当天的 log 文件
> Jvedio 支持那些网站 ?
- 网站支持:豆瓣、IMDB
> 为什么缩略图无法显示?
- DB无法同步缩略图,其他的如果有则同步
> 为什么浏览器可以访问网站,而软件无法测试通过 ?
- 检查代理软件是否开启了全局代理
> 如何自己添加图片?
- 对于缩略图/预览图:
将图片复制到SmallPic/BigPic目录下,名字改为识别码且大写,并与软件中显示的识别码完全对应,图片格式仅支持 jpg
- 对于预览图
在 ExtraPic 目录下新建文件夹,名字改为识别码且大写,并与软件中显示的识别码完全对应,该目录放置任何 jpg格式的图片软件都能识别
- 对于演员头像
将图片复制到 Actresses 文件夹中,命名为演员名字,并与软件中显示的演员名字完全对应,仅支持 jpg,比如软件显示 `TonyPark(Tony)`,则图片命名为 `TonyPark(Tony).jpg`
\ No newline at end of file
<h1 align="center"><a href="https://hitchao.github.io/JvedioWebPage/" >Jvedio</a></h1>
<h3 align="center">本地视频与图片的管理</h3>
---
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Jvedio 是本地视频管理软件,支持扫描本地视频并导入软件,建立视频库,提取出视频的 **唯一识别码**,自动分类视频,添加标签管理视频,使用人工智能识别演员,支持翻译信息,基于 FFmpeg 截取视频图片,Window 桌面端流畅美观的应用软件
---
**使用教程**】: [新手入门](02_Beginning) 【下载地址】:[前往下载](https://github.com/hitchao/Jvedio/releases)
[<img src="https://s1.ax1x.com/2022/06/11/XcZRLF.png" alt="XcZRLF.png" style="zoom:80%;" />](https://imgtu.com/i/XcZRLF)
---
[<img src="https://s1.ax1x.com/2022/06/11/XcZQVH.png" alt="XcZQVH.png" style="zoom:80%;" />](https://imgtu.com/i/XcZQVH)
---
[<img src="https://s1.ax1x.com/2022/06/11/XcZlad.png" alt="XcZlad.png" style="zoom:80%;" />](https://imgtu.com/i/XcZlad)
# 更新日志
版本:**5.0.0.0**
时间:2022-06-11
内容:
* 优化 UI 设计
* 全新架构
# 新手入门
本文档为视频导入和信息刮削的教程
# 环境配置
**运行环境**
.NET FrameWork 4.7 [点此下载](https://dotnet.microsoft.com/download/dotnet-framework)
**支持的系统**
本软件在 Win10 X64 上通过测试,在虚拟机的 Win7 X64 和 Win8 X64 上测试通过,不支持 WIN XP
**最低配置**
| 硬件配置 | 参数 |
| :------: | :------------------: |
| 处理器 | 1千兆赫 (GHz) 或更快 |
| 内存 | 2GB 以上 |
| 硬盘 | 16GB 以上 |
| 显卡 | DirectX 9 以上 |
# 视频导入
第一次使用,打开 Jvedio 后,新建一个库
[<img src="https://s1.ax1x.com/2022/06/11/XcZKqe.png" alt="XcZKqe.png" style="zoom:80%;" />](https://imgtu.com/i/XcZKqe)
右键打开该库,然后可以导入自己的视频,导入视频支持三种方式:
方式一:点击导入视频按钮
点击导入视频后,选择需要导入的文件夹
[<img src="https://s1.ax1x.com/2022/06/11/XcZurD.png" alt="XcZurD.png" style="zoom:80%;" />](https://imgtu.com/i/XcZurD)
选择文件夹后,会进行扫描,显示如下
[<img src="https://s1.ax1x.com/2022/06/11/XcZnKO.png" alt="XcZnKO.png" style="zoom:80%;" />](https://imgtu.com/i/XcZnKO)
方式二:设置-扫描-扫描文件夹
[<img src="https://s1.ax1x.com/2022/06/11/XcZ1IA.png" alt="XcZ1IA.png" style="zoom:80%;" />](https://imgtu.com/i/XcZ1IA)
方式三:将文件夹或者视频直接拖入到 Jvedio 中
[<img src="https://s1.ax1x.com/2022/06/11/XcZfZ4.png" alt="XcZfZ4.png" style="zoom:80%;" />](https://imgtu.com/i/XcZfZ4)
# 信息刮削
由于刚导入的视频没有任何信息,因此需要去网络上下载电影、视频的信息,需要下载插件并进行网络配置
1. 下载插件
点击 Jvedio 左下角的设置-选项-插件,点击获取 IMDB 爬虫插件
[<img src="https://s1.ax1x.com/2022/06/11/XcZ8PI.png" alt="XcZ8PI.png" style="zoom:80%;" />](https://imgtu.com/i/XcZ8PI)
插件安装完成,会自动重启 Jvedio,然后进入选项-同步信息,按照如下步骤设置该插件的网址:
① 选择刮削器列表中的一项,点击新增
② 输入服务器地址,点击 Headers ,按照教程填入请求头
③ 测试该网址可行性,提示通过则保存
[<img src="https://s1.ax1x.com/2022/06/11/XcZGGt.png" alt="XcZGGt.png" style="zoom:80%;" />](https://imgtu.com/i/XcZGGt)
回到主界面,点击**立即同步**
[<img src="https://s1.ax1x.com/2022/06/11/XcZJRP.png" alt="XcZJRP.png" style="zoom:80%;" />](https://imgtu.com/i/XcZJRP)
通完完成后效果如下,既有图片信息,又有文字信息
[<img src="https://s1.ax1x.com/2022/06/11/XcZYxf.png" alt="XcZYxf.png" style="zoom:80%;" />](https://imgtu.com/i/XcZYxf)
点击详情页进去后,可以看到预览图、信息等
[<img src="https://s1.ax1x.com/2022/06/11/XcZNM8.png" alt="XcZNM8.png" style="zoom:80%;" />](https://imgtu.com/i/XcZNM8)
点击演员可以看到刮削的演员信息
[<img src="https://s1.ax1x.com/2022/06/11/XcZUsS.png" alt="XcZUsS.png" style="zoom:80%;" />](https://imgtu.com/i/XcZUsS)
\ No newline at end of file
# 软件设置
# 基本
| 设置 | 说明 |
| :--------------------------------- | :------------------------------------- |
| **青少年模式** | 保护青少年健康 |
| **默认打开上一次关闭的库** | - |
| **语言** | 支持中文、英文、日语 |
| **详情窗口左右浏览数据库所有影片** | 打开详情窗口后可以浏览该库所有影片 |
| **删除文件同时删除信息** | 右键删除文件时,同时从数据库中删除信息 |
# 图像
| 设置 | 说明 |
| :--------------------------------- | :--------------------------------- |
| **无封面时将已截取的图片作为封面** | 使用影片截图功能后,自动作为封面 |
| **图片自动缩放** | 主界面显示的图片自动填充,不留黑边 |
影视图片路径说明如下:
1. 绝对路径:将图片目录放到该路径下
2. 相对路径:相对于 Jvedio.exe 所在的 `/data/username/`目录
3. 相对于影片路径:影片在哪,图片就在那,图片的命名规则如下图所示,./fanart 表示图片名称只要有 fanart 就能识别为海报图
[<img src="https://s1.ax1x.com/2022/06/11/XcZaqg.png" alt="XcZaqg.png" style="zoom:80%;" />](https://imgtu.com/i/XcZaqg)
对于绝对路径和相对路径,图片的存储目录和图片格式如下:
| 编号 | 文件夹 | 分类 | 说明 |
| :--: | :--------: | :------: | :--------------------------: |
| 1 | Actresses | 演员头像 | 演员名.jpg |
| 2 | BigPic | 海报图 | 识别码(大写).jpg |
| 3 | ExtraPic | 预览图 | 识别码(大写)\ 任意图片.jpg |
| 4 | Gif | 动态图 | 识别码(大写).gif |
| 5 | ScreenShot | 影片截图 | 识别码(大写)\ 任意图片.jpg |
| 6 | SmallPic | 缩略图 | 识别码(大写).jpg |
5.0 版本支持常见的图片后缀:jpg, jpeg, png, bmp 等,如果有 jpg 则默认使用 jpg
# 扫描与导入
| 设置 | 说明 |
| :-------------------------: | :----------------------------------: |
| **扫描的文件大小** | 扫描时自动过滤掉小于该文件大小的视频 |
| **同时导入扫描出的NFO文件** | 导入扫描出的NFO,并覆盖已有的信息! |
软件默认可识别以下几种分段视频
- XXX-001-1, XXX-001-2, XXX-001-3
- XXX-001_1, XXX-001_2, XXX-001_3
- XXX-001cd1, XXX-001cd2, XXX-001cd3
- XXX-001fhd1, XXX-001fhd2, XXX-001fhd3
- XXX-001A, XXX-001B, XXX-001C
勾选【启动时扫描以下目录】后,软件在启动页面会对该目录进行扫描
# 插件
插件更新的地址是 github,如果不显示插件列表,则说明未连接上 github,目前插件仅能下载爬虫插件
# 同步信息
**1. 代理设置**
代理设置有三种模式:
- 不使用代理
- 使用系统代理:一般来说,代理软件开启后,会应用于系统代理
- 自定义代理:配置自定义代理,支持 HTTP 和 SOCKS 代理
**2. 刮削器列表**
对于下载的插件,会显示在刮削器列表中,刮削器不会自带网址,需要自行填入,并且需要填入 Headers!
测试通过后该刮削器才能用来刮削信息
刮削器可刮削的视频类型在插件中查看
# 显示
# 主题
目前仅支持白/黑两款皮肤,后面更新会加上更多皮肤
# 翻译
暂无
# 人工智能
暂无
# 视频处理
前往 [微云](https://share.weiyun.com/QDVHNbfJ) 下载 ffmpeg.exe,添加该路径到软件中,或前往[FFMPEG官网](https://github.com/BtbN/FFmpeg-Builds/releases)下载对应压缩包并解压
设置截图数目后,影片右键-截图,即可在 `Pic\ScreenShot\XXX-001` 中生成影片截图
注意,如果设置了跳过开头/结尾,导致视频帧数小于总帧数,则会截图视频
# 自定外观
暂无
# 重命名
需要配置重命名后,才能在右键点击重命名
# 库
资源存在索引:筛选影片的时候用于筛选出可播放/不可播放的影视资源
图片存在索引:筛选出图片存在/不存在的影视资源
# 快捷键
# 主界面
| 快捷键 | 功能 |
| :------------: | :----------: |
| `Left` | 上一页 |
| `Right` | 下一页 |
| `Ctrl + Left` | 首页 |
| `Ctrl + Right` | 末页 |
| `Up` | 向上滚动一格 |
| `Down` | 向下滚动一格 |
| `Ctrl + Up` | 滚动到顶部 |
| `Ctrl + Down` | 滚动到底部 |
# 详情页
**海报图区域**:双击 => 退出,单击 => 移动界面,鼠标滚轮 => 切换图片
**左右影片区域**:鼠标滚轮 => 切换影片
| 快捷键 | 功能 |
| :--------------: | :-------------: |
| `Esc` | 退出 |
| `Left` | 上一影片 |
| `Right` | 下一影片 |
| `Ctrl + Left` | 首个影片 |
| `Ctrl + Right` | 末尾影片 |
| `Space 或 Enter` | 播放 |
| `L` | 设置喜爱 (Love) |
| `E` | 编辑 (Edit) |
| `D` | 下载 (Download) |
\ No newline at end of file
# 刮削器获取 Headers 步骤
1. 打开浏览器(本教程使用 Chrome 浏览器),输入网址,注册后登入(有些网址不用注册登陆也行)
2. 在空白处右击点击审查元素(或者按 F12),出现如下界面,一次点击刷新,接着点击 Network(在弹出的界面的第 1 行),Doc(在第 2 或第 3 行),然后列表里会出现一个文件(文件名形如:xxxxx.com),点击该文件
[<img src="https://s1.ax1x.com/2022/06/11/XcZwZQ.png" alt="XcZwZQ.png" style="zoom:80%;" />](https://imgtu.com/i/XcZwZQ)
3. 选择 Headers(第一个)滚动到 **Request Headers** 这块,复制所有内容(不包括 Request Headers)
[<img src="https://s1.ax1x.com/2022/06/11/XcZ0aj.png" alt="XcZ0aj.png" style="zoom:80%;" />](https://imgtu.com/i/XcZ0aj)
示例
```properties
accept: xxx
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9
cache-control: no-cache
cookie: xxx
pragma: no-cache
upgrade-insecure-requests: 1
user-agent: xxx
...
```
4. 粘贴到软件中,并测试通过
\ No newline at end of file
# 常见问题
**如何取消收藏?**
双击第一颗星即可取消
**智能分类没有信息显示?**
请先同步信息,才能智能分类
**常见网络返回码机器机器原因?**
| 网络返回码 | 原因 |
| ---------- | ---------------------------------------------- |
| 404 | 网址无该资源 |
| 403 | 此商品未在您的居住国家公开,需要特定国家的代理 |
| 503, 504 | 网关请求超时,网址可能被屏蔽了 |
| 302 | 检索过于频繁,服务器源拒绝了请求 |
**图片无法同步 ?**
晚上网络不畅或者 IP 被屏蔽了,更换代理或者人少在爬
**视频无法导入 ?**
视频格式仅支持如下
```
3g2,3gp,3gp2,3gpp,amr,amv,asf,avi,bdmv,bik,d2v,divx,drc,dsa,dsm,dss,dsv,evo,f4v,flc,fli,flic,flv,hdmov,ifo,ivf,m1v,m2p,m2t,m2ts,m2v,m4b,m4p,m4v,mkv,mp2v,mp4,mp4v,mpe,mpeg,mpg,mpls,mpv2,mpv4,mov,mts,ogm,ogv,pss,pva,qt,ram,ratdvd,rm,rmm,rmvb,roq,rpm,smil,smk,swf,tp,tpr,ts,vob,vp6,webm,wm,wmp,wmv
```
**影片无法成功刮削,图片信息无法下载 ?**
- 检查网络是否畅通,网址是否正确输入,Cookie 是否正确输入,并成功测试网络
- 晚上 8:00-12:00 为高峰时间
- 具体问题可查看 `log\Network` 下当天的 log 文件
**Jvedio 支持那些网站和刮削器 ?**
网站支持:豆瓣、IMDB
**为什么浏览器可以访问网站,而软件无法测试通过 ?**
检查代理软件是否开启了全局代理或者是否正确设置了代理模式
**如何自己添加图片?**
- 缩略图/预览图:
将图片复制到 SmallPic/BigPic 目录下,名字改为识别码且大写,并与软件中显示的识别码完全对应
- 预览图
在 ExtraPic 目录下新建文件夹,名字改为识别码且大写,并与软件中显示的识别码完全对应,该目录放置任何格式的图片软件都能识别
- 演员头像
将图片复制到 Actresses 文件夹中,命名为演员名字,并与软件中显示的演员名字完全对应,比如软件显示 `TonyPark(Tony)`,则图片命名为 `TonyPark(Tony).jpg`
图片格式支持 jpg, jpeg, png, bpm 等常见图片格式
\ No newline at end of file
# 开发文档
[<img src="https://s1.ax1x.com/2022/06/11/XcZjdH.png" alt="XcZjdH.png" style="zoom:80%;" />](https://imgtu.com/i/XcZjdH)
# 编译运行
1. 下载并安装 visual studio 2022,安装的时候勾选 .NET 桌面开发,在顶部选项卡的【单个组件】中勾选上 .NET Framework 4.7.2 SDK 和目标包
1. 克隆仓库
```bash
git clone https://github.com/hitchao/Jvedio
```
3. 使用 Visual Studio 2022 打开 Jvedio-WPF 目录下的 Jvedio.sln
4. 在Visual Studio 2022解决方案资源管理器中选择 Jvedio 解决方案,右键-管理解决方案的 Nuget 程序包,弹出一个提示框提示还原 Nuget 包,点击还原即可
5. Nuget 包还原完成后,菜单栏中点击生成-重新生成解决方案
6. 点击启动即可
[<img src="https://s1.ax1x.com/2022/06/11/XcZvod.png" alt="XcZvod.png" style="zoom:80%;" />](https://imgtu.com/i/XcZvod)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{D7A06C53-5742-4894-820E-3697F81A3785}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Jvedio.Language</RootNamespace>
<AssemblyName>Jvedio.Language</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Resources\Resources.zh-CN.Designer.cs">
<DependentUpon>Resources.zh-CN.resx</DependentUpon>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="Resources\Resources.ja-JP.Designer.cs">
<DependentUpon>Resources.ja-JP.resx</DependentUpon>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="Resources\Resources.en-US.Designer.cs">
<DependentUpon>Resources.en-US.resx</DependentUpon>
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
</Compile>
<Compile Include="Resources\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DesignTime>True</DesignTime>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Resources\Resources.zh-CN.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.zh-CN.Designer.cs</LastGenOutput>
<CustomToolNamespace>Jvedio.Language</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Resources.ja-JP.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.ja-JP.Designer.cs</LastGenOutput>
<CustomToolNamespace>Jvedio.Language</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Resources.en-US.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.en-US.Designer.cs</LastGenOutput>
<CustomToolNamespace>Jvedio.Language</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="Resources\Resources.resx">
<Generator>PublicResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<CustomToolNamespace>Jvedio.Language</CustomToolNamespace>
<SubType>Designer</SubType>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Include="Readme.md" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Jvedio.Language")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Jvedio.Language")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("d7a06c53-5742-4894-820e-3697f81a3785")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
# 说明
- Jvedio.Language 是 Jvedio 的语言包
- /Resources/ 目录下是语言资源,visual studio 安装插件 Resource Manager 就可以编辑这个语言包
\ No newline at end of file
此差异已折叠。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{464EC247-E814-46B0-9061-007E0CCBCC4C}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>Jvedio.Release</RootNamespace>
<AssemblyName>Jvedio.Release</AssemblyName>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
<None Include="copy_to_jvedioupdate.bat">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Include="packages.config" />
<None Include="Readme.md" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace Jvedio.Release
{
internal class Program
{
static void Main(string[] args)
{
CopyAndRemoveFile();
}
public static void CopyAndRemoveFile()
{
string origin = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../Jvedio/bin/Debug");
origin = Path.GetFullPath(origin);
string target = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../Release/public/File");
target = Path.GetFullPath(target);
Console.WriteLine($"Copy File From [{origin}] to [{target}]");
try
{
Directory.Delete(target, true);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
TryCopy(origin, target);
// 删除文件
DeleteFiles();
// 生成 json
GenerateMD5Json();
// 复制 bat 文件
string bat_file = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "copy_to_jvedioupdate.bat");
string target_bat_file = Path.GetFullPath(Path.Combine(target, "../copy_to_jvedioupdate.bat"));
File.Copy(bat_file, target_bat_file, true);
Console.WriteLine("Finished!");
Console.WriteLine("Pressed Any Key to Exit.");
Console.ReadKey();
}
private static void DeleteFiles()
{
string basePath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../Release/public/File");
basePath = Path.GetFullPath(basePath);
if (Directory.Exists(basePath))
{
DirectoryInfo folder = new DirectoryInfo(basePath);
FileInfo[] fileList = folder.GetFiles();
foreach (FileInfo file in fileList)
{
if (file.Extension == ".xml" | file.Extension == ".ini" | file.Extension == ".application" | file.Extension == ".xml" | file.Extension == ".txt")
{
try
{
file.Delete();
}
catch (Exception ex)
{
continue;
}
}
}
List<string> deleteFilePaths = new List<string> { "config.ini", "AI.sqlite", "Info.sqlite", "Translate.sqlite", "OldVersion", "RecentWatch", "WindowConfig", "ServersConfig", "mylist.sqlite" };
if (File.Exists("filestodelete.txt"))
{
using (StreamReader sr = new StreamReader("filestodelete.txt"))
{
string content = sr.ReadToEnd();
var filenames = content.Split(Environment.NewLine.ToCharArray());
if (filenames.Length > 0)
{
foreach (var item in filenames)
{
deleteFilePaths.Add(item);
}
}
else
{
deleteFilePaths.Add(content);
}
}
}
foreach (var item in deleteFilePaths)
{
if (File.Exists(basePath + item)) { File.Delete(basePath + item); }
}
string[] deleteDirPaths = new string[] { "app.publish", "BackUp", "DataBase", "log", "Pic", "data" };
foreach (var item in deleteDirPaths)
{
string p = Path.Combine(basePath, item);
if (Directory.Exists(p))
{
try
{
Directory.Delete(p, true);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
string pluginPath = Path.Combine(basePath, "plugins", "crawlers");
string[] plugins = Directory.GetFiles(pluginPath, "*.*");
string[] retainPlugins = new string[] { "CommonNet.dll", "HtmlAgilityPack.dll" };
foreach (var item in plugins)
{
string fileName = Path.GetFileName(item);
if (!retainPlugins.Contains(fileName))
{
File.Delete(item);
}
}
}
}
private static void GenerateMD5Json()
{
string path = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "../../../Release/public/File/");
path = Path.GetFullPath(path);
if (Directory.Exists(path))
{
try
{
Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();
List<string> list1 = new List<string>();
List<string> list2 = new List<string>();
List<string> fileswithMD5 = new List<string>();
var files = Directory.GetFiles(path, "*.*", SearchOption.AllDirectories);
if (files != null)
{
foreach (var item in files)
{
if (File.Exists(item))
{
FileInfo fileInfo = new FileInfo(item);
list1.Add(fileInfo.FullName.Replace(path, ""));
list2.Add(GetMD5(item));
fileswithMD5.Add(fileInfo.FullName.Replace(path, "") + " " + GetMD5(item));
Console.Write("#");
}
}
Console.WriteLine();
}
dict.Add("FileName", list1);
dict.Add("FileHash", list2);
string value = JsonConvert.SerializeObject(dict);
string jsonPath = Path.GetFullPath(Path.Combine(path, "../list.json"));
using (var listfile = new StreamWriter(jsonPath, false))
{
listfile.Write(value);
}
// 老版本
string total = string.Join("\n", fileswithMD5);
string hashPath = Path.GetFullPath(Path.Combine(path, "../list"));
using (var listfile = new StreamWriter(hashPath, false))
{
listfile.Write(total);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
public static string GetMD5(string filename)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
}
}
}
public static void TryCopy(string sourcePath, string targetPath)
{
try
{
foreach (string dirPath in Directory.GetDirectories(sourcePath, "*", SearchOption.AllDirectories))
{
Directory.CreateDirectory(dirPath.Replace(sourcePath, targetPath));
}
//Copy all the files & Replaces any files with the same name
foreach (string newPath in Directory.GetFiles(sourcePath, "*.*", SearchOption.AllDirectories))
{
File.Copy(newPath, newPath.Replace(sourcePath, targetPath), true);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("Jvedio.Release")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Jvedio.Release")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("464ec247-e814-46b0-9061-007e0ccbcc4c")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
# 说明
Jvedio.Release 是用于将生成好的 Jvedio 文件复制到 /Jvedio-WPF/Release/public/File 下,并且生成 list 文件和 list.json 文件,这两个文件区别如下
- list:Jvedio 4.6.1.1 及之前的用于校验文件 md5 的列表
- list.json:Jvedio 5.0 开始是用的校验列表
@echo off
cls
set project_dir="D:\Jvedio\jvedioupdate"
set /p input=please input the project_dir of [jvedioupdate], default is(%project_dir%):
if "%input%" neq "" (set project_dir=%input%)
echo the project_dir of [jvedioupdate] is %project_dir%
rd /s/q %project_dir%\File
del /f/s/q %project_dir%\list
del /f/s/q %project_dir%\list.json
xcopy /y/e .\File %project_dir%\File\
copy /y .\list %project_dir%\list
copy /y .\list.json %project_dir%\list.json
pause
cls
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net472" />
</packages>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>
\ No newline at end of file
<Application
x:Class="Jvedio.Style.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!-- HandyControl -->
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml" />
<ResourceDictionary Source="pack://application:,,,/HandyControl;component/Themes/Theme.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/HandyControlStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/ButtonStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/SideRadioButtonStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/SideComboBoxStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/ContextMenuStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/RadioButtonStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/RadioButtonFlatStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/TabControlStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/ListBoxStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/ProgressBarStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/ButtonStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/ToggleButtonStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/ComboBoxStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/CheckBoxStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/TextBoxStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/BasicStyle.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/Style/ChaoControls/Pagination.xaml" />
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/Style/ChaoControls/Basic.xaml" />
<!--<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/Colors/DefaultColor.xaml" />-->
<ResourceDictionary Source="pack://application:,,,/Jvedio.Style;Component/XAML/GlobalStyle.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace Jvedio.Style
{
/// <summary>
/// App.xaml 的交互逻辑
/// </summary>
public partial class App : Application
{
}
}
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册