mirror of
https://github.com/Ernous/TorrServerJellyfin.git
synced 2025-12-19 13:36:09 +05:00
Merge branch 'master' into old-good-engine
This commit is contained in:
@@ -155,7 +155,7 @@ func (c *Cache) GetState() *state.CacheState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
readersState := make([]*state.ReaderState, 0)
|
readersState := make([]*state.ReaderState, 0)
|
||||||
|
|
||||||
if c.Readers() > 0 {
|
if c.Readers() > 0 {
|
||||||
c.muReaders.Lock()
|
c.muReaders.Lock()
|
||||||
for r, _ := range c.readers {
|
for r, _ := range c.readers {
|
||||||
@@ -258,13 +258,13 @@ func (c *Cache) getRemPieces() []*Piece {
|
|||||||
if !c.pieces[i].Complete {
|
if !c.pieces[i].Complete {
|
||||||
if i == readerPos {
|
if i == readerPos {
|
||||||
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNow)
|
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNow)
|
||||||
} else if i == readerPos + 1 {
|
} else if i == readerPos+1 {
|
||||||
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNext)
|
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNext)
|
||||||
} else if i > readerPos && i <= readerRAHPos {
|
} else if i > readerPos && i <= readerRAHPos {
|
||||||
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityReadahead)
|
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)
|
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)
|
c.torrent.Piece(i).SetPriority(torrent.PiecePriorityNormal)
|
||||||
}
|
}
|
||||||
limit++
|
limit++
|
||||||
@@ -282,10 +282,10 @@ func (c *Cache) getRemPieces() []*Piece {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cache) isIdInFileBE(ranges []Range, id int) bool {
|
func (c *Cache) isIdInFileBE(ranges []Range, id int) bool {
|
||||||
|
|
||||||
// keep 8/16 MB
|
// keep 8/16 MB
|
||||||
FileRangeNotDelete := int64(c.pieceLength)
|
FileRangeNotDelete := int64(c.pieceLength)
|
||||||
if (FileRangeNotDelete < 8 * 1024 * 1024) {
|
if FileRangeNotDelete < 8*1024*1024 {
|
||||||
FileRangeNotDelete = 8 * 1024 * 1024
|
FileRangeNotDelete = 8 * 1024 * 1024
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,24 +49,24 @@ var Mstile150x150png []byte
|
|||||||
var Sitewebmanifest []byte
|
var Sitewebmanifest []byte
|
||||||
|
|
||||||
|
|
||||||
//go:embed pages/static/js/2.97916048.chunk.js
|
//go:embed pages/static/js/2.5a98d9f9.chunk.js
|
||||||
var Staticjs297916048chunkjs []byte
|
var Staticjs25a98d9f9chunkjs []byte
|
||||||
|
|
||||||
|
|
||||||
//go:embed pages/static/js/2.97916048.chunk.js.LICENSE.txt
|
//go:embed pages/static/js/2.5a98d9f9.chunk.js.LICENSE.txt
|
||||||
var Staticjs297916048chunkjsLICENSEtxt []byte
|
var Staticjs25a98d9f9chunkjsLICENSEtxt []byte
|
||||||
|
|
||||||
|
|
||||||
//go:embed pages/static/js/2.97916048.chunk.js.map
|
//go:embed pages/static/js/2.5a98d9f9.chunk.js.map
|
||||||
var Staticjs297916048chunkjsmap []byte
|
var Staticjs25a98d9f9chunkjsmap []byte
|
||||||
|
|
||||||
|
|
||||||
//go:embed pages/static/js/main.d8f84fc6.chunk.js
|
//go:embed pages/static/js/main.823c0d3a.chunk.js
|
||||||
var Staticjsmaind8f84fc6chunkjs []byte
|
var Staticjsmain823c0d3achunkjs []byte
|
||||||
|
|
||||||
|
|
||||||
//go:embed pages/static/js/main.d8f84fc6.chunk.js.map
|
//go:embed pages/static/js/main.823c0d3a.chunk.js.map
|
||||||
var Staticjsmaind8f84fc6chunkjsmap []byte
|
var Staticjsmain823c0d3achunkjsmap []byte
|
||||||
|
|
||||||
|
|
||||||
//go:embed pages/static/js/runtime-main.8bda5920.js
|
//go:embed pages/static/js/runtime-main.8bda5920.js
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"files": {
|
"files": {
|
||||||
"main.js": "/static/js/main.d8f84fc6.chunk.js",
|
"main.js": "/static/js/main.823c0d3a.chunk.js",
|
||||||
"main.js.map": "/static/js/main.d8f84fc6.chunk.js.map",
|
"main.js.map": "/static/js/main.823c0d3a.chunk.js.map",
|
||||||
"runtime-main.js": "/static/js/runtime-main.8bda5920.js",
|
"runtime-main.js": "/static/js/runtime-main.8bda5920.js",
|
||||||
"runtime-main.js.map": "/static/js/runtime-main.8bda5920.js.map",
|
"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.5a98d9f9.chunk.js": "/static/js/2.5a98d9f9.chunk.js",
|
||||||
"static/js/2.97916048.chunk.js.map": "/static/js/2.97916048.chunk.js.map",
|
"static/js/2.5a98d9f9.chunk.js.map": "/static/js/2.5a98d9f9.chunk.js.map",
|
||||||
"index.html": "/index.html",
|
"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": [
|
"entrypoints": [
|
||||||
"static/js/runtime-main.8bda5920.js",
|
"static/js/runtime-main.8bda5920.js",
|
||||||
"static/js/2.97916048.chunk.js",
|
"static/js/2.5a98d9f9.chunk.js",
|
||||||
"static/js/main.d8f84fc6.chunk.js"
|
"static/js/main.823c0d3a.chunk.js"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -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
File diff suppressed because one or more lines are too long
@@ -9,23 +9,28 @@ func RouteWebPages(route *gin.RouterGroup) {
|
|||||||
c.Data(200, "text/html; charset=utf-8", Indexhtml)
|
c.Data(200, "text/html; charset=utf-8", Indexhtml)
|
||||||
})
|
})
|
||||||
|
|
||||||
route.GET("/asset-manifest.json", func(c *gin.Context) {
|
route.GET("/index.html", func(c *gin.Context) {
|
||||||
c.Data(200, "application/json", Assetmanifestjson)
|
c.Data(200, "text/html; charset=utf-8", Indexhtml)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
route.GET("/favicon-32x32.png", func(c *gin.Context) {
|
route.GET("/static/js/2.5a98d9f9.chunk.js", func(c *gin.Context) {
|
||||||
c.Data(200, "image/png", Favicon32x32png)
|
c.Data(200, "application/javascript", Staticjs25a98d9f9chunkjs)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
route.GET("/static/js/2.97916048.chunk.js.map", func(c *gin.Context) {
|
route.GET("/static/js/main.823c0d3a.chunk.js.map", func(c *gin.Context) {
|
||||||
c.Data(200, "application/json", Staticjs297916048chunkjsmap)
|
c.Data(200, "application/json", Staticjsmain823c0d3achunkjsmap)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
route.GET("/static/js/runtime-main.8bda5920.js", func(c *gin.Context) {
|
route.GET("/static/js/runtime-main.8bda5920.js.map", func(c *gin.Context) {
|
||||||
c.Data(200, "application/javascript", Staticjsruntimemain8bda5920js)
|
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) {
|
route.GET("/browserconfig.xml", func(c *gin.Context) {
|
||||||
c.Data(200, "application/xml", Browserconfigxml)
|
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) {
|
route.GET("/mstile-150x150.png", func(c *gin.Context) {
|
||||||
c.Data(200, "image/png", Mstile150x150png)
|
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) {
|
route.GET("/static/js/2.5a98d9f9.chunk.js.map", func(c *gin.Context) {
|
||||||
c.Data(200, "application/javascript", Staticjs297916048chunkjs)
|
c.Data(200, "application/json", Staticjs25a98d9f9chunkjsmap)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
route.GET("/android-chrome-192x192.png", func(c *gin.Context) {
|
route.GET("/static/js/runtime-main.8bda5920.js", func(c *gin.Context) {
|
||||||
c.Data(200, "image/png", Androidchrome192x192png)
|
c.Data(200, "application/javascript", Staticjsruntimemain8bda5920js)
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -65,7 +65,6 @@ const TorrentCache = ({ cache, isMini }) => {
|
|||||||
source.forEach(({ percentage, priority, isReader, isReaderRange }, i) => {
|
source.forEach(({ percentage, priority, isReader, isReaderRange }, i) => {
|
||||||
const inProgress = percentage > 0 && percentage < 100
|
const inProgress = percentage > 0 && percentage < 100
|
||||||
const isCompleted = percentage === 100
|
const isCompleted = percentage === 100
|
||||||
const peacePriority = priority
|
|
||||||
const currentRow = i % piecesInOneRow
|
const currentRow = i % piecesInOneRow
|
||||||
const currentColumn = Math.floor(i / piecesInOneRow)
|
const currentColumn = Math.floor(i / piecesInOneRow)
|
||||||
const fixBlurStroke = borderWidth % 2 === 0 ? 0 : 0.5
|
const fixBlurStroke = borderWidth % 2 === 0 ? 0 : 0.5
|
||||||
@@ -92,13 +91,13 @@ const TorrentCache = ({ cache, isMini }) => {
|
|||||||
ctx.strokeRect(0, 0, pieceSize, pieceSize)
|
ctx.strokeRect(0, 0, pieceSize, pieceSize)
|
||||||
ctx.setTransform(1, 0, 0, 1, 0, 0)
|
ctx.setTransform(1, 0, 0, 1, 0, 0)
|
||||||
|
|
||||||
if (peacePriority > 0) {
|
if (priority > 0) {
|
||||||
let info = ''
|
let info = ''
|
||||||
if (peacePriority === 1) info = '*'
|
if (priority === 1) info = '*'
|
||||||
else if (peacePriority === 2) info = 'H'
|
else if (priority === 2) info = 'H'
|
||||||
else if (peacePriority === 3) info = 'R'
|
else if (priority === 3) info = 'R'
|
||||||
else if (peacePriority === 4) info = 'N'
|
else if (priority === 4) info = 'N'
|
||||||
else if (peacePriority === 5) info = 'A'
|
else if (priority === 5) info = 'A'
|
||||||
ctx.font = isMini ? '12px monospace' : '10px monospace'
|
ctx.font = isMini ? '12px monospace' : '10px monospace'
|
||||||
const xpad = isMini ? pieceSize * 0.34 : pieceSize * 0.28
|
const xpad = isMini ? pieceSize * 0.34 : pieceSize * 0.28
|
||||||
const ypad = isMini ? pieceSize * 0.69 : pieceSize * 0.78
|
const ypad = isMini ? pieceSize * 0.69 : pieceSize * 0.78
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
import { forwardRef, memo, useState } from 'react'
|
import { forwardRef, memo, useState } from 'react'
|
||||||
import {
|
import {
|
||||||
UnfoldMore as UnfoldMoreIcon,
|
UnfoldMore as UnfoldMoreIcon,
|
||||||
Edit as EditIcon,
|
PlayArrow as PlayArrowIcon,
|
||||||
Close as CloseIcon,
|
Close as CloseIcon,
|
||||||
Delete as DeleteIcon,
|
Delete as DeleteIcon,
|
||||||
} from '@material-ui/icons'
|
} from '@material-ui/icons'
|
||||||
import { getPeerString, humanizeSize, humanizeSpeed, removeRedundantCharacters } from 'utils/Utils'
|
import { getPeerString, humanizeSize, humanizeSpeed, removeRedundantCharacters } from 'utils/Utils'
|
||||||
import { torrentsHost } from 'utils/Hosts'
|
import { playlistTorrHost, torrentsHost } from 'utils/Hosts'
|
||||||
import { NoImageIcon } from 'icons'
|
import { NoImageIcon } from 'icons'
|
||||||
import DialogTorrentDetailsContent from 'components/DialogTorrentDetailsContent'
|
import DialogTorrentDetailsContent from 'components/DialogTorrentDetailsContent'
|
||||||
import Dialog from '@material-ui/core/Dialog'
|
import Dialog from '@material-ui/core/Dialog'
|
||||||
@@ -59,10 +59,12 @@ const Torrent = ({ torrent }) => {
|
|||||||
const handleClickOpenEditDialog = () => setIsEditDialogOpen(true)
|
const handleClickOpenEditDialog = () => setIsEditDialogOpen(true)
|
||||||
const handleCloseEditDialog = () => setIsEditDialogOpen(false)
|
const handleCloseEditDialog = () => setIsEditDialogOpen(false)
|
||||||
|
|
||||||
|
const fullPlaylistLink = `${playlistTorrHost()}/${encodeURIComponent(parsedTitle || 'file')}.m3u?link=${hash}&m3u`
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<TorrentCard>
|
<TorrentCard>
|
||||||
<TorrentCardPoster isPoster={poster}>
|
<TorrentCardPoster isPoster={poster} onClick={handleClickOpenEditDialog}>
|
||||||
{poster ? <img src={poster} alt='poster' /> : <NoImageIcon />}
|
{poster ? <img src={poster} alt='poster' /> : <NoImageIcon />}
|
||||||
</TorrentCardPoster>
|
</TorrentCardPoster>
|
||||||
|
|
||||||
@@ -72,9 +74,13 @@ const Torrent = ({ torrent }) => {
|
|||||||
<span>{t('Details')}</span>
|
<span>{t('Details')}</span>
|
||||||
</StyledButton>
|
</StyledButton>
|
||||||
|
|
||||||
<StyledButton onClick={handleClickOpenEditDialog}>
|
<StyledButton
|
||||||
<EditIcon />
|
onClick={() => {
|
||||||
<span>{t('Edit')}</span>
|
window.open(fullPlaylistLink, '_blank')
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<PlayArrowIcon />
|
||||||
|
<span>{t('Playlist')}</span>
|
||||||
</StyledButton>
|
</StyledButton>
|
||||||
|
|
||||||
<StyledButton onClick={() => dropTorrent(torrent)}>
|
<StyledButton onClick={() => dropTorrent(torrent)}>
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ export const TorrentCardPoster = styled.div`
|
|||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
${({
|
${({
|
||||||
isPoster,
|
isPoster,
|
||||||
|
|||||||
@@ -71,6 +71,7 @@
|
|||||||
"Peers": "Peers",
|
"Peers": "Peers",
|
||||||
"PiecesCount": "Pieces count",
|
"PiecesCount": "Pieces count",
|
||||||
"PiecesLength": "Pieces length",
|
"PiecesLength": "Pieces length",
|
||||||
|
"Playlist": "Playlist",
|
||||||
"Preload": "Preload",
|
"Preload": "Preload",
|
||||||
"ProjectSource": "Project page",
|
"ProjectSource": "Project page",
|
||||||
"Releases": "TorrServer Releases",
|
"Releases": "TorrServer Releases",
|
||||||
|
|||||||
@@ -71,6 +71,7 @@
|
|||||||
"Peers": "Пиры",
|
"Peers": "Пиры",
|
||||||
"PiecesCount": "Кол-во блоков",
|
"PiecesCount": "Кол-во блоков",
|
||||||
"PiecesLength": "Размер блока",
|
"PiecesLength": "Размер блока",
|
||||||
|
"Playlist": "Плейлист",
|
||||||
"Preload": "Предзагр.",
|
"Preload": "Предзагр.",
|
||||||
"ProjectSource": "Сайт проекта",
|
"ProjectSource": "Сайт проекта",
|
||||||
"Releases": "Релизы TorrServer",
|
"Releases": "Релизы TorrServer",
|
||||||
|
|||||||
Reference in New Issue
Block a user