perf: include all settings (#793)

This commit is contained in:
Rémi Marseault 2023-05-08 09:54:31 +02:00 committed by GitHub
parent 30beddaab4
commit 3e7f35107b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
45 changed files with 3002 additions and 1315 deletions

View file

@ -34,7 +34,7 @@ import Modal from '@/mixins/Modal'
import { mdiFile } from '@mdi/js'
import { FullScreenModal } from '@/mixins'
import qbit from '@/services/qbit'
import {defineComponent} from "vue";
import { defineComponent } from 'vue'
export default defineComponent({
name: 'RenameModal',

View file

@ -36,7 +36,7 @@
import qbit from '@/services/qbit'
import { Modal } from '@/mixins'
import { mdiCancel, mdiTagPlus, mdiPencil } from '@mdi/js'
import Vue, {defineComponent} from 'vue'
import { defineComponent } from 'vue'
export default defineComponent({
name: 'FeedForm',
@ -77,7 +77,7 @@ export default defineComponent({
},
edit() {
qbit.editFeed(this.initialFeed.name, this.feed.name)
Vue.$toast.success(this.$t('toast.feedSaved'))
this.$toast.success(this.$t('toast.feedSaved'))
this.cancel()
},
handleKeyboardShortcut(e: KeyboardEvent) {

View file

@ -0,0 +1,553 @@
<template>
<v-card flat>
<v-subheader>
{{ $t('modals.settings.advanced.qbittorrent.subheader') }}
(<a href="https://github.com/qbittorrent/qBittorrent/wiki/Explanation-of-Options-in-qBittorrent#Advanced" target="_blank">{{ $t('modals.settings.advanced.openDoc') }}</a
>)
</v-subheader>
<v-list-item>
<v-text-field
v-model="settings.memory_working_set_limit"
type="number"
dense
hide-details
outlined
class="my-5"
:hint="$t('modals.settings.advanced.qbittorrent.allocatedRamHint')"
:label="$t('modals.settings.advanced.qbittorrent.allocatedRam')"
/>
</v-list-item>
<v-list-item>
<v-select
v-model="settings.current_network_interface"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="networkInterfaceOptions"
:label="$t('modals.settings.advanced.qbittorrent.networkInterfaces.label')"
/>
</v-list-item>
<v-list-item>
<v-select
v-model="settings.current_interface_address"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="ipAddressesOptions"
:label="$t('modals.settings.advanced.qbittorrent.ipAddress.label')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.save_resume_data_interval"
type="number"
dense
outlined
:hint="$t('modals.settings.advanced.qbittorrent.saveIntervalHint')"
:label="$t('modals.settings.advanced.qbittorrent.saveInterval')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.recheck_completed_torrents" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.qbittorrent.recheckOnCompletion')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.refresh_interval"
type="number"
dense
outlined
:hint="$t('modals.settings.advanced.qbittorrent.refreshIntervalHint')"
:label="$t('modals.settings.advanced.qbittorrent.refreshInterval')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.resolve_peer_countries" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.qbittorrent.resolveCountries')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.reannounce_when_address_changed" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.qbittorrent.reannounceOnIpPortChanged')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.enable_embedded_tracker" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.qbittorrent.enableEmbeddedTracker')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.embedded_tracker_port"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.qbittorrent.embeddedTrackerPort')"
/>
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.embedded_tracker_port_forwarding"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.advanced.qbittorrent.embeddedTrackerPortForwarding')"
/>
</v-list-item>
<v-divider />
<v-subheader>
{{ $t('modals.settings.advanced.libtorrent.subheader') }}
(<a href="https://www.libtorrent.org/reference-Settings.html" target="_blank">{{ $t('modals.settings.advanced.openDoc') }}</a
>)
</v-subheader>
<v-list-item>
<v-text-field v-model="settings.async_io_threads" type="number" dense hide-details outlined class="my-5" :label="$t('modals.settings.advanced.libtorrent.asyncIoThreads')" />
</v-list-item>
<v-list-item>
<v-text-field v-model="settings.hashing_threads" type="number" dense hide-details outlined class="my-5" :label="$t('modals.settings.advanced.libtorrent.hashingThreads')" />
</v-list-item>
<v-list-item>
<v-text-field v-model="settings.file_pool_size" type="number" dense hide-details outlined class="my-5" :label="$t('modals.settings.advanced.libtorrent.filePoolSize')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.checking_memory_use"
type="number"
dense
outlined
:hint="$t('modals.settings.advanced.libtorrent.outstandingMemoryHint')"
:label="$t('modals.settings.advanced.libtorrent.outstandingMemory')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.disk_cache"
type="number"
dense
outlined
:hint="$t('modals.settings.advanced.libtorrent.diskCacheHint')"
:label="$t('modals.settings.advanced.libtorrent.diskCache')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.disk_cache_ttl"
type="number"
dense
outlined
:hint="$t('modals.settings.advanced.libtorrent.diskCacheExpiryHint')"
:label="$t('modals.settings.advanced.libtorrent.diskCacheExpiry')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.disk_queue_size"
type="number"
dense
outlined
:hint="$t('modals.settings.advanced.libtorrent.diskQueueSizeHint')"
:label="$t('modals.settings.advanced.libtorrent.diskQueueSize')"
/>
</v-list-item>
<v-list-item>
<v-select
v-model="settings.disk_io_type"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="diskIoTypeOptions"
:label="$t('modals.settings.advanced.libtorrent.diskIoType')"
/>
</v-list-item>
<v-list-item>
<v-select
v-model="settings.disk_io_read_mode"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="diskIoModeReadOptions"
:label="$t('modals.settings.advanced.libtorrent.diskIoReadMode')"
/>
</v-list-item>
<v-list-item>
<v-select
v-model="settings.disk_io_write_mode"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="diskIoModeWriteOptions"
:label="$t('modals.settings.advanced.libtorrent.diskIoWriteMode')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.enable_coalesce_read_write" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.libtorrent.coalesceReadsWrites')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.enable_piece_extent_affinity" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.libtorrent.pieceExtentAffinity')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.enable_upload_suggestions" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.libtorrent.sendUploadPieceSuggestions')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.send_buffer_watermark"
type="number"
dense
hide-details
outlined
class="my-5"
:hint="$t('modals.settings.advanced.libtorrent.sendBufferWatermarkHint')"
:label="$t('modals.settings.advanced.libtorrent.sendBufferWatermark')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.send_buffer_low_watermark"
type="number"
dense
hide-details
outlined
class="my-5"
:hint="$t('modals.settings.advanced.libtorrent.sendBufferLowWatermarkHint')"
:label="$t('modals.settings.advanced.libtorrent.sendBufferLowWatermark')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.send_buffer_watermark_factor"
type="number"
dense
hide-details
outlined
class="my-5"
:hint="$t('modals.settings.advanced.libtorrent.sendBufferWatermarkFactorHint')"
:label="$t('modals.settings.advanced.libtorrent.sendBufferWatermarkFactor')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.connection_speed"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.outgoingConnectionsPerSecond')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.socket_backlog_size"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.socketBacklogSize')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.outgoing_ports_min"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.outgoingPortsMin')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.outgoing_ports_max"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.outgoingPortsMax')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.upnp_lease_duration"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.upnpLeaseDuration')"
/>
</v-list-item>
<v-list-item>
<v-text-field v-model="settings.peer_tos" type="number" dense hide-details outlined class="my-5" :label="$t('modals.settings.advanced.libtorrent.peerTos')" />
</v-list-item>
<v-list-item>
<v-select
v-model="settings.utp_tcp_mixed_mode"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="utpTcpMixedModeOptions"
:label="$t('modals.settings.advanced.libtorrent.utpTcpMixedModeAlgorithm')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.idn_support_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.libtorrent.idnSupport')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.enable_multi_connections_from_same_ip"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.advanced.libtorrent.allowMultipleConnectionsFromTheSameIPAddress')"
/>
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.validate_https_tracker_certificate"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.advanced.libtorrent.validateHTTPSTrackerCertificate')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.ssrf_mitigation" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.libtorrent.mitigateSSRF')" />
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.block_peers_on_privileged_ports"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.advanced.libtorrent.blockPeersOnPrivilegedPorts')"
/>
</v-list-item>
<v-list-item>
<v-select
v-model="settings.upload_slots_behavior"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="uploadSlotsBehaviorOptions"
:label="$t('modals.settings.advanced.libtorrent.uploadSlotsBehavior')"
/>
</v-list-item>
<v-list-item>
<v-select
v-model="settings.upload_choking_algorithm"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="uploadChokingAlgorithmOptions"
:label="$t('modals.settings.advanced.libtorrent.uploadChokingAlgorithm')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.announce_to_all_trackers" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.libtorrent.announceAllTrackers')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.announce_to_all_tiers" hide-details class="ma-0 pa-0" :label="$t('modals.settings.advanced.libtorrent.announceAllTiers')" />
</v-list-item>
<v-list-item>
<v-text-field v-model="settings.announce_ip" type="number" dense hide-details outlined class="my-5" :label="$t('modals.settings.advanced.libtorrent.announceIP')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.max_concurrent_http_announces"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.maxConcurrentHTTPAnnounces')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.stop_tracker_timeout"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.stopTrackerTimeout')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.peer_turnover"
type="number"
dense
hide-details
outlined
class="my-5"
:hint="$t('modals.settings.advanced.libtorrent.peerTurnoverHint')"
:label="$t('modals.settings.advanced.libtorrent.peerTurnover')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.peer_turnover_cutoff"
type="number"
dense
hide-details
outlined
class="my-5"
:hint="$t('modals.settings.advanced.libtorrent.peerTurnoverCutoffHint')"
:label="$t('modals.settings.advanced.libtorrent.peerTurnoverCutoff')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.peer_turnover_interval"
type="number"
dense
hide-details
outlined
class="my-5"
:hint="$t('modals.settings.advanced.libtorrent.peerTurnoverIntervalHint')"
:label="$t('modals.settings.advanced.libtorrent.peerTurnoverInterval')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.request_queue_size"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.advanced.libtorrent.requestQueueSize')"
/>
</v-list-item>
</v-card>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { FullScreenModal, SettingsTab } from '@/mixins'
import { DiskIOMode, DiskIOType, UploadChokingAlgorithm, UploadSlotsBehavior, UtpTcpMixedMode } from '@/enums/qbit/AppPreferences'
import qbit from '@/services/qbit'
export default defineComponent({
name: 'Advanced',
mixins: [SettingsTab, FullScreenModal],
data() {
return {
networkInterfaceOptions: [{ text: this.$t('modals.settings.advanced.qbittorrent.networkInterfaces.any'), value: '' }],
ipAddressesOptions: [
{ text: this.$t('modals.settings.advanced.qbittorrent.ipAddress.all'), value: '' },
{ text: this.$t('modals.settings.advanced.qbittorrent.ipAddress.allIPv4'), value: '0.0.0.0' },
{ text: this.$t('modals.settings.advanced.qbittorrent.ipAddress.allIPv6'), value: '::' }
],
diskIoTypeOptions: [
{ text: this.$t('enums.diskIoType.default'), value: DiskIOType.DEFAULT },
{ text: this.$t('enums.diskIoType.memoryMappedFiles'), value: DiskIOType.MEMORY_MAPPED_FILES },
{ text: this.$t('enums.diskIoType.posixCompliant'), value: DiskIOType.POSIX_COMPLIANT }
],
diskIoModeReadOptions: [
{ text: this.$t('enums.diskIoMode.disableOsCache'), value: DiskIOMode.DISABLE_OS_CACHE },
{ text: this.$t('enums.diskIoMode.enableOsCache'), value: DiskIOMode.ENABLE_OS_CACHE }
],
diskIoModeWriteOptions: [
{ text: this.$t('enums.diskIoMode.disableOsCache'), value: DiskIOMode.DISABLE_OS_CACHE },
{ text: this.$t('enums.diskIoMode.enableOsCache'), value: DiskIOMode.ENABLE_OS_CACHE },
{ text: this.$t('enums.diskIoMode.writeThrough'), value: DiskIOMode.WRITE_THROUGH }
],
utpTcpMixedModeOptions: [
{ text: this.$t('enums.utpTcpMixedMode.preferTcp'), value: UtpTcpMixedMode.PREFER_TCP },
{ text: this.$t('enums.utpTcpMixedMode.peerProportional'), value: UtpTcpMixedMode.PEER_PROPORTIONAL }
],
uploadSlotsBehaviorOptions: [
{ text: this.$t('enums.uploadSlotsBehavior.fixedSlots'), value: UploadSlotsBehavior.FIXED_SLOTS },
{ text: this.$t('enums.uploadSlotsBehavior.uploadRateBased'), value: UploadSlotsBehavior.UPLOAD_RATE_BASED }
],
uploadChokingAlgorithmOptions: [
{ text: this.$t('enums.uploadChokingAlgorithm.roundRobin'), value: UploadChokingAlgorithm.ROUND_ROBIN },
{ text: this.$t('enums.uploadChokingAlgorithm.fastestUpload'), value: UploadChokingAlgorithm.FASTEST_UPLOAD },
{ text: this.$t('enums.uploadChokingAlgorithm.antiLeech'), value: UploadChokingAlgorithm.ANTI_LEECH }
]
}
},
async mounted() {
const networkInterfaces = await qbit.getNetworkInterfaces()
for (const networkInterface of networkInterfaces) {
this.networkInterfaceOptions.push({ text: networkInterface.name, value: networkInterface.value })
}
const ipAddresses = await qbit.getAddresses(this.settings.current_network_interface)
for (const ipAddress of ipAddresses) {
this.ipAddressesOptions.push({ text: ipAddress, value: ipAddress })
}
}
})
</script>

View file

@ -1,103 +1,146 @@
<template>
<v-card flat>
<v-subheader>{{ $t('modals.settings.pageBittorrent.subHeaderPrivacy') }}</v-subheader>
<v-subheader>{{ $t('modals.settings.bittorrent.privacy.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.dht" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enableDHT')" />
<v-checkbox v-model="settings.dht" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.privacy.enableDHT')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.pex" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enablePeX')" />
<v-checkbox v-model="settings.pex" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.privacy.enablePeX')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.lsd" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enableLPD')" />
<v-checkbox v-model="settings.lsd" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.privacy.enableLPD')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.anonymous_mode" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.enableAnonymous')" />
<v-select
v-model="settings.encryption"
height="1"
flat
dense
hide-details
outlined
:items="encyptionModeOptions"
:label="$t('modals.settings.bittorrent.privacy.encryptionMode')"
/>
</v-list-item>
<v-divider insert />
<v-list-item>
<v-checkbox v-model="settings.queueing_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.torrentQueue')" />
<v-checkbox v-model="settings.anonymous_mode" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.privacy.enableAnonymous')" />
<a href="https://github.com/qbittorrent/qBittorrent/wiki/Anonymous-Mode" class="ml-3" target="_blank">{{ $t('modals.settings.bittorrent.privacy.moreInfo') }}</a>
</v-list-item>
<v-divider />
<v-list-item>
<v-text-field
v-model="settings.max_active_checking_torrents"
type="number"
dense
hide-details
outlined
class="my-5"
:label="$t('modals.settings.bittorrent.maxActiveCheckingTorrents')"
/>
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.queueing_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.torrentQueueing.subheader')" />
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.queueing_enabled"
v-model="settings.max_active_downloads"
class="mb-2"
class="mb-5"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageBittorrent.maxActiveDownload')"
:disabled="!settings.queueing_enabled"
:label="$t('modals.settings.bittorrent.torrentQueueing.maxActiveDownload')"
/>
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.queueing_enabled"
v-model="settings.max_active_uploads"
class="mb-2"
class="mb-5"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageBittorrent.maxActiveUpload')"
:disabled="!settings.queueing_enabled"
:label="$t('modals.settings.bittorrent.torrentQueueing.maxActiveUpload')"
/>
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.queueing_enabled"
v-model="settings.max_active_torrents"
class="mb-2"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageBittorrent.maxActiveTorrent')"
:label="$t('modals.settings.bittorrent.torrentQueueing.maxActiveTorrent')"
/>
</v-list-item>
<v-list-item class="ms-8">
<v-checkbox
:disabled="!settings.queueing_enabled"
v-model="settings.dont_count_slow_torrents"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.bittorrent.torrentQueueing.excludeSlowTorrent')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.dont_count_slow_torrents" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.excludeSlowTorrent')" />
</v-list-item>
<v-list-item>
<v-list-item class="ms-8">
<v-text-field
:disabled="!settings.queueing_enabled || !settings.dont_count_slow_torrents"
v-model="settings.slow_torrent_dl_rate_threshold"
class="mb-2"
class="mb-5"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageBittorrent.downloadRateLimit')"
:disabled="!settings.dont_count_slow_torrents"
:label="$t('modals.settings.bittorrent.torrentQueueing.downloadRateLimit')"
/>
</v-list-item>
<v-list-item>
<v-list-item class="ms-8">
<v-text-field
:disabled="!settings.queueing_enabled || !settings.dont_count_slow_torrents"
v-model="settings.slow_torrent_ul_rate_threshold"
class="mb-2"
class="mb-5"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageBittorrent.uploadRateLimit')"
:disabled="!settings.dont_count_slow_torrents"
:label="$t('modals.settings.bittorrent.torrentQueueing.uploadRateLimit')"
/>
</v-list-item>
<v-list-item>
<v-list-item class="ms-8">
<v-text-field
:disabled="!settings.queueing_enabled || !settings.dont_count_slow_torrents"
v-model="settings.slow_torrent_inactive_timer"
class="mb-2"
class="mb-5"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageBittorrent.torrentInactivityTimer')"
:disabled="!settings.dont_count_slow_torrents"
:label="$t('modals.settings.bittorrent.torrentQueueing.torrentInactivityTimer')"
/>
</v-list-item>
<v-divider insert />
<v-subheader>{{ $t('modals.settings.pageBittorrent.subHeaderSeedLimits') }}</v-subheader>
<v-divider />
<v-subheader>{{ $t('modals.settings.bittorrent.seedLimits.subheader') }}</v-subheader>
<v-list-item>
<v-row dense>
<v-col>
<v-checkbox v-model="settings.max_ratio_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.whenRatioReaches')" />
<v-checkbox v-model="settings.max_ratio_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.seedLimits.whenRatioReaches')" />
</v-col>
<v-col>
<v-text-field v-model="settings.max_ratio" class="mb-2" outlined dense type="number" hide-details :disabled="!settings.max_ratio_enabled" />
@ -107,7 +150,7 @@
<v-list-item>
<v-row dense>
<v-col>
<v-checkbox v-model="settings.max_seeding_time_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageBittorrent.whenSeedingTimeReaches')" />
<v-checkbox v-model="settings.max_seeding_time_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.seedLimits.whenSeedingTimeReaches')" />
</v-col>
<v-col>
<v-text-field v-model="settings.max_seeding_time" class="mb-2" outlined dense type="number" hide-details :disabled="!settings.max_seeding_time_enabled" />
@ -118,53 +161,66 @@
<v-row dense>
<v-col>
<v-subheader>
{{ $t('then') }}
{{ $t('modals.settings.bittorrent.seedLimits.then') }}
</v-subheader>
</v-col>
<v-col>
<v-select
v-model="settings.max_ratio_act"
class="mb-2"
outlined
:disabled="!settings.max_ratio_enabled && !settings.max_seeding_time_enabled"
v-model="settings.max_ratio_act"
height="1"
flat
dense
small-chips
hide-details
outlined
:items="thenTypes"
/>
</v-col>
</v-row>
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.add_trackers" hide-details class="ma-0 pa-0" :label="$t('modals.settings.bittorrent.autoAddTrackers')" />
</v-list-item>
<v-list-item>
<v-textarea
:disabled="!settings.add_trackers"
v-model="settings.excluded_file_names"
outlined
required
auto-grow
clearable
persistent-hint
:hint="$t('modals.settings.bittorrent.autoAddTrackersHint')"
/>
</v-list-item>
</v-card>
</template>
<script>
<script lang="ts">
import { defineComponent } from 'vue'
import { SettingsTab, FullScreenModal } from '@/mixins'
import { MaxRatioAction } from '@/enums/qbit/AppPreferences'
import { Encryption, MaxRatioAction } from '@/enums/qbit/AppPreferences'
export default {
export default defineComponent({
name: 'BitTorrent',
mixins: [SettingsTab, FullScreenModal],
data() {
return {
encyptionModeOptions: [
{ value: Encryption.PREFER_ENCRYPTION, text: this.$t('enums.encryption.preferEncryption') },
{ value: Encryption.FORCE_ON, text: this.$t('enums.encryption.forceOn') },
{ value: Encryption.FORCE_OFF, text: this.$t('enums.encryption.forceOff') }
],
thenTypes: [
{
value: MaxRatioAction.PAUSE_TORRENT,
text: this.$t('modals.settings.pageBittorrent.maxRatioPauseTorrent')
},
{
value: MaxRatioAction.REMOVE_TORRENT,
text: this.$t('modals.settings.pageBittorrent.maxRatioRemoveTorrent')
},
{
value: MaxRatioAction.REMOVE_TORRENT_AND_FILES,
text: this.$t('modals.settings.pageBittorrent.maxRatioRemoveTorrentAndFiles')
},
{
value: MaxRatioAction.ENABLE_SUPERSEEDING,
text: this.$t('modals.settings.pageBittorrent.maxRatioTorrentSuperseeding')
}
{ value: MaxRatioAction.PAUSE_TORRENT, text: this.$t('enums.maxRatioAction.pauseTorrent') },
{ value: MaxRatioAction.REMOVE_TORRENT, text: this.$t('enums.maxRatioAction.removeTorrent') },
{ value: MaxRatioAction.REMOVE_TORRENT_AND_FILES, text: this.$t('enums.maxRatioAction.removeTorrentAndFiles') },
{ value: MaxRatioAction.ENABLE_SUPERSEEDING, text: this.$t('enums.maxRatioAction.torrentSuperseeding') }
]
}
}
}
})
</script>

View file

@ -1,142 +1,293 @@
<template>
<v-card flat>
<v-col cols="5" class="pb-0 mt-2">
<v-select v-model="settings.bittorrent_protocol" outlined dense small-chips :items="bittorrent_protocol" :label="$t('modals.settings.pageConnection.protocol')" />
</v-col>
<v-subheader>
{{ $t('modals.settings.pageConnection.listeningSubHeader') }}
</v-subheader>
<v-list-item>
<v-text-field v-model="settings.listen_port" class="mb-2" outlined dense type="number" hide-details :label="$t('modals.settings.pageConnection.incomingConnectionPort')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.upnp" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageConnection.useUPnP')" />
</v-list-item>
<v-subheader>
{{ $t('modals.settings.pageConnection.subHeader') }}
</v-subheader>
<v-list-item>
<v-text-field v-model="settings.max_connec" class="mb-2" outlined dense type="number" hide-details :label="$t('modals.settings.pageConnection.globalMaxConnection')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.max_connec_per_torrent"
class="mb-2"
outlined
<v-list-item class="my-5">
<v-select
v-model="settings.bittorrent_protocol"
height="1"
flat
dense
type="number"
hide-details
:label="$t('modals.settings.pageConnection.perTorrentMaxConnection')"
/>
</v-list-item>
<v-list-item>
<v-text-field v-model="settings.max_uploads" class="mb-2" outlined dense type="number" hide-details :label="$t('modals.settings.pageConnection.globalMaxUploadSlots')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.max_uploads_per_torrent"
class="mb-2"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageConnection.perTorrentMaxUploadSlots')"
outlined
:items="bittorrent_protocol"
:label="$t('modals.settings.connection.protocol')"
/>
</v-list-item>
<v-divider />
<v-subheader>
{{ $t('modals.settings.pageConnection.proxySubHeader') }}
</v-subheader>
<v-subheader>{{ $t('modals.settings.connection.listeningPort.subheader') }}</v-subheader>
<v-list-item>
<v-row class="ml-5 mr-5 pb-4">
<v-col cols="5" class="pa-0 pr-2">
<v-select v-model="settings.proxy_type" outlined dense hide-details small-chips :items="proxyTypes" />
<v-row>
<v-col cols="auto">
<v-text-field
v-model="settings.listen_port"
class="mb-2"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.connection.listeningPort.incomingConnectionPort')"
/>
</v-col>
<v-col cols="4" class="pa-0">
<v-text-field v-model="settings.proxy_ip" class="mr-1" outlined dense hide-details :label="$t('modals.settings.pageWebUI.ipAddress')" />
</v-col>
<v-col cols="3" class="pa-0">
<v-text-field v-model="settings.proxy_port" class="ml-1" outlined dense type="number" hide-details :label="$t('modals.settings.pageWebUI.port')" />
<v-col cols="auto">
<v-btn @click="generateRandomPort">{{ $t('modals.settings.connection.listeningPort.randomPort') }}</v-btn>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.proxy_peer_connections" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageConnection.proxyPeerConnections')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.proxy_torrents_only" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageConnection.proxyTorrentOnly')" />
<v-checkbox v-model="settings.upnp" hide-details class="ma-0 pa-0" :label="$t('modals.settings.connection.listeningPort.useUPnP')" />
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.connection.connectionLimits.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.proxy_auth_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageConnection.proxyAuth')" />
<v-row>
<v-col cols="8">
<v-checkbox v-model="max_conn_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.connection.connectionLimits.globalMaxConnection')" />
</v-col>
<v-col cols="4">
<v-text-field :disabled="!max_conn_enabled" v-model="settings.max_connec" type="number" class="ms-2" dense hide-details />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.proxy_username"
class="mb-2"
outlined
dense
<v-row>
<v-col cols="8">
<v-checkbox v-model="max_conn_per_torrent_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.connection.connectionLimits.perTorrentMaxConnection')" />
</v-col>
<v-col cols="4">
<v-text-field :disabled="!max_conn_per_torrent_enabled" v-model="settings.max_connec_per_torrent" type="number" class="ms-2" dense hide-details />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row>
<v-col cols="8">
<v-checkbox v-model="max_uploads_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.connection.connectionLimits.globalMaxUploadSlots')" />
</v-col>
<v-col cols="4">
<v-text-field :disabled="!max_uploads_enabled" v-model="settings.max_uploads" type="number" class="ms-2" dense hide-details />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row>
<v-col cols="8">
<v-checkbox
v-model="max_uploads_per_torrent_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.connection.connectionLimits.perTorrentMaxUploadSlots')"
/>
</v-col>
<v-col cols="4">
<v-text-field :disabled="!max_uploads_per_torrent_enabled" v-model="settings.max_uploads_per_torrent" type="number" class="ms-2" dense hide-details />
</v-col>
</v-row>
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.connection.proxy.subheader') }}</v-subheader>
<v-list-item>
<v-row class="mx-1 pb-4">
<v-col cols="5" class="pa-0 pr-2">
<v-select v-model="settings.proxy_type" height="1" outlined dense hide-details :items="proxyTypes" />
</v-col>
<v-col cols="4" class="pa-0">
<v-text-field
:disabled="settings.proxy_type === ProxyType.DISABLED"
v-model="settings.proxy_ip"
class="mr-1"
outlined
dense
hide-details
:label="$t('modals.settings.connection.proxy.host')"
/>
</v-col>
<v-col cols="3" class="pa-0">
<v-text-field
:disabled="settings.proxy_type === ProxyType.DISABLED"
v-model="settings.proxy_port"
class="ml-1"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.connection.proxy.port')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-checkbox
:disabled="settings.proxy_type === ProxyType.DISABLED"
v-model="settings.proxy_peer_connections"
hide-details
:disabled="!settings.proxy_auth_enabled"
:label="$t('modals.settings.pageWebUI.username')"
class="ma-0 pa-0"
:label="$t('modals.settings.connection.proxy.peerConnections')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.proxy_password"
class="mb-2"
outlined
dense
<v-checkbox
:disabled="settings.proxy_type === ProxyType.DISABLED || settings.proxy_type === ProxyType.SOCKS4"
v-model="settings.proxy_torrents_only"
hide-details
type="password"
:disabled="!settings.proxy_auth_enabled"
:label="$t('modals.settings.pageWebUI.password')"
class="ma-0 pa-0"
:label="$t('modals.settings.connection.proxy.torrentOnly')"
/>
</v-list-item>
<v-list-item>
<v-checkbox
:disabled="settings.proxy_type === ProxyType.DISABLED || settings.proxy_type === ProxyType.SOCKS4"
v-model="settings.proxy_hostname_lookup"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.connection.proxy.hostNameLookup')"
/>
</v-list-item>
<v-list-item class="mb-5">
<v-checkbox
:disabled="settings.proxy_type === ProxyType.DISABLED || settings.proxy_type === ProxyType.SOCKS4"
v-model="settings.proxy_auth_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.connection.proxy.auth.subtitle')"
/>
<v-row class="ms-6">
<v-col>
<v-text-field
:disabled="settings.proxy_type === ProxyType.DISABLED || settings.proxy_type === ProxyType.SOCKS4 || !settings.proxy_auth_enabled"
v-model="settings.proxy_username"
dense
hide-details
class="mb-5"
:label="$t('modals.settings.connection.proxy.auth.username')"
/>
<v-text-field
:disabled="settings.proxy_type === ProxyType.DISABLED || settings.proxy_type === ProxyType.SOCKS4 || !settings.proxy_auth_enabled"
v-model="settings.proxy_password"
dense
hide-details
:label="$t('modals.settings.connection.proxy.auth.password')"
:type="showPassword ? 'text' : 'password'"
:append-icon="
settings.proxy_type === ProxyType.DISABLED || settings.proxy_type === ProxyType.SOCKS4 || !settings.proxy_auth_enabled ? '' : showPassword ? mdiEye : mdiEyeOff
"
@click:append="showPassword = !showPassword"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<h5>{{ $t('modals.settings.connection.proxy.auth.tip') }}</h5>
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.connection.ipFiltering.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.ip_filter_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.connection.ipFiltering.filterPath')" />
<v-text-field :disabled="!settings.ip_filter_enabled" v-model="settings.ip_filter_path" class="ms-2" dense hide-details />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.ip_filter_trackers" hide-details class="ma-0 pa-0" :label="$t('modals.settings.connection.ipFiltering.applyToTrackers')" />
</v-list-item>
<v-list-item>
<v-subheader>{{ $t('modals.settings.connection.ipFiltering.bannedIps') }}</v-subheader>
</v-list-item>
<v-list-item>
<v-textarea v-model="settings.banned_IPs" outlined required auto-grow clearable persistent-hint :hint="$t('modals.settings.connection.ipFiltering.bannedIpsHint')" />
</v-list-item>
</v-card>
</template>
<script>
import { SettingsTab, FullScreenModal } from '@/mixins'
<script lang="ts">
import { FullScreenModal, SettingsTab } from '@/mixins'
import { BitTorrentProtocol, ProxyType } from '@/enums/qbit/AppPreferences'
import { defineComponent } from 'vue'
import { mdiEye, mdiEyeOff } from '@mdi/js'
export default {
export default defineComponent({
name: 'Connection',
computed: {
ProxyType() {
return ProxyType
}
},
mixins: [SettingsTab, FullScreenModal],
data() {
return {
proxyTypes: [
{
value: ProxyType.DISABLED,
text: 'None'
text: '(None)'
},
{
value: ProxyType.HTTP_WITHOUT_AUTH,
text: 'HTTP proxy without authentication'
value: ProxyType.SOCKS4,
text: 'SOCKS4'
},
{
value: ProxyType.SOCKS5_WITHOUT_AUTH,
text: 'SOCKS5 proxy without authentication'
value: ProxyType.SOCKS5,
text: 'SOCKS5'
},
{
value: ProxyType.HTTP_WITH_AUTH,
text: 'HTTP proxy with authentication'
},
{
value: ProxyType.SOCKS5_WITH_AUTH,
text: 'SOCKS5 proxy with authentication'
},
{
value: ProxyType.SOCKS4_WITHOUT_AUTH,
text: 'SOCKS4 proxy without authentication'
value: ProxyType.HTTP,
text: 'HTTP'
}
],
bittorrent_protocol: [
{ value: BitTorrentProtocol.TCP_uTP, text: 'TCP and μTP' },
{ value: BitTorrentProtocol.TCP, text: 'TCP' },
{ value: BitTorrentProtocol.uTP, text: 'μTP' }
]
{ value: BitTorrentProtocol.TCP_uTP, text: this.$t('enums.bittorrentProtocols.tcp_utp') },
{ value: BitTorrentProtocol.TCP, text: this.$t('enums.bittorrentProtocols.tcp') },
{ value: BitTorrentProtocol.uTP, text: this.$t('enums.bittorrentProtocols.utp') }
],
max_conn_enabled: false,
max_conn_per_torrent_enabled: false,
max_uploads_enabled: false,
max_uploads_per_torrent_enabled: false,
showPassword: false,
mdiEye,
mdiEyeOff
}
},
mounted() {
this.max_conn_enabled = this.settings.max_connec > 0
this.max_conn_per_torrent_enabled = this.settings.max_connec_per_torrent > 0
this.max_uploads_enabled = this.settings.max_uploads > 0
this.max_uploads_per_torrent_enabled = this.settings.max_uploads_per_torrent > 0
},
watch: {
max_conn_enabled(newValue) {
this.settings.max_connec = newValue ? this.settings.max_connec : -1
},
max_conn_per_torrent_enabled(newValue) {
this.settings.max_connec_per_torrent = newValue ? this.settings.max_connec_per_torrent : -1
},
max_uploads_enabled(newValue) {
this.settings.max_uploads = newValue ? this.settings.max_uploads : -1
},
max_uploads_per_torrent_enabled(newValue) {
this.settings.max_uploads_per_torrent = newValue ? this.settings.max_uploads_per_torrent : -1
}
},
methods: {
generateRandomPort() {
// source: https://github.com/qbittorrent/qBittorrent/blob/d83b2a61311b0dc3bc31ee52d1b9eaac715c3cdf/src/webui/www/private/views/preferences.html#L1729-L1734
const min = 1024
const max = 65535
this.settings.listen_port = Math.floor(Math.random() * (max - min + 1) + min)
}
}
}
})
</script>

View file

@ -1,121 +1,315 @@
<template>
<v-card flat>
<v-subheader>{{ $t('modals.settings.pageDownloads.subHeaderWhenAddTorrent') }}</v-subheader>
<v-subheader>{{ $t('modals.settings.downloads.whenAddTorrent.subheader') }}</v-subheader>
<v-list-item>
<v-select v-model="settings.torrent_content_layout" :label="$t('enums.contentLayout.title')" outlined dense small-chips :items="contentLayoutOptions" />
<v-select v-model="settings.torrent_content_layout" height="1" flat dense hide-details outlined :label="$t('enums.contentLayout.title')" :items="contentLayoutOptions" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.start_paused_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.whenAddTorrent.donotAutoStart')" />
</v-list-item>
<v-list-item>
<v-select v-model="settings.torrent_stop_condition" height="1" flat dense hide-details outlined :label="$t('enums.stopCondition.title')" :items="stopConditionOptions" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.auto_delete_mode" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.whenAddTorrent.autoDeleteMode')" />
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.preallocate_all" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.publicSettings.preAllocateDisk')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.incomplete_files_ext" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.publicSettings.appendQBExtension')" />
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.downloads.saveManagement.subheader') }}</v-subheader>
<v-list-item>
<v-select
class="mb-5"
v-model="settings.auto_tmm_enabled"
height="1"
flat
dense
hide-details
outlined
:label="$t('modals.settings.downloads.saveManagement.autoTMMEnabled')"
:items="defaultTMMOptions"
/>
</v-list-item>
<v-list-item>
<v-select
class="mb-5"
v-model="settings.torrent_changed_tmm_enabled"
height="1"
flat
dense
hide-details
outlined
:label="$t('modals.settings.downloads.saveManagement.torrentChangedTMM')"
:items="paramChangedTMMOptions"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.start_paused_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.whenAddTorrent.donotAutoStart')" />
<v-select
class="mb-5"
v-model="settings.save_path_changed_tmm_enabled"
height="1"
flat
dense
hide-details
outlined
:label="$t('modals.settings.downloads.saveManagement.savePathChangedTMM')"
:items="paramChangedTMMOptions"
/>
</v-list-item>
<v-list-item>
<v-select v-model="settings.torrent_stop_condition" :label="$t('enums.stopCondition.title')" outlined dense small-chips :items="stopConditionOptions" />
<v-select
class="mb-5"
v-model="settings.category_changed_tmm_enabled"
height="1"
flat
dense
hide-details
outlined
:label="$t('modals.settings.downloads.saveManagement.categoryChangedTMM')"
:items="paramChangedTMMOptions"
/>
</v-list-item>
<v-list-item>
<v-text-field v-model="settings.save_path" dense hide-details outlined :label="$t('modals.settings.downloads.saveManagement.defaultSavePath')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.temp_path_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.saveManagement.keepIncompleteIn')" />
<v-text-field :disabled="!settings.temp_path_enabled" v-model="settings.temp_path" class="ms-2" dense hide-details />
</v-list-item>
<v-list-item>
<v-checkbox v-model="export_dir_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.saveManagement.exportDir')" />
<v-text-field :disabled="!export_dir_enabled" v-model="settings.export_dir" class="ms-2" dense hide-details />
</v-list-item>
<v-list-item>
<v-checkbox v-model="export_dir_fin_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.saveManagement.exportDirFinished')" />
<v-text-field :disabled="!export_dir_fin_enabled" v-model="settings.export_dir_fin" class="ms-2" dense hide-details />
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.downloads.saveManagement.monitoredFolders.subheader') }}</v-subheader>
<v-list-item>
<!-- TODO: Monitored folder -->
<v-btn :disabled="true">Coming soon!</v-btn>
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.excluded_file_names_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.saveManagement.excludedFileNames.label')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.auto_delete_mode" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.whenAddTorrent.autoDeleteMode')" />
<v-textarea
:disabled="!settings.excluded_file_names_enabled"
v-model="settings.excluded_file_names"
outlined
required
auto-grow
clearable
persistent-hint
:hint="$t('modals.settings.downloads.saveManagement.excludedFileNames.hint')"
/>
</v-list-item>
<v-divider insert />
<v-subheader>{{ $t('modals.settings.pageDownloads.subHeaderPublicSettings') }}</v-subheader>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.preallocate_all" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.publicSettings.preAllocateDisk')" />
<v-checkbox v-model="settings.mail_notification_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.downloads.saveManagement.mailNotification.enabled')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.incomplete_files_ext" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.publicSettings.appendQBExtension')" />
</v-list-item>
<v-divider insert />
<v-subheader>{{ $t('modals.settings.pageDownloads.subHeaderSaveManagement') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.auto_tmm_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.autoManagement')" />
</v-list-item>
<v-list-item class="mb-2">
<v-checkbox v-model="settings.save_path_changed_tmm_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.relocate')" />
</v-list-item>
<v-list-item class="mb-2">
<v-text-field v-model="settings.save_path" class="mb-2" outlined dense :label="$t('modals.settings.pageDownloads.saveManagement.defaultSavePath')" hide-details />
<v-text-field
:disabled="!settings.mail_notification_enabled"
v-model="settings.mail_notification_sender"
dense
hide-details
outlined
:label="$t('modals.settings.downloads.saveManagement.mailNotification.from')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.temp_path_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.keepIncompleteIn')" />
<v-text-field
:disabled="!settings.mail_notification_enabled"
v-model="settings.mail_notification_email"
dense
hide-details
outlined
:label="$t('modals.settings.downloads.saveManagement.mailNotification.to')"
/>
</v-list-item>
<v-list-item v-if="settings.temp_path_enabled">
<v-text-field v-model="settings.temp_path" class="mb-2" outlined dense hide-details />
<v-list-item>
<v-text-field
:disabled="!settings.mail_notification_enabled"
v-model="settings.mail_notification_smtp"
dense
hide-details
outlined
:label="$t('modals.settings.downloads.saveManagement.mailNotification.smtpServer')"
/>
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.autorun_on_torrent_added_enabled"
:disabled="!settings.mail_notification_enabled"
v-model="settings.mail_notification_ssl_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageDownloads.saveManagement.autoEnabled_onAdded')"
:label="$t('modals.settings.downloads.saveManagement.mailNotification.sslEnabled')"
/>
</v-list-item>
<v-list-item v-if="settings.autorun_on_torrent_added_enabled">
<v-text-field
v-model="settings.autorun_on_torrent_added_program"
class="mb-2"
outlined
dense
:label="$t('modals.settings.pageDownloads.saveManagement.autoLabel_onAdded')"
<v-list-item class="mb-5">
<v-checkbox
:disabled="!settings.mail_notification_enabled"
v-model="settings.mail_notification_auth_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.downloads.saveManagement.mailNotification.authEnabled')"
/>
<v-row class="ms-6">
<v-col>
<v-text-field
:disabled="!settings.mail_notification_enabled || !settings.mail_notification_auth_enabled"
v-model="settings.mail_notification_username"
dense
hide-details
class="mb-5"
:label="$t('modals.settings.downloads.saveManagement.mailNotification.username')"
/>
<v-text-field
:disabled="!settings.mail_notification_enabled || !settings.mail_notification_auth_enabled"
v-model="settings.mail_notification_password"
dense
hide-details
:label="$t('modals.settings.downloads.saveManagement.mailNotification.password')"
:type="showPassword ? 'text' : 'password'"
:append-icon="!settings.mail_notification_enabled || !settings.mail_notification_auth_enabled ? '' : showPassword ? mdiEye : mdiEyeOff"
@click:append="showPassword = !showPassword"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.autorun_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageDownloads.saveManagement.autoEnabled_onFinished')" />
</v-list-item>
<v-list-item v-if="settings.autorun_enabled">
<v-text-field v-model="settings.autorun_program" class="mb-2" outlined dense :label="$t('modals.settings.pageDownloads.saveManagement.autoLabel_onFinished')" hide-details />
</v-list-item>
<v-list-item v-if="settings.autorun_on_torrent_added_enabled || settings.autorun_enabled" class="mb-4">
<v-card flat color="grey--text selected">
<v-card-text>
<h5>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamTitle') }}
</h5>
<ul>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamN') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamL') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamG') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamF') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamR') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamD') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamC') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamZ') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamT') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamI') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamJ') }}
</li>
<li>
{{ $t('modals.settings.pageDownloads.saveManagement.supportParamK') }}
</li>
</ul>
</v-card-text>
</v-card>
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.subheader') }}</v-subheader>
<v-row>
<v-col cols="12" md="6">
<v-list-item>
<v-checkbox
v-model="settings.autorun_on_torrent_added_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.downloads.saveManagement.runExternalProgram.onAddedEnabled')"
/>
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.autorun_on_torrent_added_enabled"
v-model="settings.autorun_on_torrent_added_program"
class="mb-2"
outlined
dense
:label="$t('modals.settings.downloads.saveManagement.runExternalProgram.onAddedLabel')"
hide-details
/>
</v-list-item>
<v-list-item>
<v-checkbox
v-model="settings.autorun_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.downloads.saveManagement.runExternalProgram.onFinishedEnabled')"
/>
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.autorun_enabled"
v-model="settings.autorun_program"
class="mb-2"
outlined
dense
:label="$t('modals.settings.downloads.saveManagement.runExternalProgram.onFinishedLabel')"
hide-details
/>
</v-list-item>
</v-col>
<v-col cols="12" md="6" class="pt-0">
<v-card flat color="grey--text selected">
<v-card-text>
<h5>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamTitle') }}
</h5>
<ul>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamN') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamL') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamG') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamF') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamR') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamD') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamC') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamZ') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamT') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamI') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamJ') }}
</li>
<li>
{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.supportParamK') }}
</li>
</ul>
<h5>{{ $t('modals.settings.downloads.saveManagement.runExternalProgram.tip') }}</h5>
</v-card-text>
</v-card>
</v-col>
</v-row>
</v-card>
</template>
<script>
<script lang="ts">
import { defineComponent } from 'vue'
import { FullScreenModal, SettingsTab } from '@/mixins'
import { AppPreferences } from '@/enums/qbit'
import { mdiEye, mdiEyeOff } from '@mdi/js'
export default {
export default defineComponent({
name: 'Downloads',
mixins: [SettingsTab, FullScreenModal],
data() {
@ -129,8 +323,35 @@ export default {
{ text: this.$t('enums.stopCondition.none'), value: AppPreferences.StopCondition.NONE },
{ text: this.$t('enums.stopCondition.metadataReceived'), value: AppPreferences.StopCondition.METADATA_RECEIVED },
{ text: this.$t('enums.stopCondition.filesChecked'), value: AppPreferences.StopCondition.FILES_CHECKED }
]
],
defaultTMMOptions: [
{ text: this.$t('modals.settings.downloads.saveManagement.defaultTMMOptions.manual'), value: false },
{ text: this.$t('modals.settings.downloads.saveManagement.defaultTMMOptions.automatic'), value: true }
],
paramChangedTMMOptions: [
{ text: this.$t('modals.settings.downloads.saveManagement.paramChangedTMMOptions.relocateTorrent'), value: true },
{ text: this.$t('modals.settings.downloads.saveManagement.paramChangedTMMOptions.switchToManual'), value: false }
],
export_dir_enabled: false,
export_dir_fin_enabled: false,
showPassword: false,
mdiEye,
mdiEyeOff
}
},
mounted() {
this.export_dir_enabled = this.settings.export_dir.length > 0
this.export_dir_fin_enabled = this.settings.export_dir_fin.length > 0
},
watch: {
export_dir_enabled(newValue) {
this.settings.export_dir = newValue ? this.settings.export_dir : ''
},
export_dir_fin_enabled(newValue) {
this.settings.export_dir_fin = newValue ? this.settings.export_dir_fin : ''
}
}
}
})
</script>

View file

@ -2,13 +2,13 @@
<v-card flat>
<v-tabs v-model="tab">
<v-tab href="#general">
{{ $t('modals.settings.pageRss.tabName.general') }}
{{ $t('modals.settings.rss.tabName.general') }}
</v-tab>
<v-tab href="#feeds">
{{ $t('modals.settings.pageRss.tabName.feeds') }}
{{ $t('modals.settings.rss.tabName.feeds') }}
</v-tab>
<v-tab href="#rules">
{{ $t('modals.settings.pageRss.tabName.rules') }}
{{ $t('modals.settings.rss.tabName.rules') }}
</v-tab>
</v-tabs>
<v-tabs-items v-model="tab" touchless>
@ -25,13 +25,14 @@
</v-card>
</template>
<script>
<script lang="ts">
import General from './Rss/General.vue'
import Feeds from './Rss/Feeds.vue'
import Rules from './Rss/Rules.vue'
import { FullScreenModal } from '@/mixins'
import { defineComponent } from 'vue'
export default {
export default defineComponent({
name: 'Rss',
components: {
General,
@ -42,5 +43,5 @@ export default {
data: () => ({
tab: null
})
}
})
</script>

View file

@ -2,7 +2,7 @@
<v-card flat>
<v-row dense class="ma-0 pa-0">
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.settings.pageRss.pageFeeds.feeds') }}</v-subheader>
<v-subheader>{{ $t('modals.settings.rss.feeds.feeds') }}</v-subheader>
<template v-for="(item, index) in availableFeeds">
<v-list-item :key="item.uid">
<v-list-item-content>
@ -28,10 +28,10 @@
</template>
<v-list-item>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createFeed">
{{ $t('modals.settings.pageRss.pageFeeds.btnCreateNew') }}
{{ $t('modals.settings.rss.feeds.btnCreateNew') }}
</v-btn>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="refreshAll">
{{ $t('modals.settings.pageRss.pageFeeds.refreshAll') }}
{{ $t('modals.settings.rss.feeds.refreshAll') }}
</v-btn>
</v-list-item>
</v-col>

View file

@ -1,41 +1,63 @@
<template>
<v-card flat>
<v-subheader>
{{ $t('modals.settings.pageRss.pageGeneral.rssAutoProcessing') }}
</v-subheader>
<v-subheader>{{ $t('modals.settings.rss.general.reader.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.rss_processing_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageRss.pageGeneral.input.enableRssProcessing')" />
<v-checkbox v-model="settings.rss_processing_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.rss.general.reader.enableProcessing')" />
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.rss_refresh_interval"
class="mb-2"
outlined
dense
type="number"
hide-details
:label="$t('modals.settings.pageRss.pageGeneral.input.feedsRefreshInterval')"
:disabled="!settings.rss_processing_enabled"
dense
outlined
:hint="$t('modals.settings.rss.general.reader.feedsRefreshIntervalHint')"
:label="$t('modals.settings.rss.general.reader.feedsRefreshInterval')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.rss_max_articles_per_feed"
class="mb-2"
outlined
dense
class="mb-3"
type="number"
dense
hide-details
:label="$t('modals.settings.pageRss.pageGeneral.input.feedsMaxArticles')"
:disabled="!settings.rss_processing_enabled"
outlined
:label="$t('modals.settings.rss.general.reader.maximumArticlesPerFeed')"
/>
</v-list-item>
<v-divider />
<v-subheader>
{{ $t('modals.settings.pageRss.pageGeneral.rssAutoDownloader') }}
</v-subheader>
<v-subheader>{{ $t('modals.settings.rss.general.autoDownloader.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.rss_auto_downloading_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageRss.pageGeneral.input.enableRssAutoDownload')" />
<v-checkbox v-model="settings.rss_auto_downloading_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.rss.general.autoDownloader.enable')" />
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.rss.general.smartEpisodeFilter.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox
v-model="settings.rss_download_repack_proper_episodes"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.rss.general.smartEpisodeFilter.downloadEpisodes')"
/>
</v-list-item>
<v-list-item>
<v-textarea
v-model="settings.rss_smart_episode_filters"
outlined
auto-grow
clearable
persistent-hint
:hint="$t('modals.settings.rss.general.smartEpisodeFilter.filtersHint')"
:label="$t('modals.settings.rss.general.smartEpisodeFilter.filters')"
/>
</v-list-item>
</v-card>
</template>

View file

@ -2,7 +2,7 @@
<v-card flat>
<v-row dense class="ma-0 pa-0">
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.settings.pageRss.pageRules.rules') }}</v-subheader>
<v-subheader>{{ $t('modals.settings.rss.rules.rules') }}</v-subheader>
<template v-for="(item, index) in availableRules">
<v-list-item :key="item.uid">
<v-list-item-content>
@ -28,7 +28,7 @@
</template>
<v-list-item>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createRule">
{{ $t('modals.settings.pageRss.pageRules.btnCreateNew') }}
{{ $t('modals.settings.rss.rules.btnCreateNew') }}
</v-btn>
</v-list-item>
</v-col>

View file

@ -0,0 +1,210 @@
<template>
<v-card flat>
<v-row class="mb-0" :class="phoneLayout ? 'flex-column' : 'flex-row'">
<v-col cols="12" sm="6">
<v-subheader>{{ $t('modals.settings.speed.subheader.global') }}</v-subheader>
<v-row class="mx-1">
<v-col cols="12" md="6">
<v-text-field v-model="settings.up_limit" dense hide-details class="mb-5" :label="$t('modals.settings.speed.upload')" />
</v-col>
<v-col cols="12" md="6">
<v-text-field v-model="settings.dl_limit" dense hide-details class="mb-5" :label="$t('modals.settings.speed.download')" />
</v-col>
</v-row>
<v-list-item>
<h5>
<i>{{ $t('modals.settings.speed.tip') }}</i>
</h5>
</v-list-item>
</v-col>
<v-divider :vertical="!phoneLayout" />
<v-col cols="12" sm="6">
<v-subheader>{{ $t('modals.settings.speed.subheader.alternative') }}</v-subheader>
<v-row class="mx-1">
<v-col cols="12" md="6">
<v-text-field v-model="settings.alt_up_limit" dense hide-details class="mb-5" :label="$t('modals.settings.speed.upload')" />
</v-col>
<v-col cols="12" md="6">
<v-text-field v-model="settings.alt_dl_limit" dense hide-details class="mb-5" :label="$t('modals.settings.speed.download')" />
</v-col>
</v-row>
<v-list-item>
<h5>
<i>{{ $t('modals.settings.speed.tip') }}</i>
</h5>
</v-list-item>
</v-col>
</v-row>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.scheduler_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.speed.scheduler.subheader')" />
</v-list-item>
<v-row class="align-center">
<v-col cols="1">
<v-subheader>From</v-subheader>
</v-col>
<v-col cols="1">
<v-text-field :disabled="true" v-model="settings.schedule_from_hour" />
</v-col>
<v-col cols="1">
<v-text-field :disabled="true" v-model="settings.schedule_from_min" />
</v-col>
<v-col cols="2">
<v-dialog v-model="scheduler.from.modal" persistent width="290px">
<template v-slot:activator="{ on, attrs }">
<v-btn :disabled="!settings.scheduler_enabled" v-bind="attrs" v-on="on">{{ $t('modals.settings.speed.scheduler.selectButtonLabel') }}</v-btn>
</template>
<v-time-picker v-if="scheduler.from.modal" v-model="fromTime" full-width ampm-in-title>
<v-spacer></v-spacer>
<v-btn text color="primary" @click="scheduler.from.modal = false">Cancel</v-btn>
<v-btn text color="primary" @click="onDialogCloseFrom()">OK</v-btn>
</v-time-picker>
</v-dialog>
</v-col>
<v-col cols="1">
<v-subheader>To</v-subheader>
</v-col>
<v-col cols="1">
<v-text-field :disabled="true" v-model="settings.schedule_to_hour" />
</v-col>
<v-col cols="1">
<v-text-field :disabled="true" v-model="settings.schedule_to_min" />
</v-col>
<v-col cols="2">
<v-dialog v-model="scheduler.to.modal" persistent width="290px">
<template v-slot:activator="{ on, attrs }">
<v-btn :disabled="!settings.scheduler_enabled" v-bind="attrs" v-on="on">{{ $t('modals.settings.speed.scheduler.selectButtonLabel') }}</v-btn>
</template>
<v-time-picker v-if="scheduler.to.modal" v-model="toTime" full-width ampm-in-title>
<v-spacer></v-spacer>
<v-btn text color="primary" @click="scheduler.to.modal = false">Cancel</v-btn>
<v-btn text color="primary" @click="onDialogCloseTo()">OK</v-btn>
</v-time-picker>
</v-dialog>
</v-col>
</v-row>
<v-list-item>
<v-select
:disabled="!settings.scheduler_enabled"
v-model="settings.scheduler_days"
class="mb-5"
height="1"
flat
dense
hide-details
outlined
:items="schedulerOptions"
:label="$t('modals.settings.speed.scheduler.when')"
/>
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.speed.subheader.settings') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.limit_utp_rate" hide-details class="ma-0 pa-0" :label="$t('modals.settings.speed.settings.applyToUtp')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.limit_tcp_overhead" hide-details class="ma-0 pa-0" :label="$t('modals.settings.speed.settings.applyToTransportOverhead')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.limit_lan_peers" hide-details class="ma-0 pa-0" :label="$t('modals.settings.speed.settings.applyToPeersOnLan')" />
</v-list-item>
</v-card>
</template>
<script lang="ts">
import { defineComponent } from 'vue'
import { FullScreenModal, SettingsTab } from '@/mixins'
import { SchedulerDays } from '@/enums/qbit/AppPreferences'
export default defineComponent({
name: 'Speed',
mixins: [SettingsTab, FullScreenModal],
data() {
return {
scheduler: {
from: {
modal: false,
hours: 0,
minutes: 0
},
to: {
modal: false,
hours: 0,
minutes: 0
}
},
schedulerOptions: [
{ text: this.$t('enums.scheduler.everyDay'), value: SchedulerDays.EVERY_DAY },
{ text: this.$t('enums.scheduler.everyWeekday'), value: SchedulerDays.EVERY_WEEKDAY },
{ text: this.$t('enums.scheduler.everyWeekend'), value: SchedulerDays.EVERY_WEEKEND },
{ text: this.$t('enums.scheduler.everyMonday'), value: SchedulerDays.EVERY_MONDAY },
{ text: this.$t('enums.scheduler.everyTuesday'), value: SchedulerDays.EVERY_TUESDAY },
{ text: this.$t('enums.scheduler.everyWednesday'), value: SchedulerDays.EVERY_WEDNESDAY },
{ text: this.$t('enums.scheduler.everyThursday'), value: SchedulerDays.EVERY_THURSDAY },
{ text: this.$t('enums.scheduler.everyFriday'), value: SchedulerDays.EVERY_FRIDAY },
{ text: this.$t('enums.scheduler.everySaturday'), value: SchedulerDays.EVERY_SATURDAY },
{ text: this.$t('enums.scheduler.everySunday'), value: SchedulerDays.EVERY_SUNDAY }
]
}
},
computed: {
fromTime: {
get: function () {
return `${this.scheduler.from.hours}:${this.scheduler.from.minutes}`
},
set: function (newValue: string) {
const [hours, minutes] = newValue.split(':')
this.scheduler.from.hours = parseInt(hours)
this.scheduler.from.minutes = parseInt(minutes)
}
},
toTime: {
get: function () {
return `${this.scheduler.to.hours}:${this.scheduler.to.minutes}`
},
set: function (newValue: string) {
const [hours, minutes] = newValue.split(':')
this.scheduler.to.hours = parseInt(hours)
this.scheduler.to.minutes = parseInt(minutes)
}
}
},
mounted() {
this.scheduler.from.hours = this.settings.schedule_from_hour
this.scheduler.from.minutes = this.settings.schedule_from_min
this.scheduler.to.hours = this.settings.schedule_to_hour
this.scheduler.to.minutes = this.settings.schedule_to_min
},
methods: {
onDialogCloseFrom() {
this.scheduler.from.modal = false
this.settings.schedule_from_hour = this.scheduler.from.hours
this.settings.schedule_from_min = this.scheduler.from.minutes
},
onDialogCloseTo() {
this.scheduler.to.modal = false
this.settings.schedule_to_hour = this.scheduler.to.hours
this.settings.schedule_to_min = this.scheduler.to.minutes
}
}
})
</script>

View file

@ -2,7 +2,7 @@
<v-card flat>
<v-row dense class="ma-0 pa-0">
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.settings.pageTagsAndCategories.subHeaderTags') }}</v-subheader>
<v-subheader>{{ $t('modals.settings.tagsAndCategories.subHeaderTags') }}</v-subheader>
<template v-for="(item, index) in availableTags">
<v-list-item :key="item.title">
<v-list-item-content>
@ -18,13 +18,13 @@
</template>
<v-list-item>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createTag">
{{ $t('modals.settings.pageTagsAndCategories.btnCreateNew') }}
{{ $t('modals.settings.tagsAndCategories.btnCreateNew') }}
</v-btn>
</v-list-item>
</v-col>
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.settings.pageTagsAndCategories.subHeaderCategories') }}</v-subheader>
<v-subheader>{{ $t('modals.settings.tagsAndCategories.subHeaderCategories') }}</v-subheader>
<template v-for="(item, index) in availableCategories">
<v-list-item :key="item.title">
<v-list-item-content>
@ -46,7 +46,7 @@
</template>
<v-list-item>
<v-btn class="mx-auto accent white--text elevation-0 px-4" @click="createCategory">
{{ $t('modals.settings.pageTagsAndCategories.btnCreateNew') }}
{{ $t('modals.settings.tagsAndCategories.btnCreateNew') }}
</v-btn>
</v-list-item>
</v-col>

View file

@ -2,13 +2,13 @@
<v-card flat>
<v-tabs v-model="tab">
<v-tab href="#general">
{{ $t('modals.settings.pageVueTorrent.tabName.general') }}
{{ $t('modals.settings.vueTorrent.tabName.general') }}
</v-tab>
<v-tab href="#desktopCard">
{{ $t('modals.settings.pageVueTorrent.tabName.desktopCard') }}
{{ $t('modals.settings.vueTorrent.tabName.desktopCard') }}
</v-tab>
<v-tab href="#mobileCard">
{{ $t('modals.settings.pageVueTorrent.tabName.mobileCard') }}
{{ $t('modals.settings.vueTorrent.tabName.mobileCard') }}
</v-tab>
</v-tabs>
<v-tabs-items v-model="tab" touchless>

View file

@ -3,7 +3,7 @@
<v-row dense>
<v-col cols="12" md="6">
<v-subheader>
{{ $t('modals.settings.pageVueTorrent.pageDesktopCard.busyTorrentTip') }}
{{ $t('modals.settings.vueTorrent.desktopCard.busyTorrentTip') }}
</v-subheader>
<v-row dense>
<v-list flat class="ma-2 pa-0">
@ -16,7 +16,7 @@
<v-col cols="12" md="6">
<v-subheader>
{{ $t('modals.settings.pageVueTorrent.pageDesktopCard.completedTorrentTip') }}
{{ $t('modals.settings.vueTorrent.desktopCard.completedTorrentTip') }}
</v-subheader>
<v-row dense>
<v-list flat class="ma-2 pa-0">

View file

@ -1,251 +1,134 @@
<template>
<v-card flat>
<v-subheader>
{{ $t('modals.settings.pageVueTorrent.pageGeneral.tip') }}
{{ $t('modals.settings.vueTorrent.general.tip') }}
</v-subheader>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.showCurrentSpeed"
class="v-input--reverse pa-0 ma-0"
<v-checkbox v-model="settings.showCurrentSpeed" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.currentSpeed')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.showSpeedGraph" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.speedGraph')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.showAlltimeStat" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.allTimeStats')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.showSessionStat" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.sessionStats')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.showFreeSpace" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.freeSpace')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.showTrackerFilter" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.trackerFilter')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.rightDrawer" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.rightDrawer')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.topPagination" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.topPagination')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.openSideBarOnStart" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.openSideBarOnStart')" />
</v-list-item>
<v-list-item class="mb-3">
<v-checkbox v-model="settings.showShutdownButton" hide-details class="ma-0 pa-0" :label="$t('modals.settings.vueTorrent.general.showShutdownButton')" />
</v-list-item>
<v-list-item class="mb-3">
<v-row>
<v-col cols="12" sm="6" md="3">
<v-select v-model="settings.lang" height="1" flat dense hide-details outlined :items="languages" :label="$t('modals.settings.vueTorrent.general.language')" />
</v-col>
<v-col cols="12" sm="6" md="3">
<v-select
v-model="settings.paginationSize"
height="1"
flat
dense
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.currentSpeed')"
outlined
:items="paginationSizes"
:label="$t('modals.settings.vueTorrent.general.paginationSize')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.showSpeedGraph"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.speedGraph')"
/>
<v-col cols="12" sm="6" md="3">
<v-select v-model="settings.title" height="1" flat dense hide-details outlined :items="titleOptions" :label="$t('modals.settings.vueTorrent.general.vueTorrentTitle')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.showAlltimeStat"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.allTimeStats')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.showSessionStat"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.sessionStats')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.showFreeSpace"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.freeSpace')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.showTrackerFilter"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.trackerFilter')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.rightDrawer"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.rightDrawer')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.topPagination"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.topPagination')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.openSideBarOnStart"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.openSideBarOnStart')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col>
<v-switch
v-model="webuiSettings.showShutdownButton"
class="v-input--reverse pa-0 ma-0"
hide-details
inset
:label="$t('modals.settings.pageVueTorrent.pageGeneral.showShutdownButton')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col cols="8" sm="8" md="10">
<p class="subtitle-1 mt-2">
{{ $t('modals.settings.pageVueTorrent.pageGeneral.language') }}
</p>
</v-col>
<v-col cols="4" sm="4" md="2">
<v-select v-model="webuiSettings.lang" flat solo dense hide-details background-color="background" class="rounded-xl" :items="languages" item-text="caption" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col cols="8" sm="8" md="10">
<p class="subtitle-1 mt-2">
{{ $t('modals.settings.pageVueTorrent.pageGeneral.paginationSize') }}
</p>
</v-col>
<v-col cols="4" sm="4" md="2">
<v-select v-model="webuiSettings.paginationSize" flat solo dense hide-details background-color="background" class="rounded-xl" :items="paginationSizes" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col cols="8" sm="8" md="10">
<p class="subtitle-1 mt-2">
{{ $t('modals.settings.pageVueTorrent.pageGeneral.vueTorrentTitle') }}
</p>
</v-col>
<v-col cols="4" sm="4" md="2">
<v-select v-model="webuiSettings.title" flat solo dense hide-details background-color="background" class="rounded-xl" :items="titleOptions" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col sm="6" md="9">
<p class="subtitle-1 mt-2">
{{ $t('modals.settings.pageVueTorrent.pageGeneral.dateFormat') }}
</p>
</v-col>
<v-col sm="6" md="3">
<v-col cols="12" sm="6" md="3">
<v-text-field
v-model="webuiSettings.dateFormat"
v-model="settings.dateFormat"
class="mb-2"
outlined
dense
hide-details
:aria-label="$t('modals.settings.pageVueTorrent.pageGeneral.dateFormat')"
placeholder="DD/MM/YYYY, HH:mm:ss"
label="using Dayjs"
hint="using Dayjs"
:label="$t('modals.settings.vueTorrent.general.dateFormat')"
/>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col cols="10" sm="10" md="11">
<p class="subtitle-1">
{{ $t('modals.settings.pageVueTorrent.pageGeneral.currentVersion') }}
</p>
<v-row>
<v-col cols="6" md="2" class="d-flex align-center justify-end">
<h3>{{ $t('modals.settings.vueTorrent.general.currentVersion') }}</h3>
</v-col>
<v-col cols="2" sm="2" md="1">
<a target="_blank" :href="`https://github.com/WDaan/VueTorrent/releases/tag/v${version}`">
<p class="mb-2">{{ version }}</p>
</a>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col cols="10" sm="10" md="11">
<p class="subtitle-1">
{{ $t('modals.settings.pageVueTorrent.pageGeneral.qbittorrentVersion') }}
</p>
</v-col>
<v-col cols="2" sm="2" md="1">
<a target="_blank" :href="`https://github.com/qbittorrent/qBittorrent/releases/tag/release-${Qbitversion}`">
<p class="mb-2">
{{ Qbitversion }}
</p>
</a>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row dense>
<v-col cols="7" sm="7" md="10">
<p class="subtitle-1">
{{ $t('modals.settings.pageVueTorrent.pageGeneral.registerMagnetHeader') }}
</p>
</v-col>
<v-col cols="4" sm="4" md="2">
<v-btn @click="registerMagnetHandler">{{ $t('modals.settings.pageVueTorrent.pageGeneral.registerMagnetButton') }}</v-btn>
<v-col cols="6" md="2" class="d-flex align-center justify-start">
<h3>
<a target="_blank" :href="`https://github.com/WDaan/VueTorrent/releases/tag/v${version}`">{{ version }}</a>
</h3>
</v-col>
<v-col cols="6" md="2" class="d-flex align-center justify-end">
<h3>{{ $t('modals.settings.vueTorrent.general.qbittorrentVersion') }}</h3>
</v-col>
<v-col cols="6" md="2" class="d-flex align-center justify-start">
<h3>
<a target="_blank" :href="`https://github.com/qbittorrent/qBittorrent/releases/tag/release-${Qbitversion}`">{{ Qbitversion }}</a>
</h3>
</v-col>
<v-col cols="12" md="4" class="d-flex align-center justify-center">
<v-btn @click="registerMagnetHandler">{{ $t('modals.settings.vueTorrent.general.registerMagnet') }}</v-btn>
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-textarea v-model="settingsField" />
</v-list-item>
<v-list-item class="remove-after justify-content-evenly">
<v-btn @click="importSettings">{{ $t('modals.settings.pageVueTorrent.pageGeneral.importSettings') }}</v-btn>
<v-btn @click="exportSettings">{{ $t('modals.settings.pageVueTorrent.pageGeneral.exportSettings') }}</v-btn>
</v-list-item>
<v-list-item class="justify-center pb-2">
<v-btn dark color="red" @click="resetSettings">{{ $t('modals.settings.pageVueTorrent.pageGeneral.resetSettings') }}</v-btn>
<v-list-item>
<v-row>
<v-col cols="12" sm="6" class="d-flex align-center justify-center">
<v-btn @click="importSettings">{{ $t('modals.settings.vueTorrent.general.importSettings') }}</v-btn>
</v-col>
<v-col cols="12" sm="6" class="d-flex align-center justify-center">
<v-btn @click="exportSettings">{{ $t('modals.settings.vueTorrent.general.exportSettings') }}</v-btn>
</v-col>
<v-col cols="12" class="d-flex align-center justify-center">
<v-btn dark color="red" @click="resetSettings">{{ $t('modals.settings.vueTorrent.general.resetSettings') }}</v-btn>
</v-col>
</v-row>
</v-list-item>
</v-card>
</template>
<script>
<script lang="ts">
import { defineComponent } from 'vue'
import { mapState, mapGetters } from 'vuex'
import { Qbit } from '@/services/qbit'
import { LOCALES } from '@/lang/locales'
@ -253,8 +136,9 @@ import { General } from '@/mixins'
import { TitleOptions } from '@/enums/vuetorrent'
import Ajv from 'ajv'
import { StoreStateSchema } from '@/schemas'
import WebUISettings from '@/types/vuetorrent/WebUISettings'
export default {
export default defineComponent({
name: 'VueTorrent-General',
mixins: [General],
data() {
@ -262,7 +146,7 @@ export default {
languages: LOCALES,
paginationSizes: [5, 15, 30, 50],
titleOptions: [TitleOptions.DEFAULT, TitleOptions.GLOBAL_SPEED, TitleOptions.FIRST_TORRENT_STATUS],
Qbitversion: 0,
Qbitversion: '',
settingsField: ''
}
},
@ -271,6 +155,9 @@ export default {
...mapGetters(['getAppVersion']),
version() {
return this.getAppVersion()
},
settings(): WebUISettings {
return this.webuiSettings
}
},
created() {
@ -311,15 +198,15 @@ export default {
},
registerMagnetHandler() {
if (typeof navigator.registerProtocolHandler !== 'function') {
this.$toast.error(this.$t("toast.magnetHandlerNotSupported").toString());
return;
this.$toast.error(this.$t('toast.magnetHandlerNotSupported').toString())
return
}
const templateUrl = location.href.replace('/settings', '/download=%s')
navigator.registerProtocolHandler('magnet', templateUrl);
navigator.registerProtocolHandler('magnet', templateUrl)
}
}
}
})
</script>
<style lang="scss" scoped>
@ -327,16 +214,4 @@ export default {
padding-top: 10px !important;
padding-bottom: 10px !important;
}
// Reversed input variant
:deep(.v-input--reverse .v-input__slot) {
@import 'src/styles/styles.scss';
@include reverse-switch;
}
.justify-content-evenly {
justify-content: space-evenly;
}
.remove-after::after {
content: unset;
}
</style>

View file

@ -3,7 +3,7 @@
<v-row dense>
<v-col cols="12" md="6">
<v-subheader>
{{ $t('modals.settings.pageVueTorrent.pageMobileCard.busyTorrentTip') }}
{{ $t('modals.settings.vueTorrent.mobileCard.busyTorrentTip') }}
</v-subheader>
<v-row dense>
<v-list flat class="ma-2 pa-0">
@ -14,7 +14,7 @@
<v-col cols="12" md="6">
<v-subheader>
{{ $t('modals.settings.pageVueTorrent.pageMobileCard.completedTorrentTip') }}
{{ $t('modals.settings.vueTorrent.mobileCard.completedTorrentTip') }}
</v-subheader>
<v-row dense>
<v-list flat class="ma-2 pa-0">

View file

@ -1,102 +1,290 @@
<template>
<v-card flat>
<v-subheader>{{ $t('modals.settings.webUI.interface.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.alternative_webui_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageWebUI.useAlternativeWebUI')" />
<v-row>
<v-col cols="9">
<v-text-field v-model="settings.web_ui_address" class="mr-1" outlined dense hide-details="true" :label="$t('modals.settings.webUI.interface.ipAddress')" />
</v-col>
<v-col cols="3">
<v-text-field v-model="settings.web_ui_port" class="ml-1" outlined dense type="number" hide-details="true" :label="$t('modals.settings.webUI.interface.port')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.web_ui_upnp" hide-details class="ma-0 pa-0" :label="$t('modals.settings.connection.listeningPort.useUPnP')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.alternative_webui_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.interface.useAlternativeWebUI')" />
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.alternative_webui_enabled"
v-model="settings.alternative_webui_path"
class="mb-2"
outlined
dense
hide-details
:label="$t('modals.settings.pageWebUI.filesLocation')"
:disabled="!settings.alternative_webui_enabled"
:label="$t('modals.settings.webUI.interface.filesLocation')"
/>
</v-list-item>
<v-divider insert />
<v-subheader>{{ $t('modals.settings.pageWebUI.webUserInterface') }}</v-subheader>
<v-divider class="mt-4" />
<v-subheader>{{ $t('modals.settings.webUI.authentication.subheader') }}</v-subheader>
<v-list-item>
<v-row class="ml-5 mr-5 pb-4">
<v-col cols="9" class="pa-0">
<v-text-field v-model="settings.web_ui_address" class="mr-1" outlined dense hide-details="true" :label="$t('modals.settings.pageWebUI.ipAddress')" />
<v-row>
<v-col cols="6">
<v-text-field v-model="settings.web_ui_username" outlined dense hide-details="true" :label="$t('modals.settings.webUI.authentication.username')" />
</v-col>
<v-col cols="3" class="pa-0">
<v-text-field v-model="settings.web_ui_port" class="ml-1" outlined dense type="number" hide-details="true" :label="$t('modals.settings.pageWebUI.port')" />
</v-col>
</v-row>
</v-list-item>
<v-divider insert />
<v-subheader>{{ $t('modals.settings.pageWebUI.authentication') }}</v-subheader>
<v-list-item>
<v-row class="ml-5 mr-5 pb-4">
<v-col cols="6" class="pa-0">
<v-text-field v-model="settings.web_ui_username" class="mr-1" outlined dense hide-details="true" :label="$t('modals.settings.pageWebUI.username')" />
</v-col>
<v-col cols="6" class="pa-0">
<v-text-field v-model="settings.web_ui_password" class="ml-1" outlined dense hide-details="true" :label="$t('modals.settings.pageWebUI.password')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item>
<v-row class="ml-5 mr-5 pb-4">
<v-col cols="6" class="pa-0">
<v-col cols="6">
<v-text-field
v-model="settings.web_ui_max_auth_fail_count"
class="mr-1"
v-model="settings.web_ui_password"
outlined
dense
type="number"
hide-details="true"
:label="$t('modals.settings.pageWebUI.maxAttempts')"
:label="$t('modals.settings.webUI.authentication.password')"
persistent-placeholder
:placeholder="$t('modals.settings.webUI.authentication.passwordPlaceholder')"
/>
</v-col>
<v-col cols="6" class="pa-0">
<v-text-field v-model="settings.web_ui_ban_duration" class="ml-1" outlined dense type="number" hide-details="true" :label="$t('modals.settings.pageWebUI.banDuration')" />
</v-col>
</v-row>
</v-list-item>
<v-list-item class="ml-5 mr-4">
<v-text-field
v-model="settings.web_ui_session_timeout"
class="mr-1"
outlined
dense
type="number"
hide-details="true"
:label="$t('modals.settings.pageWebUI.sessionTimeout')"
/>
<v-list-item>
<v-checkbox v-model="settings.bypass_local_auth" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.authentication.bypassLocalhost')" />
</v-list-item>
<v-list-item class="ml-4">
<v-checkbox v-model="settings.bypass_local_auth" hide-details class="ma-0 pa-0" :label="$t('modals.settings.pageWebUI.bypassAuthenticationForClientsOnLocalhost')" />
<v-list-item>
<v-checkbox v-model="settings.bypass_auth_subnet_whitelist_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.authentication.bypassWhitelist')" />
</v-list-item>
<v-list-item class="ml-4">
<v-checkbox
v-model="settings.bypass_auth_subnet_whitelist_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.pageWebUI.bypassAuthenticationForClientsInWhitelisted')"
/>
</v-list-item>
<v-list-item class="ml-4">
<v-list-item>
<v-textarea
v-model="settings.bypass_auth_subnet_whitelist"
class="mr-1"
class="mb-5"
outlined
dense
placeholder="Example: 172.17.32.0/24, fdff:ffff:c8::/40"
:placeholder="$t('modals.settings.webUI.authentication.whitelistExamples')"
hide-details="true"
:disabled="!settings.bypass_auth_subnet_whitelist_enabled"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.web_ui_max_auth_fail_count"
class="mb-5"
outlined
dense
type="number"
hide-details="true"
:label="$t('modals.settings.webUI.authentication.maxAttempts')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.web_ui_ban_duration"
outlined
dense
type="number"
persistent-hint
:hint="$t('modals.settings.webUI.authentication.banDurationHint')"
:label="$t('modals.settings.webUI.authentication.banDuration')"
/>
</v-list-item>
<v-list-item>
<v-text-field
v-model="settings.web_ui_session_timeout"
outlined
dense
type="number"
persistent-hint
:hint="$t('modals.settings.webUI.authentication.sessionTimeoutHint')"
:label="$t('modals.settings.webUI.authentication.sessionTimeout')"
/>
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.use_https" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.https.subheader')" />
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.use_https"
v-model="settings.web_ui_https_cert_path"
class="mb-4"
outlined
dense
hide-details
:label="$t('modals.settings.webUI.https.certificate')"
/>
</v-list-item>
<v-list-item>
<v-text-field :disabled="!settings.use_https" v-model="settings.web_ui_https_key_path" outlined dense hide-details :label="$t('modals.settings.webUI.https.key')" />
</v-list-item>
<v-list-item>
<a href="https://httpd.apache.org/docs/current/ssl/ssl_faq.html#aboutcerts" target="_blank">{{ $t('modals.settings.webUI.https.tip') }}</a>
</v-list-item>
<v-divider />
<v-subheader>{{ $t('modals.settings.webUI.security.subheader') }}</v-subheader>
<v-list-item>
<v-checkbox v-model="settings.web_ui_clickjacking_protection_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.security.clickjacking')" />
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.web_ui_csrf_protection_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.security.csrf')" />
</v-list-item>
<v-list-item>
<v-checkbox
:disabled="!settings.use_https"
v-model="settings.web_ui_secure_cookie_enabled"
hide-details
class="ma-0 pa-0"
:label="$t('modals.settings.webUI.security.secureCookie')"
/>
</v-list-item>
<v-list-item>
<v-checkbox v-model="settings.web_ui_host_header_validation_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.security.hostHeaderValidation')" />
</v-list-item>
<v-list-item>
<v-textarea
:disabled="!settings.web_ui_host_header_validation_enabled"
v-model="settings.web_ui_domain_list"
outlined
required
auto-grow
clearable
persistent-hint
:hint="$t('modals.settings.webUI.security.hostHeaderValidationHint')"
/>
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.web_ui_use_custom_http_headers_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.customHeaders')" />
</v-list-item>
<v-list-item>
<v-textarea
:disabled="!settings.web_ui_use_custom_http_headers_enabled"
v-model="settings.web_ui_custom_http_headers"
outlined
required
auto-grow
clearable
:placeholder="$t('modals.settings.webUI.customHeadersPlaceholder')"
persistent-hint
:hint="$t('modals.settings.webUI.customHeadersHint')"
/>
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.web_ui_reverse_proxy_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.reverseProxySupport')" />
</v-list-item>
<v-list-item>
<v-text-field
:disabled="!settings.web_ui_reverse_proxy_enabled"
v-model="settings.web_ui_reverse_proxies_list"
outlined
required
auto-grow
clearable
persistent-hint
:hint="$t('modals.settings.webUI.proxiesListHint')"
:label="$t('modals.settings.webUI.proxiesList')"
/>
</v-list-item>
<v-divider />
<v-list-item>
<v-checkbox v-model="settings.dyndns_enabled" hide-details class="ma-0 pa-0" :label="$t('modals.settings.webUI.dynDns.subheader')" />
</v-list-item>
<v-list-item>
<v-row>
<v-col cols="8">
<v-select :disabled="!settings.dyndns_enabled" class="mb-5" v-model="dynDnsProvider" height="1" flat dense hide-details outlined :items="dynDnsProviderOptions" />
</v-col>
<v-col cols="4">
<v-btn :disabled="!settings.dyndns_enabled" @click="registerDynDNS">{{ $t('modals.settings.webUI.dynDns.registerBtn') }}</v-btn>
</v-col>
</v-row>
</v-list-item>
<v-list-item class="mb-4">
<v-text-field :disabled="!settings.dyndns_enabled" v-model="settings.dyndns_domain" dense hide-details outlined :label="$t('modals.settings.webUI.dynDns.domainName')" />
</v-list-item>
<v-list-item class="mb-4">
<v-row>
<v-col cols="12" md="6">
<v-text-field :disabled="!settings.dyndns_enabled" v-model="settings.dyndns_username" dense hide-details :label="$t('modals.settings.webUI.dynDns.username')" />
</v-col>
<v-col cols="12" md="6">
<v-text-field
:disabled="!settings.dyndns_enabled"
v-model="settings.dyndns_password"
dense
hide-details
:label="$t('modals.settings.webUI.dynDns.password')"
:type="showPassword ? 'text' : 'password'"
:append-icon="!settings.dyndns_enabled ? '' : showPassword ? mdiEye : mdiEyeOff"
@click:append="showPassword = !showPassword"
/>
</v-col>
</v-row>
</v-list-item>
</v-card>
</template>
<script>
<script lang="ts">
import { FullScreenModal, SettingsTab } from '@/mixins'
import { defineComponent } from 'vue'
import { mdiEye, mdiEyeOff } from '@mdi/js'
export default {
export default defineComponent({
name: 'WebUI',
mixins: [SettingsTab, FullScreenModal]
}
mixins: [SettingsTab, FullScreenModal],
data() {
return {
dynDnsProvider: 'https://www.dyndns.com/account/services/hosts/add.html',
dynDnsProviderOptions: [
{
text: this.$t('modals.settings.webUI.dynDns.providers.dynDns'),
value: 'https://www.dyndns.com/account/services/hosts/add.html'
},
{
text: this.$t('modals.settings.webUI.dynDns.providers.noIp'),
value: 'http://www.no-ip.com/services/managed_dns/free_dynamic_dns.html'
}
],
showPassword: false,
mdiEye,
mdiEyeOff
}
},
methods: {
registerDynDNS() {
window.open(this.dynDnsProvider)
}
}
})
</script>

View file

@ -1,9 +1,11 @@
import WebUI from './WebUI.vue'
import BitTorrent from './BitTorrent.vue'
import Downloads from './Downloads.vue'
import VueTorrent from './VueTorrent.vue'
import TagsAndCategories from './TagsAndCategories.vue'
import Downloads from './Downloads.vue'
import Connection from './Connection.vue'
import Speed from './Speed.vue'
import BitTorrent from './BitTorrent.vue'
import Rss from './Rss.vue'
import WebUI from './WebUI.vue'
import TagsAndCategories from './TagsAndCategories.vue'
import Advanced from './Advanced.vue'
export { WebUI, BitTorrent, Downloads, VueTorrent, TagsAndCategories, Connection, Rss }
export { VueTorrent, Downloads, Connection, Speed, BitTorrent, Rss, WebUI, TagsAndCategories, Advanced }

View file

@ -2,7 +2,7 @@
<v-card flat>
<v-row dense class="ma-0 pa-0">
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.detail.pageTagsAndCategories.subHeaderTag') }}</v-subheader>
<v-subheader>{{ $t('modals.detail.tagsAndCategories.subHeaderTag') }}</v-subheader>
<v-list-item-group :value="activeTags" active-class="accent--text" multiple>
<template v-for="(item, index) in availableTags">
<v-list-item link @click="addTag(item)" :key="item.title">
@ -16,7 +16,7 @@
</v-col>
<v-col cols="12" md="6">
<v-subheader>{{ $t('modals.detail.pageTagsAndCategories.subHeaderCategories') }}</v-subheader>
<v-subheader>{{ $t('modals.detail.tagsAndCategories.subHeaderCategories') }}</v-subheader>
<v-list-item-group :value="activeCategory" active-class="accent--text">
<template v-for="(item, index) in availableCategories">
<v-list-item link @click="setCategory(item)" :key="item.title">

View file

@ -29,12 +29,10 @@ export enum MaxRatioAction {
}
export enum ProxyType {
DISABLED = -1,
HTTP_WITHOUT_AUTH = 1,
SOCKS5_WITHOUT_AUTH,
HTTP_WITH_AUTH,
SOCKS5_WITH_AUTH,
SOCKS4_WITHOUT_AUTH
DISABLED = 0,
HTTP = 1,
SOCKS5 = 2,
SOCKS4 = 5
}
enum ScanDirsEnum {
@ -77,3 +75,15 @@ export enum UtpTcpMixedMode {
PREFER_TCP,
PEER_PROPORTIONAL
}
export enum DiskIOType {
DEFAULT,
MEMORY_MAPPED_FILES,
POSIX_COMPLIANT
}
export enum DiskIOMode {
DISABLE_OS_CACHE,
ENABLE_OS_CACHE,
WRITE_THROUGH
}

View file

@ -206,21 +206,23 @@
},
"settings": {
"tabName": {
"VueTorrent": "VueTorrent",
"vueTorrent": "VueTorrent",
"downloads": "Downloads",
"connection": "Connection",
"speed": "Speed",
"bittorrent": "BitTorrent",
"rss": "RSS",
"webUI": "WebUI",
"tagsAndCategories": "Tags & Categories"
"tagsAndCategories": "Tags & Categories",
"advanced": "Advanced"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "General",
"desktopCard": "Desktop Card",
"mobileCard": "Mobile Card"
},
"pageGeneral": {
"general": {
"tip": "These settings are for the custom WebUI itself",
"currentSpeed": "Show Current Speed",
"speedGraph": "Show Speed Graph",
@ -230,148 +232,359 @@
"trackerFilter": "Show Tracker Filter",
"rightDrawer": "Right Drawer",
"topPagination": "Top Pagination",
"language": "Language:",
"paginationSize": "Pagination size:",
"vueTorrentTitle": "VueTorrent title:",
"language": "Language",
"paginationSize": "Pagination size",
"vueTorrentTitle": "VueTorrent title",
"dateFormat": "Date Format",
"openSideBarOnStart": "Open Side Bar on launch",
"showShutdownButton": "Show shutdown button",
"currentVersion": "Current Version:",
"qbittorrentVersion": "QBittorrent Version:",
"registerMagnetHeader": "Register to handle magnet links...",
"registerMagnetButton": "Register",
"currentVersion": "Current Version",
"qbittorrentVersion": "QBittorrent Version",
"registerMagnet": "Register magnet links",
"importSettings": "Import Settings",
"exportSettings": "Export Settings",
"resetSettings": "Reset Settings"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "Properties to display for busy torrents on desktop",
"completedTorrentTip": "Properties to display for completed torrents on desktop"
},
"pageMobileCard": {
"mobileCard": {
"busyTorrentTip": "Properties to display for busy torrents on mobile",
"completedTorrentTip": "Properties to display for completed torrents on mobile"
}
},
"pageDownloads": {
"subHeaderWhenAddTorrent": "When adding a torrent",
"downloads": {
"whenAddTorrent": {
"subheader": "When adding a torrent",
"donotAutoStart": "Do not start the download automatically",
"autoDeleteMode": "Delete .torrent files afterwards"
},
"subHeaderPublicSettings": "Public Settings",
"publicSettings": {
"preAllocateDisk": "Pre-allocate disk space for all files",
"appendQBExtension": "Append .!qB extension to incomplete files"
},
"subHeaderSaveManagement": "Saving Management",
"saveManagement": {
"autoManagement": "Automatic Torrent Management",
"relocate": "Relocate torrent when category changes",
"subheader": "Saving Management",
"autoTMMEnabled": "Default Torrent Management Mode",
"defaultTMMOptions": {
"manual": "Manual",
"automatic": "Automatic"
},
"torrentChangedTMM": "When Torrent Category changed",
"savePathChangedTMM": "When Default Save Path changed",
"categoryChangedTMM": "When Category Save Path changed",
"paramChangedTMMOptions": {
"relocateTorrent": "Relocate torrent",
"switchToManual": "Switch torrent to Manual Mode"
},
"defaultSavePath": "Default Save Path",
"keepIncompleteIn": "Keep incomplete torrents in:",
"autoEnabled_onAdded": "Run external program on torrent added:",
"autoLabel_onAdded": "Command",
"autoEnabled_onFinished": "Run external program on torrent finished:",
"autoLabel_onFinished": "Command",
"supportParamTitle": "Supported parameters (case sensitive):",
"supportParamN": "%N: Torrent name",
"supportParamL": "%L: Category",
"supportParamG": "%G: Tags (separated by comma)",
"supportParamF": "%F: Content path (same as root path for multi-file torrent)",
"supportParamR": "%R: Root path (first torrent subdirectory path)",
"supportParamD": "%D: Save path",
"supportParamC": "%C: Number of files",
"supportParamZ": "%Z: Torrent size (bytes)",
"supportParamT": "%T: Current tracker",
"supportParamI": "%I: Info hash v1",
"supportParamJ": "%J: Info hash v2",
"supportParamK": "%K: Torrent ID"
"keepIncompleteIn": "Keep incomplete torrents in",
"exportDir": "Copy .torrent files to",
"exportDirFinished": "Copy .torrent files for finished downloads to",
"monitoredFolders": {
"subheader": "Monitored Folders"
},
"excludedFileNames": {
"label": "Excluded file names",
"hint": "One file name per line"
},
"mailNotification": {
"enabled": "Email notification upon download completion",
"from": "From",
"to": "To",
"smtpServer": "SMTP server",
"sslEnabled": "This server requires a secure connection (SSL)",
"authEnabled": "Authentication",
"username": "Username",
"password": "Password"
},
"runExternalProgram": {
"subheader": "Run external program",
"onAddedEnabled": "Run external program on torrent added:",
"onAddedLabel": "Command",
"onFinishedEnabled": "Run external program on torrent finished:",
"onFinishedLabel": "Command",
"supportParamTitle": "Supported parameters (case sensitive):",
"supportParamN": "%N: Torrent name",
"supportParamL": "%L: Category",
"supportParamG": "%G: Tags (separated by comma)",
"supportParamF": "%F: Content path (same as root path for multi-file torrent)",
"supportParamR": "%R: Root path (first torrent subdirectory path)",
"supportParamD": "%D: Save path",
"supportParamC": "%C: Number of files",
"supportParamZ": "%Z: Torrent size (bytes)",
"supportParamT": "%T: Current tracker",
"supportParamI": "%I: Info hash v1",
"supportParamJ": "%J: Info hash v2",
"supportParamK": "%K: Torrent ID",
"tip": "Tip: Encapsulate parameter with quotation marks to avoid text being cut off at whitespace (e.g., \"%N\")"
}
}
},
"pageConnection": {
"connection": {
"protocol": "Peer connection protocol",
"listeningSubHeader": "Listening Port",
"useUPnP": "Use UPnP / NAT-PMP port forwarding from my router",
"incomingConnectionPort": "Port used for incoming connections",
"subHeader": "Connection Limits (-1 to disable)",
"globalMaxConnection": "Global maximum number of connections",
"perTorrentMaxConnection": "Maximum number of connections per torrent",
"globalMaxUploadSlots": "Global maximum number of upload slots",
"perTorrentMaxUploadSlots": "Maximum number of upload slots per torrent",
"proxySubHeader": "Proxy Server",
"proxyPeerConnections": "Use proxy for peer connections",
"proxyTorrentOnly": "Use proxy only for torrents",
"proxyAuth": "Authentication"
"listeningPort": {
"subheader": "Listening Port",
"incomingConnectionPort": "Port used for incoming connections",
"randomPort": "Random Port",
"useUPnP": "Use UPnP / NAT-PMP port forwarding from my router"
},
"connectionLimits": {
"subheader": "Connection Limits",
"globalMaxConnection": "Global maximum number of connections",
"perTorrentMaxConnection": "Maximum number of connections per torrent",
"globalMaxUploadSlots": "Global maximum number of upload slots",
"perTorrentMaxUploadSlots": "Maximum number of upload slots per torrent"
},
"proxy": {
"subheader": "Proxy Server",
"host": "Host",
"port": "Port",
"peerConnections": "Use proxy for peer connections",
"torrentOnly": "Use proxy only for torrents",
"hostNameLookup": "Use proxy for hostname lookup",
"auth": {
"subtitle": "Authentication",
"username": "Username",
"password": "Password",
"tip": "Info: The password is saved unencrypted"
}
},
"ipFiltering": {
"subheader": "IP Filtering",
"filterPath": "Filter path (.dat, .p2p, .p2b)",
"applyToTrackers": "Apply to trackers",
"bannedIps": "Manually banned IP addresses",
"bannedIpsHint": "One on each line"
}
},
"pageBittorrent": {
"subHeaderPrivacy": "Privacy",
"enableDHT": "Enable DHT (decentralized network) to find more peers",
"enablePeX": "Enable Peer Exchange (PeX) to find more peers",
"enableLPD": "Enable Local Peer Discovery to find more peers",
"enableAnonymous": "Enable anonymous mode",
"torrentQueue": "Torrent Queueing",
"maxActiveDownload": "Maximum active downloads",
"maxActiveUpload": "Maximum active uploads",
"maxActiveTorrent": "Maximum active torrents",
"excludeSlowTorrent": "Do not count slow torrents in these limits",
"downloadRateLimit": "Download rate threshold KiB/s",
"uploadRateLimit": "Upload rate threshold KiB/s",
"torrentInactivityTimer": "Torrent inactivity timer",
"subHeaderSeedLimits": "Seed Limits",
"whenRatioReaches": "When ratio reaches",
"whenSeedingTimeReaches": "When seeding time reaches",
"maxRatioPauseTorrent": "Pause torrent",
"maxRatioRemoveTorrent": "Remove torrent",
"maxRatioRemoveTorrentAndFiles": "Remove torrent and files",
"maxRatioTorrentSuperseeding": "Enable torrent super seeding"
"speed": {
"subheader": {
"global": "Global Rate Limits",
"alternative": "Alternative Rate Limits",
"settings": "Rate Limits Settings"
},
"upload": "Upload (in B/s)",
"download": "Download (in B/s)",
"tip": "0 means unlimited",
"scheduler": {
"subheader": "Schedule the use of alternative rate limits",
"from": "From",
"to": "To",
"selectButtonLabel": "Select time",
"when": "When"
},
"settings": {
"applyToUtp": "Apply rate limit to µTP protocol",
"applyToTransportOverhead": "Apply rate limit to transport overhead",
"applyToPeersOnLan": "Apply rate limit to peers on LAN"
}
},
"pageRss": {
"bittorrent": {
"privacy": {
"subheader": "Privacy",
"enableDHT": "Enable DHT (decentralized network) to find more peers",
"enablePeX": "Enable Peer Exchange (PeX) to find more peers",
"enableLPD": "Enable Local Peer Discovery to find more peers",
"encryptionMode": "Encryption Mode",
"enableAnonymous": "Enable anonymous mode",
"moreInfo": "More Information"
},
"maxActiveCheckingTorrents": "Max active checking torrents",
"torrentQueueing": {
"subheader": "Torrent Queueing",
"maxActiveDownload": "Maximum active downloads",
"maxActiveUpload": "Maximum active uploads",
"maxActiveTorrent": "Maximum active torrents",
"excludeSlowTorrent": "Do not count slow torrents in these limits",
"downloadRateLimit": "Download rate threshold (in KiB/s)",
"uploadRateLimit": "Upload rate threshold (in KiB/s)",
"torrentInactivityTimer": "Torrent inactivity timer (in seconds)"
},
"seedLimits": {
"subheader": "Seed Limits",
"whenRatioReaches": "When ratio reaches",
"whenSeedingTimeReaches": "When seeding time reaches",
"then": "Then"
},
"autoAddTrackers": "Automatically add these trackers to new downloads",
"autoAddTrackersHint": "One tracker per line"
},
"rss": {
"tabName": {
"general": "General",
"feeds": "Feeds",
"rules": "Rules"
},
"pageRules": {
"rules": "Rules",
"btnCreateNew": "Create Rule"
"general": {
"reader": {
"subheader": "RSS Reader",
"enableProcessing": "Enable fetching RSS feeds",
"feedsRefreshInterval": "Feeds refresh interval",
"feedsRefreshIntervalHint": "In minutes",
"maximumArticlesPerFeed": "Maximum number of articles per feed"
},
"autoDownloader": {
"subheader": "RSS Torrent Auto Downloader",
"enable": "Enable auto downloading of RSS torrents"
},
"smartEpisodeFilter": {
"subheader": "RSS Smart Episode Filter",
"downloadEpisodes": "Download REPACK/PROPER episodes",
"filters": "Filters",
"filtersHint": "One per line"
}
},
"pageFeeds": {
"feeds": {
"feeds": "Feeds",
"btnCreateNew": "Add feed",
"refreshAll": "Refresh All"
},
"pageGeneral": {
"rssAutoProcessing": "RSS Reader",
"rssAutoDownloader": "RSS Torrent Auto Downloader",
"input": {
"enableRssAutoDownload": "Enable auto downloading of RSS torrents",
"enableRssProcessing": "Enable fetching RSS feeds",
"feedsRefreshInterval": "Feeds refresh interval (in minutes)",
"feedsMaxArticles": "Maximum number of articles per feed"
}
"rules": {
"rules": "Rules",
"btnCreateNew": "Create Rule"
}
},
"pageWebUI": {
"useAlternativeWebUI": "Use Alternative WebUI",
"filesLocation": "Files location",
"webUserInterface": "Web User Interface (Remote Control)",
"ipAddress": "IP Address:",
"port": "Port",
"authentication": "Authentication",
"username": "Username",
"password": "Password",
"maxAttempts": "Max attempts",
"banDuration": "Ban Duration (seconds)",
"sessionTimeout": "Session timeout (seconds)",
"bypassAuthenticationForClientsOnLocalhost": "Bypass authentication for clients on localhost",
"bypassAuthenticationForClientsInWhitelisted": "Bypass authentication for clients in whitelisted IP subnets",
"whiteListExample": "Example: 172.17.32.0/24, fdff:ffff:c8::/40"
"webUI": {
"interface": {
"subheader": "Web User Interface (Remote Control)",
"ipAddress": "IP Address",
"port": "Port",
"useAlternativeWebUI": "Use Alternative WebUI",
"filesLocation": "Files location"
},
"authentication": {
"subheader": "Authentication",
"username": "Username",
"password": "Password",
"passwordPlaceholder": "(unchanged)",
"bypassLocalhost": "Bypass authentication for clients on localhost",
"bypassWhitelist": "Bypass authentication for clients in whitelisted IP subnets",
"whitelistExamples": "Example: 172.17.32.0/24, fdff:ffff:c8::/40",
"maxAttempts": "Max attempts",
"banDuration": "Ban Duration",
"banDurationHint": "In seconds",
"sessionTimeout": "Session timeout",
"sessionTimeoutHint": "In seconds"
},
"https": {
"subheader": "Use HTTPS",
"certificate": "Certificate",
"key": "Key",
"tip": "Information about certificates"
},
"security": {
"subheader": "Security",
"clickjacking": "Enable clickjacking protection",
"csrf": "Enable Cross-Site Request Forgery (CSRF) protection",
"secureCookie": "Enable cookie secure flag (requires HTTPS)",
"hostHeaderValidation": "Enable Host header validation",
"hostHeaderValidationHint": "Seperated with semi-colon ( ; )",
"serverDomains": "Server Domains"
},
"customHeaders": "Add custom HTTP headers",
"customHeadersPlaceholder": "Header1: value1\nHeader2: value2\n...",
"customHeadersHint": "One per line",
"reverseProxySupport": "Enable reverse proxy support",
"proxiesList": "Trusted proxies list",
"proxiesListHint": "Seperate IPs with semicolon ( ; )",
"dynDns": {
"subheader": "Update my dynamic domain name",
"providers": {
"dynDns": "DynDNS",
"noIp": "NO-IP"
},
"registerBtn": "Register",
"domainName": "Domain name",
"username": "Username",
"password": "Password"
}
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "Create new",
"subHeaderTags": "Available Tags:",
"subHeaderCategories": "Available Categories:"
},
"advanced": {
"openDoc": "Open documentation",
"qbittorrent": {
"subheader": "qBittorrent Section",
"allocatedRam": "Physical memory (RAM) usage limit (libtorrent >= 2.0)",
"allocatedRamHint": "in MiB",
"networkInterfaces": {
"label": "Network interface",
"any": "Any interface"
},
"ipAddress": {
"label": "Optional IP address to bind to",
"all": "All addresses",
"allIPv4": "All IPv4 addresses",
"allIPv6": "All IPv6 addresses"
},
"saveInterval": "Save resume data interval",
"saveIntervalHint": "In minutes",
"recheckOnCompletion": "Recheck torrents on completion",
"refreshInterval": "Refresh interval",
"refreshIntervalHint": "In milliseconds",
"resolveCountries": "Resolve peer countries",
"reannounceOnIpPortChanged": "Reannounce to all trackers when IP or port changed",
"enableEmbeddedTracker": "Enable embedded tracker",
"embeddedTrackerPort": "Embedded tracker port",
"embeddedTrackerPortForwarding": "Enable port forwarding for embedded tracker"
},
"libtorrent": {
"subheader": "libtorrent Section",
"asyncIoThreads": "Asynchronous I/O threads",
"hashingThreads": "Hashing threads (libtorrent >= 2.0)",
"filePoolSize": "File pool size",
"outstandingMemory": "Outstanding memory when checking torrents",
"outstandingMemoryHint": "In MiB",
"diskCache": "Disk cache (libtorrent < 2.0)",
"diskCacheHint": "In MiB",
"diskCacheExpiry": "Disk cache expiry interval (libtorrent < 2.0)",
"diskCacheExpiryHint": "In seconds",
"diskQueueSize": "Disk queue size",
"diskQueueSizeHint": "In KiB",
"diskIoType": "Disk IO Type (libtorrent >= 2.0; requires restart)",
"diskIoReadMode": "Disk IO read mode",
"diskIoWriteMode": "Disk IO write mode",
"coalesceReadsWrites": "Coalesce reads & writes (libtorrent < 2.0)",
"pieceExtentAffinity": "Use piece extent affinity",
"sendUploadPieceSuggestions": "Send upload piece suggestions",
"sendBufferWatermark": "Send buffer watermark",
"sendBufferWatermarkHint": "In KiB",
"sendBufferLowWatermark": "Send buffer low watermark",
"sendBufferLowWatermarkHint": "In KiB",
"sendBufferWatermarkFactor": "Send buffer watermark factor",
"sendBufferWatermarkFactorHint": "In %",
"outgoingConnectionsPerSecond": "Outgoing connections per second",
"socketBacklogSize": "Socket backlog size",
"outgoingPortsMin": "Outgoing ports (Min) [0: Disabled]",
"outgoingPortsMax": "Outgoing ports (Max) [0: Disabled]",
"upnpLeaseDuration": "UPnP lease duration [0: Permanent lease]",
"peerTos": "DSCP value for connections to peers",
"utpTcpMixedModeAlgorithm": "μTP-TCP mixed mode algorithm",
"idnSupport": "Enable Internationalized Domain Name (IDN) support",
"allowMultipleConnectionsFromTheSameIPAddress": "Allow multiple connections from the same IP address",
"validateHTTPSTrackerCertificate": "Validate HTTPS tracker certificate",
"mitigateSSRF": "Server-side request forgery (SSRF) mitigation",
"blockPeersOnPrivilegedPorts": "Disallow connection to peers on privileged ports",
"uploadSlotsBehavior": "Upload slots behavior",
"uploadChokingAlgorithm": "Upload choking algorithm",
"announceAllTrackers": "Always announce to all trackers in a tier",
"announceAllTiers": "Always announce to all tiers",
"announceIP": "IP address reported to trackers (requires restart)",
"maxConcurrentHTTPAnnounces": "Max concurrent HTTP announces",
"stopTrackerTimeout": "Stop tracker timeout",
"peerTurnover": "Peer turnover disconnect percentage",
"peerTurnoverHint": "In %",
"peerTurnoverCutoff": "Peer turnover threshold percentage",
"peerTurnoverCutoffHint": "In %",
"peerTurnoverInterval": "Peer turnover disconnect interval",
"peerTurnoverIntervalHint": "In seconds",
"requestQueueSize": "Maximum outstanding requests to a single peer"
}
}
},
"shareLimit": {
@ -443,7 +656,7 @@
"relevance": "Relevance",
"files": "Files"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "Available Tags:",
"subHeaderCategories": "Available Categories:"
},
@ -603,6 +816,57 @@
"none": "None",
"metadataReceived": "Metadata Received",
"filesChecked": "Files Checked"
},
"bittorrentProtocols": {
"tcp_utp": "TCP and μTP",
"tcp": "TCP",
"utp": "μTP"
},
"encryption": {
"preferEncryption": "Allow Encryption",
"forceOn": "Require Encryption",
"forceOff": "Disable Encryption"
},
"maxRatioAction": {
"pauseTorrent": "Pause torrent",
"removeTorrent": "Remove torrent",
"removeTorrentAndFiles": "Remove torrent and its files",
"torrentSuperseeding": "Enable super seeding for torrent"
},
"scheduler": {
"everyDay": "Every day",
"everyWeekday": "Weekdays",
"everyWeekend": "Weekends",
"everyMonday": "Monday",
"everyTuesday": "Tuesday",
"everyWednesday": "Wednesday",
"everyThursday": "Thursday",
"everyFriday": "Friday",
"everySaturday": "Saturday",
"everySunday": "Sunday"
},
"diskIoType": {
"default": "Default",
"memoryMappedFiles": "Memory mapped files",
"posixCompliant": "POSIX-compliant"
},
"diskIoMode": {
"disableOsCache": "Disable OS cache",
"enableOsCache": "Enable OS cache",
"writeThrough": "Write-through (libtorrent >= 2.0.6)"
},
"utpTcpMixedMode": {
"preferTcp": "Prefer TCP",
"peerProportional": "Peer proportional (throttles TCP)"
},
"uploadSlotsBehavior": {
"fixedSlots": "Fixed slots",
"uploadRateBased": "Upload rate based"
},
"uploadChokingAlgorithm": {
"roundRobin": "Round-robin",
"fastestUpload": "Fastest upload",
"antiLeech": "Anti-leech"
}
}
}

View file

@ -44,31 +44,31 @@
},
"settings": {
"tabName": {},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {},
"pageGeneral": {},
"pageDesktopCard": {
"general": {},
"desktopCard": {
"properties": {}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"whenAddTorrent": {},
"publicSettings": {},
"saveManagement": {}
},
"pageConnection": {},
"pageBittorrent": {},
"pageRss": {
"connection": {},
"bittorrent": {},
"rss": {
"tabName": {},
"pageRules": {},
"pageFeeds": {},
"pageGeneral": {
"rules": {},
"feeds": {},
"general": {
"input": {}
}
},
"pageWebUI": {},
"pageTagsAndCategories": {}
"webUI": {},
"tagsAndCategories": {}
},
"shareLimit": {
"input": {}
@ -78,7 +78,7 @@
"detail": {
"pageInfo": {},
"pagePeers": {},
"pageTagsAndCategories": {},
"tagsAndCategories": {},
"pageTrackers": {}
},
"add": {

View file

@ -165,11 +165,11 @@
"webUI": "WEB UI",
"tagsAndCategories": "tags & catégories"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "Général"
},
"pageGeneral": {
"general": {
"tip": "Ces paramètres concernent la WebUI",
"currentSpeed": "Afficher la vitesse actuelle",
"speedGraph": "Afficher le graphique de vitesse",
@ -191,7 +191,7 @@
"exportSettings": "Exporter la configuration",
"resetSettings": "Réinitialiser la configuration"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "Propriétés à afficher pour les torrents occupés",
"completedTorrentTip": "Propriétés à afficher pour les torrents terminés",
"properties": {
@ -219,9 +219,9 @@
"uploadSpeed": "Vitesse d'upload"
}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "Lors de l'ajout d'un torrent",
"whenAddTorrent": {
"donotAutoStart": "Ne pas lancer le téléchargement automatiquement",
@ -255,12 +255,12 @@
"supportParamI": "%I: Info hash"
}
},
"pageConnection": {
"connection": {
"protocol": "Protocol de connexion aux pairs",
"listeningSubHeader": "Port d'écoute",
"useUPnP": "Utiliser la redirection de port UPnP / NAT-PMP de mon routeur",
"incomingConnectionPort": "Port utilisé pour les connexions entrantes",
"subHeader": "Limites de connexion (-1 pour désactiver)",
"subHeader": "Limites de connexion",
"globalMaxConnection": "Nombre max de connexions globales",
"perTorrentMaxConnection": "Nombre max de connexions par torrent",
"globalMaxUploadSlots": "Nombre maximum de slots d'upload global",
@ -270,7 +270,7 @@
"proxyTorrentOnly": "Utiliser le proxy uniquement pour les torrents",
"proxyAuth": "Authentification"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "Vie privée",
"enableDHT": "Activer le DHT (réseau décentralisé) pour trouver plus de pairs",
"enablePeX": "Activer l'échange de pairs (PeX) pour trouver plus de pairs",
@ -292,21 +292,21 @@
"maxRatioRemoveTorrentAndFiles": "Suprimer le torrent & son contenu",
"maxRatioTorrentSuperseeding": "Activer le mode super seeding"
},
"pageRss": {
"rss": {
"tabName": {
"general": "Général",
"feeds": "Flux",
"rules": "Règles"
},
"pageRules": {
"rules": {
"rules": "Règles",
"btnCreateNew": "Créer une règle"
},
"pageFeeds": {
"feeds": {
"feeds": "Flux",
"btnCreateNew": "Ajouter un flux"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "Lecteur RSS",
"rssAutoDownloader": "Downloader automatique des torrents RSS",
"input": {
@ -317,7 +317,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "Utiliser une interface Web alternative",
"filesLocation": "Emplacement de l'interface",
"webUserInterface": "Interface utilisateur Web (accès à distance)",
@ -333,7 +333,7 @@
"bypassAuthenticationForClientsInWhitelisted": "Désactiver l'authentification pour les clients dans les sous-réseaux IP de la liste blanche",
"whiteListExample": "Exemple: 172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "Créer un nouveau",
"subHeaderTags": "Tags disponibles :",
"subHeaderCategories": "Catégories disponibles :"
@ -399,7 +399,7 @@
"relevance": "Pertinence",
"files": "Fichiers"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "Tags disponibles:",
"subHeaderCategories": "Catégories disponibles:"
},

View file

@ -120,11 +120,11 @@
"webUI": "WEBUI",
"tagsAndCategories": "tag & kategori"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "Umum"
},
"pageGeneral": {
"general": {
"tip": "Pengaturan berikut hanya untuk WebUI kustom",
"currentSpeed": "Tampilkan Kec. Terkini",
"speedGraph": "Tampilkan Grafik Kecepatan",
@ -141,14 +141,14 @@
"currentVersion": "Versi saat ini:",
"qbittorrentVersion": "Versi qBittorrent:"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "Properti ditampilkan pada torrent yang sibuk",
"completedTorrentTip": "Properti ditampilkan pada torrent yang selesai",
"properties": {}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "Saat menambahkan torrent",
"whenAddTorrent": {
"donotAutoStart": "Jangan mengunduh secara otomatis"
@ -179,7 +179,7 @@
"supportParamI": "%I: Info hash"
}
},
"pageConnection": {
"connection": {
"subHeader": "Batas Koneksi",
"globalMaxConnection": "Jumlah maksimum koneksi global",
"perTorrentMaxConnection": "Jumlah maksimum koneksi per torrent",
@ -190,7 +190,7 @@
"proxyTorrentOnly": "Gunakan proxy hanya untuk torrent",
"proxyAuth": "Autentikasi"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "Privasi",
"enableDHT": "Aktifkan DHT (jaringan terdesentralisasi) untuk menemukan banyak peer",
"enablePeX": "Aktifkan Peer Exchange (PeX) untuk menemukan banyak peer",
@ -212,21 +212,21 @@
"maxRatioRemoveTorrentAndFiles": "Hapus torrent beserta file",
"maxRatioTorrentSuperseeding": "Aktifkan torrent super seeding"
},
"pageRss": {
"rss": {
"tabName": {
"general": "Umum",
"feeds": "Feed",
"rules": "Aturan"
},
"pageRules": {
"rules": {
"rules": "Aturan",
"btnCreateNew": "Buat Aturan"
},
"pageFeeds": {
"feeds": {
"feeds": "Feed",
"btnCreateNew": "Tambah feed"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "Pembaca RSS",
"rssAutoDownloader": "Pengunduh Otomatis RSS Torrent",
"input": {
@ -237,7 +237,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "Gunakan WebUI Alternatif",
"filesLocation": "Lokasi file",
"webUserInterface": "Web User Interface (Remote Control)",
@ -253,7 +253,7 @@
"bypassAuthenticationForClientsInWhitelisted": "Lewati autentikasi untuk klien pada whitelist subnet IP",
"whiteListExample": "Contoh: 172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "Buat baru",
"subHeaderTags": "Tag Tersedia:",
"subHeaderCategories": "Kategori Tersedia:"
@ -319,7 +319,7 @@
"relevance": "Relevansi",
"files": "File"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "Tag Tersedia:",
"subHeaderCategories": "Kategori Tersedia:"
},

View file

@ -27,31 +27,31 @@
},
"settings": {
"tabName": {},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {},
"pageGeneral": {},
"pageDesktopCard": {
"general": {},
"desktopCard": {
"properties": {}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"whenAddTorrent": {},
"publicSettings": {},
"saveManagement": {}
},
"pageConnection": {},
"pageBittorrent": {},
"pageRss": {
"connection": {},
"bittorrent": {},
"rss": {
"tabName": {},
"pageRules": {},
"pageFeeds": {},
"pageGeneral": {
"rules": {},
"feeds": {},
"general": {
"input": {}
}
},
"pageWebUI": {},
"pageTagsAndCategories": {}
"webUI": {},
"tagsAndCategories": {}
},
"shareLimit": {
"input": {}
@ -61,7 +61,7 @@
"detail": {
"pageInfo": {},
"pagePeers": {},
"pageTagsAndCategories": {},
"tagsAndCategories": {},
"pageTrackers": {}
},
"add": {

View file

@ -121,11 +121,11 @@
"webUI": "WEB UI",
"tagsAndCategories": "タグ と カテゴリ"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "一般"
},
"pageGeneral": {
"general": {
"tip": "これらの設定は、このカスタム WebUI に対するものです",
"currentSpeed": "現在の速度を表示する",
"speedGraph": "速度グラフを表示する",
@ -140,14 +140,14 @@
"currentVersion": "現在のバージョン:",
"qbittorrentVersion": "QBittorrentのバージョン:"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "稼働中のTorrentに表示されるプロパティ",
"completedTorrentTip": "完了したTorrentに表示されるプロパティ",
"properties": {}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "Torrentを追加したとき",
"whenAddTorrent": {
"donotAutoStart": "自動でダウンロードを開始しない"
@ -178,7 +178,7 @@
"supportParamI": "%I: info ハッシュ"
}
},
"pageConnection": {
"connection": {
"subHeader": "接続制限",
"globalMaxConnection": "全体の最大接続数",
"perTorrentMaxConnection": "Torrentあたりの最大接続数",
@ -189,7 +189,7 @@
"proxyTorrentOnly": "Torrentに対してのみプロキシを使う",
"proxyAuth": "認証"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "プライバシー",
"enableDHT": "より多くのピアを見つけるために DHT (分散ネットワーク) を有効にする",
"enablePeX": "より多くのピアを見つけるために ピア交換 (PeX) を有効にする",
@ -207,21 +207,21 @@
"whenRatioReaches": "シード制限する共有比",
"whenSeedingTimeReaches": "シード制限するシード時間 (分)"
},
"pageRss": {
"rss": {
"tabName": {
"general": "一般",
"feeds": "フィード",
"rules": "ルール"
},
"pageRules": {
"rules": {
"rules": "ルール",
"btnCreateNew": "ルールを作成"
},
"pageFeeds": {
"feeds": {
"feeds": "フィード",
"btnCreateNew": "フィードを追加"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "RSSリーダー",
"rssAutoDownloader": "RSS Torrent自動ダウンロード",
"input": {
@ -232,7 +232,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "カスタム WebUI を使用する",
"filesLocation": "ファイルの場所",
"webUserInterface": "ウェブユーザーインターフェース (遠隔操作)",
@ -248,7 +248,7 @@
"bypassAuthenticationForClientsInWhitelisted": "ホワイトリストに登録された IP サブネットのクライアントは認証を行わない",
"whiteListExample": "例: 172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "作成",
"subHeaderTags": "利用可能なタグ:",
"subHeaderCategories": "利用可能なカテゴリ:"
@ -314,7 +314,7 @@
"relevance": "関連",
"files": "ファイル"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "利用可能タグ:",
"subHeaderCategories": "利用可能タグ:"
},

View file

@ -15,22 +15,22 @@ export enum Locales {
}
type LocaleDef = {
text: string
value: Locales
caption: string
}
export const LOCALES: LocaleDef[] = [
{ value: Locales.EN, caption: 'English' },
{ value: Locales.ES, caption: 'Español' },
{ value: Locales.FR, caption: 'Français' },
{ value: Locales.ID, caption: 'Bahasa Indonesia' },
{ value: Locales.IT, caption: 'Italiano' },
{ value: Locales.JA, caption: '日本語' },
{ value: Locales.NL, caption: 'Dutch' },
{ value: Locales.PT_BR, caption: 'Português' },
{ value: Locales.RU, caption: 'Русский язык' },
{ value: Locales.UK, caption: 'Українська' },
{ value: Locales.VI, caption: 'Tiếng Việt' },
{ value: Locales.ZH_HANS, caption: '简体中文' },
{ value: Locales.ZH_HANT, caption: '繁體中文' }
{ text: 'English', value: Locales.EN },
{ text: 'Español', value: Locales.ES },
{ text: 'Français', value: Locales.FR },
{ text: 'Bahasa Indonesia', value: Locales.ID },
{ text: 'Italiano', value: Locales.IT },
{ text: '日本語', value: Locales.JA },
{ text: 'Dutch', value: Locales.NL },
{ text: 'Português', value: Locales.PT_BR },
{ text: 'Русский язык', value: Locales.RU },
{ text: 'Українська', value: Locales.UK },
{ text: 'Tiếng Việt', value: Locales.VI },
{ text: '简体中文', value: Locales.ZH_HANS },
{ text: '繁體中文', value: Locales.ZH_HANT }
]

View file

@ -49,31 +49,31 @@
},
"settings": {
"tabName": {},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {},
"pageGeneral": {},
"pageDesktopCard": {
"general": {},
"desktopCard": {
"properties": {}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"whenAddTorrent": {},
"publicSettings": {},
"saveManagement": {}
},
"pageConnection": {},
"pageBittorrent": {},
"pageRss": {
"connection": {},
"bittorrent": {},
"rss": {
"tabName": {},
"pageRules": {},
"pageFeeds": {},
"pageGeneral": {
"rules": {},
"feeds": {},
"general": {
"input": {}
}
},
"pageWebUI": {},
"pageTagsAndCategories": {}
"webUI": {},
"tagsAndCategories": {}
},
"shareLimit": {
"input": {}
@ -83,7 +83,7 @@
"detail": {
"pageInfo": {},
"pagePeers": {},
"pageTagsAndCategories": {},
"tagsAndCategories": {},
"pageTrackers": {}
},
"add": {

View file

@ -49,31 +49,31 @@
},
"settings": {
"tabName": {},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {},
"pageGeneral": {},
"pageDesktopCard": {
"general": {},
"desktopCard": {
"properties": {}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"whenAddTorrent": {},
"publicSettings": {},
"saveManagement": {}
},
"pageConnection": {},
"pageBittorrent": {},
"pageRss": {
"connection": {},
"bittorrent": {},
"rss": {
"tabName": {},
"pageRules": {},
"pageFeeds": {},
"pageGeneral": {
"rules": {},
"feeds": {},
"general": {
"input": {}
}
},
"pageWebUI": {},
"pageTagsAndCategories": {}
"webUI": {},
"tagsAndCategories": {}
},
"shareLimit": {
"input": {}
@ -83,7 +83,7 @@
"detail": {
"pageInfo": {},
"pagePeers": {},
"pageTagsAndCategories": {},
"tagsAndCategories": {},
"pageTrackers": {}
},
"add": {

View file

@ -132,11 +132,11 @@
"webUI": "Веб-интерфейс",
"tagsAndCategories": "Метки и категории"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "Общее"
},
"pageGeneral": {
"general": {
"tip": "Общие настройки пользовательского веб-интерфейса",
"currentSpeed": "Показывать текущую скорость",
"speedGraph": "Показывать график скорости",
@ -155,7 +155,7 @@
"qbittorrentVersion": "Версия QBittorrent:",
"resetSettings": "Сбросить настройки"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "Свойства для отображения активных торрентов",
"completedTorrentTip": "Свойства для отображения завершенных торрентов",
"properties": {
@ -174,9 +174,9 @@
"size": "Размер"
}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "При добавлении торрента",
"whenAddTorrent": {
"donotAutoStart": "Не начинать загрузку автоматически"
@ -211,7 +211,7 @@
"supportParamK": "%K: ID торрента"
}
},
"pageConnection": {
"connection": {
"subHeader": "Ограничение соединений",
"globalMaxConnection": "Глобальное максимальное количество соединений",
"perTorrentMaxConnection": "Максимальное количество соединений на торрент",
@ -222,7 +222,7 @@
"proxyTorrentOnly": "Использовать прокси только для торрентов",
"proxyAuth": "Аутентификация"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "Конфиденциальность",
"enableDHT": "Включить DHT (децентрализованную сеть), чтобы найти больше одноранговых устройств (пиров)",
"enablePeX": "Включить Peer Exchange (PeX), чтобы найти больше одноранговых устройств (пиров)",
@ -240,21 +240,21 @@
"whenRatioReaches": "По достижении рейтинга раздачи",
"whenSeedingTimeReaches": "По достижении времени раздачи"
},
"pageRss": {
"rss": {
"tabName": {
"general": "Общие",
"feeds": "Каналы",
"rules": "Правила"
},
"pageRules": {
"rules": {
"rules": "Правила",
"btnCreateNew": "Создать правило"
},
"pageFeeds": {
"feeds": {
"feeds": "Каналы",
"btnCreateNew": "Добавить ленту"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "Чтение RSS",
"rssAutoDownloader": "Автозагрузчик Торрентов RSS",
"input": {
@ -265,7 +265,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "Использовать альтернативный веб-интерфейс",
"filesLocation": "Расположение файла",
"webUserInterface": "Веб-интерфейс (удаленное управление)",
@ -281,7 +281,7 @@
"bypassAuthenticationForClientsInWhitelisted": "Пропустить аутентификацию для клиентов в подсетях IP из белого списка",
"whiteListExample": "Пример: 172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "Создать категорию",
"subHeaderTags": "Доступные теги:",
"subHeaderCategories": "Доступные категории:"
@ -347,7 +347,7 @@
"relevance": "Актуальность",
"files": "Файлы"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "Доступные таги:",
"subHeaderCategories": "Доступные категории:"
},

View file

@ -218,13 +218,13 @@
"webUI": "Bеб-інтерфейс",
"tagsAndCategories": "Мітки та категорії"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "Загальне",
"desktopCard": "Десктоп",
"mobileCard": "Мобільний"
},
"pageGeneral": {
"general": {
"tip": "Ці налаштування призначені для користувацького веб-інтерфейсу",
"currentSpeed": "Відображати поточну швидкість",
"speedGraph": "Показувати графік швидкості",
@ -246,16 +246,16 @@
"exportSettings": "Експорт налаштувань",
"resetSettings": "Скинути налаштування"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "Властивості для відображення зайнятих торрентів",
"completedTorrentTip": "Властивості для відображення завершених торрентів"
},
"pageMobileCard": {
"mobileCard": {
"busyTorrentTip": "Властивості для відображення для зайнятих торрентів на мобільному пристрої",
"completedTorrentTip": "Властивості для відображення завершених торрентів на мобільному пристрої"
}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "Коли додається торент",
"whenAddTorrent": {
"donotAutoStart": "Не запускати завантаження автоматично",
@ -291,7 +291,7 @@
"supportParamK": "%K: ID торренту"
}
},
"pageConnection": {
"connection": {
"protocol": "Протокол підключення пірів",
"listeningSubHeader": "Прослуховуваний порт",
"useUPnP": "Використовувати переспрямування портів UPnP / NAT-PMP з мого маршрутизатора",
@ -306,7 +306,7 @@
"proxyTorrentOnly": "Використовувати проксі тільки для торрентів",
"proxyAuth": "Аутентифікація"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "Конфіденційність",
"enableDHT": "Увімкнути DHT (децентралізовану мережу), щоб знайти більше однорангових пристроїв",
"enablePeX": "Увімкнути Peer Exchange (PeX), щоб знайти більше однорангових партнерів",
@ -328,21 +328,21 @@
"maxRatioRemoveTorrentAndFiles": "Видалити торрент та файли",
"maxRatioTorrentSuperseeding": "Ввімкнути режим суперсіда"
},
"pageRss": {
"rss": {
"tabName": {
"general": "Загальні",
"feeds": "Стрічки",
"rules": "Правила"
},
"pageRules": {
"rules": {
"rules": "Правила",
"btnCreateNew": "Створити правило"
},
"pageFeeds": {
"feeds": {
"feeds": "Стрічки",
"btnCreateNew": "Додати стрічку"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "Зчитувач RSS",
"rssAutoDownloader": "Автозавантаження торрентів через RSS",
"input": {
@ -353,7 +353,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "Використовувати альтернативний веб-інтерфейс",
"filesLocation": "Розташування файлів",
"webUserInterface": "Веб-інтерфейс користувача (дистанційне керування)",
@ -369,7 +369,7 @@
"bypassAuthenticationForClientsInWhitelisted": "Обійти автентифікацію для клієнтів у підмережах IP із білого списку",
"whiteListExample": "Приклад: 172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "Створити категорію",
"subHeaderTags": "Доступні мітки:",
"subHeaderCategories": "Доступні категорії:"
@ -435,7 +435,7 @@
"relevance": "Відповідність",
"files": "Файли"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "Доступні мітки:",
"subHeaderCategories": "Доступні категорії:"
},

View file

@ -147,11 +147,11 @@
"webUI": "Web UI",
"tagsAndCategories": "Thẻ & Danh mục"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "Chung"
},
"pageGeneral": {
"general": {
"tip": "Đây là các cài đặt dành riêng cho VueTorrent",
"currentSpeed": "Hiển thị tốc độ hiện tại",
"speedGraph": "Hiển thị biểu đồ tốc độ",
@ -170,7 +170,7 @@
"qbittorrentVersion": "Phiên bản QBittorrent:",
"resetSettings": "Đặt lại cài đặt"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "Các thuộc tính để hiển thị cho các torrent chưa hoàn thành",
"completedTorrentTip": "Các thuộc tính để hiển thị cho các torrent đã hoàn thành",
"properties": {
@ -201,9 +201,9 @@
"globalVolume": "Global Volume"
}
},
"pageMobileCard": {}
"mobileCard": {}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "Khi thêm một torrent",
"whenAddTorrent": {
"donotAutoStart": "Không tự động bắt đầu tải xuống"
@ -238,12 +238,12 @@
"supportParamK": "%K: ID torrent"
}
},
"pageConnection": {
"connection": {
"protocol": "Giao thức kết nối ngang hàng",
"listeningSubHeader": "Cổng",
"useUPnP": "Sử dụng chuyển tiếp cổng UPnP/NAT-PMP từ bộ định tuyến của tôi",
"incomingConnectionPort": "Cổng được sử dụng cho các kết nối đến",
"subHeader": "Giới hạn kết nối (-1 để tắt)",
"subHeader": "Giới hạn kết nối",
"globalMaxConnection": "Số lượng kết nối tối đa chung",
"perTorrentMaxConnection": "Số lượng kết nối tối đa trên mỗi torrent",
"globalMaxUploadSlots": "Số vùng tải lên tối đa chung",
@ -253,7 +253,7 @@
"proxyTorrentOnly": "Chỉ sử dụng proxy cho torrent",
"proxyAuth": "Xác thực"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "Riêng tư",
"enableDHT": "Kích hoạt DHT (mạng phi tập trung) để tìm thêm máy ngang hàng",
"enablePeX": "Bật Trao đổi ngang hàng (PeX) để tìm thêm máy ngang hàng",
@ -275,21 +275,21 @@
"maxRatioRemoveTorrentAndFiles": "Xóa torrent và tệp",
"maxRatioTorrentSuperseeding": "Kích hoạt tính năng siêu chia sẻ torrent"
},
"pageRss": {
"rss": {
"tabName": {
"general": "Chung",
"feeds": "Nguồn cấp dữ liệu",
"rules": "Quy tắc"
},
"pageRules": {
"rules": {
"rules": "Quy tắc",
"btnCreateNew": "Tạo quy tắc"
},
"pageFeeds": {
"feeds": {
"feeds": "Nguồn cấp dữ liệu",
"btnCreateNew": "Thêm nguồn cấp dữ liệu"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "RSS",
"rssAutoDownloader": "Trình tải xuống tự động RSS Torrent",
"input": {
@ -300,7 +300,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "Sử dụng WebUI thay thế",
"filesLocation": "Vị trí WebUI",
"webUserInterface": "Giao diện người dùng web (Điều khiển từ xa)",
@ -316,7 +316,7 @@
"bypassAuthenticationForClientsInWhitelisted": "Bỏ qua xác thực cho máy khách trong mạng con IP được liệt kê trong danh sách trắng",
"whiteListExample": "Ví dụ: 172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "Tạo mới",
"subHeaderTags": "Thẻ có sẵn:",
"subHeaderCategories": "Danh mục có sẵn:"
@ -382,7 +382,7 @@
"relevance": "Mức độ liên quan",
"files": "Các tập tin"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "Thẻ có sẵn:",
"subHeaderCategories": "Danh mục có sẵn:"
},

View file

@ -213,13 +213,13 @@
"webUI": "WebUI",
"tagsAndCategories": "标签&分类"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "常规",
"desktopCard": "桌面端标签",
"mobileCard": "移动端标签"
},
"pageGeneral": {
"general": {
"tip": "这些设置适用于 Vuetorrent 本身",
"currentSpeed": "显示当前速度",
"speedGraph": "显示速度图形化",
@ -241,16 +241,16 @@
"exportSettings": "导出设置",
"resetSettings": "重设为默认"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "未完成种子显示属性",
"completedTorrentTip": "已完成种子显示属性"
},
"pageMobileCard": {
"mobileCard": {
"busyTorrentTip": "未完成种子显示属性",
"completedTorrentTip": "已完成种子显示属性"
}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "当添加种子时",
"whenAddTorrent": {
"donotAutoStart": "不要开始自动下载",
@ -286,7 +286,7 @@
"supportParamK": "%K: 种子 ID"
}
},
"pageConnection": {
"connection": {
"protocol": "对等连接协议",
"listeningSubHeader": "监听端口",
"useUPnP": "使用路由器的 UPnP/NAT-PMP 端口转发",
@ -301,7 +301,7 @@
"proxyTorrentOnly": "只对 torrents 使用代理",
"proxyAuth": "认证"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "隐私",
"enableDHT": "启用 DHT (分散网络) 寻找更多终端",
"enablePeX": "启用 PeX (对等交换) 寻找更多终端",
@ -323,21 +323,21 @@
"maxRatioRemoveTorrentAndFiles": "移除种子和文件",
"maxRatioTorrentSuperseeding": "启用超级做种"
},
"pageRss": {
"rss": {
"tabName": {
"general": "常规",
"feeds": "订阅源",
"rules": "规则"
},
"pageRules": {
"rules": {
"rules": "规则",
"btnCreateNew": "创建规则"
},
"pageFeeds": {
"feeds": {
"feeds": "订阅源",
"btnCreateNew": "添加订阅"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "RSS 阅读器",
"rssAutoDownloader": "RSS Torrent 自动下载器",
"input": {
@ -348,7 +348,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "使用自定义WEBUI",
"filesLocation": "文件路径",
"webUserInterface": "WEBUI设置 (远程控制)",
@ -364,7 +364,7 @@
"bypassAuthenticationForClientsInWhitelisted": "绕过白名单IP子网中客户端的身份验证",
"whiteListExample": "示例172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "新增",
"subHeaderTags": "可用标签:",
"subHeaderCategories": "可用分类:"
@ -439,7 +439,7 @@
"relevance": "关联",
"files": "文件"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "可用标签:",
"subHeaderCategories": "可用分类:"
},

View file

@ -213,13 +213,13 @@
"webUI": "網頁介面",
"tagsAndCategories": "標籤和分類"
},
"pageVueTorrent": {
"vueTorrent": {
"tabName": {
"general": "一般",
"desktopCard": "桌面版卡片",
"mobileCard": "行動版卡片"
},
"pageGeneral": {
"general": {
"tip": "這些設定適用於自訂WebUI",
"currentSpeed": "顯示當前速率",
"speedGraph": "顯示速率圖表",
@ -241,16 +241,16 @@
"exportSettings": "匯出設定",
"resetSettings": "重置設定"
},
"pageDesktopCard": {
"desktopCard": {
"busyTorrentTip": "桌面版上未完成種子所顯示的屬性",
"completedTorrentTip": "桌面版上已完成種子所顯示的屬性"
},
"pageMobileCard": {
"mobileCard": {
"busyTorrentTip": "行動版上未完成種子所顯示的屬性",
"completedTorrentTip": "行動版上未完成種子所顯示的屬性"
}
},
"pageDownloads": {
"downloads": {
"subHeaderWhenAddTorrent": "當新增種子時",
"whenAddTorrent": {
"donotAutoStart": "不要自動開始下載",
@ -286,12 +286,12 @@
"supportParamK": "%K: 種子 ID"
}
},
"pageConnection": {
"connection": {
"protocol": "下載者連線協定",
"listeningSubHeader": "監聽埠",
"useUPnP": "使用從路由器轉送的 UPnP / NAT-PMP 連接埠",
"incomingConnectionPort": "連入連線時使用的埠",
"subHeader": "連線限制 (-1 以禁用)",
"subHeader": "連線限制",
"globalMaxConnection": "全域最大連線數",
"perTorrentMaxConnection": "單個種子的最大連線數",
"globalMaxUploadSlots": "全域上傳通道最大數",
@ -301,7 +301,7 @@
"proxyTorrentOnly": "只對種子使用代理伺服器",
"proxyAuth": "驗證"
},
"pageBittorrent": {
"bittorrent": {
"subHeaderPrivacy": "隱私",
"enableDHT": "啟用 DHT (分散式網絡) 以尋找更多下載者",
"enablePeX": "啟用節點交換 (PeX) 以尋找更多下載者",
@ -323,21 +323,21 @@
"maxRatioRemoveTorrentAndFiles": "移除種子與其檔案",
"maxRatioTorrentSuperseeding": "為種子啟用超級做種"
},
"pageRss": {
"rss": {
"tabName": {
"general": "一般",
"feeds": "訂閱源",
"rules": "規則"
},
"pageRules": {
"rules": {
"rules": "規則",
"btnCreateNew": "新增規則"
},
"pageFeeds": {
"feeds": {
"feeds": "訂閱源",
"btnCreateNew": "新增訂閱"
},
"pageGeneral": {
"general": {
"rssAutoProcessing": "RSS 閱讀器",
"rssAutoDownloader": "RSS 種子自動下載器",
"input": {
@ -348,7 +348,7 @@
}
}
},
"pageWebUI": {
"webUI": {
"useAlternativeWebUI": "使用替補 WebUI",
"filesLocation": "檔案路徑",
"webUserInterface": "網頁介面 (遠端控制)",
@ -364,7 +364,7 @@
"bypassAuthenticationForClientsInWhitelisted": "跳過白名單內 IP 子網中客戶端的驗證",
"whiteListExample": "範例172.17.32.0/24, fdff:ffff:c8::/40"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"btnCreateNew": "新增",
"subHeaderTags": "可用標籤:",
"subHeaderCategories": "可用分類:"
@ -439,7 +439,7 @@
"relevance": "關聯",
"files": "檔案"
},
"pageTagsAndCategories": {
"tagsAndCategories": {
"subHeaderTag": "可用標籤:",
"subHeaderCategories": "可用分類:"
},

View file

@ -1,18 +1,23 @@
import { Component, Vue, Watch } from 'vue-property-decorator'
import { defineComponent } from 'vue'
@Component
export default class FullScreenModal extends Vue {
tab!: string | null
get phoneLayout() {
return this.$vuetify.breakpoint.xsOnly
export default defineComponent({
name: 'FullScreenModal',
data() {
return {
tab: null as string | null
}
},
computed: {
phoneLayout() {
return this.$vuetify.breakpoint.xsOnly
},
dialogWidth() {
return this.phoneLayout ? '100%' : '80%'
}
},
watch: {
dialog(visible: boolean) {
if (!visible) this.tab = null
}
}
get dialogWidth() {
return this.phoneLayout ? '100%' : '80%'
}
@Watch('dialog')
onDialogChanged(visible: boolean) {
if (!visible) this.tab = null
}
}
})

View file

@ -1,12 +1,13 @@
import { mapGetters } from 'vuex'
import { defineComponent } from 'vue'
import qbit from '@/services/qbit'
import { AppPreferences } from '@/types/qbit/models'
export default defineComponent({
name: 'SettingsTab',
computed: {
...mapGetters(['getSettings']),
settings() {
settings(): AppPreferences {
return this.getSettings()
}
},

View file

@ -12,7 +12,8 @@ import type {
TorrentFile,
TorrentProperties,
Tracker,
Torrent
Torrent,
NetworkInterface
} from '@/types/qbit/models'
import type { MainDataResponse, SearchResultsResponse, TorrentPeersResponse } from '@/types/qbit/responses'
import type { AddTorrentPayload, AppPreferencesPayload, CreateFeedPayload, LoginPayload } from '@/types/qbit/payloads'
@ -532,6 +533,18 @@ export class QBitApi {
.then(() => true)
.catch(() => false)
}
async getNetworkInterfaces(): Promise<NetworkInterface[]> {
return this.axios.get('/app/networkInterfaceList').then(r => r.data)
}
async getAddresses(iface: string = ''): Promise<string[]> {
const params = {
iface
}
return this.axios.get('/app/networkInterfaceAddressList', { params }).then(r => r.data)
}
}
export const Qbit = new QBitApi()

View file

@ -10,8 +10,15 @@ import type {
StopCondition,
UploadChokingAlgorithm,
UploadSlotsBehavior,
UtpTcpMixedMode
UtpTcpMixedMode,
DiskIOType
} from '@/enums/qbit/AppPreferences'
import { DiskIOMode } from '@/enums/qbit/AppPreferences'
export interface NetworkInterface {
name: string
value: string
}
export default interface AppPreferences {
/** List of trackers to add to new torrent */
@ -51,6 +58,7 @@ export default interface AppPreferences {
banned_IPs: string
/** Bittorrent Protocol to use (see list of possible values below) */
bittorrent_protocol: BitTorrentProtocol
block_peers_on_privileged_ports: boolean
/** (White)list of ipv4/ipv6 subnets for which webui authentication should be bypassed; list entries are separated by commas */
bypass_auth_subnet_whitelist: string
/** True if webui authentication should be bypassed for clients whose ip resides within (at least) one of the subnets on the whitelist */
@ -61,8 +69,7 @@ export default interface AppPreferences {
category_changed_tmm_enabled: boolean
/** Outstanding memory when checking torrents in MiB */
checking_memory_use: number
/** True if a subfolder should be created when adding a torrent */
create_subfolder_enabled: boolean
connection_speed: number
/** IP Address to bind to. Empty String means All addresses */
current_interface_address: string
/** Network Interface used */
@ -73,6 +80,10 @@ export default interface AppPreferences {
disk_cache: number
/** Disk cache expiry interval in seconds */
disk_cache_ttl: number
disk_io_read_mode: DiskIOMode
disk_io_type: DiskIOType
disk_io_write_mode: DiskIOMode
disk_queue_size: number
/** Global download speed limit in KiB/s; -1 means no limit is applied */
dl_limit: number
/** If true torrents w/o any activity (stalled ones) will not be counted towards max_active_* limits; see dont_count_slow_torrents for more information */
@ -89,26 +100,29 @@ export default interface AppPreferences {
dyndns_username: string
/** Port used for embedded tracker */
embedded_tracker_port: number
embedded_tracker_port_forwarding: boolean
/** True enables coalesce reads & writes */
enable_coalesce_read_write: boolean
/** True enables embedded tracker */
enable_embedded_tracker: boolean
/** True allows multiple connections from the same IP address */
enable_multi_connections_from_same_ip: boolean
/** True enables os cache */
enable_os_cache: boolean
/** True if the advanced libtorrent option piece_extent_affinity is enabled */
enable_piece_extent_affinity: boolean
/** True enables sending of upload piece suggestions */
enable_upload_suggestions: boolean
/** See list of possible values here below */
encryption: Encryption
excluded_file_names: string
excluded_file_names_enabled: boolean
/** Path to directory to copy .torrent files to. Slashes are used as path separators */
export_dir: string
/** Path to directory to copy .torrent files of completed downloads to. Slashes are used as path separators */
export_dir_fin: string
/** File pool size */
file_pool_size: number
hashing_threads: number
idn_support_enabled: boolean
/** True if ".!qB" should be appended to incomplete files */
incomplete_files_ext: boolean
/** True if external IP filter should be enabled */
@ -145,12 +159,14 @@ export default interface AppPreferences {
mail_notification_ssl_enabled: boolean
/** Username for smtp authentication */
mail_notification_username: string
max_active_checking_torrents: number
/** Maximum number of active simultaneous downloads */
max_active_downloads: number
/** Maximum number of active simultaneous downloads and uploads */
max_active_torrents: number
/** Maximum number of active simultaneous uploads */
max_active_uploads: number
max_concurrent_http_announces: number
/** Maximum global number of simultaneous connections */
max_connec: number
/** Maximum number of simultaneous connections per torrent */
@ -169,16 +185,23 @@ export default interface AppPreferences {
max_uploads: number
/** Maximum number of upload slots per torrent */
max_uploads_per_torrent: number
memory_working_set_limit: number
/** Maximal outgoing port (0: Disabled) */
outgoing_ports_max: number
/** Minimal outgoing port (0: Disabled) */
outgoing_ports_min: number
peer_tos: number
peer_turnover: number
peer_turnover_cutoff: number
peer_turnover_interval: number
performance_warning: boolean
/** True if PeX is enabled */
pex: boolean
/** True if disk space should be pre-allocated for all files */
preallocate_all: boolean
/** True proxy requires authentication; doesn't apply to SOCKS4 proxies */
proxy_auth_enabled: boolean
proxy_hostname_lookup: boolean
/** Proxy IP address or domain name */
proxy_ip: string
/** Password for proxy authentication */
@ -197,8 +220,11 @@ export default interface AppPreferences {
queueing_enabled: boolean
/** True if the port is randomly selected */
random_port: boolean
reannounce_when_address_changed: boolean
/** True rechecks torrents on completion */
recheck_completed_torrents: boolean
refresh_interval: number
request_queue_size: number
/** True resolves peer countries */
resolve_peer_countries: boolean
/** Enable auto-downloading of torrents from the RSS feeds */
@ -247,10 +273,7 @@ export default interface AppPreferences {
slow_torrent_ul_rate_threshold: number
/** Socket backlog size */
socket_backlog_size: number
/** For API < v2.0.1: SSL certificate contents (this is a not a path) */
ssl_cert: string
/** For API < v2.0.1: SSL keyfile contents (this is a not a path) */
ssl_key: string
ssrf_mitigation: boolean
/** True if torrents should be added in a Paused state */
start_paused_enabled: boolean
/** Timeout in seconds for a stopped announce request to trackers */
@ -265,7 +288,7 @@ export default interface AppPreferences {
torrent_content_layout: ContentLayout
/** Default stop condition to select when adding a new torrent */
torrent_stop_condition: StopCondition
/** Global upload speed limit in KiB/s; -1 means no limit is applied */
/** Global upload speed limit in KiB/s; 0 means no limit is applied */
up_limit: number
/** Upload choking algorithm used (see list of possible values below) */
upload_choking_algorithm: UploadChokingAlgorithm
@ -275,10 +298,12 @@ export default interface AppPreferences {
upnp: boolean
/** UPnP lease duration (0: Permanent lease) */
upnp_lease_duration: number
use_category_paths_in_manual_mode: boolean
/** True if WebUI HTTPS access is enabled */
use_https: boolean
/** μTP-TCP mixed mode algorithm (see list of possible values below) */
utp_tcp_mixed_mode: UtpTcpMixedMode
validate_https_tracker_certificate: boolean
/** IP address to use for the WebUI */
web_ui_address: string
/** WebUI access ban duration in seconds */
@ -300,9 +325,11 @@ export default interface AppPreferences {
/** Maximum number of authentication failures before WebUI access ban */
web_ui_max_auth_fail_count: number
/** For API ≥ v2.3.0: Plaintext WebUI password, not readable, write-only. For API < v2.3.0: MD5 hash of WebUI password, hash is generated from the following string: username:Web UI Access:plain_text_web_ui_password */
web_ui_password: string
web_ui_password?: string
/** WebUI port */
web_ui_port: number
web_ui_reverse_proxies_list: string
web_ui_reverse_proxy_enabled: boolean
/** True if WebUI cookie Secure flag is enabled */
web_ui_secure_cookie_enabled: boolean
/** Seconds until WebUI is automatically signed off */

View file

@ -12,13 +12,15 @@ import type SearchPlugin from './SearchPlugin'
import type SearchJob from './SearchJob'
import type SearchStatus from './SearchStatus'
import type SearchResult from './SearchResult'
import { FeedArticle } from '@/types/qbit/models/FeedArticle'
import { FeedArticle } from './FeedArticle'
import { NetworkInterface } from './AppPreferences'
type ApplicationVersion = string
export type {
ApplicationVersion,
AppPreferences,
NetworkInterface,
Category,
ServerState,
Tracker,

View file

@ -28,7 +28,7 @@
:item-class="getRowStyle"
>
<template #top>
<div class="mx-4">
<div class="mx-4 mb-5">
<v-text-field v-model="filter" :label="$t('filter')" />
<v-row>
<v-col>
@ -36,11 +36,12 @@
</v-col>
<v-col>
<v-btn style="float: right" small elevation="3" @click="markAllAsRead">
{{ $t('modals.rss.markAllAsRead') }}
{{ $t('modals.rss.markAllAsRead') }}
</v-btn>
</v-col>
</v-row>
</div>
<v-divider />
</template>
<template #[`item.title`]="{ item }">
<a :href="item.link" target="_blank" v-text="item.title" />

View file

@ -3,7 +3,7 @@
<v-row no-gutters class="grey--text" align="center" justify="center">
<v-col>
<h1 style="font-size: 1.6em !important" class="subtitle-1 ml-2">
{{ $t('settings') | titleCase }}
{{ $t('settings').toString() | titleCase }}
</h1>
</v-col>
<v-col class="align-center justify-center">
@ -21,7 +21,7 @@
<v-row class="ma-0 pa-0">
<v-tabs v-model="tab" align-with-title show-arrows background-color="primary">
<v-tab class="white--text" href="#vuetorrent">
<h4>{{ $t('modals.settings.tabName.VueTorrent') }}</h4>
<h4>{{ $t('modals.settings.tabName.vueTorrent') }}</h4>
</v-tab>
<v-tab class="white--text" href="#downloads">
<h4>{{ $t('modals.settings.tabName.downloads') }}</h4>
@ -29,6 +29,9 @@
<v-tab class="white--text" href="#connection">
<h4>{{ $t('modals.settings.tabName.connection') }}</h4>
</v-tab>
<v-tab class="white--text" href="#speed">
<h4>{{ $t('modals.settings.tabName.speed') }}</h4>
</v-tab>
<v-tab class="white--text" href="#bittorrent">
<h4>{{ $t('modals.settings.tabName.bittorrent') }}</h4>
</v-tab>
@ -41,9 +44,11 @@
<v-tab class="white--text" href="#tagsAndCategories">
<h4>{{ $t('modals.settings.tabName.tagsAndCategories') }}</h4>
</v-tab>
<v-tab class="white--text" href="#advanced">
<h4>{{ $t('modals.settings.tabName.advanced') }}</h4>
</v-tab>
</v-tabs>
<!--<v-divider />-->
<v-card-text class="pa-0">
<v-tabs-items v-model="tab" touchless>
<v-tab-item eager value="vuetorrent">
@ -55,6 +60,9 @@
<v-tab-item eager value="connection">
<Connection :is-active="tab === 'connection'" />
</v-tab-item>
<v-tab-item eager value="speed">
<Speed :is-active="tab === 'speed'" />
</v-tab-item>
<v-tab-item eager value="bittorrent">
<BitTorrent :is-active="tab === 'bittorrent'" />
</v-tab-item>
@ -67,33 +75,39 @@
<v-tab-item eager value="tagsAndCategories">
<TagsAndCategories :is-active="tab === 'tagsAndCategories'" />
</v-tab-item>
<v-tab-item eager value="advanced">
<Advanced :is-active="tab === 'advanced'" />
</v-tab-item>
</v-tabs-items>
</v-card-text>
</v-row>
</div>
</template>
<script>
<script lang="ts">
import { defineComponent } from 'vue'
import { mapGetters } from 'vuex'
import { mdiClose, mdiContentSave } from '@mdi/js'
import { WebUI, BitTorrent, Downloads, VueTorrent, TagsAndCategories, Connection, Rss } from '../components/Settings/Tabs'
import { VueTorrent, Downloads, Connection, Speed, BitTorrent, Rss, WebUI, TagsAndCategories, Advanced } from '../components/Settings/Tabs'
import { SettingsTab } from '../mixins'
export default {
export default defineComponent({
name: 'Settings',
components: {
WebUI,
BitTorrent,
Downloads,
VueTorrent,
TagsAndCategories,
Downloads,
Connection,
Rss
Speed,
BitTorrent,
Rss,
WebUI,
TagsAndCategories,
Advanced
},
mixins: [SettingsTab],
data() {
return {
tab: null,
tab: 'vuetorrent',
items: [],
peers: [],
mdiClose,
@ -125,11 +139,11 @@ export default {
close() {
this.$router.back()
},
handleKeyboardShortcut(e) {
handleKeyboardShortcut(e: KeyboardEvent) {
if (e.key === 'Escape') {
this.close()
}
}
}
}
})
</script>

File diff suppressed because it is too large Load diff

View file

@ -4,7 +4,7 @@ exports[`DesktopCard > render correctly 1`] = `
"<v-card-stub loaderheight=\\"4\\" tag=\\"div\\" flat=\\"true\\">
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-col-stub cols=\\"12\\" md=\\"6\\" tag=\\"div\\">
<v-subheader-stub> modals.settings.pageVueTorrent.pageDesktopCard.busyTorrentTip </v-subheader-stub>
<v-subheader-stub> modals.settings.vueTorrent.desktopCard.busyTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<draggable-stub list=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" clone=\\"[Function]\\" element=\\"div\\" tag=\\"tbody\\">
@ -48,7 +48,7 @@ exports[`DesktopCard > render correctly 1`] = `
</v-row-stub>
</v-col-stub>
<v-col-stub cols=\\"12\\" md=\\"6\\" tag=\\"div\\">
<v-subheader-stub> modals.settings.pageVueTorrent.pageDesktopCard.completedTorrentTip </v-subheader-stub>
<v-subheader-stub> modals.settings.vueTorrent.desktopCard.completedTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<draggable-stub list=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" clone=\\"[Function]\\" element=\\"div\\" tag=\\"tbody\\">

View file

@ -4,141 +4,66 @@ exports[`General > render correctly 1`] = `
"<v-card-stub data-v-7da6d3e2=\\"\\" loaderheight=\\"4\\" tag=\\"div\\" flat=\\"true\\">
<v-subheader-stub data-v-7da6d3e2=\\"\\"> </v-subheader-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"100\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"100\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"10\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\" class=\\"mb-3\\">
<v-checkbox-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" indeterminateicon=\\"$checkboxIndeterminate\\" officon=\\"$checkboxOff\\" onicon=\\"$checkboxOn\\" class=\\"ma-0 pa-0\\"></v-checkbox-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\" class=\\"mb-3\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" sm=\\"6\\" md=\\"3\\" tag=\\"div\\">
<v-select-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" value=\\"English\\" appendicon=\\"$dropdown\\" backgroundcolor=\\"\\" dense=\\"true\\" height=\\"1\\" hidedetails=\\"true\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" flat=\\"true\\" outlined=\\"true\\" type=\\"text\\" valuecomparator=\\"[Function]\\" nodatatext=\\"$vuetify.noDataText\\" items=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" itemcolor=\\"primary\\" itemdisabled=\\"disabled\\" itemtext=\\"text\\" itemvalue=\\"value\\" menuprops=\\"[object Object]\\"></v-select-stub>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" sm=\\"6\\" md=\\"3\\" tag=\\"div\\">
<v-select-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" value=\\"10\\" appendicon=\\"$dropdown\\" backgroundcolor=\\"\\" dense=\\"true\\" height=\\"1\\" hidedetails=\\"true\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" flat=\\"true\\" outlined=\\"true\\" type=\\"text\\" valuecomparator=\\"[Function]\\" nodatatext=\\"$vuetify.noDataText\\" items=\\"5,15,30,50\\" itemcolor=\\"primary\\" itemdisabled=\\"disabled\\" itemtext=\\"text\\" itemvalue=\\"value\\" menuprops=\\"[object Object]\\"></v-select-stub>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" sm=\\"6\\" md=\\"3\\" tag=\\"div\\">
<v-select-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" value=\\"test\\" appendicon=\\"$dropdown\\" backgroundcolor=\\"\\" dense=\\"true\\" height=\\"1\\" hidedetails=\\"true\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" flat=\\"true\\" outlined=\\"true\\" type=\\"text\\" valuecomparator=\\"[Function]\\" nodatatext=\\"$vuetify.noDataText\\" items=\\"Default,Global Speed,First Torrent Status\\" itemcolor=\\"primary\\" itemdisabled=\\"disabled\\" itemtext=\\"text\\" itemvalue=\\"value\\" menuprops=\\"[object Object]\\"></v-select-stub>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" sm=\\"6\\" md=\\"3\\" tag=\\"div\\">
<v-text-field-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" hint=\\"using Dayjs\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" outlined=\\"true\\" placeholder=\\"DD/MM/YYYY, HH:mm:ss\\" type=\\"text\\" class=\\"mb-2\\"></v-text-field-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"6\\" md=\\"2\\" tag=\\"div\\" class=\\"d-flex align-center justify-end\\">
<h3 data-v-7da6d3e2=\\"\\"></h3>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"6\\" md=\\"2\\" tag=\\"div\\" class=\\"d-flex align-center justify-start\\">
<h3 data-v-7da6d3e2=\\"\\"><a data-v-7da6d3e2=\\"\\" target=\\"_blank\\" href=\\"https://github.com/WDaan/VueTorrent/releases/tag/vundefined\\"></a></h3>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"6\\" md=\\"2\\" tag=\\"div\\" class=\\"d-flex align-center justify-end\\">
<h3 data-v-7da6d3e2=\\"\\"></h3>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"6\\" md=\\"2\\" tag=\\"div\\" class=\\"d-flex align-center justify-start\\">
<h3 data-v-7da6d3e2=\\"\\"><a data-v-7da6d3e2=\\"\\" target=\\"_blank\\" href=\\"https://github.com/qbittorrent/qBittorrent/releases/tag/release-v1.2.3\\">v1.2.3</a></h3>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"true\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inputvalue=\\"10\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-switch-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" hidedetails=\\"true\\" ripple=\\"true\\" valuecomparator=\\"[Function]\\" inset=\\"true\\" class=\\"v-input--reverse pa-0 ma-0\\"></v-switch-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"8\\" sm=\\"8\\" md=\\"10\\" tag=\\"div\\">
<p data-v-7da6d3e2=\\"\\" class=\\"subtitle-1 mt-2\\"> </p>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"4\\" sm=\\"4\\" md=\\"2\\" tag=\\"div\\">
<v-select-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" value=\\"English\\" appendicon=\\"$dropdown\\" backgroundcolor=\\"background\\" dense=\\"true\\" hidedetails=\\"true\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" flat=\\"true\\" solo=\\"true\\" type=\\"text\\" valuecomparator=\\"[Function]\\" nodatatext=\\"$vuetify.noDataText\\" items=\\"[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]\\" itemcolor=\\"primary\\" itemdisabled=\\"disabled\\" itemtext=\\"caption\\" itemvalue=\\"value\\" menuprops=\\"[object Object]\\" class=\\"rounded-xl\\"></v-select-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"8\\" sm=\\"8\\" md=\\"10\\" tag=\\"div\\">
<p data-v-7da6d3e2=\\"\\" class=\\"subtitle-1 mt-2\\"> </p>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"4\\" sm=\\"4\\" md=\\"2\\" tag=\\"div\\">
<v-select-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" value=\\"10\\" appendicon=\\"$dropdown\\" backgroundcolor=\\"background\\" dense=\\"true\\" hidedetails=\\"true\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" flat=\\"true\\" solo=\\"true\\" type=\\"text\\" valuecomparator=\\"[Function]\\" nodatatext=\\"$vuetify.noDataText\\" items=\\"5,15,30,50\\" itemcolor=\\"primary\\" itemdisabled=\\"disabled\\" itemtext=\\"text\\" itemvalue=\\"value\\" menuprops=\\"[object Object]\\" class=\\"rounded-xl\\"></v-select-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"8\\" sm=\\"8\\" md=\\"10\\" tag=\\"div\\">
<p data-v-7da6d3e2=\\"\\" class=\\"subtitle-1 mt-2\\"> </p>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"4\\" sm=\\"4\\" md=\\"2\\" tag=\\"div\\">
<v-select-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" value=\\"test\\" appendicon=\\"$dropdown\\" backgroundcolor=\\"background\\" dense=\\"true\\" hidedetails=\\"true\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" flat=\\"true\\" solo=\\"true\\" type=\\"text\\" valuecomparator=\\"[Function]\\" nodatatext=\\"$vuetify.noDataText\\" items=\\"Default,Global Speed,First Torrent Status\\" itemcolor=\\"primary\\" itemdisabled=\\"disabled\\" itemtext=\\"text\\" itemvalue=\\"value\\" menuprops=\\"[object Object]\\" class=\\"rounded-xl\\"></v-select-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" sm=\\"6\\" md=\\"9\\" tag=\\"div\\">
<p data-v-7da6d3e2=\\"\\" class=\\"subtitle-1 mt-2\\"> </p>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" sm=\\"6\\" md=\\"3\\" tag=\\"div\\">
<v-text-field-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" backgroundcolor=\\"\\" dense=\\"true\\" hidedetails=\\"true\\" label=\\"using Dayjs\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" outlined=\\"true\\" placeholder=\\"DD/MM/YYYY, HH:mm:ss\\" type=\\"text\\" class=\\"mb-2\\"></v-text-field-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"10\\" sm=\\"10\\" md=\\"11\\" tag=\\"div\\">
<p data-v-7da6d3e2=\\"\\" class=\\"subtitle-1\\"> </p>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"2\\" sm=\\"2\\" md=\\"1\\" tag=\\"div\\"><a data-v-7da6d3e2=\\"\\" target=\\"_blank\\" href=\\"https://github.com/WDaan/VueTorrent/releases/tag/vundefined\\">
<p data-v-7da6d3e2=\\"\\" class=\\"mb-2\\"></p>
</a></v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"10\\" sm=\\"10\\" md=\\"11\\" tag=\\"div\\">
<p data-v-7da6d3e2=\\"\\" class=\\"subtitle-1\\"> </p>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"2\\" sm=\\"2\\" md=\\"1\\" tag=\\"div\\"><a data-v-7da6d3e2=\\"\\" target=\\"_blank\\" href=\\"https://github.com/qbittorrent/qBittorrent/releases/tag/release-v1.2.3\\">
<p data-v-7da6d3e2=\\"\\" class=\\"mb-2\\"> v1.2.3 </p>
</a></v-col-stub>
</v-row-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\" dense=\\"true\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"7\\" sm=\\"7\\" md=\\"10\\" tag=\\"div\\">
<p data-v-7da6d3e2=\\"\\" class=\\"subtitle-1\\"> </p>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"4\\" sm=\\"4\\" md=\\"2\\" tag=\\"div\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" md=\\"4\\" tag=\\"div\\" class=\\"d-flex align-center justify-center\\">
<v-btn-stub data-v-7da6d3e2=\\"\\" tag=\\"button\\" activeclass=\\"\\" type=\\"button\\"></v-btn-stub>
</v-col-stub>
</v-row-stub>
@ -146,12 +71,18 @@ exports[`General > render correctly 1`] = `
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-textarea-stub data-v-7da6d3e2=\\"\\" errorcount=\\"1\\" errormessages=\\"\\" messages=\\"\\" rules=\\"\\" successmessages=\\"\\" value=\\"\\" backgroundcolor=\\"\\" loaderheight=\\"2\\" clearicon=\\"$clear\\" type=\\"text\\" rowheight=\\"24\\" rows=\\"5\\"></v-textarea-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\" class=\\"remove-after justify-content-evenly\\">
<v-btn-stub data-v-7da6d3e2=\\"\\" tag=\\"button\\" activeclass=\\"\\" type=\\"button\\"></v-btn-stub>
<v-btn-stub data-v-7da6d3e2=\\"\\" tag=\\"button\\" activeclass=\\"\\" type=\\"button\\"></v-btn-stub>
</v-list-item-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\" class=\\"justify-center pb-2\\">
<v-btn-stub data-v-7da6d3e2=\\"\\" color=\\"red\\" dark=\\"true\\" tag=\\"button\\" activeclass=\\"\\" type=\\"button\\"></v-btn-stub>
<v-list-item-stub data-v-7da6d3e2=\\"\\" activeclass=\\"\\" tag=\\"div\\">
<v-row-stub data-v-7da6d3e2=\\"\\" tag=\\"div\\">
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" sm=\\"6\\" tag=\\"div\\" class=\\"d-flex align-center justify-center\\">
<v-btn-stub data-v-7da6d3e2=\\"\\" tag=\\"button\\" activeclass=\\"\\" type=\\"button\\"></v-btn-stub>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" sm=\\"6\\" tag=\\"div\\" class=\\"d-flex align-center justify-center\\">
<v-btn-stub data-v-7da6d3e2=\\"\\" tag=\\"button\\" activeclass=\\"\\" type=\\"button\\"></v-btn-stub>
</v-col-stub>
<v-col-stub data-v-7da6d3e2=\\"\\" cols=\\"12\\" tag=\\"div\\" class=\\"d-flex align-center justify-center\\">
<v-btn-stub data-v-7da6d3e2=\\"\\" color=\\"red\\" dark=\\"true\\" tag=\\"button\\" activeclass=\\"\\" type=\\"button\\"></v-btn-stub>
</v-col-stub>
</v-row-stub>
</v-list-item-stub>
</v-card-stub>"
`;

View file

@ -4,7 +4,7 @@ exports[`MobileCard > render correctly 1`] = `
"<v-card-stub loaderheight=\\"4\\" tag=\\"div\\" flat=\\"true\\">
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-col-stub cols=\\"12\\" md=\\"6\\" tag=\\"div\\">
<v-subheader-stub> modals.settings.pageVueTorrent.pageMobileCard.busyTorrentTip </v-subheader-stub>
<v-subheader-stub> modals.settings.vueTorrent.mobileCard.busyTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<vdashboarditem-stub property=\\"[object Object]\\"></vdashboarditem-stub>
@ -24,7 +24,7 @@ exports[`MobileCard > render correctly 1`] = `
</v-row-stub>
</v-col-stub>
<v-col-stub cols=\\"12\\" md=\\"6\\" tag=\\"div\\">
<v-subheader-stub> modals.settings.pageVueTorrent.pageMobileCard.completedTorrentTip </v-subheader-stub>
<v-subheader-stub> modals.settings.vueTorrent.mobileCard.completedTorrentTip </v-subheader-stub>
<v-row-stub tag=\\"div\\" dense=\\"true\\">
<v-list-stub tag=\\"div\\" flat=\\"true\\" class=\\"ma-2 pa-0\\">
<vdashboarditem-stub property=\\"[object Object]\\"></vdashboarditem-stub>