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)
|
||||
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
]
|
||||
}
|
||||
@@ -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)
|
||||
})
|
||||
|
||||
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)
|
||||
})
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)}>
|
||||
|
||||
@@ -37,6 +37,7 @@ export const TorrentCardPoster = styled.div`
|
||||
border-radius: 5px;
|
||||
overflow: hidden;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
|
||||
${({
|
||||
isPoster,
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
"Peers": "Peers",
|
||||
"PiecesCount": "Pieces count",
|
||||
"PiecesLength": "Pieces length",
|
||||
"Playlist": "Playlist",
|
||||
"Preload": "Preload",
|
||||
"ProjectSource": "Project page",
|
||||
"Releases": "TorrServer Releases",
|
||||
|
||||
@@ -71,6 +71,7 @@
|
||||
"Peers": "Пиры",
|
||||
"PiecesCount": "Кол-во блоков",
|
||||
"PiecesLength": "Размер блока",
|
||||
"Playlist": "Плейлист",
|
||||
"Preload": "Предзагр.",
|
||||
"ProjectSource": "Сайт проекта",
|
||||
"Releases": "Релизы TorrServer",
|
||||
|
||||
Reference in New Issue
Block a user