Merge branch 'master' into old-good-engine

This commit is contained in:
nikk gitanes
2021-08-21 08:12:58 +03:00
16 changed files with 104 additions and 93 deletions

View File

@@ -155,7 +155,7 @@ func (c *Cache) GetState() *state.CacheState {
}
readersState := make([]*state.ReaderState, 0)
if c.Readers() > 0 {
c.muReaders.Lock()
for r, _ := range c.readers {
@@ -258,13 +258,13 @@ func (c *Cache) getRemPieces() []*Piece {
if !c.pieces[i].Complete {
if i == readerPos {
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNow)
} else if i == readerPos + 1 {
} else if i == readerPos+1 {
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNext)
} else if i > readerPos && i <= readerRAHPos {
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityReadahead)
} else if i > readerRAHPos && i <= readerPos + (end - readerPos)/2 && c.torrent.PieceState(i).Priority != torrent.PiecePriorityHigh {
} else if i > readerRAHPos && i <= readerRAHPos+5 && c.torrent.PieceState(i).Priority != torrent.PiecePriorityHigh {
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityHigh)
} else if i > readerPos + (end - readerPos)/2 && c.torrent.PieceState(i).Priority != torrent.PiecePriorityNormal {
} else if i > readerRAHPos+5 && c.torrent.PieceState(i).Priority != torrent.PiecePriorityNormal {
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNormal)
}
limit++
@@ -282,10 +282,10 @@ func (c *Cache) getRemPieces() []*Piece {
}
func (c *Cache) isIdInFileBE(ranges []Range, id int) bool {
// keep 8/16 MB
FileRangeNotDelete := int64(c.pieceLength)
if (FileRangeNotDelete < 8 * 1024 * 1024) {
if FileRangeNotDelete < 8*1024*1024 {
FileRangeNotDelete = 8 * 1024 * 1024
}

View File

@@ -49,24 +49,24 @@ var Mstile150x150png []byte
var Sitewebmanifest []byte
//go:embed pages/static/js/2.97916048.chunk.js
var Staticjs297916048chunkjs []byte
//go:embed pages/static/js/2.5a98d9f9.chunk.js
var Staticjs25a98d9f9chunkjs []byte
//go:embed pages/static/js/2.97916048.chunk.js.LICENSE.txt
var Staticjs297916048chunkjsLICENSEtxt []byte
//go:embed pages/static/js/2.5a98d9f9.chunk.js.LICENSE.txt
var Staticjs25a98d9f9chunkjsLICENSEtxt []byte
//go:embed pages/static/js/2.97916048.chunk.js.map
var Staticjs297916048chunkjsmap []byte
//go:embed pages/static/js/2.5a98d9f9.chunk.js.map
var Staticjs25a98d9f9chunkjsmap []byte
//go:embed pages/static/js/main.d8f84fc6.chunk.js
var Staticjsmaind8f84fc6chunkjs []byte
//go:embed pages/static/js/main.823c0d3a.chunk.js
var Staticjsmain823c0d3achunkjs []byte
//go:embed pages/static/js/main.d8f84fc6.chunk.js.map
var Staticjsmaind8f84fc6chunkjsmap []byte
//go:embed pages/static/js/main.823c0d3a.chunk.js.map
var Staticjsmain823c0d3achunkjsmap []byte
//go:embed pages/static/js/runtime-main.8bda5920.js

View File

@@ -1,17 +1,17 @@
{
"files": {
"main.js": "/static/js/main.d8f84fc6.chunk.js",
"main.js.map": "/static/js/main.d8f84fc6.chunk.js.map",
"main.js": "/static/js/main.823c0d3a.chunk.js",
"main.js.map": "/static/js/main.823c0d3a.chunk.js.map",
"runtime-main.js": "/static/js/runtime-main.8bda5920.js",
"runtime-main.js.map": "/static/js/runtime-main.8bda5920.js.map",
"static/js/2.97916048.chunk.js": "/static/js/2.97916048.chunk.js",
"static/js/2.97916048.chunk.js.map": "/static/js/2.97916048.chunk.js.map",
"static/js/2.5a98d9f9.chunk.js": "/static/js/2.5a98d9f9.chunk.js",
"static/js/2.5a98d9f9.chunk.js.map": "/static/js/2.5a98d9f9.chunk.js.map",
"index.html": "/index.html",
"static/js/2.97916048.chunk.js.LICENSE.txt": "/static/js/2.97916048.chunk.js.LICENSE.txt"
"static/js/2.5a98d9f9.chunk.js.LICENSE.txt": "/static/js/2.5a98d9f9.chunk.js.LICENSE.txt"
},
"entrypoints": [
"static/js/runtime-main.8bda5920.js",
"static/js/2.97916048.chunk.js",
"static/js/main.d8f84fc6.chunk.js"
"static/js/2.5a98d9f9.chunk.js",
"static/js/main.823c0d3a.chunk.js"
]
}

View File

@@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png"><link rel="manifest" href="/site.webmanifest"><meta name="msapplication-TileColor" content="#da532c"><meta name="theme-color" content="#ffffff"><link rel="preconnect" href="https://fonts.gstatic.com"><link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600&display=swap" rel="stylesheet"><meta name="viewport" content="width=device-width,shrink-to-fit=no"><meta name="description" content="TorrServer - torrent to http stream"/><title>TorrServer</title></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="https://cdn.lordicon.com/libs/frhvbuzj/lord-icon-2.0.2.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-app.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-analytics.js"></script><script>const firebaseConfig={apiKey:"AIzaSyDivIsadtzAmp3SIY4yArNcFugUmr63rvo",authDomain:"torrserve.firebaseapp.com",databaseURL:"https://torrserve.firebaseio.com",projectId:"torrserve",storageBucket:"torrserve.appspot.com",messagingSenderId:"400168070412",appId:"1:400168070412:web:82c8e43dd7fc8f807aed29",measurementId:"G-T4RC2BFRSF"};firebase.initializeApp(firebaseConfig),firebase.analytics()</script><script>!function(e){function r(r){for(var n,l,f=r[0],i=r[1],a=r[2],c=0,s=[];c<f.length;c++)l=f[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,f=1;f<t.length;f++){var i=t[f];0!==o[i]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var f=this.webpackJsonptorrserver_web=this.webpackJsonptorrserver_web||[],i=f.push.bind(f);f.push=r,f=f.slice();for(var a=0;a<f.length;a++)r(f[a]);var p=i;t()}([])</script><script src="/static/js/2.97916048.chunk.js"></script><script src="/static/js/main.d8f84fc6.chunk.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"/><link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"><link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"><link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"><link rel="icon" type="image/png" sizes="192x192" href="/android-chrome-192x192.png"><link rel="manifest" href="/site.webmanifest"><meta name="msapplication-TileColor" content="#da532c"><meta name="theme-color" content="#ffffff"><link rel="preconnect" href="https://fonts.gstatic.com"><link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;600&display=swap" rel="stylesheet"><meta name="viewport" content="width=device-width,shrink-to-fit=no"><meta name="description" content="TorrServer - torrent to http stream"/><title>TorrServer</title></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script src="https://cdn.lordicon.com/libs/frhvbuzj/lord-icon-2.0.2.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-app.js"></script><script src="https://www.gstatic.com/firebasejs/8.1.2/firebase-analytics.js"></script><script>const firebaseConfig={apiKey:"AIzaSyDivIsadtzAmp3SIY4yArNcFugUmr63rvo",authDomain:"torrserve.firebaseapp.com",databaseURL:"https://torrserve.firebaseio.com",projectId:"torrserve",storageBucket:"torrserve.appspot.com",messagingSenderId:"400168070412",appId:"1:400168070412:web:82c8e43dd7fc8f807aed29",measurementId:"G-T4RC2BFRSF"};firebase.initializeApp(firebaseConfig),firebase.analytics()</script><script>!function(e){function r(r){for(var n,l,f=r[0],i=r[1],a=r[2],c=0,s=[];c<f.length;c++)l=f[c],Object.prototype.hasOwnProperty.call(o,l)&&o[l]&&s.push(o[l][0]),o[l]=0;for(n in i)Object.prototype.hasOwnProperty.call(i,n)&&(e[n]=i[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,f=1;f<t.length;f++){var i=t[f];0!==o[i]&&(n=!1)}n&&(u.splice(r--,1),e=l(l.s=t[0]))}return e}var n={},o={1:0},u=[];function l(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,l),t.l=!0,t.exports}l.m=e,l.c=n,l.d=function(e,r,t){l.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},l.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},l.t=function(e,r){if(1&r&&(e=l(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(l.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)l.d(t,n,function(r){return e[r]}.bind(null,n));return t},l.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return l.d(r,"a",r),r},l.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},l.p="/";var f=this.webpackJsonptorrserver_web=this.webpackJsonptorrserver_web||[],i=f.push.bind(f);f.push=r,f=f.slice();for(var a=0;a<f.length;a++)r(f[a]);var p=i;t()}([])</script><script src="/static/js/2.5a98d9f9.chunk.js"></script><script src="/static/js/main.823c0d3a.chunk.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -9,23 +9,28 @@ func RouteWebPages(route *gin.RouterGroup) {
c.Data(200, "text/html; charset=utf-8", Indexhtml)
})
route.GET("/asset-manifest.json", func(c *gin.Context) {
c.Data(200, "application/json", Assetmanifestjson)
route.GET("/index.html", func(c *gin.Context) {
c.Data(200, "text/html; charset=utf-8", Indexhtml)
})
route.GET("/favicon-32x32.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon32x32png)
route.GET("/static/js/2.5a98d9f9.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjs25a98d9f9chunkjs)
})
route.GET("/static/js/2.97916048.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjs297916048chunkjsmap)
route.GET("/static/js/main.823c0d3a.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsmain823c0d3achunkjsmap)
})
route.GET("/static/js/runtime-main.8bda5920.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsruntimemain8bda5920js)
route.GET("/static/js/runtime-main.8bda5920.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsruntimemain8bda5920jsmap)
})
route.GET("/android-chrome-192x192.png", func(c *gin.Context) {
c.Data(200, "image/png", Androidchrome192x192png)
})
@@ -34,11 +39,46 @@ func RouteWebPages(route *gin.RouterGroup) {
})
route.GET("/favicon-16x16.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon16x16png)
})
route.GET("/favicon.ico", func(c *gin.Context) {
c.Data(200, "image/x-icon", Faviconico)
})
route.GET("/static/js/2.5a98d9f9.chunk.js.LICENSE.txt", func(c *gin.Context) {
c.Data(200, "text/plain; charset=utf-8", Staticjs25a98d9f9chunkjsLICENSEtxt)
})
route.GET("/static/js/main.823c0d3a.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsmain823c0d3achunkjs)
})
route.GET("/android-chrome-512x512.png", func(c *gin.Context) {
c.Data(200, "image/png", Androidchrome512x512png)
})
route.GET("/asset-manifest.json", func(c *gin.Context) {
c.Data(200, "application/json", Assetmanifestjson)
})
route.GET("/browserconfig.xml", func(c *gin.Context) {
c.Data(200, "application/xml", Browserconfigxml)
})
route.GET("/favicon-32x32.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon32x32png)
})
route.GET("/mstile-150x150.png", func(c *gin.Context) {
c.Data(200, "image/png", Mstile150x150png)
})
@@ -49,53 +89,13 @@ func RouteWebPages(route *gin.RouterGroup) {
})
route.GET("/static/js/2.97916048.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjs297916048chunkjs)
route.GET("/static/js/2.5a98d9f9.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjs25a98d9f9chunkjsmap)
})
route.GET("/android-chrome-192x192.png", func(c *gin.Context) {
c.Data(200, "image/png", Androidchrome192x192png)
})
route.GET("/favicon.ico", func(c *gin.Context) {
c.Data(200, "image/x-icon", Faviconico)
})
route.GET("/static/js/main.d8f84fc6.chunk.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsmaind8f84fc6chunkjs)
})
route.GET("/static/js/main.d8f84fc6.chunk.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsmaind8f84fc6chunkjsmap)
})
route.GET("/static/js/runtime-main.8bda5920.js.map", func(c *gin.Context) {
c.Data(200, "application/json", Staticjsruntimemain8bda5920jsmap)
})
route.GET("/android-chrome-512x512.png", func(c *gin.Context) {
c.Data(200, "image/png", Androidchrome512x512png)
})
route.GET("/index.html", func(c *gin.Context) {
c.Data(200, "text/html; charset=utf-8", Indexhtml)
})
route.GET("/static/js/2.97916048.chunk.js.LICENSE.txt", func(c *gin.Context) {
c.Data(200, "text/plain; charset=utf-8", Staticjs297916048chunkjsLICENSEtxt)
})
route.GET("/favicon-16x16.png", func(c *gin.Context) {
c.Data(200, "image/png", Favicon16x16png)
route.GET("/static/js/runtime-main.8bda5920.js", func(c *gin.Context) {
c.Data(200, "application/javascript", Staticjsruntimemain8bda5920js)
})
}

View File

@@ -65,7 +65,6 @@ const TorrentCache = ({ cache, isMini }) => {
source.forEach(({ percentage, priority, isReader, isReaderRange }, i) => {
const inProgress = percentage > 0 && percentage < 100
const isCompleted = percentage === 100
const peacePriority = priority
const currentRow = i % piecesInOneRow
const currentColumn = Math.floor(i / piecesInOneRow)
const fixBlurStroke = borderWidth % 2 === 0 ? 0 : 0.5
@@ -92,13 +91,13 @@ const TorrentCache = ({ cache, isMini }) => {
ctx.strokeRect(0, 0, pieceSize, pieceSize)
ctx.setTransform(1, 0, 0, 1, 0, 0)
if (peacePriority > 0) {
if (priority > 0) {
let info = ''
if (peacePriority === 1) info = '*'
else if (peacePriority === 2) info = 'H'
else if (peacePriority === 3) info = 'R'
else if (peacePriority === 4) info = 'N'
else if (peacePriority === 5) info = 'A'
if (priority === 1) info = '*'
else if (priority === 2) info = 'H'
else if (priority === 3) info = 'R'
else if (priority === 4) info = 'N'
else if (priority === 5) info = 'A'
ctx.font = isMini ? '12px monospace' : '10px monospace'
const xpad = isMini ? pieceSize * 0.34 : pieceSize * 0.28
const ypad = isMini ? pieceSize * 0.69 : pieceSize * 0.78

View File

@@ -1,12 +1,12 @@
import { forwardRef, memo, useState } from 'react'
import {
UnfoldMore as UnfoldMoreIcon,
Edit as EditIcon,
PlayArrow as PlayArrowIcon,
Close as CloseIcon,
Delete as DeleteIcon,
} from '@material-ui/icons'
import { getPeerString, humanizeSize, humanizeSpeed, removeRedundantCharacters } from 'utils/Utils'
import { torrentsHost } from 'utils/Hosts'
import { playlistTorrHost, torrentsHost } from 'utils/Hosts'
import { NoImageIcon } from 'icons'
import DialogTorrentDetailsContent from 'components/DialogTorrentDetailsContent'
import Dialog from '@material-ui/core/Dialog'
@@ -59,10 +59,12 @@ const Torrent = ({ torrent }) => {
const handleClickOpenEditDialog = () => setIsEditDialogOpen(true)
const handleCloseEditDialog = () => setIsEditDialogOpen(false)
const fullPlaylistLink = `${playlistTorrHost()}/${encodeURIComponent(parsedTitle || 'file')}.m3u?link=${hash}&m3u`
return (
<>
<TorrentCard>
<TorrentCardPoster isPoster={poster}>
<TorrentCardPoster isPoster={poster} onClick={handleClickOpenEditDialog}>
{poster ? <img src={poster} alt='poster' /> : <NoImageIcon />}
</TorrentCardPoster>
@@ -72,9 +74,13 @@ const Torrent = ({ torrent }) => {
<span>{t('Details')}</span>
</StyledButton>
<StyledButton onClick={handleClickOpenEditDialog}>
<EditIcon />
<span>{t('Edit')}</span>
<StyledButton
onClick={() => {
window.open(fullPlaylistLink, '_blank')
}}
>
<PlayArrowIcon />
<span>{t('Playlist')}</span>
</StyledButton>
<StyledButton onClick={() => dropTorrent(torrent)}>

View File

@@ -37,6 +37,7 @@ export const TorrentCardPoster = styled.div`
border-radius: 5px;
overflow: hidden;
text-align: center;
cursor: pointer;
${({
isPoster,

View File

@@ -71,6 +71,7 @@
"Peers": "Peers",
"PiecesCount": "Pieces count",
"PiecesLength": "Pieces length",
"Playlist": "Playlist",
"Preload": "Preload",
"ProjectSource": "Project page",
"Releases": "TorrServer Releases",

View File

@@ -71,6 +71,7 @@
"Peers": "Пиры",
"PiecesCount": "Кол-во блоков",
"PiecesLength": "Размер блока",
"Playlist": "Плейлист",
"Preload": "Предзагр.",
"ProjectSource": "Сайт проекта",
"Releases": "Релизы TorrServer",