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) 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
} }

View File

@@ -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

View File

@@ -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"
] ]
} }

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) 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)
}) })
} }

View File

@@ -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

View File

@@ -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)}>

View File

@@ -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,

View File

@@ -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",

View File

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