Browse Source

Some changes

tags/v1.5.0-rc2.2
Ivan Bravo Bravo 6 months ago
parent
commit
c7e3bf8402
71 changed files with 590 additions and 269 deletions
  1. 2
    1
      src/.eslintrc.js
  2. 2
    1
      src/components/Form/InlineField.vue
  3. 1
    1
      src/components/Form/index.js
  4. 1
    1
      src/components/Layout/Menubar.vue
  5. 29
    10
      src/components/Layout/Navbar.backup.vue
  6. 24
    21
      src/components/Layout/Navbar.vue
  7. 12
    5
      src/components/Layout/Titlebar.vue
  8. 2
    2
      src/components/Layout/index.js
  9. 54
    22
      src/components/Nudity/PhotoRun.vue
  10. 10
    3
      src/components/Nudity/Upload.vue
  11. 2
    2
      src/components/Nudity/index.js
  12. 4
    2
      src/components/Page/PageHeader.vue
  13. 1
    1
      src/components/Page/index.js
  14. 11
    6
      src/components/Queue/QueueBar.backup.vue
  15. 19
    9
      src/components/Queue/QueuePhoto.vue
  16. 2
    2
      src/components/Queue/index.js
  17. 10
    4
      src/components/Settings/Preference.vue
  18. 38
    14
      src/components/Settings/SettingsPreferences.vue
  19. 2
    2
      src/components/Settings/index.js
  20. 3
    1
      src/components/UI/AppExternalLink.vue
  21. 4
    2
      src/components/UI/AppNews.vue
  22. 4
    2
      src/components/UI/AppPhoto.vue
  23. 22
    10
      src/components/UI/BoxItem.vue
  24. 29
    12
      src/components/UI/ProjectUpdate.vue
  25. 1
    1
      src/electron/src/index.js
  26. 1
    1
      src/electron/src/modules/app-error.js
  27. 3
    3
      src/electron/src/modules/services/base.js
  28. 5
    2
      src/electron/src/modules/settings.js
  29. 1
    1
      src/electron/src/modules/tools/fs.js
  30. 1
    1
      src/electron/src/modules/tools/power.js
  31. 6
    6
      src/electron/src/modules/tools/system.js
  32. 4
    3
      src/layouts/default.backup.vue
  33. 8
    2
      src/layouts/default.vue
  34. 3
    2
      src/layouts/wizard.vue
  35. 1
    1
      src/modules/consola/index.js
  36. 2
    3
      src/modules/consola/log.js
  37. 1
    1
      src/modules/events.js
  38. 8
    2
      src/modules/file.js
  39. 6
    2
      src/modules/nudify/nudify.js
  40. 11
    5
      src/modules/nudify/photo-run.js
  41. 6
    5
      src/modules/nudify/photo.js
  42. 1
    1
      src/modules/services/base.js
  43. 1
    1
      src/modules/system/achievements.js
  44. 2
    0
      src/modules/tutorial.js
  45. 3
    2
      src/modules/updater/base.js
  46. 1
    1
      src/modules/updater/checkpoints.js
  47. 1
    1
      src/modules/updater/dreampower.js
  48. 1
    1
      src/modules/updater/dreamtime.js
  49. 2
    0
      src/nuxt.config.js
  50. 1
    0
      src/package.json
  51. 1
    1
      src/pages/about.vue
  52. 32
    12
      src/pages/alerts.vue
  53. 6
    6
      src/pages/index.vue
  54. 5
    2
      src/pages/models/add.vue
  55. 2
    1
      src/pages/models/index.vue
  56. 16
    7
      src/pages/nudify/_id.vue
  57. 6
    3
      src/pages/nudify/_id/crop.vue
  58. 5
    2
      src/pages/nudify/_id/editor.vue
  59. 4
    1
      src/pages/nudify/_id/preferences.vue
  60. 27
    10
      src/pages/nudify/_id/results.vue
  61. 8
    5
      src/pages/settings/folders.vue
  62. 4
    2
      src/pages/settings/telemetry.vue
  63. 11
    3
      src/pages/wizard/checkpoints.vue
  64. 27
    8
      src/pages/wizard/power.vue
  65. 18
    7
      src/pages/wizard/telemetry.vue
  66. 6
    2
      src/pages/wizard/tos.vue
  67. 4
    2
      src/pages/wizard/welcome.vue
  68. 21
    8
      src/plugins/setup.js
  69. 15
    0
      src/store/app.js
  70. 1
    1
      src/workers/fs/index.js
  71. 2
    2
      src/workers/fs/worker.js

+ 2
- 1
src/.eslintrc.js View File

@@ -66,7 +66,7 @@ module.exports = {
'nuxt/no-cjs-in-config': 'off',
'nuxt/no-globals-in-created': 'off',
'linebreak-style': 'error',
'max-len': ['warn', { code: 120 }],
'max-len': ['warn', { code: 160 }],
'no-await-in-loop': 'warn',
'no-continue': 'off',
'no-param-reassign': 'off',
@@ -75,6 +75,7 @@ module.exports = {
'no-trailing-spaces': 'warn',
'no-tabs': 'error',
'no-undef': 'warn',
'no-shadow': 'warn',
'class-methods-use-this': 'off',
'comma-dangle': 'warn',
'func-names': 'off',

+ 2
- 1
src/components/Form/InlineField.vue View File

@@ -4,7 +4,8 @@
<p class="inline-field-label">
{{ label }}
</p>
<p v-if="hint" class="inline-field-hint">
<p v-if="hint"
class="inline-field-hint">
{{ hint }}
</p>
</div>

+ 1
- 1
src/components/Form/index.js View File

@@ -1,4 +1,4 @@
import Vue from 'vue'
import InlineField from './InlineField'
import InlineField from './InlineField.vue'

Vue.component('form-inline-field', InlineField)

+ 1
- 1
src/components/Layout/Menubar.vue View File

@@ -49,7 +49,7 @@ export default {

section {
&:not(:last-child) {
@apply pb-6 border-b-2 border-dark-400;
@apply pb-6 border-b border-dark-400;
@apply mb-3;
}
}

+ 29
- 10
src/components/Layout/Navbar.backup.vue View File

@@ -1,30 +1,47 @@
<template>
<div class="layout__navbar">
<div class="navbar__left">
<nuxt-link v-if="canNudify" to="/" class="navbar__item navbar__item--home">
<nuxt-link v-if="canNudify"
to="/"
class="navbar__item navbar__item--home">
Upload
</nuxt-link>

<nuxt-link id="settings" class="navbar__item" to="/settings">
<nuxt-link id="settings"
class="navbar__item"
to="/settings">
Settings
</nuxt-link>

<nuxt-link v-if="unlockedBadTime" v-tooltip="{ content: 'Mini-game. Can you survive until the end? ๐ŸŽฎ๐Ÿ’€', placement: 'bottom' }" class="navbar__item" to="/games/badtime">
<nuxt-link v-if="unlockedBadTime"
v-tooltip="{ content: 'Mini-game. Can you survive until the end? ๐ŸŽฎ๐Ÿ’€', placement: 'bottom' }"
class="navbar__item"
to="/games/badtime">
Bad Time Game
</nuxt-link>

<a v-if="isDev" class="navbar__item" @click.prevent="createError">
<a v-if="isDev"
class="navbar__item"
@click.prevent="createError">
Force Error
</a>
</div>

<div class="navbar__right">
<nuxt-link v-tooltip="{placement: 'bottom', content: 'Alert Center'}" class="navbar__icon" to="/alerts">
<font-awesome-icon v-if="hasAlerts" icon="exclamation-triangle" class="alerts--active" />
<font-awesome-icon v-else icon="check-circle" class="alerts--ok" />
<nuxt-link v-tooltip="{placement: 'bottom', content: 'Alert Center'}"
class="navbar__icon"
to="/alerts">
<font-awesome-icon v-if="hasAlerts"
icon="exclamation-triangle"
class="alerts--active" />
<font-awesome-icon v-else
icon="check-circle"
class="alerts--ok" />
</nuxt-link>

<nuxt-link v-tooltip="{placement: 'bottom', content: 'About'}" class="navbar__icon" to="/about">
<nuxt-link v-tooltip="{placement: 'bottom', content: 'About'}"
class="navbar__icon"
to="/about">
<font-awesome-icon icon="info-circle" />
</nuxt-link>

@@ -109,9 +126,11 @@ export default {
0% {
@apply text-danger-500;
}

50% {
@apply text-warning-500;
}

100% {
@apply text-danger-500;
}
@@ -169,9 +188,9 @@ export default {
}

.alerts--active {
animation-name: alertAnim;
animation-iteration-count: infinite;
animation-duration: 3s;
animation-iteration-count: infinite;
animation-name: alertAnim;
animation-timing-function: ease-in-out;
}


+ 24
- 21
src/components/Layout/Navbar.vue View File

@@ -32,11 +32,12 @@
</div>

<div class="nav__right">
<div v-if="isBadTimeAvailable"
v-tooltip="'Bad Time Game'"
class="nav__item nav__item--button">
<nuxt-link v-if="isBadTimeAvailable"
v-tooltip="'Bad Time Game'"
to="/games/badtime"
class="nav__item nav__item--button">
<img src="~/assets/images/games/sans.png">
</div>
</nuxt-link>

<nuxt-link v-tooltip="'Settings'"
to="/settings"
@@ -135,9 +136,11 @@ export default {
0% {
background-position: 0% 0%;
}

50% {
background-position: 100% 0%;
}

100% {
background-position: 0% 0%;
}
@@ -147,9 +150,11 @@ export default {
0% {
@apply text-danger-500;
}

50% {
@apply text-warning-500;
}

100% {
@apply text-danger-500;
}
@@ -200,34 +205,32 @@ export default {
&.nav__item--button {
@apply justify-center;
@apply rounded-full text-lg mr-3;
width: 40px;
height: 40px;
width: 40px;

&:hover {
@apply bg-dark-800;
@apply bg-dark-400;
}

img {
height: 20px;
}
height: 20px;
}
}

&.nav__item--logo {
@apply text-white text-sm font-bold px-6 select-none;

background: rgb(99, 66, 245);
background: linear-gradient(
40deg,
rgba(99, 66, 245, 1) 0%,
rgba(239, 125, 199, 1) 100%
);
background-size: 200% 100%;
background-position: 0% 0%;
animation-duration: 10s;
animation-iteration-count: infinite;

animation-name: logoAnim;
animation-iteration-count: infinite;
animation-duration: 10s;
animation-timing-function: ease-in-out;

background: rgb(99, 66, 245);
background: linear-gradient(40deg,
rgba(99, 66, 245, 1) 0%,
rgba(239, 125, 199, 1) 100%);
background-position: 0% 0%;
background-size: 200% 100%;
}

&.nav__item--greetings {
@@ -288,9 +291,9 @@ export default {
}

.alerts--active {
animation-name: alertAnim;
animation-iteration-count: infinite;
animation-duration: 3s;
animation-iteration-count: infinite;
animation-name: alertAnim;
animation-timing-function: ease-in-out;
}


+ 12
- 5
src/components/Layout/Titlebar.vue View File

@@ -3,15 +3,22 @@
<div class="titlebar__drag" />

<div class="titlebar__buttons">
<button id="minimize" type="button" @click="minimize">
<button id="minimize"
type="button"
@click="minimize">
<font-awesome-icon icon="minus" />
</button>

<button id="maximize" type="button" @click="maximize">
<button id="maximize"
type="button"
@click="maximize">
<font-awesome-icon :icon="['far', 'square']" />
</button>

<button id="close" type="button" class="close" @click="close">
<button id="close"
type="button"
class="close"
@click="close">
<font-awesome-icon icon="times" />
</button>
</div>
@@ -61,7 +68,7 @@ export default {
.topbar__badtime {
@apply flex items-center justify-center;
@apply lowercase font-bold text-sm;
font-family: "Comic Sans MS", serif;
font-family: 'Comic Sans MS', serif;

img {
@apply mr-2;
@@ -80,8 +87,8 @@ export default {
button {
@apply flex items-center justify-center outline-none;
@apply text-xs;
width: 50px;
height: 30px;
width: 50px;

&:hover {
@apply bg-dark-800;

+ 2
- 2
src/components/Layout/index.js View File

@@ -1,7 +1,7 @@
import Vue from 'vue'

import Titlebar from './Titlebar'
import Navbar from './Navbar'
import Titlebar from './Titlebar.vue'
import Navbar from './Navbar.vue'
import Menubar from './Menubar.vue'

Vue.component('Titlebar', Titlebar)

+ 54
- 22
src/components/Nudity/PhotoRun.vue View File

@@ -1,6 +1,9 @@
<template>
<div class="photo-run" :class="previewClass" data-private>
<div class="run__preview" :style="previewStyle" />
<div class="photo-run"
:class="previewClass"
data-private>
<div class="run__preview"
:style="previewStyle" />

<div
v-if="run.preferences.body.randomize || run.preferences.body.progressive.enabled"
@@ -32,7 +35,8 @@
</div>

<div class="run__content">
<div v-if="run.running" class="content__item">
<div v-if="run.running"
class="content__item">
<p class="text-white">
<span>
<font-awesome-icon icon="running" />
@@ -41,7 +45,8 @@
</p>
</div>

<div v-else-if="run.failed" class="content__item">
<div v-else-if="run.failed"
class="content__item">
<p class="text-danger-500">
<span>
<font-awesome-icon icon="exclamation-circle" />
@@ -50,7 +55,8 @@
</p>
</div>

<div v-else-if="run.finished" class="content__item">
<div v-else-if="run.finished"
class="content__item">
<p class="text-white">
<span>
<font-awesome-icon icon="heart" />
@@ -59,7 +65,8 @@
</p>
</div>

<div v-else class="content__item">
<div v-else
class="content__item">
<p class="text-white">
<span>
<font-awesome-icon icon="clock" />
@@ -67,7 +74,8 @@
</p>
</div>

<div v-show="run.finished && run.outputFile.exists" class="content__item">
<div v-show="run.finished && run.outputFile.exists"
class="content__item">
<button
v-tooltip="'Open photo'"
class="button button--info button--sm"
@@ -76,7 +84,8 @@
</button>
</div>

<div v-show="run.finished && run.outputFile.exists" class="content__item">
<div v-show="run.finished && run.outputFile.exists"
class="content__item">
<button
v-tooltip="'Save photo'"
class="button button--info button--sm"
@@ -85,19 +94,26 @@
</button>
</div>

<div v-show="run.finished" class="content__item">
<button v-tooltip="'Rerun'" class="button button--success button--sm" @click.prevent="rerun">
<div v-show="run.finished"
class="content__item">
<button v-tooltip="'Rerun'"
class="button button--success button--sm"
@click.prevent="rerun">
<font-awesome-icon icon="undo" />
</button>
</div>

<div v-show="run.running" class="content__item">
<button v-tooltip="'Stop'" class="button button--danger button--sm" @click.prevent="cancel">
<div v-show="run.running"
class="content__item">
<button v-tooltip="'Stop'"
class="button button--danger button--sm"
@click.prevent="cancel">
<font-awesome-icon icon="stop" />
</button>
</div>

<div v-show="hasMaskfin" class="content__item">
<div v-show="hasMaskfin"
class="content__item">
<button
v-tooltip="'View Maskfin'"
class="button button--sm"
@@ -117,31 +133,46 @@
</div>

<!-- Maskfin Dialog -->
<dialog v-if="hasMaskfin" ref="maskfinDialog">
<dialog v-if="hasMaskfin"
ref="maskfinDialog">
<div class="dialog__content dialog__maskfin">
<div class="maskfin__preview">
<img :src="run.maskfinFile.path">
</div>

<div class="maskfin__description">
<p>This is the Maskfin, a mask that represents in layers the areas that the algorithm will replace with the fake nude.</p>
<p>Click on the "Add to queue" button to add it as an additional photo, edit the layers with the editor and continue with the nudification. You can also save it to your computer, edit it with an external program and continue the nudification manually.</p>
<p>
This is the Maskfin,
a mask that represents in layers the areas that the algorithm will replace with the fake nude.
</p>

<p>
Click on the "Add to queue" button to add it as an additional photo,
edit the layers with the editor and continue with the nudification.
You can also save it to your computer,
edit it with an external program and continue the nudification manually.
</p>

<p>
For more information please consult the
<a :href="manualURL" target="_blank">guide</a>.
<a :href="manualURL"
target="_blank">guide</a>.
</p>
</div>

<div class="dialog__buttons">
<button class="button" @click.prevent="addMaskToQueue">
<button class="button"
@click.prevent="addMaskToQueue">
Add to queue
</button>

<button class="button button--success" @click.prevent="saveMask">
<button class="button button--success"
@click.prevent="saveMask">
Save
</button>

<button class="button button--danger" @click.prevent="$refs.maskfinDialog.close()">
<button class="button button--danger"
@click.prevent="$refs.maskfinDialog.close()">
Close
</button>
</div>
@@ -161,7 +192,8 @@
</div>

<div class="dialog__buttons">
<button class="button button--danger" @click.prevent="$refs.terminalDialog.close()">
<button class="button button--danger"
@click.prevent="$refs.terminalDialog.close()">
Close
</button>
</div>
@@ -254,7 +286,7 @@ export default {
<style lang="scss" scoped>
.photo-run {
@apply relative border-2 border-dark-500;
background-image: url("~@/assets/images/curls.png"); /* Background pattern from Toptal Subtle Patterns */
background-image: url('~@/assets/images/curls.png'); /* Background pattern from Toptal Subtle Patterns */
min-height: 512px;
transition: border-color 0.2s linear;


+ 10
- 3
src/components/Nudity/Upload.vue View File

@@ -1,5 +1,6 @@
<template>
<div id="uploader" class="uploader">
<div id="uploader"
class="uploader">
<!-- Uploader Selection -->
<div class="uploader__selection">
<div class="selection__content" />
@@ -70,7 +71,9 @@ export default {
*
*/
openUrl() {
if (isEmpty(this.webAddress) || (!startsWith(this.webAddress, 'http://') && !startsWith(this.webAddress, 'https://'))) {
if (isEmpty(this.webAddress)
|| (!startsWith(this.webAddress, 'http://')
&& !startsWith(this.webAddress, 'https://'))) {
throw new Warning('Upload failed.', 'Please enter a valid web address.')
}

@@ -94,7 +97,11 @@ export default {
try {
post = await instagram.getPost(this.instagramPhoto)
} catch (error) {
throw new Warning('Upload failed.', 'Unable to download the photo, please verify that the address is correct and that you are connected to the Internet.', error)
throw new Warning(
'Upload failed.',
'Unable to download the photo, please verify that the address is correct and that you are connected to the Internet.',
error,
)
}

if (post.isVideo) {

+ 2
- 2
src/components/Nudity/index.js View File

@@ -1,6 +1,6 @@
import Vue from 'vue'
import NudifyUpload from './Upload'
import NudifyPhotoRun from './PhotoRun'
import NudifyUpload from './Upload.vue'
import NudifyPhotoRun from './PhotoRun.vue'

Vue.component('nudify-upload', NudifyUpload)
Vue.component('nudify-photo-run', NudifyPhotoRun)

+ 4
- 2
src/components/Page/PageHeader.vue View File

@@ -4,11 +4,13 @@
<slot />
</div>

<div v-if="this.$slots.center" class="header__center">
<div v-if="this.$slots.center"
class="header__center">
<slot name="center" />
</div>

<div v-if="this.$slots.right" class="header__right">
<div v-if="this.$slots.right"
class="header__right">
<slot name="right" />
</div>
</div>

+ 1
- 1
src/components/Page/index.js View File

@@ -1,4 +1,4 @@
import Vue from 'vue'
import PageHeader from './PageHeader'
import PageHeader from './PageHeader.vue'

Vue.component('PageHeader', PageHeader)

+ 11
- 6
src/components/Queue/QueueBar.backup.vue View File

@@ -1,5 +1,6 @@
<template>
<div id="queuebar" class="layout__jobbar">
<div id="queuebar"
class="layout__jobbar">
<section id="queuebar-running">
<div class="section__header">
<div class="section__title">
@@ -7,7 +8,8 @@
<span>Queue</span>
</div>

<div v-show="$nudify.waiting.length > 0" class="section__actions">
<div v-show="$nudify.waiting.length > 0"
class="section__actions">
<button
v-tooltip="{placement: 'bottom', content: 'Forget waiting'}"
class="button button--danger button--xs"
@@ -40,7 +42,8 @@
<span>Pending</span>
</div>

<div v-show="$nudify.pending.length > 0" class="section__actions">
<div v-show="$nudify.pending.length > 0"
class="section__actions">
<button
v-tooltip="'Forget all'"
class="button button--danger button--xs"
@@ -73,7 +76,8 @@
<span>Finished</span>
</div>

<div v-show="$nudify.finished.length > 0" class="section__actions">
<div v-show="$nudify.finished.length > 0"
class="section__actions">
<button
v-tooltip="'Forget all'"
class="button button--danger button--xs"
@@ -121,10 +125,11 @@ section {

&:not(:first-child) {
.section__header {
&::before, &::after {
&::before,
&::after {
@apply block border-b;
@apply absolute right-0 pointer-events-none z-0;
content: " ";
content: ' ';
left: 100px;
}


+ 19
- 9
src/components/Queue/QueuePhoto.vue View File

@@ -1,23 +1,32 @@
<template>
<div class="photo" :class="photoClass">
<div class="photo__preview" :style="previewStyle" />
<div class="photo"
:class="photoClass">
<div class="photo__preview"
:style="previewStyle" />

<div class="photo__content">
<span v-show="photo.running || photo.finished">{{ photo.timer.duration }}s</span>

<button v-tooltip="'Open'" @click="open">
<button v-tooltip="'Open'"
@click="open">
<font-awesome-icon icon="external-link-square-alt" />
</button>

<button v-show="photo.pending" v-tooltip="'Add to Queue'" @click="add">
<button v-show="photo.pending"
v-tooltip="'Add to Queue'"
@click="add">
<font-awesome-icon icon="play" />
</button>

<button v-show="photo.waiting" v-tooltip="'Remove from Queue'" @click="cancel">
<button v-show="photo.waiting"
v-tooltip="'Remove from Queue'"
@click="cancel">
<font-awesome-icon icon="sign-out-alt" />
</button>

<button v-show="photo.running" v-tooltip="'Stop'" @click="stop">
<button v-show="photo.running"
v-tooltip="'Stop'"
@click="stop">
<font-awesome-icon icon="stop" />
</button>
</div>
@@ -85,7 +94,7 @@ export default {
<style lang="scss" scoped>
.photo {
@apply w-1/2 h-full relative border-2 border-dark-800;
background-image: url("~@/assets/images/curls.png");
background-image: url('~@/assets/images/curls.png');
will-change: transform;

&.photo--running {
@@ -111,9 +120,10 @@ export default {
@apply absolute top-0 bottom-0 left-0 right-0 z-30;
@apply flex bg-dark-500-60 opacity-0;
backdrop-filter: blur(4px);
transition: opacity .1s linear;
transition: opacity 0.1s linear;

span, button {
span,
button {
@apply flex-1;
}


+ 2
- 2
src/components/Queue/index.js View File

@@ -8,8 +8,8 @@
// Written by Ivan Bravo Bravo <ivan@dreamnet.tech>, 2020.

import Vue from 'vue'
import QueueBar from './QueueBar'
import QueuePhoto from './QueuePhoto'
import QueueBar from './QueueBar.vue'
import QueuePhoto from './QueuePhoto.vue'

Vue.component('Queuebar', QueueBar)
Vue.component('QueuePhoto', QueuePhoto)

+ 10
- 4
src/components/Settings/Preference.vue View File

@@ -1,9 +1,13 @@
<template>
<section class="box box--items">
<div class="box__content">
<box-item :description="`Value: ${currentValue.size}`" :label="`${label} size`">
<box-item :description="`Value: ${currentValue.size}`"
:label="`${label} size`">
<div :style="{ opacity: body.randomize ? 0.3 : 1.0 }">
<VueSlider v-model="currentValue.size" :min="min" :max="max" :interval="0.05" />
<VueSlider v-model="currentValue.size"
:min="min"
:max="max"
:interval="0.05" />
</div>
</box-item>

@@ -11,7 +15,8 @@
v-show="!body.randomize && body.progressive.enabled"
label="Progressive?"
description="Increase this body part progressively in each run.">
<select v-model="currentValue.progressive" class="input">
<select v-model="currentValue.progressive"
class="input">
<option :value="true">
Enabled
</option>
@@ -25,7 +30,8 @@
<box-item
label="Randomize?"
description="Randomize this body part in each run.">
<select v-model="currentValue.randomize.enabled" class="input">
<select v-model="currentValue.randomize.enabled"
class="input">
<option :value="true">
Enabled
</option>

+ 38
- 14
src/components/Settings/SettingsPreferences.vue View File

@@ -1,6 +1,8 @@
<template>
<div class="c-preferences">
<section v-show="currentValue.advanced.transformMode !== 'import-maskfin'" id="preferences-runs" class="box box--items">
<section v-show="currentValue.advanced.transformMode !== 'import-maskfin'"
id="preferences-runs"
class="box box--items">
<div class="box__header">
<h2 class="title">
Per run.
@@ -14,13 +16,17 @@
<box-item
label="Runs."
description="Number of times the photo will be nudified.">
<input v-model="currentValue.body.executions" type="number" min="1" class="input">
<input v-model="currentValue.body.executions"
type="number"
min="1"
class="input">
</box-item>

<box-item
label="Randomize."
description="Set random body preferences at each run.">
<select v-model="currentValue.body.randomize" class="input">
<select v-model="currentValue.body.randomize"
class="input">
<option :value="true">
Enabled
</option>
@@ -34,7 +40,8 @@
v-show="!currentValue.body.randomize"
label="Progressive."
:description="`Body preferences will increase ${currentValue.body.progressive.rate} at each run.`">
<select v-model="currentValue.body.progressive.enabled" class="input">
<select v-model="currentValue.body.progressive.enabled"
class="input">
<option :value="true">
Enabled
</option>
@@ -48,28 +55,42 @@
v-show="!currentValue.body.randomize && currentValue.body.progressive.enabled"
label="Progressive rate."
:description="`Value: ${currentValue.body.progressive.rate}`">
<VueSlider v-model="currentValue.body.progressive.rate" :min="0.1" :max="0.9" :interval="0.05" />
<VueSlider v-model="currentValue.body.progressive.rate"
:min="0.1"
:max="0.9"
:interval="0.05" />
</box-item>
</div>
</section>

<!-- Boobs -->
<Preference id="preferences-body" v-model="currentValue.body.boobs" label="Boobs" />
<Preference id="preferences-body"
v-model="currentValue.body.boobs"
label="Boobs" />

<!-- Areola -->
<Preference v-model="currentValue.body.areola" label="Areola" :min="0" />
<Preference v-model="currentValue.body.areola"
label="Areola"
:min="0" />

<!-- Nipple -->
<Preference v-model="currentValue.body.nipple" label="Nipple" :min="0" />
<Preference v-model="currentValue.body.nipple"
label="Nipple"
:min="0" />

<!-- Vagina -->
<Preference v-model="currentValue.body.vagina" label="Vagina" :max="1.5" />
<Preference v-model="currentValue.body.vagina"
label="Vagina"
:max="1.5" />

<!-- Pubic Hair -->
<Preference v-model="currentValue.body.pubicHair" label="Pubic Hair" :min="0" />
<Preference v-model="currentValue.body.pubicHair"
label="Pubic Hair"
:min="0" />

<!-- Advanced -->
<section id="preferences-advanced" class="box box--items">
<section id="preferences-advanced"
class="box box--items">
<div class="box__header">
<h2 class="title">
Advanced.
@@ -84,7 +105,8 @@
id="preferences-advanced-scale"
label="Scale method."
description="Indicates how the photo will be scaled, this changes the quality of the result dramatically.">
<select v-model="currentValue.advanced.scaleMode" class="input">
<select v-model="currentValue.advanced.scaleMode"
class="input">
<option value="none">
None
</option>
@@ -110,7 +132,8 @@
id="preferences-advanced-color"
label="Color transfer."
description="Use a experimental algorithm to try to recover the original colors of the photo.">
<select v-model="currentValue.advanced.useColorTransfer" class="input">
<select v-model="currentValue.advanced.useColorTransfer"
class="input">
<option :value="true">
Enabled
</option>
@@ -123,7 +146,8 @@
<box-item
label="Transformation method."
description="Advanced users. Indicates additional options for transformation.">
<select v-model="currentValue.advanced.transformMode" class="input">
<select v-model="currentValue.advanced.transformMode"
class="input">
<option value="normal">
Nudify
</option>

+ 2
- 2
src/components/Settings/index.js View File

@@ -10,8 +10,8 @@
*/

import Vue from 'vue'
import SettingsPreferences from './SettingsPreferences'
import Preference from './Preference'
import SettingsPreferences from './SettingsPreferences.vue'
import Preference from './Preference.vue'

Vue.component('settings-preferences', SettingsPreferences)
Vue.component('Preference', Preference)

+ 3
- 1
src/components/UI/AppExternalLink.vue View File

@@ -1,5 +1,7 @@
<template>
<a href="#" class="c-app-external-link" @click.prevent="openExternal">
<a href="#"
class="c-app-external-link"
@click.prevent="openExternal">
<slot />
</a>
</template>

+ 4
- 2
src/components/UI/AppNews.vue View File

@@ -8,7 +8,9 @@
data-theme="dark"
data-link-color="#D67411"
:href="`${twitterUrl}?ref_src=twsrc%5Etfw`">Tweets by DreamNetTechno</a>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8" />
<script async
src="https://platform.twitter.com/widgets.js"
charset="utf-8" />
</div>
</template>

@@ -26,7 +28,7 @@ export default {

<style lang="scss" scoped>
.c-news {
width: 100%;
max-width: 1200px;
width: 100%;
}
</style>

+ 4
- 2
src/components/UI/AppPhoto.vue View File

@@ -1,8 +1,10 @@
<template>
<figure class="photo" :class="{'photo--hover': hover}">
<figure class="photo"
:class="{'photo--hover': hover}">
<img :src="src">

<p v-if="$slots.default" class="photo__label">
<p v-if="$slots.default"
class="photo__label">
<slot />
</p>
</figure>

+ 22
- 10
src/components/UI/BoxItem.vue View File

@@ -1,24 +1,36 @@
<template>
<div v-if="isVisible" class="box__item" :class="cssClass" @click="click">
<div v-if="isVisible"
class="box__item"
:class="cssClass"
@click="click">
<!-- Icon -->
<slot name="icon">
<div v-if="icon" class="item__icon">
<img v-if="isImageIcon" :src="icon">
<font-awesome-icon v-else :icon="icon" />
<div v-if="icon"
class="item__icon">
<img v-if="isImageIcon"
:src="icon">
<font-awesome-icon v-else
:icon="icon" />
</div>
</slot>

<!-- Label & Description -->
<div v-if="label" class="item__content">
<span class="item__label" v-html="label" />
<div v-if="label"
class="item__content">
<span class="item__label"
v-html="label" />

<slot name="description">
<span v-if="description" class="item__description" v-html="description" />
<span v-if="description"
class="item__description"
v-html="description" />
</slot>
</div>

<!-- Actions -->
<div v-if="$slots.default" class="item__action" :class="{ 'item__action--full': !hasIcon && !label }">
<div v-if="$slots.default"
class="item__action"
:class="{ 'item__action--full': !hasIcon && !label }">
<slot />
</div>
</div>
@@ -140,7 +152,7 @@ export default {
.box__item {
@apply flex px-4 py-2;
min-height: 50px;
transition: all .2s ease-in-out;
transition: all 0.2s ease-in-out;

&.box__item--sub {
@apply pl-8;
@@ -164,8 +176,8 @@ export default {

.item__icon {
@apply mr-4 flex items-center justify-center text-2xl;
width: 42px;
min-width: 42px;
width: 42px;
}

.item__content {

+ 29
- 12
src/components/UI/ProjectUpdate.vue View File

@@ -9,51 +9,68 @@
</div>

<!-- Downloading -->
<div v-else-if="isDownloading" class="update__status">
<div v-else-if="isDownloading"
class="update__status">
Downloading ~ <strong>{{ updater.update.progress | progress }}</strong> ~ {{ updater.update.written | size }}/{{ updater.update.total | size }} MB.
</div>

<!-- Installing -->
<div v-else-if="isInstalling" class="update__status">
<div v-else-if="isInstalling"
class="update__status">
Installing...
</div>

<!-- Download Progress -->
<div v-show="isDownloading" class="update__progressbar">
<progress min="0" max="100" :value="updater.update.progress" />
<div v-show="isDownloading"
class="update__progressbar">
<progress min="0"
max="100"
:value="updater.update.progress" />
</div>

<!-- Actions -->
<div class="update__actions">
<button v-show="!updater.update.active" class="button button--success" @click.prevent="updater.start()">
<button v-show="!updater.update.active"
class="button button--success"
@click.prevent="updater.start()">
Start
</button>

<button v-show="updater.update.active" class="button button--danger" @click.prevent="updater.cancel()">
<button v-show="updater.update.active"
class="button button--danger"
@click.prevent="updater.cancel()">
Cancel
</button>

<button v-tooltip="'Show a list of links to download the update manually.'" class="button button--info" @click.prevent="$refs.mirrorsDialog.show()">
<button v-tooltip="'Show a list of links to download the update manually.'"
class="button button--info"
@click.prevent="$refs.mirrorsDialog.show()">
Mirrors
</button>
</div>

<!-- Hint -->
<div class="update__hint">
<p><a href="https://time.dreamnet.tech/docs/guide/updater" target="_blank">More information and troubleshooting</a>.</p>
<p>
<a href="https://time.dreamnet.tech/docs/guide/updater"
target="_blank">More information and troubleshooting</a>.
</p>
</div>

<!-- Mirrors Dialog -->
<dialog ref="mirrorsDialog">
<div class="dialog__content">
<ul class="mirrors">
<li v-for="(item, index) in updater.downloadUrls" :key="index">
<a :href="item" target="_blank">{{ item | domain }}</a>
<li v-for="(item, index) in updater.downloadUrls"
:key="index">
<a :href="item"
target="_blank">{{ item | domain }}</a>
</li>
</ul>

<div class="dialog__buttons">
<button class="button button--danger" @click.prevent="$refs.mirrorsDialog.close()">
<button class="button button--danger"
@click.prevent="$refs.mirrorsDialog.close()">
Close
</button>
</div>
@@ -134,8 +151,8 @@ export default {

progress {
@apply w-full border-0 bg-dark-600;
height: 18px;
border-radius: 9px;
height: 18px;

&::-webkit-progress-bar {
@apply bg-dark-500;

+ 1
- 1
src/electron/src/index.js View File

@@ -334,7 +334,7 @@ app.on('ready', async () => {
try {
await DreamApp.start()
} catch (error) {
throw new AppError(error, { title: `Failed to start correctly.`, level: 'error' })
throw new AppError(error, { title: 'Failed to start correctly.', level: 'error' })
}
})


+ 1
- 1
src/electron/src/modules/app-error.js View File

@@ -111,7 +111,7 @@ export class AppError extends Error {
exception = new Error(error)
}

appError = new AppError(`The application has encountered an unexpected error.`, {
appError = new AppError('The application has encountered an unexpected error.', {
error: exception,
title: 'Unexpected error!',
level: 'error',

+ 3
- 3
src/electron/src/modules/services/base.js View File

@@ -14,8 +14,8 @@ import { existsSync, readJsonSync, writeJsonSync } from 'fs-extra'

const logger = require('@dreamnet/logplease').create('services')

export function makeServiceProxy(obj) {
return new Proxy(obj, {
export function makeServiceProxy(item) {
return new Proxy(item, {
get: (obj, prop) => {
if (prop in obj) {
return obj[prop]
@@ -92,7 +92,7 @@ export class BaseService {
static make(obj) {
if (!obj) {
// eslint-disable-next-line no-param-reassign
obj = new this
obj = new this()
}

return makeServiceProxy(obj)

+ 5
- 2
src/electron/src/modules/settings.js View File

@@ -248,7 +248,10 @@ class Settings {
try {
fs.outputFileSync(this.path, JSON.stringify(this._default, null, 2))
} catch (error) {
throw new AppError(`Could not create settings file. Please make sure the program has the necessary permissions to write to:\n${this.path}`, { fatal: true, error })
throw new AppError(
`Could not create settings file. Please make sure the program has the necessary permissions to write to:\n${this.path}`,
{ fatal: true, error },
)
}
}

@@ -402,7 +405,7 @@ class Settings {
}
}

export const theSettings = new Settings
export const theSettings = new Settings()

const saveHandler = {
get(target, property, receiver) {

+ 1
- 1
src/electron/src/modules/tools/fs.js View File

@@ -117,7 +117,7 @@ export function extractSeven(path, destinationPath) {
*/
export function download(url, options = {}) {
const EventBus = require('js-event-bus')
const bus = new EventBus
const bus = new EventBus()

// eslint-disable-next-line no-param-reassign
options = {

+ 1
- 1
src/electron/src/modules/tools/power.js View File

@@ -154,7 +154,7 @@ export const transform = (run) => {
args.push('--hsize', preferences.body.pubicHair.size)
}

const events = (new EventBus)
const events = (new EventBus())

setTimeout(() => {
// Give time for the renderer to receive the events object.

+ 6
- 6
src/electron/src/modules/tools/system.js View File

@@ -82,7 +82,7 @@ class System {
this.memory = memory
this.online = online

logger.info(`GPU:`, this.graphics)
logger.info('GPU:', this.graphics)
logger.info(`RAM: ${memory.total} bytes.`)
logger.info(`Online: ${online}`)
}
@@ -110,10 +110,10 @@ class System {
settings: settings.payload,
}

logger.info(`Current load:`, load)
logger.info(`CPU Speed:`, cpuSpeed)
logger.info(`CPU Temperature:`, cpuTemperature)
logger.info(`Memory:`, memory)
logger.info('Current load:', load)
logger.info('CPU Speed:', cpuSpeed)
logger.info('CPU Temperature:', cpuTemperature)
logger.info('Memory:', memory)

return this.snapshot
}
@@ -130,4 +130,4 @@ class System {
}
}

export const system = new System
export const system = new System()

+ 4
- 3
src/layouts/default.backup.vue View File

@@ -19,7 +19,8 @@
<QueueBar />

<!-- Content -->
<div id="layout-content" class="layout__content">
<div id="layout-content"
class="layout__content">
<nuxt />
</div>

@@ -45,12 +46,12 @@ export default {
@apply h-full;

display: grid;
grid-template-areas: 'topbar topbar topbar' 'navbar navbar navbar' 'content content queuebar';
grid-template-columns: 250px 1fr 250px;
grid-template-rows: 30px 50px 1fr;
grid-template-areas: "topbar topbar topbar" "navbar navbar navbar" "content content queuebar";

&.layout--left-queue {
grid-template-areas: "topbar topbar topbar" "navbar navbar navbar" "queuebar content content";
grid-template-areas: 'topbar topbar topbar' 'navbar navbar navbar' 'queuebar content content';

.layout__jobbar {
@apply border-l-0 border-r;

+ 8
- 2
src/layouts/default.vue View File

@@ -1,5 +1,6 @@
<template>
<div
ref="layout"
class="layout"
:class="{
'layout--dragging': isDragging,
@@ -35,12 +36,17 @@
</template>

<script>
import { wrapGrid } from 'animate-css-grid'
import { UploadMixin } from '~/mixins'

export default {
middleware: ['wizard'],

mixins: [UploadMixin],

mounted() {
wrapGrid(this.$refs.layout)
},
}
</script>

@@ -49,9 +55,9 @@ export default {
@apply h-full;

display: grid;
grid-template-areas: 'title title title' 'nav nav nav' 'menu content queue';
grid-template-columns: 250px 1fr 250px;
grid-template-rows: 30px 50px 1fr;
grid-template-areas: "title title title" "nav nav nav" "menu content queue";

&.layout--dragging {
.layout__dropzone {
@@ -74,8 +80,8 @@ export default {
.layout__content {
@apply relative overflow-hidden overflow-y-auto;
@apply py-6 px-9;
height: calc(100vh - 80px);
grid-area: content;
height: calc(100vh - 80px);
}

.layout__dropzone {

+ 3
- 2
src/layouts/wizard.vue View File

@@ -4,7 +4,8 @@
<LayoutTopbar />

<!-- Content -->
<div id="layout-content" class="layout__content">
<div id="layout-content"
class="layout__content">
<div class="container">
<nuxt />
</div>
@@ -23,9 +24,9 @@ export default {
@apply h-full;

display: grid;
grid-template-areas: 'topbar' 'content';
grid-template-columns: 100%;
grid-template-rows: 30px 1fr;
grid-template-areas: "topbar" "content";

.layout__topbar {
grid-area: topbar;

+ 1
- 1
src/modules/consola/index.js View File

@@ -11,7 +11,7 @@ import { Consola } from './consola'

export { Consola }

export const consola = (new Consola)
export const consola = new Consola()

export {
HandledError, LogEvent, Warning, Exception,

+ 2
- 3
src/modules/consola/log.js View File

@@ -8,12 +8,11 @@
// Written by Ivan Bravo Bravo <ivan@dreamnet.tech>, 2019.

import {
isNil, isError, isString, toString, isBoolean,
isNil, isError, isString, toString, isBoolean, isPlainObject,
} from 'lodash'
import he from 'he'
import Swal from 'sweetalert2/dist/sweetalert2.js'
import Swal from 'sweetalert2/dist/sweetalert2'
import Logger from '@dreamnet/logplease'
import isPlainObject from 'lodash/isPlainObject'
import { mapStackTrace } from 'sourcemapped-stacktrace'
import { HandledError } from './errors'


+ 1
- 1
src/modules/events.js View File

@@ -9,4 +9,4 @@

import EventBus from 'js-event-bus'

export const events = new EventBus
export const events = new EventBus()

+ 8
- 2
src/modules/file.js View File

@@ -200,7 +200,10 @@ export class File {
*/
save(defaultPath) {
if (!fs.existsSync(this.path)) {
throw new Warning('The photo no longer exists.', 'Could not save the photo because it has been deleted, this could be caused due to cleaning or antivirus programs.')
throw new Warning(
'The photo no longer exists.',
'Could not save the photo because it has been deleted, this could be caused due to cleaning or antivirus programs.',
)
}

const savePath = dialog.showSaveDialogSync({
@@ -223,7 +226,10 @@ export class File {

openItem() {
if (!fs.existsSync(this.path)) {
throw new Warning('The photo no longer exists.', 'Could not open the photo because it has been deleted, this could be caused due to cleaning or antivirus programs.')
throw new Warning(
'The photo no longer exists.',
'Could not open the photo because it has been deleted, this could be caused due to cleaning or antivirus programs.',
)
}

shell.openItem(this.path)

+ 6
- 2
src/modules/nudify/nudify.js View File

@@ -14,7 +14,7 @@ import {
} from 'lodash'
import { basename } from 'path'
import delay from 'delay'
import Swal from 'sweetalert2/dist/sweetalert2.js'
import Swal from 'sweetalert2/dist/sweetalert2'
import { watch } from 'melanke-watchjs'
import { NudifyQueue } from './queue'
import { events } from '../events'
@@ -204,7 +204,11 @@ export const Nudify = {

this.add(file)
} catch (error) {
throw new Warning('Upload failed.', 'Unable to download the photo, please verify that the address is correct and that you are connected to the Internet.', error)
throw new Warning(
'Upload failed.',
'Unable to download the photo, please verify that the address is correct and that you are connected to the Internet.',
error,
)
}
},


+ 11
- 5
src/modules/nudify/photo-run.js View File

@@ -13,12 +13,12 @@ import {
trim, kebabCase, truncate, deburr,
} from 'lodash'
import deferred from 'deferred'
import Swal from 'sweetalert2/dist/sweetalert2.js'
import Swal from 'sweetalert2/dist/sweetalert2'
import emojiStrip from 'emoji-strip'
import { File } from '../file'
import { Timer } from '../timer'
import cliErrors from '../config/cli-errors'
import preferencesConfig from '../config/preferences'
import cliErrors from '../config/cli-errors.json'
import preferencesConfig from '../config/preferences.json'
import { settings, achievements } from '../system'

const { getCurrentWindow } = require('electron').remote
@@ -70,7 +70,7 @@ export class PhotoRun {
/**
* @type {Timer}
*/
timer = new Timer
timer = new Timer()

/**
* @type {Object}
@@ -251,7 +251,13 @@ export class PhotoRun {

this.process.on('fail', (fileError) => {
if (fileError) {
def.reject(new Warning('Nudification failed!', 'The photo has been transformed but could not be saved. Please make sure you have enough disk space and that DreamTime can write to it.', fileError))
def.reject(
new Warning(
'Nudification failed!',
'The photo has been transformed but could not be saved. Please make sure you have enough disk space and that DreamTime can write to it.',
fileError,
),
)
} else {
def.reject(this.getPowerError())
}

+ 6
- 5
src/modules/nudify/photo.js View File

@@ -52,7 +52,7 @@ export class Photo {
/**
* @type {EventBus}
*/
events = new EventBus
events = new EventBus()

/**
* @type {string}
@@ -91,7 +91,7 @@ export class Photo {
/**
* @type {Timer}
*/
timer = new Timer
timer = new Timer()

/**
* @type {boolean}
@@ -250,7 +250,7 @@ export class Photo {
})

await this.fileEditor.writeDataURL(dataURL)
this.consola.debug(`Saved editor changes.`)
this.consola.debug('Saved editor changes.')
}

/**
@@ -280,7 +280,7 @@ export class Photo {
const dataURL = canvas.toDataURL(this.fileCrop.mimetype, 1)
await this.fileCrop.writeDataURL(dataURL)

this.consola.debug(`Saved crop changes.`)
this.consola.debug('Saved crop changes.')
}

/**
@@ -306,6 +306,7 @@ export class Photo {
*
*/
validate() {
// eslint-disable-next-line no-shadow
const { exists, mimetype, path } = this.file

if (!exists) {
@@ -619,7 +620,7 @@ export class Photo {
return
}

const notification = new Notification(`๐Ÿ’– Dream fulfilled!`, {
const notification = new Notification('๐Ÿ’– Dream fulfilled!', {
icon: this.file.path,
body: 'All runs have finished.',
})

+ 1
- 1
src/modules/services/base.js View File

@@ -36,7 +36,7 @@ export class BaseService {
* @return {BaseService}
*/
static make() {
return new Proxy(new this, {
return new Proxy(new this(), {
get: (obj, prop) => {
if (prop in obj) {
return obj[prop]

+ 1
- 1
src/modules/system/achievements.js View File

@@ -8,7 +8,7 @@
// Written by Ivan Bravo Bravo <ivan@dreamnet.tech>, 2019.

import { random } from 'lodash'
import Swal from 'sweetalert2/dist/sweetalert2.js'
import Swal from 'sweetalert2/dist/sweetalert2'
import { events } from '../events'
import { settings } from './settings'


+ 2
- 0
src/modules/tutorial.js View File

@@ -1,3 +1,5 @@
/* eslint-disable max-len */

// DreamTime.
// Copyright (C) DreamNet. All rights reserved.
//

+ 3
- 2
src/modules/updater/base.js View File

@@ -231,7 +231,8 @@ export class BaseUpdater {
dialog.showMessageBoxSync({
type: 'error',
title: 'Connect to Internet.',
message: 'There was a problem getting the latest version of the components needed to use DreamTime. Please make sure you are connected to the Internet just for this time and try again.',
message: `There was a problem getting the latest version of the components needed to use DreamTime.
Please make sure you are connected to the Internet just for this time and try again.`,
})

// Close.
@@ -281,7 +282,7 @@ export class BaseUpdater {
if (this.latest.assets.length === 1) {
[asset] = this.latest.assets
} else {
asset = find(this.latest.assets, (asset) => asset.name.includes(this.platform))
asset = find(this.latest.assets, (item) => item.name.includes(this.platform))
}

if (!isNil(asset)) {

+ 1
- 1
src/modules/updater/checkpoints.js View File

@@ -88,4 +88,4 @@ class CheckpointsUpdater extends BaseUpdater {
}
}

export const checkpoints = (new CheckpointsUpdater)
export const checkpoints = (new CheckpointsUpdater())

+ 1
- 1
src/modules/updater/dreampower.js View File

@@ -139,4 +139,4 @@ class DreamPowerUpdater extends BaseUpdater {
}
}

export const dreampower = (new DreamPowerUpdater)
export const dreampower = (new DreamPowerUpdater())

+ 1
- 1
src/modules/updater/dreamtime.js View File

@@ -71,4 +71,4 @@ class DreamTimeUpdater extends BaseUpdater {
}
}

export const dreamtime = new DreamTimeUpdater
export const dreamtime = new DreamTimeUpdater()

+ 2
- 0
src/nuxt.config.js View File

@@ -1,3 +1,5 @@
/* eslint-disable max-len */

const dev = process.env.NODE_ENV === 'development'
const analyze = false
const uglify = !dev

+ 1
- 0
src/package.json View File

@@ -65,6 +65,7 @@
"@fortawesome/free-solid-svg-icons": "^5.12.1",
"@fortawesome/vue-fontawesome": "^0.1.9",
"@sweetalert2/theme-dark": "^3.1.0",
"animate-css-grid": "^1.4.3",
"axios": "^0.19.2",
"combokeys": "^3.0.1",
"compare-versions": "^3.6.0",

+ 1
- 1
src/pages/about.vue View File

@@ -352,7 +352,7 @@ export default {
@apply font-bold;

background: linear-gradient(transparent, transparent),
linear-gradient(top, rgba(213, 173, 109, 1) 0%, rgba(213,
linear-gradient(to bottom, rgba(213, 173, 109, 1) 0%, rgba(213,
173,
109,
1)

+ 32
- 12
src/pages/alerts.vue View File

@@ -2,51 +2,71 @@
<div class="alerts content__body">
<div class="wrapper">
<!-- Models Folder -->
<div v-if="!requirements.folders.models" class="notification notification--danger">
<div v-if="!requirements.folders.models"
class="notification notification--danger">
<span class="icon"><font-awesome-icon icon="exclamation-triangle" /></span>
<span v-if="!$dream.isPortable">The <strong>Models</strong> folder has <strong>invalid characters</strong>. Please change the location of the folder in the <nuxt-link to="/settings/folders">settings</nuxt-link>.</span>
<span v-else>The place where you have extracted {{ $dream.name }} has <strong>invalid characters</strong>. Please move the application to another place.</span>
<span v-if="!$dream.isPortable">
The <strong>Models</strong> folder has <strong>invalid characters</strong>.
Please change the location of the folder in the <nuxt-link to="/settings/folders">settings</nuxt-link>.
</span>
<span v-else>
The place where you have extracted {{ $dream.name }} has <strong>invalid characters</strong>.
Please move the application to another place.
</span>
</div>
<div v-else class="notification notification--success">

<div v-else
class="notification notification--success">
<span class="icon"><font-awesome-icon icon="check-circle" /></span>
<span>The <strong>Models</strong> folder is valid. There should be no problems saving the nudified photos.</span>
</div>

<!-- GPU -->
<div v-if="$settings.processing.device === 'GPU'">
<div v-if="!requirements.recommended.vram" class="notification notification--danger">
<div v-if="!requirements.recommended.vram"
class="notification notification--danger">
<span class="icon"><font-awesome-icon icon="exclamation-triangle" /></span>
<span>Your NVIDIA GPU has less than <strong>4 GB</strong> of VRAM.</span>
</div>
<div v-else class="notification notification--success">
<div v-else
class="notification notification--success">
<span class="icon"><font-awesome-icon icon="check-circle" /></span>
<span>Your NVIDIA GPU meets the minimum amount of VRAM.</span>
</div>
</div>

<!-- RAM -->
<div v-if="!requirements.recommended.ram" class="notification notification--warning">
<div v-if="!requirements.recommended.ram"
class="notification notification--warning">
<span class="icon"><font-awesome-icon icon="exclamation-triangle" /></span>
<span>Your system has less than <strong>8 GB</strong> of RAM. Please buy more RAM!</span>
</div>
<div v-else class="notification notification--success">
<div v-else
class="notification notification--success">
<span class="icon"><font-awesome-icon icon="check-circle" /></span>
<span>Your system meets the minimum amount of RAM.</span>
</div>

<!-- Windows Media Feature Pack -->
<div v-if="is.windows">
<div v-if="!requirements.windows.media" class="notification notification--warning">
<div v-if="!requirements.windows.media"
class="notification notification--warning">
<span class="icon"><font-awesome-icon icon="exclamation-triangle" /></span>
<span>The <strong>Windows Media Feature Pack</strong> is not installed. You can <a href="https://www.microsoft.com/en-us/software-download/mediafeaturepack" target="_blank">install it</a> or ignore this warning.</span>
<span>
The <strong>Windows Media Feature Pack</strong> is not installed.
You can <a href="https://www.microsoft.com/en-us/software-download/mediafeaturepack"
target="_blank">install it</a> or ignore this warning.
</span>
</div>
<div v-else class="notification notification--success">
<div v-else
class="notification notification--success">
<span class="icon"><font-awesome-icon icon="check-circle" /></span>
<span>The Windows Media Feature Pack is installed.</span>
</div>
</div>

<div v-if="hasAlerts" class="legend">
<div v-if="hasAlerts"
class="legend">
<p>
<strong class="text-warning-400"><font-awesome-icon icon="exclamation-triangle" /></strong> = It could cause problems.
</p>

+ 6
- 6
src/pages/index.vue View File

@@ -72,7 +72,7 @@

<h3 class="subtitle">
Upload photos using their direct web address.
<span v-tooltip="'Make sure the web address ends in a valid format (jpg, png, gif). Photos from Google and other services may not work because they are not direct and/or valid format.'"
<span v-tooltip="'Make sure the web address ends in a valid format (jpg, png, gif).'"
class="help">
<font-awesome-icon icon="info-circle" />
</span>
@@ -274,7 +274,11 @@ export default {
try {
post = await instagram.getPost(this.instagramPhoto)
} catch (error) {
throw new Warning('Upload failed.', 'Unable to download the photo, please verify that the address is correct and that you are connected to the Internet.', error)
throw new Warning(
'Upload failed.',
'Unable to download the photo, please verify that the address is correct and that you are connected to the Internet.',
error,
)
}

if (post.isVideo) {
@@ -300,10 +304,6 @@ export default {
@apply flex-1;
}

.methods__content {

}

.method__header {
@apply mb-9;


+ 5
- 2
src/pages/models/add.vue View File

@@ -12,7 +12,8 @@

<div class="content-body">
<div class="buttons">
<nuxt-link to="/models" class="button is-danger">
<nuxt-link to="/models"
class="button is-danger">
Cancel
</nuxt-link>
</div>
@@ -20,7 +21,9 @@
<div class="fields">
<div class="field">
<label class="label">Name:</label>
<input v-model="name" class="input" required>
<input v-model="name"
class="input"
required>
</div>
</div>
</div>

+ 2
- 1
src/pages/models/index.vue View File

@@ -12,7 +12,8 @@

<div class="content-body">
<div class="buttons">
<nuxt-link to="/models/add" class="button">
<nuxt-link to="/models/add"
class="button">
Create
</nuxt-link>
</div>

+ 16
- 7
src/pages/nudify/_id.vue View File

@@ -1,14 +1,18 @@
<template>
<div v-if="photo" class="nudify content__body">
<div v-if="photo"
class="nudify content__body">
<div class="nudify__menu">
<div class="menu__container">
<!-- Original Preview -->
<div class="mb-6 flex justify-center">
<app-photo :src="photo.file.path" :hover="false" data-private />
<app-photo :src="photo.file.path"
:hover="false"
data-private />
</div>

<!-- Navigation -->
<div id="nudify-navigation" class="box box--items">
<div id="nudify-navigation"
class="box box--items">
<div class="box__content">
<box-item
label="Preferences"
@@ -23,7 +27,9 @@
</div>

<!-- Tools -->
<div v-if="photo.canModify" id="nudify-tools" class="box box--items">
<div v-if="photo.canModify"
id="nudify-tools"
class="box box--items">
<div class="box__content">
<box-item
label="Editor"
@@ -90,7 +96,10 @@

<button
id="nudify-forget"
v-tooltip="{content: 'Free memory by removing the photo from the application. (Nudified photos will not be deleted)', placement: 'right', boundary: 'viewport'}"
v-tooltip="{
content: 'Free memory by removing the photo from the application. (Nudified photos will not be deleted)',
placement: 'right',
boundary: 'viewport'}"
class="button button--danger"
@click.prevent="forget">
<span class="icon"><font-awesome-icon icon="trash-alt" /></span>
@@ -171,7 +180,7 @@ export default {
},

forget() {
this.$router.push(`/`)
this.$router.push('/')
this.photo.forget()
},
},
@@ -188,7 +197,7 @@ export default {
@apply mr-4 pr-6 h-full overflow-y-auto;
width: 250px;

.button {
.button {
@apply block w-full mb-6;
}
}

+ 6
- 3
src/pages/nudify/_id/crop.vue View File

@@ -1,7 +1,8 @@
<template>
<div class="nudify-cropper">
<div class="cropper__crop">
<canvas ref="cropCanvas" data-private />
<canvas ref="cropCanvas"
data-private />
</div>

<div class="cropper__help">
@@ -14,7 +15,8 @@
<span>Reload</span>
</button>

<section id="cropper-about" class="box">
<section id="cropper-about"
class="box">
<div class="box__header">
<h2 class="title">
<font-awesome-icon icon="crop" /> Manual crop.
@@ -28,7 +30,8 @@
</div>
</section>

<section id="cropper-help" class="box">
<section id="cropper-help"
class="box">
<div class="box__header">
<h2 class="title">
<font-awesome-icon icon="mouse-pointer" /> Commands

+ 5
- 2
src/pages/nudify/_id/editor.vue View File

@@ -1,11 +1,14 @@
<template>
<div class="nudify-editor">
<div v-if="photo.scaleMode === 'cropjs' || photo.scaleMode === 'overlay'" class="notification notification--warning">
<div v-if="photo.scaleMode === 'cropjs' || photo.scaleMode === 'overlay'"
class="notification notification--warning">
<span class="icon"><font-awesome-icon icon="exclamation-triangle" /></span>
<span>The changes will not be reflected in the nudification until you click on the <strong>Reload</strong> button of the Crop/Overlay tool.</span>
</div>

<div ref="imageEditor" class="editor" data-private />
<div ref="imageEditor"
class="editor"
data-private />
</div>
</template>


+ 4
- 1
src/pages/nudify/_id/preferences.vue View File

@@ -2,7 +2,10 @@
<div class="nudify-preferences wrapper">
<div class="notification">
<span class="icon"><font-awesome-icon icon="info-circle" /></span>
<span>These preferences will only apply to the current photo. To change global preferences visit the <nuxt-link to="/settings/preferences">settings</nuxt-link>.</span>
<span>
These preferences will only apply to the current photo.
To change global preferences visit the <nuxt-link to="/settings/preferences">settings</nuxt-link>.
</span>
</div>

<settings-preferences v-model="photo.preferences" />

+ 27
- 10
src/pages/nudify/_id/results.vue View File

@@ -1,16 +1,24 @@
<template>
<!-- Results -->
<div v-if="photo.started" class="results">
<div v-if="photo.started"
class="results">
<!-- Tool alert -->
<div v-if="photo.isScaleModeCorrected" class="notification notification--warning">
<div v-if="photo.isScaleModeCorrected"
class="notification notification--warning">
<span class="icon"><font-awesome-icon icon="exclamation-triangle" /></span>
<span>The scale method is set to <strong>Crop/Overlay</strong> but the tool has not been used. The photos will be nudified with <strong>Fixed</strong> instead.</span>
<span>
The scale method is set to <strong>Crop/Overlay</strong> but the tool has not been used.
The photos will be nudified with <strong>Fixed</strong> instead.
</span>
</div>

<!-- Quick settings -->
<div class="box box--items box--items--horizontal">
<div class="box__content">
<box-item v-tooltip="{placement: 'bottom', content: 'Scale method. Indicates how the photo will be scaled, this changes the quality of the result dramatically.'}">
<box-item v-tooltip="{
placement: 'bottom',
content: 'Scale method. Indicates how the photo will be scaled, this changes the quality of the result dramatically.'
}">
<select
v-model="photo.preferences.advanced.scaleMode"
:disabled="photo.running"
@@ -36,7 +44,10 @@
</select>
</box-item>

<box-item v-tooltip="{placement: 'bottom', content: 'Color transfer. Use a experimental algorithm to try to recover the original colors of the photo.'}">
<box-item v-tooltip="{
placement: 'bottom',
content: 'Color transfer. Use a experimental algorithm to try to recover the original colors of the photo.'
}">
<select
v-model="photo.preferences.advanced.useColorTransfer"
:disabled="photo.running"
@@ -54,14 +65,18 @@

<!-- Runs -->
<div class="runs">
<nudify-photo-run v-for="(run, index) in photo.runs" :key="index" :run="run" />
<nudify-photo-run v-for="(run, index) in photo.runs"
:key="index"
:run="run" />
</div>
</div>

<!-- Waiting -->
<div v-else-if="photo.waiting" class="results">
<div v-else-if="photo.waiting"
class="results">
<div class="results__status">
<font-awesome-icon icon="cloud-sun-rain" class="icon" />
<font-awesome-icon icon="cloud-sun-rain"
class="icon" />

<h2>
Waiting for other dreams to end...
@@ -70,9 +85,11 @@
</div>

<!-- Pending -->
<div v-else class="results">
<div v-else
class="results">
<div class="results__status">
<font-awesome-icon icon="cloud-moon" class="icon" />
<font-awesome-icon icon="cloud-moon"
class="icon" />

<h2>
Add me to the queue to dream together.

+ 8
- 5
src/pages/settings/folders.vue View File

@@ -1,11 +1,14 @@
<template>
<div class="settings-folders" scoped>
<div v-if="$dream.isPortable" class="notification">
<div class="settings-folders"
scoped>
<div v-if="$dream.isPortable"
class="notification">
<span class="icon"><font-awesome-icon icon="exclamation-triangle" /></span>
<span>To maximize portability these options cannot be changed in the portable version.</span>
</div>

<div v-else class="notification">
<div v-else
class="notification">
<span class="icon"><font-awesome-icon icon="info-circle" /></span>
<span>Changing this options needs a restart to take effect.</span>
</div>
@@ -97,7 +100,7 @@
</template>

<script>
import _ from 'lodash'
import { isNil } from 'lodash'
import { VModel } from '~/mixins'

const { paths } = $provider
@@ -118,7 +121,7 @@ export default {
properties: ['openDirectory'],
})

if (_.isNil(dir)) {
if (isNil(dir)) {
return path
}


+ 4
- 2
src/pages/settings/telemetry.vue View File

@@ -5,7 +5,8 @@
<box-item
label="Bug report."
description="Allow to report errors automatically.">
<select v-model="currentValue.telemetry.bugs" class="input">
<select v-model="currentValue.telemetry.bugs"
class="input">
<option :value="true">
Enabled
</option>
@@ -18,7 +19,8 @@
<box-item
label="Session tracking."
description="Allow to send detailed information about how you use the application. (No sensitive information or photos will be sent)">
<select v-model="currentValue.telemetry.dom" class="input">
<select v-model="currentValue.telemetry.dom"
class="input">
<option :value="true">
Enabled
</option>

+ 11
- 3
src/pages/wizard/checkpoints.vue View File

@@ -16,8 +16,15 @@
</div>

<div class="project__description">
<p>Now you need the data models required by the algorithm to carry out the nudification process. It is a mandatory component to use {{ $dream.name }}.</p>
<p>Click "Start" to start the automatic download and installation. Approximately <strong>2 GB</strong> will be downloaded.</p>
<p>
Now you need the data models required by the algorithm to carry out the nudification process.
It is a mandatory component to use {{ $dream.name }}.
</p>

<p>
Click "Start" to start the automatic download and installation.
Approximately <strong>2 GB</strong> will be downloaded.
</p>
</div>
</div>

@@ -35,7 +42,8 @@
</div>

<div class="project__settings text-center">
<button class="button" @click="$dream.openPowerFolder()">
<button class="button"
@click="$dream.openPowerFolder()">
<span class="icon"><font-awesome-icon icon="folder-open" /></span>
<span>DreamPower</span>
</button>

+ 27
- 8
src/pages/wizard/power.vue View File

@@ -16,14 +16,22 @@
</div>

<div class="project__description">
<p>{{ power.title }} is the artificial intelligence algorithm necessary to nudify the photos. It is a mandatory component to use {{ $dream.name }}.</p>
<p>Click "Start" to start the automatic download and installation. Approximately <strong>1 GB</strong> will be downloaded. (Depending on your system)</p>
<p>
{{ power.title }} is the artificial intelligence algorithm necessary to nudify the photos.
It is a mandatory component to use {{ $dream.name }}.
</p>

<p>
Click "Start" to start the automatic download and installation.
Approximately <strong>1 GB</strong> will be downloaded. (Depending on your system)