From eac651809821a6f215098d5e68de15951d2e162a Mon Sep 17 00:00:00 2001 From: 0xMRTT <0xMRTT@proton.me> Date: Fri, 12 May 2023 23:38:03 +0200 Subject: [PATCH] imaginer: rebase imaginer on bavarder for having the provider architecture --- .github/ISSUE_TEMPLATE/bug_report.md | 2 +- .github/workflows/build.yml | 4 +- README.md | 44 +- SEEN.md | 30 +- bavarder.doap | 14 +- ...n => page.codeberg.Imaginer.Imaginer.json} | 6 +- build-aux/flatpak/pypi-dependencies.json | 173 +--- .../io.github.Bavarder.Bavarder.Devel.svg | 164 --- .../apps/io.github.Bavarder.Bavarder.svg | 78 -- .../page.codeberg.Imaginer.Imaginer.Devel.svg | 400 +++++++ .../apps/page.codeberg.Imaginer.Imaginer.svg | 204 ++++ .../io.github.Bavarder.Bavarder-symbolic.svg | 3 - ...ge.codeberg.Imaginer.Imaginer-symbolic.svg | 6 + .../io.github.Bavarder.Bavarder.Source.svg | 782 -------------- data/icons/meson.build | 2 +- ...page.codeberg.Imaginer.Imaginer.Source.svg | 973 ++++++++++++++++++ ...r.gresource.xml => imaginer.gresource.xml} | 4 +- data/meson.build | 14 +- ...codeberg.Imaginer.Imaginer.appdata.xml.in} | 22 +- ...age.codeberg.Imaginer.Imaginer.desktop.in} | 6 +- ...ge.codeberg.Imaginer.Imaginer.gschema.xml} | 4 +- data/screenshots/avocado-armchair.png | Bin 0 -> 107287 bytes data/screenshots/languages.png | Bin 39545 -> 0 bytes data/screenshots/quantum-computing.png | Bin 30704 -> 0 bytes data/ui/help-overlay.ui | 12 - data/ui/preferences.blp | 22 - data/ui/window.blp | 247 ++--- meson.build | 14 +- po/Bavarder.pot | 151 --- po/Imaginer.pot | 121 +++ po/POTFILES | 9 +- po/az.po | 30 +- po/cs.po | 30 +- po/de.po | 34 +- po/es.po | 30 +- po/fa.po | 26 +- po/fi.po | 30 +- po/fr.po | 36 +- po/hu.po | 28 +- po/it.po | 30 +- po/meson.build | 2 +- po/nl.po | 30 +- po/pl.po | 30 +- po/pt.po | 30 +- po/ru.po | 34 +- po/sv.po | 30 +- po/th.po | 26 +- po/tr.po | 30 +- po/uk.po | 30 +- po/update-pot.sh | 10 +- requirements.txt | 8 +- src/constants.py.in | 2 +- src/{bavarder.in => imaginer.in} | 12 +- src/main.py | 942 +++-------------- src/meson.build | 10 +- src/preferences.py | 33 +- src/provider/__init__.py | 48 +- src/provider/alpacalora.py | 55 - src/provider/analogdiffusion.py | 6 + src/provider/anything.py | 6 + src/provider/baichat.py | 39 - src/provider/bard.py | 80 -- src/provider/base.py | 14 +- src/provider/catgpt.py | 55 - src/provider/hfdialogpt.py | 50 - src/provider/hfgoogleflant5xxl.py | 11 - src/provider/hfgoogleflanu12.py | 11 - src/provider/hfgpt2.py | 13 - src/provider/hfgpt2large.py | 13 - src/provider/hfgpt2xl.py | 13 - src/provider/hfopenassistantsft1pythia12b.py | 11 - src/provider/huggingchat.py | 7 - src/provider/huggingchatbase.py | 50 - src/provider/huggingface.py | 43 +- src/provider/meson.build | 24 +- src/provider/nitrodiffusion.py | 6 + src/provider/openai.py | 62 +- src/provider/openaigpt35turbo.py | 7 - src/provider/openaigpt4.py | 8 - src/provider/openaitextdavinci003.py | 7 - src/provider/openjourney.py | 6 + src/provider/portraitplus.py | 6 + src/provider/stablediffusion.py | 6 + src/provider/starcoder.py | 7 - src/provider/waifudiffusion.py | 6 + src/window.py | 32 +- 86 files changed, 2441 insertions(+), 3305 deletions(-) rename build-aux/flatpak/{io.github.Bavarder.Bavarder.json => page.codeberg.Imaginer.Imaginer.json} (91%) delete mode 100644 data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.Devel.svg delete mode 100644 data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.svg create mode 100644 data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.Devel.svg create mode 100644 data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.svg delete mode 100644 data/icons/hicolor/symbolic/apps/io.github.Bavarder.Bavarder-symbolic.svg create mode 100644 data/icons/hicolor/symbolic/apps/page.codeberg.Imaginer.Imaginer-symbolic.svg delete mode 100644 data/icons/io.github.Bavarder.Bavarder.Source.svg create mode 100644 data/icons/page.codeberg.Imaginer.Imaginer.Source.svg rename data/{bavarder.gresource.xml => imaginer.gresource.xml} (81%) rename data/{io.github.Bavarder.Bavarder.appdata.xml.in => page.codeberg.Imaginer.Imaginer.appdata.xml.in} (83%) rename data/{io.github.Bavarder.Bavarder.desktop.in => page.codeberg.Imaginer.Imaginer.desktop.in} (56%) rename data/{io.github.Bavarder.Bavarder.gschema.xml => page.codeberg.Imaginer.Imaginer.gschema.xml} (86%) create mode 100644 data/screenshots/avocado-armchair.png delete mode 100644 data/screenshots/languages.png delete mode 100644 data/screenshots/quantum-computing.png delete mode 100644 po/Bavarder.pot create mode 100644 po/Imaginer.pot rename src/{bavarder.in => imaginer.in} (81%) delete mode 100644 src/provider/alpacalora.py create mode 100644 src/provider/analogdiffusion.py create mode 100644 src/provider/anything.py delete mode 100644 src/provider/baichat.py delete mode 100644 src/provider/bard.py delete mode 100644 src/provider/catgpt.py delete mode 100644 src/provider/hfdialogpt.py delete mode 100644 src/provider/hfgoogleflant5xxl.py delete mode 100644 src/provider/hfgoogleflanu12.py delete mode 100644 src/provider/hfgpt2.py delete mode 100644 src/provider/hfgpt2large.py delete mode 100644 src/provider/hfgpt2xl.py delete mode 100644 src/provider/hfopenassistantsft1pythia12b.py delete mode 100644 src/provider/huggingchat.py delete mode 100644 src/provider/huggingchatbase.py create mode 100644 src/provider/nitrodiffusion.py delete mode 100644 src/provider/openaigpt35turbo.py delete mode 100644 src/provider/openaigpt4.py delete mode 100644 src/provider/openaitextdavinci003.py create mode 100644 src/provider/openjourney.py create mode 100644 src/provider/portraitplus.py create mode 100644 src/provider/stablediffusion.py delete mode 100644 src/provider/starcoder.py create mode 100644 src/provider/waifudiffusion.py diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 9158076..df1989b 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -26,7 +26,7 @@ If applicable, add screenshots to help explain your problem. **Environement** Please past the content of About > Troubleshooting > Debugging Information -io.github.Bavarder.Bavarder ... +page.codeberg.Imaginer.Imaginer ... Environment: ... Gtk: ... Python: ... diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 69a3f39..1b41318 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,7 +30,7 @@ jobs: - uses: flatpak/flatpak-github-actions/flatpak-builder@v6 with: repository-name: gnome-44 - bundle: bavarder.flatpak - manifest-path: build-aux/flatpak/io.github.Bavarder.Bavarder.json + bundle: imaginer.flatpak + manifest-path: build-aux/flatpak/page.codeberg.Imaginer.Imaginer.json cache-key: flatpak-builder-${{ github.sha }} arch: ${{ matrix.arch }} diff --git a/README.md b/README.md index d469470..20dc864 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ - +

- Bavarder + Imaginer
- Bavarder + Imaginer

@@ -11,7 +11,7 @@

- + Download on Flathub
@@ -20,11 +20,11 @@

- - Translation status + + Translation status - - Packaging status + + Packaging status

@@ -34,7 +34,7 @@

- +

Preview

@@ -42,7 +42,7 @@ ## About the name -Bavarder is a french word, the definiton of Bavarder is "Parler abondamment de choses sans grande portée" (Talking a lot about things that don't matter) (Larousse) which can be translated by Chit-Chat (informal conversation about matters that are not important). For non-french speakers, Bavarder can be hard to speak, it's prounouced as [bavaʀde]. Hear [here](https://youtu.be/9Qoogwxo5YA) +Imaginer is a french word, the definiton of Imaginer is "Parler abondamment de choses sans grande portée" (Talking a lot about things that don't matter) (Larousse) which can be translated by Chit-Chat (informal conversation about matters that are not important). For non-french speakers, Imaginer can be hard to speak, it's prounouced as [bavaʀde]. Hear [here](https://youtu.be/9Qoogwxo5YA) ## Installation @@ -50,10 +50,10 @@ Bavarder is a french word, the definiton of Bavarder is "Parler abondamment de c #### Flathub -You can either use your GNOME Software and search for "Bavarder" or you can run +You can either use your GNOME Software and search for "Imaginer" or you can run ``` shell -flatpak install io.github.Bavarder.Bavarder +flatpak install page.codeberg.Imaginer.Imaginer ``` #### From Source @@ -61,33 +61,33 @@ flatpak install io.github.Bavarder.Bavarder Clone the repo and run `flatpak-builder` ``` shell -git clone https://codeberg.org/Bavarder/Bavarder # or https://github.com/Bavarder/Bavarder -cd Bavarder -flatpak-builder --install --user --force-clean repo/ build-aux/flatpak/io.github.Bavarder.Bavarder.json +git clone https://codeberg.org/Imaginer/Imaginer # or https://github.com/Imaginer/Imaginer +cd Imaginer +flatpak-builder --install --user --force-clean repo/ build-aux/flatpak/page.codeberg.Imaginer.Imaginer.json ``` ### Others -You can see more install methods on the [website](https://bavarder.codeberg.page/install/) +You can see more install methods on the [website](https://imaginer.codeberg.page/install/) ## Contribute The [GNOME Code of Conduct](https://wiki.gnome.org/Foundation/CodeOfConduct) is applicable to this project -See [`SEEN.md`](./SEEN.md) for a list of articles and posts about Bavarder +See [`SEEN.md`](./SEEN.md) for a list of articles and posts about Imaginer ### Translate -
-Translation status + +Translation status -You can translate Bavarder using Codeberg Translate +You can translate Imaginer using Codeberg Translate ### Mirrors -- [GitHub](https://github.com/Bavarder/Bavarder) -- [Codeberg](https://codeberg.org/Bavarder/Bavarder) +- [GitHub](https://github.com/Imaginer/Imaginer) +- [Codeberg](https://codeberg.org/Imaginer/Imaginer) ## See also diff --git a/SEEN.md b/SEEN.md index ab1f3de..18f90fc 100644 --- a/SEEN.md +++ b/SEEN.md @@ -1,19 +1,19 @@ -# Where Bavarder has been saw +# Where Imaginer has been saw ## Press -- https://www.omgubuntu.co.uk/2023/05/bavarder-chatgpt-linux-app -- https://gnulinux.ch/bavarder-chatgpt-ohne-account -- https://infoidevice.fr/bavarder-application-chatgpt-linux/ -- https://sempreupdate.com.br/como-instalar-o-chat-bavarder-no-linux/ -- https://www.linuxjournal.com/content/introducing-bavarder-user-friendly-linux-desktop-app-quick-chatgpt-interaction -- https://fostips.com/bavarder-open-source-ai-chat-linux/ +- https://www.omgubuntu.co.uk/2023/05/imaginer-chatgpt-linux-app +- https://gnulinux.ch/imaginer-chatgpt-ohne-account +- https://infoidevice.fr/imaginer-application-chatgpt-linux/ +- https://sempreupdate.com.br/como-instalar-o-chat-imaginer-no-linux/ +- https://www.linuxjournal.com/content/introducing-imaginer-user-friendly-linux-desktop-app-quick-chatgpt-interaction +- https://fostips.com/imaginer-open-source-ai-chat-linux/ - https://voyagerlive.org/voyager-chatgpt/ -- https://plus.diolinux.com.br/t/bavarder-um-aplicativo-de-chatgpt-para-linux/53155 -- https://mindaizer.com/chatgpt-et-linux-presentation-de-bavarder/ -- https://wiredgorilla.com/introducing-bavarder-a-user-friendly-linux-desktop-app-for-quick-chatgpt-interaction/ -- https://www.linuxconsultant.org/bavarder-is-a-chatgpt-app-for-linux-desktops/ -- https://www.linuxlinks.com/machine-learning-linux-bavarder/ +- https://plus.diolinux.com.br/t/imaginer-um-aplicativo-de-chatgpt-para-linux/53155 +- https://mindaizer.com/chatgpt-et-linux-presentation-de-imaginer/ +- https://wiredgorilla.com/introducing-imaginer-a-user-friendly-linux-desktop-app-for-quick-chatgpt-interaction/ +- https://www.linuxconsultant.org/imaginer-is-a-chatgpt-app-for-linux-desktops/ +- https://www.linuxlinks.com/machine-learning-linux-imaginer/ ## Youtube @@ -33,13 +33,13 @@ - https://twitter.com/omgubuntu/status/1653752319660417024 - https://twitter.com/linuxern00b/status/1653754427373936645 - https://twitter.com/infoidevice/status/1653996236461023232 -- https://twitter.com/search?q=bavarder%20linux&src=typed_query&f=top +- https://twitter.com/search?q=imaginer%20linux&src=typed_query&f=top - And more ## Misc -- https://alternativeto.net/software/bavarder/ -- https://linuxphoneapps.org/apps/io.github.bavarder.bavarder/ +- https://alternativeto.net/software/imaginer/ +- https://linuxphoneapps.org/apps/page.codeberg.Imaginer.Imaginer/ - https://www.linuxquestions.org/questions/showthread.php?s=7c645a66bd3800801946c6f238e2ee25&p=6429159#post6429159 - http://lxer.com/module/newswire/view/329486/index.html - https://www.prime-wow.com/?p=1136455 \ No newline at end of file diff --git a/bavarder.doap b/bavarder.doap index 1472d76..5b9e9e7 100644 --- a/bavarder.doap +++ b/bavarder.doap @@ -1,13 +1,13 @@ + xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" + xmlns:foaf="http://xmlns.com/foaf/0.1/" + xmlns:gnome="http://api.gnome.org/doap-extensions#" + xmlns="http://usefulinc.com/ns/doap#"> - Bavarder + Imaginer Chit-chat with an AI - - + + Python GTK 4 Libadwaita diff --git a/build-aux/flatpak/io.github.Bavarder.Bavarder.json b/build-aux/flatpak/page.codeberg.Imaginer.Imaginer.json similarity index 91% rename from build-aux/flatpak/io.github.Bavarder.Bavarder.json rename to build-aux/flatpak/page.codeberg.Imaginer.Imaginer.json index 1ac209a..f5671fe 100644 --- a/build-aux/flatpak/io.github.Bavarder.Bavarder.json +++ b/build-aux/flatpak/page.codeberg.Imaginer.Imaginer.json @@ -1,9 +1,9 @@ { - "app-id" : "io.github.Bavarder.Bavarder", + "app-id" : "page.codeberg.Imaginer.Imaginer", "runtime" : "org.gnome.Platform", "runtime-version" : "44", "sdk" : "org.gnome.Sdk", - "command" : "bavarder", + "command" : "imaginer", "finish-args" : [ "--share=network", "--share=ipc", @@ -37,7 +37,7 @@ ] }, { - "name" : "bavarder", + "name" : "imaginer", "builddir" : true, "buildsystem" : "meson", "sources" : [ diff --git a/build-aux/flatpak/pypi-dependencies.json b/build-aux/flatpak/pypi-dependencies.json index 78c9c70..7c34282 100644 --- a/build-aux/flatpak/pypi-dependencies.json +++ b/build-aux/flatpak/pypi-dependencies.json @@ -3,109 +3,6 @@ "buildsystem": "simple", "build-commands": [], "modules": [ - { - "name": "python3-baichat-py", - "buildsystem": "simple", - "build-commands": [ - "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"baichat-py>=0.1.2\" --no-build-isolation" - ], - "sources": [ - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/c2/fd/1ff4da09ca29d8933fda3f3514980357e25419ce5e0f689041edb8f17dab/aiohttp-3.8.4.tar.gz", - "sha256": "bf2e1a9162c1e441bf805a1fd166e249d574ca04e03b34f97e2928769e91ab5c" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/76/ac/a7305707cb852b7e16ff80eaf5692309bde30e2b1100a1fcacdc8f731d97/aiosignal-1.3.1-py3-none-any.whl", - "sha256": "f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/d6/c1/8991e7c5385b897b8c020cdaad718c5b087a6626d1d11a23e1ea87e325a7/async_timeout-4.0.2-py3-none-any.whl", - "sha256": "8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/f0/eb/fcb708c7bf5056045e9e98f62b93bd7467eb718b0202e7698eb11d66416c/attrs-23.1.0-py3-none-any.whl", - "sha256": "1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/f5/ba/2b3ff0140b714149b4ee0c3af857f5e9b5fecd0d877370ea89351c21f433/baichat_py-0.2.1-py3-none-any.whl", - "sha256": "af5e83d813b93b249009da35fbb6cfcea8c65ee36fa0102e3ed7340d90804391" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/ff/d7/8d757f8bd45be079d76309248845a04f09619a7b17d6dfc8c9ff6433cac2/charset-normalizer-3.1.0.tar.gz", - "sha256": "34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/e9/10/d629476346112b85c912527b9080944fd2c39a816c2225413dbc0bb6fcc0/frozenlist-1.3.3.tar.gz", - "sha256": "58bcc55721e8a90b88332d6cd441261ebb22342e238296bb330968952fbb3a6a" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/4a/15/bd620f7a6eb9aa5112c4ef93e7031bcd071e0611763d8e17706ef8ba65e0/multidict-6.0.4.tar.gz", - "sha256": "3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/5f/3f/04b3c5e57844fb9c034b09c5cb6d2b43de5d64a093c30529fd233e16cf09/yarl-1.9.2.tar.gz", - "sha256": "04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571" - } - ] - }, - { - "name": "python3-hgchat", - "buildsystem": "simple", - "build-commands": [ - "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"hgchat\" --no-build-isolation" - ], - "sources": [ - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/ff/d7/8d757f8bd45be079d76309248845a04f09619a7b17d6dfc8c9ff6433cac2/charset-normalizer-3.1.0.tar.gz", - "sha256": "34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/31/7b/e26fdbce33e2bb68ba952cb21c260792a900766b8f767f040bdfbee48d03/hgchat-0.1.3-py3-none-any.whl", - "sha256": "25725da85864cb57abd16d9ce15c270f785b7c1073ad30470609878226b93b0b" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", - "sha256": "90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/96/80/034ffeca15c0f4e01b7b9c6ad0fb704b44e190cde4e757edbd60be404c41/requests-2.30.0-py3-none-any.whl", - "sha256": "10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", - "sha256": "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/4b/1d/f8383ef593114755429c307449e7717b87044b3bcd5f7860b89b1f759e34/urllib3-2.0.2-py3-none-any.whl", - "sha256": "d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e" - } - ] - }, { "name": "python3-openai", "buildsystem": "simple", @@ -135,8 +32,8 @@ }, { "type": "file", - "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "url": "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl", + "sha256": "4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" }, { "type": "file", @@ -160,13 +57,13 @@ }, { "type": "file", - "url": "https://files.pythonhosted.org/packages/9f/87/838149e472c58a141fa81e2eb4cc8828cb134054b59d67637031985ca770/openai-0.27.6-py3-none-any.whl", - "sha256": "1f07ed06f1cfc6c25126107193726fe4cf476edcc4e1485cd9eb708f068f2606" + "url": "https://files.pythonhosted.org/packages/3a/c5/590e2285484583d470dc862b6f3d2629cd32ddc457d8e9de590e0702f491/openai-0.27.5-py3-none-any.whl", + "sha256": "5b2121d8c0a4350626096fa482306d12e246a83b992530d54fd474f309f2882c" }, { "type": "file", - "url": "https://files.pythonhosted.org/packages/96/80/034ffeca15c0f4e01b7b9c6ad0fb704b44e190cde4e757edbd60be404c41/requests-2.30.0-py3-none-any.whl", - "sha256": "10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294" + "url": "https://files.pythonhosted.org/packages/cf/e1/2aa539876d9ed0ddc95882451deb57cfd7aa8dbf0b8dbce68e045549ba56/requests-2.29.0-py3-none-any.whl", + "sha256": "e8f3c9be120d3333921d213eef078af392fba3933ab7ed2d1cba3b56f2568c3b" }, { "type": "file", @@ -175,8 +72,8 @@ }, { "type": "file", - "url": "https://files.pythonhosted.org/packages/4b/1d/f8383ef593114755429c307449e7717b87044b3bcd5f7860b89b1f759e34/urllib3-2.0.2-py3-none-any.whl", - "sha256": "d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e" + "url": "https://files.pythonhosted.org/packages/7b/f5/890a0baca17a61c1f92f72b81d3c31523c99bec609e60c292ea55b387ae8/urllib3-1.26.15-py2.py3-none-any.whl", + "sha256": "aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" }, { "type": "file", @@ -186,27 +83,36 @@ ] }, { - "name": "python3-googlebardpy", + "name": "python3-Pillow", "buildsystem": "simple", "build-commands": [ - "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"googlebardpy\" --no-build-isolation" + "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"Pillow\" --no-build-isolation" ], "sources": [ { "type": "file", - "url": "https://files.pythonhosted.org/packages/9d/19/59961b522e6757f0c9097e4493fa906031b95b3ebe9360b2c3083561a6b4/certifi-2023.5.7-py3-none-any.whl", - "sha256": "c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716" + "url": "https://files.pythonhosted.org/packages/00/d5/4903f310765e0ff2b8e91ffe55031ac6af77d982f0156061e20a4d1a8b2d/Pillow-9.5.0.tar.gz", + "sha256": "bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1" + } + ] + }, + { + "name": "python3-requests", + "buildsystem": "simple", + "build-commands": [ + "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"requests\" --no-build-isolation" + ], + "sources": [ + { + "type": "file", + "url": "https://files.pythonhosted.org/packages/71/4c/3db2b8021bd6f2f0ceb0e088d6b2d49147671f25832fb17970e9b583d742/certifi-2022.12.7-py3-none-any.whl", + "sha256": "4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" }, { "type": "file", "url": "https://files.pythonhosted.org/packages/ff/d7/8d757f8bd45be079d76309248845a04f09619a7b17d6dfc8c9ff6433cac2/charset-normalizer-3.1.0.tar.gz", "sha256": "34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5" }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/a8/40/30a6440d5ceec49fc268710705b89e654fc854d9b8754850228deaf64892/googlebardpy-0.1.0-py3-none-any.whl", - "sha256": "12e65fdfe99392cbb5e8f93572340b757cd9d7aa83391316eaea3a1527995ef2" - }, { "type": "file", "url": "https://files.pythonhosted.org/packages/fc/34/3030de6f1370931b9dbb4dad48f6ab1015ab1d32447850b9fc94e60097be/idna-3.4-py3-none-any.whl", @@ -214,32 +120,13 @@ }, { "type": "file", - "url": "https://files.pythonhosted.org/packages/96/80/034ffeca15c0f4e01b7b9c6ad0fb704b44e190cde4e757edbd60be404c41/requests-2.30.0-py3-none-any.whl", - "sha256": "10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294" + "url": "https://files.pythonhosted.org/packages/cf/e1/2aa539876d9ed0ddc95882451deb57cfd7aa8dbf0b8dbce68e045549ba56/requests-2.29.0-py3-none-any.whl", + "sha256": "e8f3c9be120d3333921d213eef078af392fba3933ab7ed2d1cba3b56f2568c3b" }, { "type": "file", - "url": "https://files.pythonhosted.org/packages/4b/1d/f8383ef593114755429c307449e7717b87044b3bcd5f7860b89b1f759e34/urllib3-2.0.2-py3-none-any.whl", - "sha256": "d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e" - } - ] - }, - { - "name": "python3-pymdown-extensions", - "buildsystem": "simple", - "build-commands": [ - "pip3 install --verbose --exists-action=i --no-index --find-links=\"file://${PWD}\" --prefix=${FLATPAK_DEST} \"pymdown-extensions\" --no-build-isolation" - ], - "sources": [ - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/36/2b/61d51a2c4f25ef062ae3f74576b01638bebad5e045f747ff12643df63844/PyYAML-6.0.tar.gz", - "sha256": "68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2" - }, - { - "type": "file", - "url": "https://files.pythonhosted.org/packages/42/d5/ad2ce4fbd49f746c56f17ca4d1a8112cf76ea8797db670592923f7b3d96e/pymdown_extensions-9.11-py3-none-any.whl", - "sha256": "a499191d8d869f30339de86fcf072a787e86c42b6f16f280f5c2cf174182b7f3" + "url": "https://files.pythonhosted.org/packages/7b/f5/890a0baca17a61c1f92f72b81d3c31523c99bec609e60c292ea55b387ae8/urllib3-1.26.15-py2.py3-none-any.whl", + "sha256": "aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42" } ] } diff --git a/data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.Devel.svg b/data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.Devel.svg deleted file mode 100644 index 28894f6..0000000 --- a/data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.Devel.svg +++ /dev/null @@ -1,164 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.svg b/data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.svg deleted file mode 100644 index 7f77822..0000000 --- a/data/icons/hicolor/scalable/apps/io.github.Bavarder.Bavarder.svg +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.Devel.svg b/data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.Devel.svg new file mode 100644 index 0000000..e782569 --- /dev/null +++ b/data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.Devel.svg @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.svg b/data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.svg new file mode 100644 index 0000000..a596c08 --- /dev/null +++ b/data/icons/hicolor/scalable/apps/page.codeberg.Imaginer.Imaginer.svg @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/data/icons/hicolor/symbolic/apps/io.github.Bavarder.Bavarder-symbolic.svg b/data/icons/hicolor/symbolic/apps/io.github.Bavarder.Bavarder-symbolic.svg deleted file mode 100644 index 6e68edc..0000000 --- a/data/icons/hicolor/symbolic/apps/io.github.Bavarder.Bavarder-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/data/icons/hicolor/symbolic/apps/page.codeberg.Imaginer.Imaginer-symbolic.svg b/data/icons/hicolor/symbolic/apps/page.codeberg.Imaginer.Imaginer-symbolic.svg new file mode 100644 index 0000000..721e5a4 --- /dev/null +++ b/data/icons/hicolor/symbolic/apps/page.codeberg.Imaginer.Imaginer-symbolic.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/data/icons/io.github.Bavarder.Bavarder.Source.svg b/data/icons/io.github.Bavarder.Bavarder.Source.svg deleted file mode 100644 index e4c3ce9..0000000 --- a/data/icons/io.github.Bavarder.Bavarder.Source.svg +++ /dev/null @@ -1,782 +0,0 @@ - - - - - Adwaita Icon Template - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - GNOME Design Team - - - - - Adwaita Icon Template - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Hicolor - Symbolic - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/data/icons/meson.build b/data/icons/meson.build index 0e417b7..e76093f 100644 --- a/data/icons/meson.build +++ b/data/icons/meson.build @@ -1,4 +1,4 @@ -application_id = 'io.github.Bavarder.Bavarder' +application_id = 'page.codeberg.Imaginer.Imaginer' scalable_dir = join_paths('hicolor', 'scalable', 'apps') install_data( diff --git a/data/icons/page.codeberg.Imaginer.Imaginer.Source.svg b/data/icons/page.codeberg.Imaginer.Imaginer.Source.svg new file mode 100644 index 0000000..25b8c10 --- /dev/null +++ b/data/icons/page.codeberg.Imaginer.Imaginer.Source.svg @@ -0,0 +1,973 @@ + + + +Adwaita Icon Templateimage/svg+xmlGNOME Design TeamAdwaita Icon TemplateHicolorSymbolic diff --git a/data/bavarder.gresource.xml b/data/imaginer.gresource.xml similarity index 81% rename from data/bavarder.gresource.xml rename to data/imaginer.gresource.xml index 1549f0d..112c53b 100644 --- a/data/bavarder.gresource.xml +++ b/data/imaginer.gresource.xml @@ -1,12 +1,12 @@ - + ui/window.ui ui/help-overlay.ui ui/preferences.ui style.css - + icons/scalable/actions/paper-plane-symbolic.svg icons/scalable/actions/x-circular-symbolic.svg diff --git a/data/meson.build b/data/meson.build index 1370b42..dc427e8 100644 --- a/data/meson.build +++ b/data/meson.build @@ -3,8 +3,8 @@ pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.proje subdir('ui') -gnome.compile_resources('bavarder', - 'bavarder.gresource.xml', +gnome.compile_resources('imaginer', + 'imaginer.gresource.xml', gresource_bundle: true, source_dir: meson.current_build_dir(), install: true, @@ -13,8 +13,8 @@ gnome.compile_resources('bavarder', ) desktop_file = i18n.merge_file( - input: 'io.github.Bavarder.Bavarder.desktop.in', - output: 'io.github.Bavarder.Bavarder.desktop', + input: 'page.codeberg.Imaginer.Imaginer.desktop.in', + output: 'page.codeberg.Imaginer.Imaginer.desktop', type: 'desktop', po_dir: '../po', install: true, @@ -27,8 +27,8 @@ if desktop_utils.found() endif appstream_file = i18n.merge_file( - input: 'io.github.Bavarder.Bavarder.appdata.xml.in', - output: 'io.github.Bavarder.Bavarder.appdata.xml', + input: 'page.codeberg.Imaginer.Imaginer.appdata.xml.in', + output: 'page.codeberg.Imaginer.Imaginer.appdata.xml', po_dir: '../po', install: true, install_dir: join_paths(get_option('datadir'), 'appdata') @@ -39,7 +39,7 @@ if appstream_util.found() test('Validate appstream file', appstream_util, args: ['validate', appstream_file]) endif -install_data('io.github.Bavarder.Bavarder.gschema.xml', +install_data('page.codeberg.Imaginer.Imaginer.gschema.xml', install_dir: join_paths(get_option('datadir'), 'glib-2.0/schemas') ) diff --git a/data/io.github.Bavarder.Bavarder.appdata.xml.in b/data/page.codeberg.Imaginer.Imaginer.appdata.xml.in similarity index 83% rename from data/io.github.Bavarder.Bavarder.appdata.xml.in rename to data/page.codeberg.Imaginer.Imaginer.appdata.xml.in index dd1c4dd..a68727f 100644 --- a/data/io.github.Bavarder.Bavarder.appdata.xml.in +++ b/data/page.codeberg.Imaginer.Imaginer.appdata.xml.in @@ -1,12 +1,12 @@ - io.github.Bavarder.Bavarder - Bavarder + page.codeberg.Imaginer.Imaginer + Imaginer Chit-chat with an AI 0xMRTT CC0-1.0 GPL-3.0-or-later - io.github.Bavarder.Bavarder.desktop + page.codeberg.Imaginer.Imaginer.desktop @@ -16,14 +16,14 @@ Screenshot of Main UI - https://raw.githubusercontent.com/Bavarder/Bavarder/main/data/screenshots/quantum-computing.png + https://raw.githubusercontent.com/Imaginer/Imaginer/main/data/screenshots/quantum-computing.png - https://codeberg.org/Bavarder/Bavarder/issues - https://translate.codeberg.org/engage/bavarder/ - https://codeberg.org/Bavarder/Bavarder/issues - https://codeberg.org/Bavarder/Bavarder + https://codeberg.org/Imaginer/Imaginer/issues + https://translate.codeberg.org/engage/imaginer/ + https://codeberg.org/Imaginer/Imaginer/issues + https://codeberg.org/Imaginer/Imaginer HiDpiIcon @@ -50,7 +50,7 @@ - Bavarder + Imaginer Chat GPT ChatGPT @@ -115,12 +115,12 @@ -

Change app ID to io.github.Bavarder.Bavarder

+

Change app ID to page.codeberg.Imaginer.Imaginer

-

First release of Bavarder

+

First release of Imaginer

diff --git a/data/io.github.Bavarder.Bavarder.desktop.in b/data/page.codeberg.Imaginer.Imaginer.desktop.in similarity index 56% rename from data/io.github.Bavarder.Bavarder.desktop.in rename to data/page.codeberg.Imaginer.Imaginer.desktop.in index 365fffd..4d66822 100644 --- a/data/io.github.Bavarder.Bavarder.desktop.in +++ b/data/page.codeberg.Imaginer.Imaginer.desktop.in @@ -1,7 +1,7 @@ [Desktop Entry] -Name=Bavarder -Exec=bavarder -Icon=io.github.Bavarder.Bavarder +Name=Imaginer +Exec=imaginer +Icon=page.codeberg.Imaginer.Imaginer Terminal=false Type=Application Categories=GTK; diff --git a/data/io.github.Bavarder.Bavarder.gschema.xml b/data/page.codeberg.Imaginer.Imaginer.gschema.xml similarity index 86% rename from data/io.github.Bavarder.Bavarder.gschema.xml rename to data/page.codeberg.Imaginer.Imaginer.gschema.xml index aa87f2c..ccf3bfe 100644 --- a/data/io.github.Bavarder.Bavarder.gschema.xml +++ b/data/page.codeberg.Imaginer.Imaginer.gschema.xml @@ -1,6 +1,6 @@ - - + + 350 diff --git a/data/screenshots/avocado-armchair.png b/data/screenshots/avocado-armchair.png new file mode 100644 index 0000000000000000000000000000000000000000..c14ba72f2c72603d8ad70cf462ef94725eae96dc GIT binary patch literal 107287 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 diff --git a/data/ui/help-overlay.ui b/data/ui/help-overlay.ui index 7dcee22..0ed446e 100644 --- a/data/ui/help-overlay.ui +++ b/data/ui/help-overlay.ui @@ -33,18 +33,6 @@ app.preferences - - - Copy response - app.copy_bot - - - - - Clear - app.clear - - diff --git a/data/ui/preferences.blp b/data/ui/preferences.blp index a742123..811a8a7 100644 --- a/data/ui/preferences.blp +++ b/data/ui/preferences.blp @@ -8,28 +8,6 @@ template Preferences : Adw.PreferencesWindow { modal: true; Adw.PreferencesPage general_page { - Adw.PreferencesGroup prompt_group { - title: _("Prompt"); - - Adw.ActionRow { - title: _("Clear prompt after send"); - subtitle: _("The prompt will be cleared after send"); - activatable-widget: clear_after_send_switch; - Gtk.Switch clear_after_send_switch { - valign: center; - } - } - - Adw.ActionRow { - title: _("Use text view"); - subtitle: _("If the text view is used, you will lose formatting"); - activatable-widget: use_text_view_switch; - Gtk.Switch use_text_view_switch { - valign: center; - } - } - } - Adw.PreferencesGroup provider_group { title: _("Providers"); } diff --git a/data/ui/window.blp b/data/ui/window.blp index d837c6b..85f391b 100644 --- a/data/ui/window.blp +++ b/data/ui/window.blp @@ -2,9 +2,8 @@ using Gtk 4.0; using Adw 1; using WebKit 6.0; -template BavarderWindow : Adw.ApplicationWindow { - - title: _("Bavarder"); +template ImaginerWindow : Adw.ApplicationWindow { + title: _("Imaginer"); default-width: 350; default-height: 500; @@ -21,15 +20,12 @@ template BavarderWindow : Adw.ApplicationWindow { vexpand: true; hexpand: true; Adw.HeaderBar { - MenuButton { + MenuButton menu { primary: true; menu-model: main-menu; icon-name: "open-menu-symbolic"; tooltip-text: _("Main Menu"); } - DropDown provider_selector { - styles ["flat"] - } styles ["flat"] } @@ -48,179 +44,98 @@ template BavarderWindow : Adw.ApplicationWindow { margin-end: 24; spacing: 12; - Adw.PreferencesGroup prompt_group { - title: _("Message"); + Stack stack_imaginer { + transition-type: crossfade; - Box { - orientation: vertical; - hexpand: true; - vexpand: true; + StackPage { + name: "stack_imagine"; + child: + Adw.PreferencesPage { + Adw.PreferencesGroup { + Picture image { + halign: center; + visible: false; + styles ["card"] + //content-fit: cover; + //can-shrink: true; + height-request: 200; + width-request: 200; - styles ["card", "text-box"] + } + } - ScrolledWindow { - margin-top:12; - margin-bottom:0; - margin-start:12; - margin-end:12; - styles ["scrolled-window"] + Adw.PreferencesGroup { - TextView prompt_text_view { - wrap-mode: word_char; - hexpand: true; - vexpand: true; - buffer: TextBuffer { }; - //key-press => on_key_press_event(); + Adw.EntryRow prompt { + title: _("Prompt"); + } - } - } - Box { - hexpand: true; - halign: end; - - styles ["toolbar"] - Button { - sensitive: false; - icon-name: "edit-copy-symbolic"; - tooltip-text: _("Copy to Clipboard"); - action-name: "app.copy_prompt"; - } - // Button listen { - // action-name: "app.listen"; - // tooltip-text: _("Listen"); - // icon-name: "audio-input-microphone-symbolic"; - // } - - // Button listen_wait { - // visible: false; - // sensitive: false; - // tooltip-text: _("Listening"); - // Spinner listen_spinner { - // margin-top: 8; - // margin-bottom: 8; - // margin-start: 8; - // margin-end: 8; - // } - // } - Button ask_button { - visible: true; - sensitive: false; - icon-name: "paper-plane-symbolic"; - tooltip-text: _("Ask"); - hexpand: true; - halign: end; - action-name: "app.ask"; - styles ["suggested-action", "circular"] - } - Button wait_button { - visible: false; - sensitive: false; - tooltip-text: _("Wait"); - styles ["suggested-action", "circular"] - Spinner spinner { - margin-top: 8; - margin-bottom: 8; - margin-start: 8; - margin-end: 8; - styles ["suggested-action", "circular"] + Adw.EntryRow negative_prompt { + title: _("Negative Prompt"); + } } - } - } + + Adw.PreferencesGroup { + title: _("Options"); + + Adw.ActionRow { + title: _("Save Location"); + activatable-widget: button_output; + + + Button button_output { + valign: center; + action-name: "app.choose_output"; + + Box { + spacing: 6; + + Image { + icon-name: "document-open-symbolic"; + } + + Label label_output { + label: _("(None)"); + } + } + } + } + } + + Adw.PreferencesGroup { + Button button_imagine { + valign: center; + halign: center; + label: _("_Imagine"); + tooltip-text: _("Save location is missing."); + use-underline: true; + sensitive: false; + action-name: "app.ask"; + + styles [ + "suggested-action", + "pill", + ] + } + } + }; } - Adw.PreferencesGroup bot_group { - title: _("Response"); - - - Box { - orientation: vertical; - hexpand: true; - vexpand: true; - - styles ["card", "text-box"] - - ScrolledWindow scrolled_response_window { - margin-top:12; - margin-bottom:0; - margin-start:12; - margin-end:12; - styles ["scrolled-window"] - - Gtk.Stack response_stack { - vexpand: true; - hexpand: true; - Gtk.StackPage { - name: "page_response"; - child: TextView bot_text_view { - wrap-mode: word_char; - hexpand: true; - vexpand: true; - editable: false; - }; - } - - // Gtk.StackPage { - // name: "page_offline"; - // child: Adw.StatusPage { - // //icon-name: "network-wireless-offline-symbolic"; - // title: _("Offline"); - // }; - // } - } - + StackPage { + name: "stack_loading"; + child: + Adw.StatusPage { + Spinner spinner { + valign: center; } - - Box { - hexpand: true; - halign: end; - - styles ["toolbar"] - - // Button speak { - // action-name: "app.speak"; - // tooltip-text: _("Speak"); - // icon-name: "audio-speakers-symbolic"; - // } - - // Button speak_wait { - // visible: false; - // sensitive: false; - // tooltip-text: _("Speaking"); - // Spinner speak_spinner { - // margin-top: 8; - // margin-bottom: 8; - // margin-start: 8; - // margin-end: 8; - // } - // } - - Button copy_bot { - sensitive: false; - icon-name: "edit-copy-symbolic"; - tooltip-text: _("Copy to Clipboard"); - hexpand: true; - halign: end; - action-name: "app.copy_bot"; - } - - Button stop_button { - visible: false; - sensitive: false; - icon-name: "x-circular-symbolic"; - tooltip-text: _("Stop"); - hexpand: true; - halign: end; - action-name: "app.stop"; - styles ["suggested-action", "circular"] - } - } - } + }; } } } } } +} menu main-menu { @@ -236,7 +151,7 @@ menu main-menu { } item { - label: _("About Bavarder"); + label: _("About Imaginer"); action: "app.about"; } } diff --git a/meson.build b/meson.build index 2ed456e..278e428 100644 --- a/meson.build +++ b/meson.build @@ -1,4 +1,4 @@ -project('bavarder', +project('imaginer', version: '0.2.0', meson_version: '>= 0.62.0', default_options: [ 'warning_level=2', 'werror=false', ], @@ -9,12 +9,12 @@ gnome = import('gnome') python = import('python') # Constants -PROJECT_RDNN_NAME = 'io.github.Bavarder.Bavarder' -BUGTRACKER_URL = 'https://github.com/Bavarder/Bavarder/issues' -HELP_URL = 'https://github.com/Bavarder/Bavarder/issues' -TRANSLATE_URL = 'https://translate.codeberg.org/engage/bavarder/' +PROJECT_RDNN_NAME = 'page.codeberg.Imaginer.Imaginer' +BUGTRACKER_URL = 'https://github.com/Imaginer/Imaginer/issues' +HELP_URL = 'https://github.com/Imaginer/Imaginer/issues' +TRANSLATE_URL = 'https://translate.codeberg.org/engage/imaginer/' -PROJECT_URL = 'https://github.com/Bavarder' +PROJECT_URL = 'https://github.com/Imaginer' git_bin = find_program('git', required: false) @@ -45,7 +45,7 @@ if not PY_INSTALLDIR.found() endif PKGDATA_DIR = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()) -MODULE_DIR = join_paths(PKGDATA_DIR, 'bavarder') +MODULE_DIR = join_paths(PKGDATA_DIR, 'imaginer') conf = configuration_data() conf.set('APP_ID', APPLICATION_ID) diff --git a/po/Bavarder.pot b/po/Bavarder.pot deleted file mode 100644 index 0124384..0000000 --- a/po/Bavarder.pot +++ /dev/null @@ -1,151 +0,0 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder -# This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-05-12 16:35+0200\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "" - -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 -msgid "Chit-chat with an AI" -msgstr "" - -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 -msgid "0xMRTT" -msgstr "" - -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 -msgid "Screenshot of Main UI" -msgstr "" - -#: data/ui/help-overlay.ui:11 -msgctxt "shortcut window" -msgid "General" -msgstr "" - -#: data/ui/help-overlay.ui:14 -msgctxt "shortcut window" -msgid "Show Shortcuts" -msgstr "" - -#: data/ui/help-overlay.ui:20 -msgctxt "shortcut window" -msgid "Ask" -msgstr "" - -#: data/ui/help-overlay.ui:26 -msgctxt "shortcut window" -msgid "Quit" -msgstr "" - -#: data/ui/help-overlay.ui:32 -msgctxt "shortcut window" -msgid "Preferences" -msgstr "" - -#: data/ui/help-overlay.ui:38 -msgctxt "shortcut window" -msgid "Copy response" -msgstr "" - -#: data/ui/help-overlay.ui:44 -msgctxt "shortcut window" -msgid "Clear" -msgstr "" - -#: data/ui/preferences.blp:5 data/ui/window.blp:229 -msgid "Preferences" -msgstr "" - -#: data/ui/preferences.blp:12 -msgid "Prompt" -msgstr "" - -#: data/ui/preferences.blp:15 -msgid "Clear prompt after send" -msgstr "" - -#: data/ui/preferences.blp:16 -msgid "The prompt will be cleared after send" -msgstr "" - -#: data/ui/preferences.blp:24 -msgid "Use text view" -msgstr "" - -#: data/ui/preferences.blp:25 -msgid "If the text view is used, you will lose formatting" -msgstr "" - -#: data/ui/preferences.blp:34 -msgid "Providers" -msgstr "" - -#: data/ui/window.blp:28 -msgid "Main Menu" -msgstr "" - -#: data/ui/window.blp:37 src/provider/base.py:50 -msgid "No network connection" -msgstr "" - -#: data/ui/window.blp:52 -msgid "Message" -msgstr "" - -#: data/ui/window.blp:85 data/ui/window.blp:201 -msgid "Copy to Clipboard" -msgstr "" - -#: data/ui/window.blp:109 -msgid "Ask" -msgstr "" - -#: data/ui/window.blp:118 -msgid "Wait" -msgstr "" - -#: data/ui/window.blp:133 -msgid "Response" -msgstr "" - -#: data/ui/window.blp:211 -msgid "Stop" -msgstr "" - -#: data/ui/window.blp:234 -msgid "Keyboard Shortcuts" -msgstr "" - -#: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "" - -#: src/provider/base.py:43 -msgid "No API key provided, you can provide one in settings" -msgstr "" - -#: src/provider/base.py:45 -msgid "Open settings" -msgstr "" - -#: src/provider/catgpt.py:9 -msgid "Cat GPT" -msgstr "" diff --git a/po/Imaginer.pot b/po/Imaginer.pot new file mode 100644 index 0000000..e113325 --- /dev/null +++ b/po/Imaginer.pot @@ -0,0 +1,121 @@ +# Imaginer POT file +# Copyright (C) 2023 Imaginer +# This file is distributed under the GNU GPLv3 license. +# Imaginer, 2023. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-05-12 23:36+0200\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:6 +msgid "Imaginer" +msgstr "" + +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 +msgid "Chit-chat with an AI" +msgstr "" + +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 +msgid "0xMRTT" +msgstr "" + +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 +msgid "Screenshot of Main UI" +msgstr "" + +#: data/ui/help-overlay.ui:11 +msgctxt "shortcut window" +msgid "General" +msgstr "" + +#: data/ui/help-overlay.ui:14 +msgctxt "shortcut window" +msgid "Show Shortcuts" +msgstr "" + +#: data/ui/help-overlay.ui:20 +msgctxt "shortcut window" +msgid "Ask" +msgstr "" + +#: data/ui/help-overlay.ui:26 +msgctxt "shortcut window" +msgid "Quit" +msgstr "" + +#: data/ui/help-overlay.ui:32 +msgctxt "shortcut window" +msgid "Preferences" +msgstr "" + +#: data/ui/preferences.blp:5 data/ui/window.blp:144 +msgid "Preferences" +msgstr "" + +#: data/ui/preferences.blp:12 +msgid "Providers" +msgstr "" + +#: data/ui/window.blp:27 +msgid "Main Menu" +msgstr "" + +#: data/ui/window.blp:33 src/provider/base.py:52 +msgid "No network connection" +msgstr "" + +#: data/ui/window.blp:70 +msgid "Prompt" +msgstr "" + +#: data/ui/window.blp:74 +msgid "Negative Prompt" +msgstr "" + +#: data/ui/window.blp:80 +msgid "Options" +msgstr "" + +#: data/ui/window.blp:83 +msgid "Save Location" +msgstr "" + +#: data/ui/window.blp:99 +msgid "(None)" +msgstr "" + +#: data/ui/window.blp:110 +msgid "_Imagine" +msgstr "" + +#: data/ui/window.blp:111 +msgid "Save location is missing." +msgstr "" + +#: data/ui/window.blp:149 +msgid "Keyboard Shortcuts" +msgstr "" + +#: data/ui/window.blp:154 +msgid "About Imaginer" +msgstr "" + +#: src/provider/base.py:45 +msgid "No API key provided, you can provide one in settings" +msgstr "" + +#: src/provider/base.py:47 +msgid "Open settings" +msgstr "" diff --git a/po/POTFILES b/po/POTFILES index b29cd71..6d8554d 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -1,11 +1,10 @@ -data/io.github.Bavarder.Bavarder.desktop.in -data/io.github.Bavarder.Bavarder.appdata.xml.in -data/io.github.Bavarder.Bavarder.gschema.xml +data/page.codeberg.Imaginer.Imaginer.desktop.in +data/page.codeberg.Imaginer.Imaginer.appdata.xml.in +data/page.codeberg.Imaginer.Imaginer.gschema.xml data/ui/help-overlay.ui data/ui/preferences.blp data/ui/window.blp src/main.py src/preferences.py src/window.py -src/provider/base.py -src/provider/catgpt.py \ No newline at end of file +src/provider/base.py \ No newline at end of file diff --git a/po/az.po b/po/az.po index 6881e85..2f539a1 100644 --- a/po/az.po +++ b/po/az.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # thepoladov13 , 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-07 23:15+0000\n" "Last-Translator: 0xMRTT <0xmrtt@proton.me>\n" -"Language-Team: Azerbaijani \n" +"Language-Team: Azerbaijani \n" "Language: az\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Chit AI ilə söhbət edin" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Əsas UI ekran görüntüsü" @@ -141,8 +141,8 @@ msgid "Keyboard Shortcuts" msgstr "Klaviatura Qısayolları" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Bavarder haqqında" +msgid "About Imaginer" +msgstr "Imaginer haqqında" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/cs.po b/po/cs.po index 677b783..6ca4fe0 100644 --- a/po/cs.po +++ b/po/cs.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # muznyo , 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Czech \n" +"Language-Team: Czech \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Chatovat s umělou inteligencí" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Snímek obrazovky hlavního uživatelského rozhraní" @@ -139,8 +139,8 @@ msgid "Keyboard Shortcuts" msgstr "Klávesové zkratky" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "O Bavarder" +msgid "About Imaginer" +msgstr "O Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/de.po b/po/de.po index 18c5d77..1fc6230 100644 --- a/po/de.po +++ b/po/de.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # 0xMRTT <0xmrtt@tuta.io>, 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:38+0000\n" "Last-Translator: 0xMRTT <0xmrtt@proton.me>\n" -"Language-Team: German \n" +"Language-Team: German \n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Plaudern Sie mit GPT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Screenshot der Hauptbenutzeroberfläche" @@ -139,8 +139,8 @@ msgid "Keyboard Shortcuts" msgstr "Tastatürkürzel" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Über Bavarder" +msgid "About Imaginer" +msgstr "Über Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" @@ -182,8 +182,8 @@ msgstr "Katze GPT" #~ msgid "Working offline" #~ msgstr "Offline arbeiten" -#~ msgid "bavarder" -#~ msgstr "bavarder" +#~ msgid "imaginer" +#~ msgstr "imaginer" #~ msgid "No description" #~ msgstr "Keine Beschreibung" diff --git a/po/es.po b/po/es.po index c06435a..00d33f2 100644 --- a/po/es.po +++ b/po/es.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # 0xMRTT <0xmrtt@tuta.io>, 2023. # sjdonado , 2023. @@ -15,8 +15,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Spanish \n" +"Language-Team: Spanish \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,21 +24,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Conversa con una IA" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Captura de Pantalla de la Interfaz de Usuario Principal" @@ -142,8 +142,8 @@ msgid "Keyboard Shortcuts" msgstr "Atajos de Teclado" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Sobre Bavarder" +msgid "About Imaginer" +msgstr "Sobre Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/fa.po b/po/fa.po index 9a3662b..59629a4 100644 --- a/po/fa.po +++ b/po/fa.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # kouroshtaf , 2023. # Kourosh , 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Persian \n" +"Language-Team: Persian \n" "Language: fa\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" msgstr "باوارده" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "گپی با هوش مصنوعی" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "سازنده: 0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "تصویر نمای اصلی" @@ -143,7 +143,7 @@ msgid "Keyboard Shortcuts" msgstr "کلیدهای میانبر" #: data/ui/window.blp:239 -msgid "About Bavarder" +msgid "About Imaginer" msgstr "درباره" #: src/provider/base.py:43 diff --git a/po/fi.po b/po/fi.po index b3cd9ba..2dbbd75 100644 --- a/po/fi.po +++ b/po/fi.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # artnay , 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Finnish \n" +"Language-Team: Finnish \n" "Language: fi\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Keskustele tekoälyn kanssa" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Kuvakaappaus käyttöliittymästä" @@ -139,8 +139,8 @@ msgid "Keyboard Shortcuts" msgstr "Pikanäppäimet" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Tietoja - Bavarder" +msgid "About Imaginer" +msgstr "Tietoja - Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/fr.po b/po/fr.po index 89ffade..aca3acf 100644 --- a/po/fr.po +++ b/po/fr.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # 0xMRTT <0xmrtt@tuta.io>, 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -14,8 +14,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:38+0000\n" "Last-Translator: 0xMRTT <0xmrtt@proton.me>\n" -"Language-Team: French \n" +"Language-Team: French \n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,21 +23,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" -msgstr "Bavarder avec GPT" +msgstr "Imaginer avec GPT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Capture d’écran de l’interface principale" @@ -141,8 +141,8 @@ msgid "Keyboard Shortcuts" msgstr "Raccourcis clavier" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "À propos de Bavarder" +msgid "About Imaginer" +msgstr "À propos de Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" @@ -184,8 +184,8 @@ msgstr "Cat GPT" #~ msgid "Working offline" #~ msgstr "Travailler hors ligne" -#~ msgid "bavarder" -#~ msgstr "bavarder" +#~ msgid "imaginer" +#~ msgstr "imaginer" #~ msgid "No description" #~ msgstr "Aucune description" diff --git a/po/hu.po b/po/hu.po index d2ac42b..c37a656 100644 --- a/po/hu.po +++ b/po/hu.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # osiixy , 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Hungarian \n" +"Language-Team: Hungarian \n" "Language: hu\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "" @@ -141,7 +141,7 @@ msgid "Keyboard Shortcuts" msgstr "" #: data/ui/window.blp:239 -msgid "About Bavarder" +msgid "About Imaginer" msgstr "" #: src/provider/base.py:43 diff --git a/po/it.po b/po/it.po index f624ec2..9e3e0dc 100644 --- a/po/it.po +++ b/po/it.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # 0xMRTT <0xmrtt@tuta.io>, 2023. # phaerrax , 2023. @@ -13,8 +13,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Italian \n" +"Language-Team: Italian \n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,21 +22,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Chiacchiera con un'IA" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Schermata dell'interfaccia principale" @@ -144,8 +144,8 @@ msgid "Keyboard Shortcuts" msgstr "Scorciatoie da tastiera" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Informazioni su Bavarder" +msgid "About Imaginer" +msgstr "Informazioni su Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/meson.build b/po/meson.build index 17a56ee..63e32be 100644 --- a/po/meson.build +++ b/po/meson.build @@ -1 +1 @@ -i18n.gettext('bavarder', preset: 'glib') +i18n.gettext('imaginer', preset: 'glib') diff --git a/po/nl.po b/po/nl.po index 7db60c8..1e9a372 100644 --- a/po/nl.po +++ b/po/nl.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # Vistaus , 2023. msgid "" @@ -11,8 +11,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch \n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,21 +20,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Babbel met een KI" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Schermfoto van het hoofdscherm" @@ -138,8 +138,8 @@ msgid "Keyboard Shortcuts" msgstr "Sneltoetsen" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Over Bavarder" +msgid "About Imaginer" +msgstr "Over Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/pl.po b/po/pl.po index 948ea66..03120f2 100644 --- a/po/pl.po +++ b/po/pl.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # ioghjog , 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Polish \n" +"Language-Team: Polish \n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,21 +22,21 @@ msgstr "" "|| n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Pogawędka z SI" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Zrzut ekranu interfejsu" @@ -144,8 +144,8 @@ msgid "Keyboard Shortcuts" msgstr "Skróty klawiszowe" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "O Bavarderze" +msgid "About Imaginer" +msgstr "O Imaginerze" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/pt.po b/po/pt.po index b7f980f..d5ed94b 100644 --- a/po/pt.po +++ b/po/pt.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # galegovski , 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Portuguese \n" +"Language-Team: Portuguese \n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Bate-papo com uma IA" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Captura da tela principal" @@ -143,8 +143,8 @@ msgid "Keyboard Shortcuts" msgstr "Atalhos do teclado" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Sobre Bavarder" +msgid "About Imaginer" +msgstr "Sobre Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/ru.po b/po/ru.po index 0f44384..39f1790 100644 --- a/po/ru.po +++ b/po/ru.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # 0xMRTT <0xmrtt@tuta.io>, 2023. # Daudix_UFO , 2023. @@ -13,8 +13,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Russian \n" +"Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,21 +23,21 @@ msgstr "" "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Болтайте с GPT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Снимок экрана главного интерфейса" @@ -141,8 +141,8 @@ msgid "Keyboard Shortcuts" msgstr "Комбинации клавиш" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "О Bavarder" +msgid "About Imaginer" +msgstr "О Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" @@ -177,8 +177,8 @@ msgstr "Cat GPT" #~ msgid "Ready" #~ msgstr "Готов" -#~ msgid "bavarder" -#~ msgstr "bavarder" +#~ msgid "imaginer" +#~ msgstr "imaginer" #~ msgid "No description" #~ msgstr "Нет описания" diff --git a/po/sv.po b/po/sv.po index a48e17e..cc1679b 100644 --- a/po/sv.po +++ b/po/sv.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # 0xMRTT <0xmrtt@tuta.io>, 2023. # Morgan Antonsson , 2023. @@ -13,8 +13,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Swedish \n" +"Language-Team: Swedish \n" "Language: sv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,21 +22,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Chatta med en AI" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Skärmdump av huvudgränssnittet" @@ -144,8 +144,8 @@ msgid "Keyboard Shortcuts" msgstr "Tangentbordsgenvägar" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Om Bavarder" +msgid "About Imaginer" +msgstr "Om Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/th.po b/po/th.po index 04289c2..a8130c6 100644 --- a/po/th.po +++ b/po/th.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # watchakorn-18k , 2023. msgid "" @@ -11,8 +11,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Thai \n" +"Language-Team: Thai \n" "Language: th\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,21 +20,21 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" msgstr "แบบวาร์เดอร์" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "แชทกับ AI" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "ภาพหน้าจอของ UI หลัก" @@ -138,7 +138,7 @@ msgid "Keyboard Shortcuts" msgstr "แป้นพิมพ์ลัด" #: data/ui/window.blp:239 -msgid "About Bavarder" +msgid "About Imaginer" msgstr "เกี่ยวกับแบบวาร์เดอร์" #: src/provider/base.py:43 diff --git a/po/tr.po b/po/tr.po index f5e6f20..ebebeeb 100644 --- a/po/tr.po +++ b/po/tr.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # keyiflerolsun , 2023. # 0xMRTT <0xmrtt@proton.me>, 2023. @@ -12,8 +12,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Turkish \n" +"Language-Team: Turkish \n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,21 +21,21 @@ msgstr "" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Chit AI ile sohbet edin" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Ana Kullanıcı Arayüzü'nün ekran görüntüsü" @@ -143,8 +143,8 @@ msgid "Keyboard Shortcuts" msgstr "Klavye kısayolları" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Bavarder Hakkında" +msgid "About Imaginer" +msgstr "Imaginer Hakkında" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/uk.po b/po/uk.po index 867cbec..288c429 100644 --- a/po/uk.po +++ b/po/uk.po @@ -1,7 +1,7 @@ -# Bavarder POT file -# Copyright (C) 2023 Bavarder +# Imaginer POT file +# Copyright (C) 2023 Imaginer # This file is distributed under the GNU GPLv3 license. -# Bavarder, 2023. +# Imaginer, 2023. # # 0xMRTT <0xmrtt@tuta.io>, 2023. # Orest58008 , 2023. @@ -13,8 +13,8 @@ msgstr "" "POT-Creation-Date: 2023-05-12 16:35+0200\n" "PO-Revision-Date: 2023-05-12 14:36+0000\n" "Last-Translator: Anonymous \n" -"Language-Team: Ukrainian \n" +"Language-Team: Ukrainian \n" "Language: uk\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,21 +23,21 @@ msgstr "" "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.17\n" -#: data/io.github.Bavarder.Bavarder.desktop.in:3 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:4 data/ui/window.blp:7 -msgid "Bavarder" -msgstr "Bavarder" +#: data/page.codeberg.Imaginer.Imaginer.desktop.in:3 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:4 data/ui/window.blp:7 +msgid "Imaginer" +msgstr "Imaginer" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:5 -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:13 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:5 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:13 msgid "Chit-chat with an AI" msgstr "Побалакати з ШІ" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:6 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:6 msgid "0xMRTT" msgstr "0xMRTT" -#: data/io.github.Bavarder.Bavarder.appdata.xml.in:18 +#: data/page.codeberg.Imaginer.Imaginer.appdata.xml.in:18 msgid "Screenshot of Main UI" msgstr "Знімок головного інтерфейсу" @@ -145,8 +145,8 @@ msgid "Keyboard Shortcuts" msgstr "Комбінації Клавіш" #: data/ui/window.blp:239 -msgid "About Bavarder" -msgstr "Про Bavarder" +msgid "About Imaginer" +msgstr "Про Imaginer" #: src/provider/base.py:43 msgid "No API key provided, you can provide one in settings" diff --git a/po/update-pot.sh b/po/update-pot.sh index ef52fae..a02323b 100644 --- a/po/update-pot.sh +++ b/po/update-pot.sh @@ -1,10 +1,10 @@ #!/bin/bash po_dir=$(dirname "$(realpath "$0")") -xgettext -f "$po_dir"/POTFILES -o "$po_dir"/Bavarder.pot --add-comments=Translators --keyword=_ --keyword=C_1c,2 --from-code=UTF-8 -sed -i "s/SOME DESCRIPTIVE TITLE./Bavarder POT file/" "$po_dir"/Bavarder.pot -sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/$(date +%Y) Bavarder/" "$po_dir"/Bavarder.pot -sed -i "s@same license as the PACKAGE package.@GNU GPLv3 license.@" "$po_dir"/Bavarder.pot -sed -i "s/FIRST AUTHOR , YEAR./Bavarder, $(date +%Y)./" "$po_dir"/Bavarder.pot +xgettext -f "$po_dir"/POTFILES -o "$po_dir"/Imaginer.pot --add-comments=Translators --keyword=_ --keyword=C_1c,2 --from-code=UTF-8 +sed -i "s/SOME DESCRIPTIVE TITLE./Imaginer POT file/" "$po_dir"/Imaginer.pot +sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/$(date +%Y) Imaginer/" "$po_dir"/Imaginer.pot +sed -i "s@same license as the PACKAGE package.@GNU GPLv3 license.@" "$po_dir"/Imaginer.pot +sed -i "s/FIRST AUTHOR , YEAR./Imaginer, $(date +%Y)./" "$po_dir"/Imaginer.pot regex="$po_dir/([a-zA-Z_]*).po" find "$po_dir" -type f -name "*.po" | sed -rn "s:$regex:\1:p" > "$po_dir/LINGUAS" \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index f74693d..24225c2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,10 +2,6 @@ # chmod +x flatpak-pip-generator # ./flatpak-pip-generator --requirements-file=requirements.txt --output pypi-dependencies -baichat-py>=0.1.2 -hgchat openai -googlebardpy -markdown -pymdown-extensions -Pygments \ No newline at end of file +Pillow +requests \ No newline at end of file diff --git a/src/constants.py.in b/src/constants.py.in index a281864..671aa36 100644 --- a/src/constants.py.in +++ b/src/constants.py.in @@ -1,4 +1,4 @@ -rootdir = '/io/github/Bavarder/Bavarder' +rootdir = '/page/codeberg/Imaginer/Imaginer' datadir = '@DATA_DIR@' pkgdatadir = '@PKGDATA_DIR@' localedir = '@LOCALE_DIR@' diff --git a/src/bavarder.in b/src/imaginer.in similarity index 81% rename from src/bavarder.in rename to src/imaginer.in index 3c1120e..daba562 100755 --- a/src/bavarder.in +++ b/src/imaginer.in @@ -1,6 +1,6 @@ #!@PYTHON@ -# bavarder.in +# imaginer.in # # Copyright 2023 Me # @@ -31,16 +31,16 @@ localedir = '@LOCALE_DIR@' sys.path.insert(1, pkgdatadir) signal.signal(signal.SIGINT, signal.SIG_DFL) -locale.bindtextdomain('bavarder', localedir) -locale.textdomain('bavarder') -gettext.install('bavarder', localedir) +locale.bindtextdomain('imaginer', localedir) +locale.textdomain('imaginer') +gettext.install('imaginer', localedir) if __name__ == '__main__': import gi from gi.repository import Gio - resource = Gio.Resource.load(os.path.join(pkgdatadir, 'bavarder.gresource')) + resource = Gio.Resource.load(os.path.join(pkgdatadir, 'imaginer.gresource')) resource._register() - from bavarder import main + from imaginer import main sys.exit(main.main(VERSION)) diff --git a/src/main.py b/src/main.py index 1154413..0a34339 100644 --- a/src/main.py +++ b/src/main.py @@ -29,8 +29,8 @@ gi.require_version("Gdk", "4.0") gi.require_version("Gst", "1.0") gi.require_version('WebKit', '6.0') -from gi.repository import Gtk, Gio, Adw, Gdk, GLib, Gst, WebKit -from .window import BavarderWindow +from gi.repository import Gtk, Gio, Adw, Gdk, GLib +from .window import ImaginerWindow from .preferences import Preferences from enum import auto, IntEnum @@ -38,18 +38,16 @@ from .constants import app_id, version, build_type from tempfile import NamedTemporaryFile +import unicodedata +from time import gmtime, strftime +from os.path import basename, splitext + from .provider import PROVIDERS import platform import os -import markdown import tempfile import re -class Step(IntEnum): - CONVERT_HTML = auto() - LOAD_WEBVIEW = auto() - RENDER = auto() - class KillableThread(threading.Thread): def __init__(self, *args, **keywords): threading.Thread.__init__(self, *args, **keywords) @@ -84,12 +82,12 @@ class KillableThread(threading.Thread): -class BavarderApplication(Adw.Application): +class ImaginerApplication(Adw.Application): """The main application singleton class.""" def __init__(self): super().__init__( - application_id="io.github.Bavarder.Bavarder", + application_id="page.codeberg.Imaginer.Imaginer", flags=Gio.ApplicationFlags.DEFAULT_FLAGS, ) self.create_action("quit", self.on_quit, ["q"]) @@ -97,37 +95,32 @@ class BavarderApplication(Adw.Application): self.create_action( "preferences", self.on_preferences_action, ["comma"] ) - self.create_action("copy_prompt", self.on_copy_prompt_action) - self.create_action("copy_bot", self.on_copy_bot_action, ["c"]) self.create_action("ask", self.on_ask_action, ["Return"]) - self.create_action("clear", self.on_clear_action, ["BackSpace"]) self.create_action("stop", self.on_stop_action, ["Escape"]) + self.create_action("choose_output", self.on_file_chooser, ["s"]) + # self.create_action("speak", self.on_speak_action, ["S"]) # self.create_action("listen", self.on_listen_action, ["L"]) - self.settings = Gio.Settings(schema_id="io.github.Bavarder.Bavarder") - - self.clear_after_send = self.settings.get_boolean("clear-after-send") - self.use_text_view = self.settings.get_boolean("use-text-view") + self.settings = Gio.Settings(schema_id="page.codeberg.Imaginer.Imaginer") self.enabled_providers = sorted( set(self.settings.get_strv("enabled-providers")) ) self.latest_provider = self.settings.get_string("latest-provider") - self.web_view = None - self.web_view_pending_html = None - - self.loading = False - self.shown = False - self.preview_visible = False - + self.create_stateful_action( + "set_provider", + GLib.VariantType.new("s"), + GLib.Variant("s", self.latest_provider), + self.on_set_provider_action + ) def quitting(self, *args, **kwargs): """Called before closing main window.""" self.settings.set_strv("enabled-providers", list(self.enabled_providers)) - self.settings.set_string("latest-provider", self.get_provider().slug) + self.settings.set_string("latest-provider", self.provider) print("Saving providers data...") @@ -146,15 +139,6 @@ class BavarderApplication(Adw.Application): data = GLib.Variant("a{ss}", r) self.settings.set_value("providers-data", data) - def on_clear_action(self, action, param): - self.win.bot_text_view.get_buffer().set_text("") - self.win.prompt_text_view.get_buffer().set_text("") - self.win.prompt_text_view.grab_focus() - - def get_provider(self): - print(self.providers) - return self.providers[self.win.provider_selector.props.selected] - def do_activate(self): """Called when the application is activated. @@ -163,7 +147,7 @@ class BavarderApplication(Adw.Application): """ self.win = self.props.active_window if not self.win: - self.win = BavarderWindow(application=self) + self.win = ImaginerWindow(application=self) self.win.present() self.win.connect("close-request", self.quitting) @@ -176,38 +160,55 @@ class BavarderApplication(Adw.Application): for k, p in self.providers.items(): if p.slug == self.latest_provider: print("Setting selected provider to", k) - self.win.provider_selector.set_selected(k) + self.provider = k break - self.win.prompt_text_view.grab_focus() + def on_set_provider_action(self, action, *args): + self.provider = args[0].get_string() + print("Setting provider to", self.provider) + + Gio.SimpleAction.set_state(self.lookup_action("set_provider"), args[0]) + def load_dropdown(self): + self.menu_model = Gio.Menu() + + provider_menu = Gio.Menu() + - self.provider_selector_model = Gtk.StringList() self.providers = {} - self.providers_data = self.settings.get_value("providers-data") print(self.providers_data) print(self.enabled_providers) - for provider, i in zip( - self.enabled_providers, range(len(self.enabled_providers)) - ): + + for provider in self.enabled_providers: print("Loading provider", provider) try: - self.provider_selector_model.append(PROVIDERS[provider].name) + item = PROVIDERS[provider] + item_model = Gio.MenuItem() + item_model.set_label(item.name) + item_model.set_action_and_target_value( + "app.set_provider", + GLib.Variant("s", item.slug)) + provider_menu.append_item(item_model) except KeyError: print("Provider", provider, "not found") - self.enabled_providers.remove(provider) continue else: try: - _ = self.providers[i] # doesn't re load if already loaded + _ = self.providers[item.slug] # doesn't re load if already loaded except KeyError: - self.providers[i] = PROVIDERS[provider](self.win, self) + self.providers[item.slug] = PROVIDERS[provider](self.win, self) - self.win.provider_selector.set_model(self.provider_selector_model) - self.win.provider_selector.connect("notify", self.on_provider_selector_notify) + self.menu_model.append_submenu("Providers", provider_menu) + + self.menu_model.append_item(Gio.MenuItem.new(label="Preferences", detailed_action="app.preferences")) + self.menu_model.append_item(Gio.MenuItem.new(label="Keyboard Shortcuts", detailed_action="win.show-help-overlay")) + self.menu_model.append_item(Gio.MenuItem.new(label="About", detailed_action="app.about")) + + + self.win.menu.set_menu_model(self.menu_model) def load(self): for p in self.providers.values(): @@ -217,14 +218,11 @@ class BavarderApplication(Adw.Application): except KeyError: # provider not in data pass - def on_provider_selector_notify(self, _unused, pspec): - self.win.banner.set_revealed(False) - def on_about_action(self, widget, _): """Callback for the app.about action.""" about = Adw.AboutWindow( transient_for=self.props.active_window, - application_name="Bavarder", + application_name="Imaginer", application_icon=app_id, developer_name="0xMRTT", developers=["0xMRTT https://github.com/0xMRTT"], @@ -243,9 +241,9 @@ class BavarderApplication(Adw.Application): galegovski """, license_type=Gtk.License.GPL_3_0, version=version, - website="https://bavarder.codeberg.page", - issue_url="https://github.com/Bavarder/Bavarder/issues", - support_url="https://codeberg.org/Bavarder/Bavarder/issues", + website="https://imaginer.codeberg.page", + issue_url="https://github.com/Imaginer/Imaginer/issues", + support_url="https://codeberg.org/Imaginer/Imaginer/issues", copyright="© 2023 0xMRTT", ) @@ -274,801 +272,87 @@ Providers: {self.enabled_providers} ) preferences.present() - def on_copy_prompt_action(self, widget, _): - """Callback for the app.copy_prompt action.""" + def on_file_chooser(self, widget, _): + """Callback for the app.choose_output action.""" + self.file_chooser.show() + + def on_file_chooser_response(self, _, response): + if response == Gtk.ResponseType.ACCEPT: + self.directory = self.file_chooser.get_file() + dir_basename = self.directory.get_basename() + self.win.label_output.set_label(dir_basename) + self.win.button_imagine.set_has_tooltip(False) + + self.file_chooser.hide() + + if response == Gtk.ResponseType.ACCEPT: + self.file_path = self.directory.get_path() + + def slugify(self, value): + value = ( + unicodedata.normalize("NFKD", value) + .encode("ascii", "ignore") + .decode("ascii") + ) + value = re.sub("[^\w\s-]", "", value).strip().lower() + return re.sub("[-\s]+", "-", value) - toast = Adw.Toast() - - text = self.win.prompt_text_view.get_buffer() - toast.set_title("Text copied") - - (start, end) = text.get_bounds() - text = text.get_text(start, end, False) - - if len(text) == 0: - return - - Gdk.Display.get_default().get_clipboard().set(text) - - self.win.toast_overlay.add_toast(toast) - - def on_copy_bot_action(self, widget, _): - """Callback for the app.copy_bot action.""" - - toast = Adw.Toast() - toast.set_title("Text copied") - - try: - text = self.response - except AttributeError: - return - else: - if len(text) == 0: - return - else: - Gdk.Display.get_default().get_clipboard().set(text) - - self.win.toast_overlay.add_toast(toast) - - def ask(self, prompt): - return self.providers[self.provider].ask(prompt) - - @staticmethod - def on_click_link(web_view, decision, _decision_type): - if web_view.get_uri().startswith(("http://", "https://", "www.")): - Glib.spawn_command_line_async(f"xdg-open {web_view.get_uri()}") - decision.ignore() - return True - - @staticmethod - def on_right_click(web_view, context_menu, _event, _hit_test): - # disable some context menu option - for item in context_menu.get_items(): - if item.get_stock_action() in [WebKit.ContextMenuAction.RELOAD, - WebKit.ContextMenuAction.GO_BACK, - WebKit.ContextMenuAction.GO_FORWARD, - WebKit.ContextMenuAction.STOP]: - context_menu.remove(item) - - - def show(self, html=None, step=Step.LOAD_WEBVIEW): - if step == Step.LOAD_WEBVIEW: - self.loading = True - if not self.web_view: - self.web_view = WebKit.WebView() - self.web_view.get_settings().set_allow_universal_access_from_file_urls(True) - - self.web_view.get_settings().set_enable_developer_extras(True) - - # Show preview once the load is finished - self.web_view.connect("load-changed", self.on_load_changed) - - # All links will be opened in default browser, but local files are opened in apps. - self.web_view.connect("decide-policy", self.on_click_link) - - self.web_view.connect("context-menu", self.on_right_click) - - self.web_view.set_hexpand(True) - self.web_view.set_vexpand(True) - - self.win.response_stack.add_child(self.web_view) - self.win.response_stack.set_visible_child(self.web_view) - - if self.web_view.is_loading(): - self.web_view_pending_html = html - else: - try: - self.web_view.load_html(html, "file://localhost/") - except TypeError: # Argument 1 does not allow None as a value - pass - - - elif step == Step.RENDER: - if not self.preview_visible: - self.preview_visible = True - self.show() - - def reload(self, *_widget, reshow=False): - if self.preview_visible: - if reshow: - self.hide() - self.show() - - def on_load_changed(self, _web_view, event): - if event == WebKit.LoadEvent.FINISHED: - self.loading = False - if self.web_view_pending_html: - self.show(html=self.web_view_pending_html, step=Step.LOAD_WEBVIEW) - self.web_view_pending_html = None - else: - # we only lazyload the webview once - self.show(step=Step.RENDER) - - def parse_css(self, path): - - adw_palette_prefixes = [ - "blue_", - "green_", - "yellow_", - "orange_", - "red_", - "purple_", - "brown_", - "light_", - "dark_" - ] - - # Regular expressions - not_define_color = re.compile(r"(^(?:(?!@define-color).)*$)") - define_color = re.compile(r"(@define-color .*[^\s])") - css = "" - variables = {} - palette = {} - - for color in adw_palette_prefixes: - palette[color] = {} - - with open(path, "r", encoding="utf-8") as sheet: - for line in sheet: - cdefine_match = re.search(define_color, line) - not_cdefine_match = re.search(not_define_color, line) - if cdefine_match != None: # If @define-color variable declarations were found - palette_part = cdefine_match.__getitem__(1) # Get the second item of the re.Match object - name, color = palette_part.split(" ", 1)[1].split(" ", 1) - if name.startswith(tuple(adw_palette_prefixes)): # Palette colors - palette[name[:-1]][name[-1:]] = color[:-1] - else: # Other color variables - variables[name] = color[:-1] - elif not_cdefine_match != None: # If CSS rules were found - css_part = not_cdefine_match.__getitem__(1) - css += f"{css_part}\n" - - sheet.close() - return variables, palette, css - - def update_response(self, response): - """Update the response text view with the response.""" - self.response = response - - if not self.use_text_view: - response = markdown.markdown(response, extensions=["markdown.extensions.extra", 'pymdownx.arithmatex', 'pymdownx.highlight']) - - TEMPLATE = """ - - - - - - - - - - - - {response} - - - """ - - ADWAITA_STYLE = """:root { - --text-color: #2e3436; - --background-color: #f6f5f4; - --alt-background-color: #edeeef; - --link-color: #0d71de; - --blockquote-text-color: #747e85; - --blockquote-border-color: #d6d8da; - --header-border-color: #e1e2e4; - --hr-background-color: #d8dadd; - --table-tr-border-color: #bdc1c6; - --table-td-border-color: #d6d8da; - --kbd-text-color: #4e585e; - --kbd-background-color: #f1f1f1; - --kbd-border-color: #bdc1c6; - --kbd-shadow-color: #8c939a; - } - - @media (prefers-color-scheme: dark) { - :root { - --text-color: #eeeeec; - --background-color: #363636; - --alt-background-color: #4a4a4a; - --link-color: #78aeed; - --blockquote-text-color: #ffffff; - --blockquote-border-color: #525252; - --header-border-color: #474747; - --hr-background-color: #505050; - --table-tr-border-color: #696969; - --table-td-border-color: #525252; - --kbd-text-color: #ffffff; - --kbd-background-color: #4a4a4a; - --kbd-border-color: #696969; - --kbd-shadow-color: #979797; - } - }""" - CUSTOM_STYLE = """ - --text-color: {card_fg_color}; - --background-color: {card_bg_color}; - --alt-background-color: {view_bg_color}; - --link-color: {accent_fg_color}; - --blockquote-text-color: {card_fg_color}; - --blockquote-border-color: {card_bg_color}; - --header-border-color: {headerbar_border_color}; - --hr-background-color: {headerbar_bg_color}; - --table-tr-border-color: {headerbar_border_color}; - --table-td-border-color: {headerbar_border_color}; - --kbd-text-color: #4e585e; - --kbd-background-color: #f1f1f1; - --kbd-border-color: #bdc1c6; - --kbd-shadow-color: #8c939a; - """ - - if os.path.exists(os.path.expanduser("~/.config/gtk-4.0/gtk.css")): - variables, palette, css = self.parse_css(os.path.expanduser("~/.config/gtk-4.0/gtk.css")) - theme_css = ":root {\n" + CUSTOM_STYLE.format(**variables) + " \n}\n" + css - else: - theme_css = ADWAITA_STYLE - self.show(TEMPLATE.replace("{response}", response).replace("{theme_css}", theme_css), Step.LOAD_WEBVIEW) - else: - self.win.bot_text_view.get_buffer().props.text = response - self.win.response_stack.set_visible_child_name("page_response") def on_ask_action(self, widget, _): """Callback for the app.ask action.""" - self.prompt = self.win.prompt_text_view.get_buffer().props.text.strip() + + self.prompt = self.win.prompt.get_text() + self.negative_prompt = self.win.negative_prompt.get_text() + + try: + self.path = self.file_path + except AttributeError: + self.path = "imaginer" + else: + self.path = f"{path}/imaginer-{self.slugify(self.prompt)}-{strftime('%d-%b-%Y-%H-%M-%S', gmtime())}" if self.prompt == "" or self.prompt is None: # empty prompt return else: self.win.spinner.start() - self.win.ask_button.set_visible(False) - self.win.wait_button.set_visible(True) - self.win.stop_button.set_visible(True) - self.provider = self.win.provider_selector.props.selected + self.win.stack_imaginer.set_visible_child_name("stack_loading") def thread_run(): try: - response = self.ask(self.prompt) + image = self.providers[self.provider].ask(self.prompt, self.negative_prompt) except GLib.Error as e: - response = e.message - GLib.idle_add(cleanup, response) + self.win.banner.set_title(str(e)) + self.win.banner.set_revealed(True) + else: + path = self.providers[self.provider].path(self.path) + GLib.idle_add(cleanup, image, path) - def cleanup(response): + def cleanup(image, path): self.win.spinner.stop() - self.win.ask_button.set_visible(True) - self.win.wait_button.set_visible(False) - self.win.stop_button.set_visible(False) - GLib.idle_add(self.update_response, response) + self.win.stack_imaginer.set_visible_child_name("stack_imagine") self.t.join() - if self.clear_after_send: - self.win.prompt_text_view.get_buffer().set_text("") + if image: + self.win.banner.set_revealed(False) + image.save(path) + self.win.image.set_file(Gio.File.new_for_path(path)) + self.win.image.set_visible(True) + print("Image saved") + else: + print("No image returned") + + self.t = KillableThread(target=thread_run) self.t.start() def on_stop_action(self, widget, _): """Callback for the app.stop action.""" self.win.spinner.stop() - self.win.ask_button.set_visible(True) - self.win.wait_button.set_visible(False) - self.win.stop_button.set_visible(False) + self.win.stack_imaginer.set_visible_child_name("stack_imagine") self.t.kill() self.t.join() - # def on_speak_action(self, widget, _): - # """Callback for the app.speak action.""" - # print("app.speak action activated") - # - # try: - # - # with NamedTemporaryFile() as file_to_play: - # - # tts = gTTS(self.win.bot_text_view.get_buffer().props.text) - # tts.write_to_fp(file_to_play) - # file_to_play.seek(0) - # self._play_audio(file_to_play.name) - # except Exception as exc: - # print(exc) - # - # def _play_audio(self, path): - # uri = "file://" + path - # self.player.set_property("uri", uri) - # self.pipeline.add(self.player) - # self.pipeline.set_state(Gst.State.PLAYING) - # self.player.set_state(Gst.State.PLAYING) - # - # def on_listen_action(self, widget, _): - # """Callback for the app.listen action.""" - # print("app.listen action activated") - def create_action(self, name, callback, shortcuts=None): """Add an application action. @@ -1083,9 +367,19 @@ Providers: {self.enabled_providers} self.add_action(action) if shortcuts: self.set_accels_for_action(f"app.{name}", shortcuts) + + def create_stateful_action(self, name, parameter_type, initial_state, callback, shortcuts=None): + """Add a stateful application action.""" + + action = Gio.SimpleAction.new_stateful( + name, parameter_type, initial_state) + action.connect("activate", callback) + self.add_action(action) + if shortcuts: + self.parent.set_accels_for_action(f"app.{name}", shortcuts) def main(version): """The application's entry point.""" - app = BavarderApplication() + app = ImaginerApplication() return app.run(sys.argv) diff --git a/src/meson.build b/src/meson.build index f9d6f91..3be20f6 100644 --- a/src/meson.build +++ b/src/meson.build @@ -1,12 +1,12 @@ pkgdatadir = join_paths(get_option('prefix'), get_option('datadir'), meson.project_name()) -moduledir = join_paths(pkgdatadir, 'bavarder') +moduledir = join_paths(pkgdatadir, 'imaginer') gnome = import('gnome') python = import('python') configure_file( - input: 'bavarder.in', - output: 'bavarder', + input: 'imaginer.in', + output: 'imaginer', configuration: conf, install: true, install_dir: get_option('bindir'), @@ -21,13 +21,13 @@ configure_file( install_dir: moduledir ) -bavarder_sources = [ +imaginer_sources = [ '__init__.py', 'main.py', 'preferences.py', 'window.py', ] -PY_INSTALLDIR.install_sources(bavarder_sources, subdir: moduledir) +PY_INSTALLDIR.install_sources(imaginer_sources, subdir: moduledir) subdir('provider') \ No newline at end of file diff --git a/src/preferences.py b/src/preferences.py index 3a91549..490ce2b 100644 --- a/src/preferences.py +++ b/src/preferences.py @@ -3,50 +3,19 @@ from gi.repository import Gtk, Adw from .provider import PROVIDERS -@Gtk.Template(resource_path="/io/github/Bavarder/Bavarder/ui/preferences.ui") +@Gtk.Template(resource_path="/page/codeberg/Imaginer/Imaginer/ui/preferences.ui") class Preferences(Adw.PreferencesWindow): __gtype_name__ = "Preferences" - clear_after_send_switch = Gtk.Template.Child() provider_group = Gtk.Template.Child() - use_text_view_switch = Gtk.Template.Child() def __init__(self, application, **kwargs): super().__init__(**kwargs) self.app = application self.settings = application.settings - - self.clear_after_send_switch.set_active(self.app.clear_after_send) - self.clear_after_send_switch.connect( - "notify::active", self.on_clear_after_send_switch_toggled - ) - - self.use_text_view_switch.set_active(self.app.use_text_view) - self.use_text_view_switch.connect( - "notify::active", self.on_use_text_view_switch_toggled - ) - self.setup_providers() - def on_clear_after_send_switch_toggled(self, widget, *args): - """Callback for the clear_after_send_switch toggled event.""" - if widget.get_active(): - self.settings.set_boolean("clear-after-send", True) - self.app.clear_after_send = True - else: - self.settings.set_boolean("clear-after-send", False) - self.app.clear_after_send = False - - def on_use_text_view_switch_toggled(self, widget, *args): - """Callback for the use_text_view_switch toggled event.""" - if widget.get_active(): - self.settings.set_boolean("use-text-view", True) - self.app.use_text_view = True - else: - self.settings.set_boolean("use-text-view", False) - self.app.use_text_view = False - def setup_providers(self): # for provider in self.app.providers.values(): # try: diff --git a/src/provider/__init__.py b/src/provider/__init__.py index 25e8ea1..91e52c0 100644 --- a/src/provider/__init__.py +++ b/src/provider/__init__.py @@ -1,35 +1,19 @@ -from .huggingchat import HuggingChatProvider -from .baichat import BAIChatProvider -from .openaigpt35turbo import OpenAIGPT35TurboProvider -from .openaigpt4 import OpenAIGPT4Provider -from .catgpt import CatGPTProvider -from .openaitextdavinci003 import OpenAITextDavinci003 -from .alpacalora import AlpacaLoRAProvider -from .hfgoogleflant5xxl import HuggingFaceGoogleFlanT5XXLProvider -from .hfgoogleflanu12 import HuggingFaceGoogleFlanU12Provider -from .hfopenassistantsft1pythia12b import HuggingFaceOpenAssistantSFT1PythiaProvider -from .hfgpt2 import HuggingFaceGPT2Provider -from .hfdialogpt import HuggingFaceDialoGPTLargeProvider -from .bard import BardProvider -from .hfgpt2large import HuggingFaceGPT2LargeProvider -from .hfgpt2xl import HuggingFaceGPT2XLProvider -from .starcoder import StarCoderProvider +from .analogdiffusion import AnalogDiffusionProvider +from .anything import AnythingProvider +from .nitrodiffusion import NitroDiffusionProvider +from .openai import OpenAIProvider +from .openjourney import OpenJourneyProvider +from .portraitplus import PortraitPlusProvider +from .stablediffusion import StableDiffusionProvider +from .waifudiffusion import WaifuDiffusionProvider PROVIDERS = { - "alpacalora": AlpacaLoRAProvider, - "baichat": BAIChatProvider, - # "bard": BardProvider, # Disabled because we need more documentation on how to use it - "catgpt": CatGPTProvider, - "hfdialogpt": HuggingFaceDialoGPTLargeProvider, - "hfgoogleflant5xxl": HuggingFaceGoogleFlanT5XXLProvider, - "hfgoogleflanu12": HuggingFaceGoogleFlanU12Provider, - "hfgpt2": HuggingFaceGPT2Provider, - "hfgpt2large": HuggingFaceGPT2LargeProvider, - "hfgpt2xl": HuggingFaceGPT2XLProvider, - "hfopenassistantsft1pythia12b": HuggingFaceOpenAssistantSFT1PythiaProvider, - "huggingchat": HuggingChatProvider, - "openaigpt35turbo": OpenAIGPT35TurboProvider, - "openaigpt4": OpenAIGPT4Provider, - "openaitextdavinci003": OpenAITextDavinci003, - "starcoder": StarCoderProvider, + "analogdiffusion": AnalogDiffusionProvider, + "anything": AnythingProvider, + "nitrodiffusion": NitroDiffusionProvider, + "openai": OpenAIProvider, + "openjourney": OpenJourneyProvider, + "portraitplus": PortraitPlusProvider, + "stablediffusion": StableDiffusionProvider, + "waifudiffusion": WaifuDiffusionProvider, } diff --git a/src/provider/alpacalora.py b/src/provider/alpacalora.py deleted file mode 100644 index 5efba8d..0000000 --- a/src/provider/alpacalora.py +++ /dev/null @@ -1,55 +0,0 @@ -from .base import BavarderProvider - -import socket -import requests - -from gi.repository import Gtk, Adw, GLib - - -class AlpacaLoRAProvider(BavarderProvider): - name = "Alpaca-LoRA" - slug = "alpacalora" - - def __init__(self, win, app, *args, **kwargs): - super().__init__(win, app, *args, **kwargs) - - def ask(self, prompt): - try: - response = requests.post( - "https://tloen-alpaca-lora.hf.space/run/predict", - json={ - "data": [ - prompt, - prompt, - 0.1, - 0.75, - 40, - 4, - 128, - ] - }, - ).json() - except socket.gaierror: - self.no_connection() - return "" - else: - self.win.banner.set_revealed(False) - if "error" in response: - self.win.banner.props.title = response["error"] - self.win.banner.props.button_label = "" - self.win.banner.set_revealed(True) - return "" - else: - r = response["data"][0] - GLib.idle_add(self.update_response, r) - return r - - @property - def require_api_key(self): - return False - - def save(self): - return {} - - def load(self, data): - pass diff --git a/src/provider/analogdiffusion.py b/src/provider/analogdiffusion.py new file mode 100644 index 0000000..76a26a5 --- /dev/null +++ b/src/provider/analogdiffusion.py @@ -0,0 +1,6 @@ +from .huggingface import BaseHFProvider + +class AnalogDiffusionProvider(BaseHFProvider): + name = "Analog Diffusion" + slug = "analogdiffusion" + model = "wavymulder/Analog-Diffusion" \ No newline at end of file diff --git a/src/provider/anything.py b/src/provider/anything.py new file mode 100644 index 0000000..92ba76c --- /dev/null +++ b/src/provider/anything.py @@ -0,0 +1,6 @@ +from .huggingface import BaseHFProvider + +class AnythingProvider(BaseHFProvider): + name = "Anything" + slug = "anything" + model = "andite/anything-v4.0" \ No newline at end of file diff --git a/src/provider/baichat.py b/src/provider/baichat.py deleted file mode 100644 index 2e63c50..0000000 --- a/src/provider/baichat.py +++ /dev/null @@ -1,39 +0,0 @@ -from .base import BavarderProvider - -from baichat_py import BAIChat -import socket - -from gi.repository import Gtk, Adw, GLib - - -class BAIChatProvider(BavarderProvider): - name = "BAI Chat" - slug = "baichat" - - def __init__(self, win, app, *args, **kwargs): - super().__init__(win, app, *args, **kwargs) - self.chat = BAIChat(sync=True) - - def ask(self, prompt): - try: - response = self.chat.sync_ask(prompt) - except KeyError: - self.win.banner.set_revealed(False) - return "" - except socket.gaierror: - self.no_connection() - return "" - else: - self.win.banner.set_revealed(False) - GLib.idle_add(self.update_response, response.text) - return response.text - - @property - def require_api_key(self): - return False - - def save(self): - return {} - - def load(self, data): - pass diff --git a/src/provider/bard.py b/src/provider/bard.py deleted file mode 100644 index a586164..0000000 --- a/src/provider/bard.py +++ /dev/null @@ -1,80 +0,0 @@ -from .base import BavarderProvider - -import socket - -from googlebardpy import BardChat - -from gi.repository import Gtk, Adw, GLib - - -class BardProvider(BavarderProvider): - name = "Bard" - slug = "bard" - version = "0.1.0" - url = "https://bavarder.codeberg.page/docs/providers/bard.html" - - def __init__(self, win, app, *args, **kwargs): - super().__init__(win, app, *args, **kwargs) - self.pref_win = None - - def ask(self, prompt): - try: - response = self.chat.ask(prompt) - response = response["content"] - except AttributeError: - self.no_api_key() - return "" - except socket.gaierror: - self.no_connection() - return "" - else: - self.hide_banner() - GLib.idle_add(self.update_response, response) - return response - - @property - def require_api_key(self): - return True - - def preferences(self, win): - self.pref_win = win - - self.expander = Adw.ExpanderRow() - self.expander.props.title = self.name - - self.expander.add_action(self.about()) - self.expander.add_action(self.enable_switch()) - - self.api_row = Adw.PasswordEntryRow() - self.api_row.connect("apply", self.on_apply) - self.api_row.props.title = "__Secure-1PSID cookie" - self.api_row.set_show_apply_button(True) - self.api_row.add_suffix(self.how_to_get_a_token()) - self.expander.add_row(self.api_row) - - return self.expander - - def on_apply(self, widget): - self.hide_banner() - api_key = self.api_row.get_text() - self.api_key = api_key - try: - self.chat = BardChat(api_key) - except AttributeError: - self.banner.props.title = "Invalid API key" - self.banner.props.button_label = "" - self.banner.set_revealed(True) - - def save(self): - try: - return {"api_key": self.api_key} - except AttributeError: # no api key - return {} - - def load(self, data): - try: - self.chat = BardChat(data["api_key"]) - self.api_key = data["api_key"] - except AttributeError: - self.chat = None - self.api_key = None diff --git a/src/provider/base.py b/src/provider/base.py index 111cb9f..04662dd 100644 --- a/src/provider/base.py +++ b/src/provider/base.py @@ -5,7 +5,7 @@ from gi.repository import Gtk, Adw, GLib import json -class BavarderProvider: +class ImaginerProvider: name = None slug = None description = "" @@ -15,7 +15,7 @@ class BavarderProvider: developers = ["0xMRTT https://github.com/0xMRTT"] license_type = Gtk.License.GPL_3_0 copyright = "© 2023 0xMRTT" - url = "https://bavarder.codeberg.page/help/bard" + url = "https://imaginer.codeberg.page/help/bard" def __init__(self, win, app, *args, **kwargs): @@ -23,11 +23,13 @@ class BavarderProvider: self.banner = win.banner self.app = app self.chat = None - self.update_response = app.update_response - def ask(self, prompt): + def ask(self, prompt, negative_prompt): raise NotImplementedError() + def path(self, path): + return f"{path}-{self.slug}.png" + @property def require_api_key(self): raise NotImplementedError() @@ -77,7 +79,7 @@ class BavarderProvider: popover.set_child(vbox) about_button = Gtk.MenuButton() - about_button.set_icon_name("info-symbolic") + about_button.set_icon_name("dialog-information-symbolic") about_button.set_valign(Gtk.Align.CENTER) about_button.set_popover(popover) return about_button @@ -89,7 +91,7 @@ class BavarderProvider: def how_to_get_a_token(self): about_button = Gtk.Button() - about_button.set_icon_name("info-symbolic") + about_button.set_icon_name("dialog-information-symbolic") about_button.set_tooltip_text("How to get a token?") about_button.add_css_class("flat") about_button.set_valign(Gtk.Align.CENTER) diff --git a/src/provider/catgpt.py b/src/provider/catgpt.py deleted file mode 100644 index b94d0c6..0000000 --- a/src/provider/catgpt.py +++ /dev/null @@ -1,55 +0,0 @@ -from .base import BavarderProvider - -from random import choice, randint - -from gi.repository import Gtk, Adw, GLib - - -class CatGPTProvider(BavarderProvider): - name = _("Cat GPT") - slug = "catgpt" - version = "0.1.0" - - def __init__(self, win, app, *args, **kwargs): - super().__init__(win, app, *args, **kwargs) - self.chat = None - - def ask(self, prompt): - return " ".join([self.pick_generator()() for i in range(randint(1, 12))]) - - def pick_generator(self): - if randint(1, 15) == 1: - return choice( - [ - lambda: "ня" * randint(1, 4), - lambda: "ニャン" * randint(1, 4), - lambda: "喵" * randint(1, 4), - lambda: "ña" * randint(1, 4), - lambda: "ڽا" * randint(1, 4), - lambda: "ম্যাও" * randint(1, 4), - ] - ) - - return choice( - [ - lambda: "meow" * randint(1, 3), - lambda: "mew" * randint(1, 3), - lambda: "miau" * randint(1, 3), - lambda: "miaou" * randint(1, 3), - lambda: "miao" * randint(1, 3), - lambda: "nya" * randint(1, 3), - lambda: "m" + "r" * randint(1, 6) + "p", - lambda: "pur" + "r" * randint(1, 6), - lambda: "nya" * randint(1, 3) + "ny" + "a" * randint(1, 10), - ] - ) - - @property - def require_api_key(self): - return False - - def save(self): - return {} - - def load(self, data): - pass diff --git a/src/provider/hfdialogpt.py b/src/provider/hfdialogpt.py deleted file mode 100644 index 0929126..0000000 --- a/src/provider/hfdialogpt.py +++ /dev/null @@ -1,50 +0,0 @@ -from .huggingface import BaseHFProvider -import json -import socket -import requests - -from gi.repository import Gtk, Adw, GLib - - -class HuggingFaceDialoGPTLargeProvider(BaseHFProvider): - name = "DialoGPT" - slug = "hfdialogpt" - model = "microsoft/DialoGPT-large" - - @property - def require_api_key(self): - return False - - def ask(self, prompt): - try: - payload = json.dumps( - { - "inputs": { - # "past_user_inputs": ["Which movie is the best ?"], - # "generated_responses": ["It's Die Hard for sure."], - "text": prompt - }, - } - ) - headers = {"Content-Type": "application/json"} - if self.authorization: - headers["Authorization"] = f"Bearer {self.api_key}" - url = f"https://api-inference.huggingface.co/models/{self.model}" - print(url) - response = requests.request("POST", url, headers=headers, data=payload) - print(response.json()) - response = response.json()["generated_text"] - - # except NoApikey: - # self.no_api_key() - # return "" - except KeyError: - pass - except socket.gaierror: - self.no_connection() - return "" - else: - self.hide_banner() - print(response) - GLib.idle_add(self.update_response, response) - return response diff --git a/src/provider/hfgoogleflant5xxl.py b/src/provider/hfgoogleflant5xxl.py deleted file mode 100644 index cdb3952..0000000 --- a/src/provider/hfgoogleflant5xxl.py +++ /dev/null @@ -1,11 +0,0 @@ -from .huggingface import BaseHFProvider - - -class HuggingFaceGoogleFlanT5XXLProvider(BaseHFProvider): - name = "Google Flan T5 XXL" - slug = "hfgoogleflant5xxl" - model = "google/flan-t5-xxl" - - @property - def require_api_key(self): - return False diff --git a/src/provider/hfgoogleflanu12.py b/src/provider/hfgoogleflanu12.py deleted file mode 100644 index cc6b6df..0000000 --- a/src/provider/hfgoogleflanu12.py +++ /dev/null @@ -1,11 +0,0 @@ -from .huggingface import BaseHFProvider - - -class HuggingFaceGoogleFlanU12Provider(BaseHFProvider): - name = "Google Flan U12" - slug = "hfgoogleflanu12" - model = "google/flan-ul2" - - @property - def require_api_key(self): - return False diff --git a/src/provider/hfgpt2.py b/src/provider/hfgpt2.py deleted file mode 100644 index e8bbd9f..0000000 --- a/src/provider/hfgpt2.py +++ /dev/null @@ -1,13 +0,0 @@ -from .huggingface import BaseHFProvider - - -class HuggingFaceGPT2Provider(BaseHFProvider): - name = "GPT 2" - slug = "hfgpt2" - model = "gpt2" - description = "GPT-2 is a transformers model pretrained on a very large corpus of English data \nin a self-supervised fashion. This means it was pretrained on the raw texts only,\n with no humans labelling them in any way (which is why it can use lots of publicly available data)\n with an automatic process to generate inputs and labels from those texts. More precisely,\n it was trained to guess the next word in sentences." - languages = "English" - - @property - def require_api_key(self): - return False diff --git a/src/provider/hfgpt2large.py b/src/provider/hfgpt2large.py deleted file mode 100644 index b6dc711..0000000 --- a/src/provider/hfgpt2large.py +++ /dev/null @@ -1,13 +0,0 @@ -from .huggingface import BaseHFProvider - - -class HuggingFaceGPT2LargeProvider(BaseHFProvider): - name = "GPT 2 Large" - slug = "hfgpt2large" - model = "gpt2-large" - description = "GPT-2 is a transformers model pretrained on a very large corpus of English data \nin a self-supervised fashion. This means it was pretrained on the raw texts only,\n with no humans labelling them in any way (which is why it can use lots of publicly available data)\n with an automatic process to generate inputs and labels from those texts. More precisely,\n it was trained to guess the next word in sentences." - languages = "English" - - @property - def require_api_key(self): - return False diff --git a/src/provider/hfgpt2xl.py b/src/provider/hfgpt2xl.py deleted file mode 100644 index 0da5e92..0000000 --- a/src/provider/hfgpt2xl.py +++ /dev/null @@ -1,13 +0,0 @@ -from .huggingface import BaseHFProvider - - -class HuggingFaceGPT2XLProvider(BaseHFProvider): - name = "GPT 2 XL" - slug = "hfgpt2" - model = "gpt2-xl" - description = "GPT-2 is a transformers model pretrained on a very large corpus of English data \nin a self-supervised fashion. This means it was pretrained on the raw texts only,\n with no humans labelling them in any way (which is why it can use lots of publicly available data)\n with an automatic process to generate inputs and labels from those texts. More precisely,\n it was trained to guess the next word in sentences." - languages = "English" - - @property - def require_api_key(self): - return False diff --git a/src/provider/hfopenassistantsft1pythia12b.py b/src/provider/hfopenassistantsft1pythia12b.py deleted file mode 100644 index 62d5f9a..0000000 --- a/src/provider/hfopenassistantsft1pythia12b.py +++ /dev/null @@ -1,11 +0,0 @@ -from .huggingface import BaseHFProvider - - -class HuggingFaceOpenAssistantSFT1PythiaProvider(BaseHFProvider): - name = "Open-Assistant SFT-1 12B Model " - slug = "hfopenassistantsft1pythia12b" - model = "OpenAssistant/oasst-sft-1-pythia-12b" - - @property - def require_api_key(self): - return False diff --git a/src/provider/huggingchat.py b/src/provider/huggingchat.py deleted file mode 100644 index 66bebed..0000000 --- a/src/provider/huggingchat.py +++ /dev/null @@ -1,7 +0,0 @@ -from .huggingchatbase import BaseHuggingChatProvider - - -class HuggingChatProvider(BaseHuggingChatProvider): - name = "Hugging Chat" - slug = "huggingchat" - model = "OpenAssistant/oasst-sft-6-llama-30b-xor" diff --git a/src/provider/huggingchatbase.py b/src/provider/huggingchatbase.py deleted file mode 100644 index 2d76e93..0000000 --- a/src/provider/huggingchatbase.py +++ /dev/null @@ -1,50 +0,0 @@ -from .base import BavarderProvider - -from hgchat import HGChat -import socket - - -from gi.repository import Gtk, Adw, GLib - - -class BaseHuggingChatProvider(BavarderProvider): - name = "Hugging Chat" - slug = "huggingchat" - model = None - - def __init__(self, win, app, *args, **kwargs): - super().__init__(win, app, *args, **kwargs) - self.chat = HGChat(self.model) - - def ask(self, prompt): - try: - response = self.chat.ask(prompt) - except socket.gaierror: - self.no_connection() - return "" - except Exception as e: - self.win.banner.props.title = str(e) - self.win.banner.props.button_label = "" - self.win.banner.set_revealed(True) - return "" - else: - self.win.banner.set_revealed(False) - r = "" - for i in response: - char = i["token"]["text"] - if char == "": - r += "\n" - else: - r += char - GLib.idle_add(self.update_response, r) - return r - - @property - def require_api_key(self): - return False - - def save(self): - return {} - - def load(self, data): - pass diff --git a/src/provider/huggingface.py b/src/provider/huggingface.py index 52cc2e8..a0a9600 100644 --- a/src/provider/huggingface.py +++ b/src/provider/huggingface.py @@ -1,27 +1,33 @@ import requests import json -from .base import BavarderProvider +from .base import ImaginerProvider import socket from gi.repository import Gtk, Adw, GLib +from PIL import Image, UnidentifiedImageError +import io - -class BaseHFProvider(BavarderProvider): +class BaseHFProvider(ImaginerProvider): name = None slug = None model = None - url = "https://bavarder.codeberg.page/help/huggingface" + url = "https://imaginer.codeberg.page/help/huggingface" def __init__(self, win, app, *args, **kwargs): super().__init__(win, app, *args, **kwargs) self.api_key = None - def ask(self, prompt): + def ask(self, prompt, negative_prompt): try: - payload = json.dumps({"inputs": prompt}) + payload = json.dumps( + { + "inputs": prompt, + "negative_prompts": negative_prompt if negative_prompt else "", + } + ) headers = {"Content-Type": "application/json"} - if self.require_api_key: + if self.require_api_key and self.api_key: headers["Authorization"] = f"Bearer {self.api_key}" url = f"https://api-inference.huggingface.co/models/{self.model}" response = requests.request("POST", url, headers=headers, data=payload) @@ -33,25 +39,30 @@ class BaseHFProvider(BavarderProvider): self.win.banner.props.button_label = "" self.win.banner.set_revealed(True) return "" - response = response.json()[0]["generated_text"] - - # except NoApikey: - # self.no_api_key() - # return "" + response = response.content except KeyError: + print("KeyError") pass except socket.gaierror: self.no_connection() return "" else: self.hide_banner() - print(response) - GLib.idle_add(self.update_response, response) - return response + if response: + try: + return Image.open(io.BytesIO(response)) + except UnidentifiedImageError: + error = json.loads(response)["error"] + self.win.banner.set_title(error) + self.win.banner.set_revealed(True) + return None + else: + print("No response") + return None @property def require_api_key(self): - return False + return True def preferences(self, win): if self.require_api_key: diff --git a/src/provider/meson.build b/src/provider/meson.build index 9fb5c6d..83ece9e 100644 --- a/src/provider/meson.build +++ b/src/provider/meson.build @@ -3,26 +3,16 @@ providers_dir = join_paths(moduledir, 'provider') providers_sources = [ '__init__.py', - 'alpacalora.py', - 'baichat.py', - 'bard.py', + 'analogdiffusion.py', + 'anything.py', 'base.py', - 'catgpt.py', - 'hfdialogpt.py', - 'hfgoogleflant5xxl.py', - 'hfgoogleflanu12.py', - 'hfgpt2.py', - 'hfgpt2large.py', - 'hfgpt2xl.py', - 'hfopenassistantsft1pythia12b.py', - 'huggingchat.py', - 'huggingchatbase.py', 'huggingface.py', + 'nitrodiffusion.py', 'openai.py', - 'openaigpt4.py', - 'openaigpt35turbo.py', - 'openaitextdavinci003.py', - 'starcoder.py', + 'openjourney.py', + 'portraitplus.py', + 'stablediffusion.py', + 'waifudiffusion.py' ] PY_INSTALLDIR.install_sources(providers_sources, subdir: providers_dir) diff --git a/src/provider/nitrodiffusion.py b/src/provider/nitrodiffusion.py new file mode 100644 index 0000000..00df06c --- /dev/null +++ b/src/provider/nitrodiffusion.py @@ -0,0 +1,6 @@ +from .huggingface import BaseHFProvider + +class NitroDiffusionProvider(BaseHFProvider): + name = "Nitro Diffusion" + slug = "nitrodiffusion" + model = "nitrosocke/Nitro-Diffusion" \ No newline at end of file diff --git a/src/provider/openai.py b/src/provider/openai.py index 20cedf6..c327ad0 100644 --- a/src/provider/openai.py +++ b/src/provider/openai.py @@ -1,55 +1,44 @@ -from .base import BavarderProvider +from .base import ImaginerProvider import openai import socket from gi.repository import Gtk, Adw, GLib +from PIL import Image, UnidentifiedImageError +import io -class BaseOpenAIProvider(BavarderProvider): - name = None - slug = None - model = None +class OpenAIProvider(ImaginerProvider): + name = "Open AI" + slug = "openai" version = "0.1.0" api_key_title = "API Key" - url = "https://bavarder.codeberg.page/help/openai" + url = "https://imaginer.codeberg.page/help/openai" def __init__(self, win, app, *args, **kwargs): super().__init__(win, app, *args, **kwargs) self.chat = openai.ChatCompletion - self.pref_win = None - def ask(self, prompt): - prompt = self.chunk(prompt) + def ask(self, prompt, negative_prompt): try: - if isinstance(prompt, list): - self.win.banner.props.title = "Prompt too long, splitting into chunks." - self.win.banner.props.button_label = "" - self.win.banner.set_revealed(True) - response = "" - for chunk in prompt: - response += ( - self.chat.create( - model=self.model, - messages=[{"role": "user", "content": chunk}], - ) - .choices[0] - .message.content - ) - else: - response = self.chat.create( - model=self.model, messages=[{"role": "user", "content": prompt}] - ) - response = response.choices[0].message.content + print("Prompt:", prompt) + response = openai.Image.create( + prompt=prompt, n=1, size="1024x1024" + ) + image_url = response["data"][0]["url"] + image_bytes = requests.get(image_url).content except openai.error.AuthenticationError: + print("No API key") self.no_api_key() return "" - except openai.error.InvalidRequestError: - self.win.banner.props.title = "You don't have access to this model" + except openai.error.OpenAIError as e: + print("Invalid request") + self.win.banner.props.title = e.error["message"] self.win.banner.props.button_label = "" self.win.banner.set_revealed(True) return "" except openai.error.RateLimitError: + print("Rate limit") self.win.banner.props.title = "You exceeded your current quota, please check your plan and billing details." self.win.banner.props.button_label = "" self.win.banner.set_revealed(True) @@ -59,8 +48,17 @@ class BaseOpenAIProvider(BavarderProvider): return "" else: self.hide_banner() - GLib.idle_add(self.update_response, response) - return response + if image_bytes: + try: + return Image.open(io.BytesIO(image_bytes)) + except UnidentifiedImageError: + error = json.loads(image_bytes)["error"] + self.win.banner.set_title(error) + self.win.banner.set_revealed(True) + return None + else: + return None + @property def require_api_key(self): diff --git a/src/provider/openaigpt35turbo.py b/src/provider/openaigpt35turbo.py deleted file mode 100644 index f7e81b5..0000000 --- a/src/provider/openaigpt35turbo.py +++ /dev/null @@ -1,7 +0,0 @@ -from .openai import BaseOpenAIProvider - - -class OpenAIGPT35TurboProvider(BaseOpenAIProvider): - name = "OpenAI GPT 3.5 Turbo" - slug = "openaigpt35turbo" - model = "gpt-3.5-turbo" diff --git a/src/provider/openaigpt4.py b/src/provider/openaigpt4.py deleted file mode 100644 index 30b7ee1..0000000 --- a/src/provider/openaigpt4.py +++ /dev/null @@ -1,8 +0,0 @@ -from .openai import BaseOpenAIProvider - - -class OpenAIGPT4Provider(BaseOpenAIProvider): - name = "OpenAI GPT 4" - slug = "openaigpt4" - model = "gpt-4" - api_key_title = "API Key (Require a plan with access to the GPT-4 model)" diff --git a/src/provider/openaitextdavinci003.py b/src/provider/openaitextdavinci003.py deleted file mode 100644 index 710de86..0000000 --- a/src/provider/openaitextdavinci003.py +++ /dev/null @@ -1,7 +0,0 @@ -from .openai import BaseOpenAIProvider - - -class OpenAITextDavinci003(BaseOpenAIProvider): - name = "OpenAI Text Davinci 003" - slug = "openaitextdavinci003" - model = "text-davinci-003" diff --git a/src/provider/openjourney.py b/src/provider/openjourney.py new file mode 100644 index 0000000..e26498d --- /dev/null +++ b/src/provider/openjourney.py @@ -0,0 +1,6 @@ +from .huggingface import BaseHFProvider + +class OpenJourneyProvider(BaseHFProvider): + name = "Open Journey" + slug = "openjourney" + model = "prompthero/openjourney-v4" \ No newline at end of file diff --git a/src/provider/portraitplus.py b/src/provider/portraitplus.py new file mode 100644 index 0000000..7006112 --- /dev/null +++ b/src/provider/portraitplus.py @@ -0,0 +1,6 @@ +from .huggingface import BaseHFProvider + +class PortraitPlusProvider(BaseHFProvider): + name = "Portrail Plus" + slug = "portrailplus" + model = "wavymulder/portraitplus" \ No newline at end of file diff --git a/src/provider/stablediffusion.py b/src/provider/stablediffusion.py new file mode 100644 index 0000000..ccaef70 --- /dev/null +++ b/src/provider/stablediffusion.py @@ -0,0 +1,6 @@ +from .huggingface import BaseHFProvider + +class StableDiffusionProvider(BaseHFProvider): + name = "Stable Diffusion" + slug = "stablediffusion" + model = "stabilityai/stable-diffusion-2-1" \ No newline at end of file diff --git a/src/provider/starcoder.py b/src/provider/starcoder.py deleted file mode 100644 index 38db554..0000000 --- a/src/provider/starcoder.py +++ /dev/null @@ -1,7 +0,0 @@ -from .huggingchatbase import BaseHuggingChatProvider - - -class StarCoderProvider(BaseHuggingChatProvider): - name = "Star Coder" - slug = "starcoder" - model = "bigcode/starcoder" diff --git a/src/provider/waifudiffusion.py b/src/provider/waifudiffusion.py new file mode 100644 index 0000000..0bd7493 --- /dev/null +++ b/src/provider/waifudiffusion.py @@ -0,0 +1,6 @@ +from .huggingface import BaseHFProvider + +class WaifuDiffusionProvider(BaseHFProvider): + name = "Waifu Diffusion" + slug = "waifudiffusion" + model = "hakurei/waifu-diffusion" \ No newline at end of file diff --git a/src/window.py b/src/window.py index efc17aa..ff7ae0a 100644 --- a/src/window.py +++ b/src/window.py @@ -21,32 +21,26 @@ from gi.repository import Adw from gi.repository import Gtk, Gio -@Gtk.Template(resource_path="/io/github/Bavarder/Bavarder/ui/window.ui") -class BavarderWindow(Adw.ApplicationWindow): - __gtype_name__ = "BavarderWindow" +@Gtk.Template(resource_path="/page/codeberg/Imaginer/Imaginer/ui/window.ui") +class ImaginerWindow(Adw.ApplicationWindow): + __gtype_name__ = "ImaginerWindow" toast_overlay = Gtk.Template.Child() - prompt_text_view = Gtk.Template.Child() - spinner = Gtk.Template.Child() - ask_button = Gtk.Template.Child() - wait_button = Gtk.Template.Child() - scrolled_response_window = Gtk.Template.Child() - bot_text_view = Gtk.Template.Child() - response_stack = Gtk.Template.Child() banner = Gtk.Template.Child() - stop_button = Gtk.Template.Child() - # listen = Gtk.Template.Child() - # listen_wait = Gtk.Template.Child() - # listen_spinner = Gtk.Template.Child() - # speak = Gtk.Template.Child() - # speak_wait = Gtk.Template.Child() - # speak_spinner = Gtk.Template.Child() - provider_selector = Gtk.Template.Child() + main = Gtk.Template.Child() + stack_imaginer = Gtk.Template.Child() + image = Gtk.Template.Child() + button_output = Gtk.Template.Child() + button_imagine = Gtk.Template.Child() + spinner = Gtk.Template.Child() + prompt = Gtk.Template.Child() + negative_prompt = Gtk.Template.Child() + menu = Gtk.Template.Child() def __init__(self, **kwargs): super().__init__(**kwargs) - self.settings = Gio.Settings(schema_id="io.github.Bavarder.Bavarder") + self.settings = Gio.Settings(schema_id="page.codeberg.Imaginer.Imaginer") self.settings.bind( "width", self, "default-width", Gio.SettingsBindFlags.DEFAULT