Compare commits

..

2 commits

Author SHA1 Message Date
Vladimir Vaskov
4074ac4dfe
submodule: remove 2024-09-30 22:24:48 +03:00
Vladimir Vaskov
b1a7049d46
metainfo: set images from tag 2024-09-30 21:57:57 +03:00
239 changed files with 4500 additions and 16471 deletions

1
.envrc
View file

@ -1 +0,0 @@
use flake

83
.github/workflows/CI-PR.yml vendored Normal file
View file

@ -0,0 +1,83 @@
name: CI Pull Request
on:
pull_request:
permissions:
contents: read
pull-requests: read
jobs:
lint-vala:
name: Lint vala files
runs-on: ubuntu-latest
container:
image: valalang/lint
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Lint Vala
run: io.elementary.vala-lint -d . -c vala-lint.conf
lint-blp:
name: Lint blueprint ui files
runs-on: ubuntu-latest
needs: lint-vala
container:
image: ubuntu:latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Update apt cache
run: apt-get update
- name: Install blueprint-compiler Blueptint
run: apt-get install -y blueprint-compiler
- name: Lint Blueprint
run: blueprint-compiler format -s 2 data/ui/*.blp
checkers:
name: Run checkers
runs-on: ubuntu-latest
needs: lint-blp
container:
image: ubuntu:latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
# - name: Run indentation checker
# run: python3 .checkers/indentation_checker.py
# - name: Run empty lines checker
# run: python3 .checkers/empty_lines_checker.py
test-build:
name: Test Build
runs-on: ubuntu-latest
needs: checkers
container:
image: bilelmoussaoui/flatpak-github-actions:gnome-nightly
options: --privileged
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Run tests and lint
uses: flatpak/flatpak-github-actions/flatpak-builder@v6
with:
bundle: cassette.flatpak
manifest-path: build-aux/flatpak/nightly/io.github.Rirusha.Cassette-Devel.json
run-tests: true
cache-key: flatpak-builder-${{ github.sha }}

135
.github/workflows/CI-master.yml vendored Normal file
View file

@ -0,0 +1,135 @@
name: CI master
on:
workflow_dispatch:
push:
branches:
- 'master'
jobs:
lint-vala:
name: Lint vala files
runs-on: ubuntu-latest
container:
image: valalang/lint
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Lint Vala
run: io.elementary.vala-lint -d . -c vala-lint.conf
lint-blp:
name: Lint blueprint ui files
runs-on: ubuntu-latest
needs: lint-vala
container:
image: ubuntu:latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Update apt cache
run: apt-get update
- name: Install blueprint-compiler Blueptint
run: apt-get install -y blueprint-compiler
- name: Lint Blueprint
run: blueprint-compiler format -s 2 data/ui/*.blp
checkers:
name: Run checkers
runs-on: ubuntu-latest
needs: lint-blp
container:
image: ubuntu:latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
# - name: Run indentation checker
# run: python3 .checkers/indentation_checker.py
# - name: Run empty lines checker
# run: python3 .checkers/empty_lines_checker.py
flatter:
name: Build Repo
runs-on: ubuntu-latest
needs: checkers
container:
image: ghcr.io/andyholmes/flatter/gnome:master
options: --privileged
strategy:
matrix:
arch: [aarch64, x86_64]
fail-fast: false
max-parallel: 1
steps:
- name: Checkout
uses: actions/checkout@v4
# - name: Set up Flatpak
# run: |
# dnf update -y
# dnf install -y flatpak
# flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
# flatpak update -y
# - name: Install org.freedesktop.Sdk.Extension.vala-nightly
# run: |
# flatpak install -y org.freedesktop.Sdk.Extension.vala-nightly//23.08
- name: Setup QEMU
if: ${{ matrix.arch == 'aarch64' }}
id: qemu
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Setup GPG
id: gpg
uses: crazy-max/ghaction-import-gpg@v6
with:
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
passphrase: ${{ secrets.GPG_PASSPHRASE }}
- name: Build
uses: andyholmes/flatter@main
with:
files: |
build-aux/flatpak/nightly/io.github.Rirusha.Cassette-Devel.json
arch: ${{ matrix.arch }}
gpg-sign: ${{ steps.gpg.outputs.fingerprint }}
upload-bundles: true
run-tests: true
upload-pages-artifact: ${{ matrix.arch == 'x86_64' }}
deploy:
name: Deploy
runs-on: ubuntu-latest
needs: flatter
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: GitHub Pages
id: deployment
uses: actions/deploy-pages@v4

16
.gitignore vendored
View file

@ -1,13 +1,11 @@
# build dir
_build
builddir*
# nix
result
.direnv
# Codium
# Workspaces
*.code-workspace
.vscode/settings.json
# Personal scripts
my.*
# Po
*.mo
@ -18,3 +16,7 @@ po/cassette.pot
build-dir
repo
.flatpak
_build
# gh
settings.json

View file

@ -1,201 +0,0 @@
include:
- project: 'gnome/citemplates'
file: 'flatpak/flatpak_ci_initiative.yml'
- project: 'Rirusha/citemplates'
file: 'lints.yml'
- project: 'Rirusha/citemplates'
file: 'vala-checkers.yml'
variables:
APP_ID: 'space.rirusha.Cassette.Devel'
MANIFEST_PATH: $CI_PROJECT_DIR/build-aux/flatpak/${APP_ID}.yml
BUNDLE: "${APP_ID}.flatpak"
RUNTIME_REPO: "https://nightly.gnome.org/gnome-nightly.flatpakrepo"
FLATPAK_MODULE: "cassette"
stages:
- lint-vala
- lint-blp
- lint-checkers
- test-mr
- build-aarch64
- build-x86_64
- deploy
- deploy-sithyfus
- update-repo
# lint-vala:
# stage: 'lint-vala'
# extends: '.lint-vala'
# lint-blp:
# stage: 'lint-blp'
# extends: '.lint-blp'
# lint-checkers:
# stage: 'lint-checkers'
# extends: '.lint-checkers'
test-mr:
variables:
RUN_TESTS: "0"
stage: 'test-mr'
extends: '.flatpak'
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
.setup-gpg:
image: 'quay.io/gnome_infrastructure/gnome-runtime-images:gnome-master'
stage: 'setup-gpg'
tags:
- flatpak
before_script:
- mkdir -p ${GNUPGHOME}
- gpg --list-keys --with-keygrip
- touch ${GNUPGHOME}/gpg.conf
- touch ${GNUPGHOME}/gpg-agent.conf
- echo "allow-preset-passphrase" >> ${GNUPGHOME}/gpg-agent.conf
- echo "pinentry-mode loopback" >> ${GNUPGHOME}/gpg.conf
- echo "batch" >> ${GNUPGHOME}/gpg.conf
- echo "yes" >> ${GNUPGHOME}/gpg.conf
- echo "passphrase-file ${GPG_PASSPHRASE}" >> ${GNUPGHOME}/gpg.conf
- gpg-connect-agent reloadagent /bye
- cat ${GPG_PASSPHRASE} | /usr/libexec/gpg-preset-passphrase --preset ${GPG_KEY_GREP}
- base64 -d ${GPG_PRIVATE_KEY} | gpg --import
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == 'push'
.build:
extends: '.setup-gpg'
stage: 'build'
interruptible: true
variables:
GNUPGHOME: /build/.gnupg
LANG: "C.UTF-8"
RUN_TESTS: "0"
ARCH: x86_64
script:
- cat /etc/os-release
- flatpak --version
# Report the installed versions of the runtime
- flatpak info org.gnome.Platform
- flatpak info org.gnome.Sdk
# Print the date, since appstream depends on local timezone
- date && date -u
- |
export REWRITE_RUN_TESTS="--run-tests"
if [[ $RUN_TESTS != "1" ]]; then
export REWRITE_RUN_TESTS="--no-run-tests"
fi
rewrite-flatpak-manifest ${REWRITE_RUN_TESTS} ${MANIFEST_PATH} ${FLATPAK_MODULE} -- ${CONFIG_OPTS}
- |
if [ ${ARCH} = "x86_64" ]; then
tar xf repo.tar
rm -rf repo.tar
fi
- >-
xvfb-run -a -s "-screen 0 1024x768x24" --
dbus-run-session
flatpak-builder ${CI_FB_ARGS} --keep-build-dirs --arch=${ARCH} --user --gpg-sign=${GPG_KEY_ID} --gpg-homedir=${GNUPGHOME} --disable-rofiles-fuse flatpak_app --repo=repo ${BRANCH:+--default-branch=$BRANCH} ${MANIFEST_PATH}
# Generate a Flatpak bundle
- flatpak build-bundle --runtime-repo=${RUNTIME_REPO} --gpg-sign=${GPG_KEY_ID} --gpg-homedir=${GNUPGHOME} repo ${BUNDLE} ${APP_ID} ${BRANCH}
- echo "[Flatpak Repo]" > repo/index.flatpakrepo
- echo "Title=Cassette Nightly Repo" >> repo/index.flatpakrepo
- echo "Url=https://cassette-rirusha-7b5d032b879376545602ad6add1827529edccbba8e6c57.pages.gitlab.gnome.org/" >> repo/index.flatpakrepo
- echo "Homepage=https://https://gitlab.gnome.org/Rirusha/Cassette/" >> repo/index.flatpakrepo
- echo "Comment=Repository with development version of Cassette" >> repo/index.flatpakrepo
- echo "Description=Repository with development version of Cassette" >> repo/index.flatpakrepo
- echo "Icon=https://dl.flathub.org/repo/logo.svg" >> repo/index.flatpakrepo
- echo "GPGKey=$(gpg --export ${GPG_KEY_ID} | base64 --wrap=0)" >> repo/index.flatpakrepo
- flatpak build-update-repo --gpg-sign=${GPG_KEY_ID} --gpg-homedir=${GNUPGHOME} --generate-static-deltas --prune repo
- tar cf repo.tar repo/
- rm -rf .flatpak-builder
artifacts:
name: 'Flatpak artifacts'
when: 'always'
paths:
- $BUNDLE
- 'repo.tar'
- '.flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/meson-logs/meson-log.txt'
- '.flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/meson-logs/testlog.txt'
reports:
junit: '.flatpak-builder/build/${FLATPAK_MODULE}/_flatpak_build/meson-logs/testlog.junit.xml'
expire_in: 14 days
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == 'push'
build-x86_64:
extends: '.build'
variables:
ARCH: x86_64
dependencies:
- "build-aarch64"
tags:
- flatpak
stage: "build-x86_64"
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == 'push'
# Need to fix `Error: module cassette: Error removing file /builds/Rirusha/cassette-test-ci/.flatpak-builder/build/cassette: Directory not empty`
build-aarch64:
extends: '.build'
variables:
ARCH: aarch64
tags:
- flatpak-aarch64
stage: "build-aarch64"
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == 'push'
pages:
variables:
BUILD_OUTPUT_PATH: $CI_PROJECT_DIR/repo
stage: deploy
image: alpine:latest
dependencies:
- "build-x86_64"
script:
- apk add rsync
- tar xf repo.tar
- find $BUILD_OUTPUT_PATH \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i -e "s#href=\"\/#href=\"$CI_PAGES_URL/#g" -e "s#src=\"\/#src=\"$CI_PAGES_URL/#g"
- mkdir public || true
- rsync -av --exclude='public' --exclude='.git' $BUILD_OUTPUT_PATH/ public
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == 'push'
artifacts:
paths:
- public
expire_in: 14 days
update-repo:
stage: update-repo
image: alpine:latest
dependencies:
- "build-x86_64"
script:
- tar xf repo.tar
- apk add git
- git clone https://Rirusha:${GITHUB_TOKEN}@github.com/Rirusha/rirusha.space.git
- rm -f rirusha.space/repos/cassette-nightly.flatpakrepo && cp repo/index.flatpakrepo rirusha.space/repos/cassette-nightly.flatpakrepo
- cd rirusha.space
- git add .
- echo $(git status --porcelain)
- git config --global user.email "not-a@mail.com"
- git config --global user.name "Updater Bot"
- git commit -m "Update cassette-nightly repo" || true
- git push
- cd ..
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE == 'push'

3
.gitmodules vendored
View file

@ -1,3 +0,0 @@
[submodule "vala-checkers"]
path = vala-checkers
url = https://gitlab.gnome.org/Rirusha/vala-checkers.git

3
.vscode/gdb.sh vendored Executable file
View file

@ -0,0 +1,3 @@
#!/bin/sh
flatpak build --with-appdir --allow=devel --bind-mount=/run/user/1000/doc=/run/user/1000/doc/by-app/io.github.Rirusha.Cassette-Devel --share=network --share=ipc --socket=fallback-x11 --socket=wayland --device=dri --socket=pulseaudio --filesystem=xdg-music:ro --filesystem=xdg-download:ro --talk-name=org.mpris.MediaPlayer2.Player --own-name=org.mpris.MediaPlayer2.cassette .flatpak/repo gdb "$@"

19
.vscode/launch.json vendored Normal file
View file

@ -0,0 +1,19 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Debug",
"type": "gdb",
"request": "launch",
"preLaunchTask": "Flatpak launch build",
"gdbpath": "${workspaceRoot}/.vscode/gdb.sh",
"target": "${workspaceRoot}/_build/src/cassette",
"arguments": "",
"cwd": "${workspaceRoot}",
"valuesFormatting": "parseText"
},
]
}

14
.vscode/tasks.json vendored
View file

@ -12,19 +12,19 @@
{
"label": "Empty lines check",
"type": "shell",
"command": "python3 ${workspaceFolder}/vala-checkers/empty_lines_checker.py .",
"command": "python3 ${workspaceFolder}/checkers/empty_lines_checker.py .",
"problemMatcher": []
},
{
"label": "Indentation check",
"type": "shell",
"command": "python3 ${workspaceFolder}/vala-checkers/indentation_checker.py .",
"command": "python3 ${workspaceFolder}/checkers/indentation_checker.py .",
"problemMatcher": []
},
{
"label": "Full check",
"type": "shell",
"command": "echo 'Linter:' && io.elementary.vala-lint -d . -c vala-lint.conf && echo 'Empty lines:' && python3 ${workspaceFolder}/vala-checkers/empty_lines_checker.py . && echo 'Indentation:' && python3 ${workspaceFolder}/vala-checkers/indentation_checker.py .",
"command": "io.elementary.vala-lint -d . -c vala-lint.conf && python3 ${workspaceFolder}/checkers/empty_lines_checker.py . && python3 ${workspaceFolder}/checkers/indentation_checker.py .",
"problemMatcher": []
},
{
@ -39,6 +39,12 @@
"command": "blueprint-compiler format -f -s 2 data/ui/*.blp",
"problemMatcher": []
},
{
"label": "Generate .pot",
"type": "shell",
"command": "sh po/update_potfiles.sh && flatpak run --command=meson --filesystem=host org.gnome.Sdk compile -C _build cassette-pot",
"problemMatcher": []
},
{
"label": "Run tests",
"type": "shell",
@ -50,4 +56,4 @@
"problemMatcher": []
}
]
}
}

View file

@ -1,61 +0,0 @@
## How to contribute
If you don't know what to do, then:
* All scheduled tasks are in the issue section and have the "enhancement" label.
* All known problems are in the same place and have a "bug" label.
Choose tasks from the nearest versions. You can find a list of them [here](https://github.com/Rirusha/Cassette/milestones). This will both speed up the release of the next version and facilitate the review, so you will not need to switch from one global problem to another.
Also, if you decide to fix some bug described in the issue, first make sure that it can still be reproduced in the `main` branch.
Also, if you think that the application is missing something or you have found a bug, then do not hesitate to create an issue.
## Naming commits
The message header should look like:
```
feat: add a play button to the `Widget name`
The button was missing, so it had to be added
```
This is an example. The rules are described in more detail [here](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional). Also, the message body is optional if the information in the header is exhaustive. Also here is a list of all types of commits with descriptions:
* `build`: Used for changes related to the system build or external dependencies.
* `chore`: Usually includes changes that are not directly related to the code or tests, for example, updating documentation, configuring the development environment, upgrading the version, etc.
* `ci`: Refers to changes related to configuring or improving CI.
* `docs`: Used for changes related only to documentation, such as correcting typos, updating the README, or adding comments to the code.
* `feat`: Indicates the addition of new functionality or features to the project.
* `fix`: Refers to fixing errors in the code or fixing problems in the project.
* `perf`: Used when changes are made to improve performance.
* `refactor`: Refers to changes that do not add new functionality, but only change the structure or organization of existing code.
* `revert`: Used to undo previous commits in the project history.
* `style`: Refers to changes in the formatting of the code, for example, edits of spaces, indents, line breaks, etc.
* `test`: Used to add or modify test code, for example, testing new functionality or correcting existing tests.
* `po`: Used to add or change a translation.
## Creating Pull Requests
All Pull Requests must be made in the `master` branch. If you close an issue, then link to it with the keyword "close" in the commit body, for example:
```
fix: fix incorrect behavior
close #123
```
## Formatting the code
If you are using Visual Studio Code, then there is a task to run the linter. Otherwise, use the configuration in the root of the repository in the linter: vala-lint.conf, CI uses it exactly.
## Development
Check the build using flatpak, as this is the only officially supported version.
## Testing
Writing or supplementing existing tests for the client is highly welcome.

227
README.md
View file

@ -1,52 +1,56 @@
README language: \
[![En](https://img.shields.io/badge/en-green)](README.md)
[![Ru](https://img.shields.io/badge/ru-gray)](docs/README-ru.md)
<h1 align="center">
<img src="data/icons/hicolor/scalable/apps/io.github.Rirusha.Cassette.svg" alt="Cassette"/>
<br/>
Cassette
</h1>
<div align="center">
<h1>
<img
src="data/icons/hicolor/scalable/apps/space.rirusha.Cassette.svg"
height="64"
/>
Cassette
</h1>
<p align="center">
GTK4/Adwaita приложение, которое позволит вам использовать Я.Музыку на Linux.
</p>
<br/>
<p align="center">
<a href="https://flathub.org/apps/details/io.github.Rirusha.Cassette">
<img width="200" src="https://flathub.org/assets/badges/flathub-badge-en.png" alt="Download on Flathub">
</a>
<br>
<br>
<a href="https://stopthemingmy.app">
<img src="https://stopthemingmy.app/badge.svg"/>
</a>
<br>
<a href="https://t.me/CassetteGNOME_Devlog">
<img alt="Static Badge" src="https://img.shields.io/badge/Channel-blue?style=flat&logo=telegram">
<img alt="tg" src="https://img.shields.io/badge/Telegram-Channel-blue?style=flat&logo=telegram&label=%20&labelColor=blue">
</a>
<a href="https://t.me/CassetteGNOME_Devlog">
<img alt="Static Badge" src="https://img.shields.io/badge/Chat-blue?style=flat&logo=telegram">
<br>
<a href="https://t.me/CassetteGNOME_Discussion">
<img alt="tg" src="https://img.shields.io/badge/Telegram-Chat-blue?style=flat&logo=telegram&label=%20&labelColor=blue">
</a>
</div>
</p>
<div align="center"><h4>GTK4/Adwaita application that allows you to use Yandex Music service on Linux operating systems.</h4></div>
<p align="center">
<img src="data/images/1-liked.png" alt="Screenshot"/>
</p>
<div align="center">
<img src="data/images/1-liked-view.png" alt="Preview"/>
</div>
## Install
## План основных версий
[![GitHub milestone details](https://img.shields.io/github/milestones/progress-percent/Rirusha/Cassette/2?label=0.2.0%20-%20%D0%9C%D0%BE%D1%8F%20%D0%B2%D0%BE%D0%BB%D0%BD%D0%B0)](https://github.com/Rirusha/Cassette/milestone/2) \
[![GitHub milestone details](https://img.shields.io/github/milestones/progress-percent/Rirusha/Cassette/5?label=0.2.1%20-%20%D0%A3%D0%BB%D1%83%D1%87%D1%88%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B1%D1%8D%D0%BA%D0%B5%D0%BD%D0%B4%D0%B0%20%D0%B8%20%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F)](https://github.com/Rirusha/Cassette/milestone/5) \
[![GitHub milestone details](https://img.shields.io/github/milestones/progress-percent/Rirusha/Cassette/4?label=0.2.2%20-%20%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D0%BD%D0%B0%D0%B4%20%D0%B0%D0%B4%D0%B0%D0%BF%D1%82%D0%B8%D0%B2%D0%BD%D0%BE%D1%81%D1%82%D1%8C%D1%8E)](https://github.com/Rirusha/Cassette/milestone/4) \
[![GitHub milestone details](https://img.shields.io/github/milestones/progress-percent/Rirusha/Cassette/6?label=0.3.0%20-%20%D0%9F%D0%BE%D0%BA%D0%B0%D0%B7%20%D0%B0%D0%BB%D1%8C%D0%B1%D0%BE%D0%BC%D0%BE%D0%B2%20%D0%B8%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D0%B5%D0%B9)](https://github.com/Rirusha/Cassette/milestone/6) \
[![GitHub milestone details](https://img.shields.io/github/milestones/progress-percent/Rirusha/Cassette/7?label=0.4.0%20-%20%D0%A0%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%20%D0%BF%D0%BE%20%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%D1%83)](https://github.com/Rirusha/Cassette/milestone/7)
**Flathub:**
Все запланированные фичи можете [посмотреть в бэклоге](https://github.com/users/Rirusha/projects/2)
<a href="https://flathub.org/apps/details/space.rirusha.Cassette">
<img width='240' alt='Download on Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.svg'/>
</a>
```shell
flatpak install space.rirusha.Cassette
```
## Установка из репозитория
**Distribution repositories:**
Приложение Cassette доступно здесь:
[![Packaging status](https://repology.org/badge/vertical-allrepos/cassette.svg)](https://repology.org/project/cassette/versions)
### ALT Linux
### ALT Sisyphus
```shell
su -
apt-get install cassette
@ -54,7 +58,8 @@ apt-get install cassette
### Arch Linux
> Most AUR Helpers support Pacman-style flags, for example, yay.
> [!NOTE]
> Большинство AUR Helper'ов поддерживает Pacman-style флаги, например, yay.
#### yay
```shell
@ -66,15 +71,66 @@ yay -S cassette
pamac install cassette
```
### NixOS Unstable
## Установка c помощью Flatpak
Вы можете скачать по [ссылке](https://flathub.org/apps/details/io.github.Rirusha.Cassette) или используя терминал
```shell
nix-shell -p cassette
flatpak install io.github.Rirusha.Cassette
```
## Building
#### Dependencies:
## Nightly версия
> [!WARNING]
> Данная версия собирается и обновляется при каждом изменение в коде, поэтому может оказаться нестабильной.
### Flatpak
#### Подключаем репозиторий `gnome-nightly` и устанавливаем GNOME Platform:
```shell
flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
flatpak install gnome-nightly org.gnome.Platform//master
```
#### Подключаем Nightly репозиторий и устанавливаем приложение:
```shell
flatpak remote-add --if-not-exists cassette-nightly https://rirusha.github.io/Cassette/index.flatpakrepo
flatpak install cassette-nightly io.github.Rirusha.Cassette-Devel
```
#### Для удаления репозитория нужно выполнить:
```shell
flatpak remote-delete cassette-nightly
```
### Arch Linux
> [!NOTE]
> При необходимости, в arch-подобных системах можно установить Nightly версию из репозитория AUR.
> По возможности рекомендуется использовать Flatpak версию.
>
> Большинство AUR Helper'ов поддерживает Pacman-style флаги, например, yay.
#### yay
```shell
yay -S cassette-git
```
#### pamac
```shell
pamac install cassette-git
```
## Установка в Windows
Способы установки приложения в Windows описаны [здесь](docs/INSTALLATION_ON_WINDOWS.md).
## Сборка из исходного кода
#### Зависимости:
* `gtk4`, version: `>= 4.14`
* `libadwaita-1`, version: `>= 1.5`
* `libsoup-3.0`
@ -86,10 +142,9 @@ nix-shell -p cassette
* `gstreamer-1.0`
* `webkitgtk-6.0`
* `gio-2.0`, version: `>= 2.72`
* `git`, only for `devel`
#### Building utilities:
* `git`, только для `devel`
#### Утилиты для сборки:
* `meson`
* `ninja`
* `cmake`
@ -99,96 +154,92 @@ nix-shell -p cassette
* `pkg`
* `appstream-utils`
### PreRelease
### Сборка:
> Unstable features under development will not be available in this version.
#### latest
> [!NOTE]
> В данной версии будут недоступны нестабильные функции, находящиеся в разработке.
```shell
meson setup _build
meson setup builddir
```
### `is_devel` flag
> In this version, all devel functions will be available.
#### devel
> [!WARNING]
> В данной версии будут доступны все devel функции, приложение может работать нестабильно.
```shell
meson setup _build -Dis_devel=true
meson setup builddir
meson configure -Dprofile=development builddir
```
#### Install
### Тестирование
```shell
sudo ninja install -C _build
ninja -C builddir test
```
#### Testing
### Установка:
```shell
ninja -C _build test
sudo ninja -C builddir install
```
#### Uninstal
### Удаление:
```shell
sudo ninja uninstall -C _build
sudo ninja -C builddir uninstall
```
## Devel version
> This version is built and updated with every commit, so it may be unstable.
## Решение проблем
You need to add `cassette-nightly` and `gnome-nightly` repositories:
Решение известных проблем описано на странице Cassette на [ALT Gnome Wiki](https://alt-gnome.wiki/cassette.html#решение-проблем).
```shell
flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
flatpak remote-add --if-not-exists cassette-nightly https://rirusha.space/repos/cassette-nightly.flatpakrepo
```
Также загляните во вкладку [issues](https://github.com/Rirusha/Cassette/issues), если вашей проблемы нет и там, расскажите о ней, заведя новый [issue](https://github.com/Rirusha/Cassette/issues/new).
Install application:
```shell
flatpak install cassette-nightly space.rirusha.Cassette.Devel
```
## Для разработчиков
## For developers
### Использование Visual Studio Code
Репозиторий имеет рекомендуемые расширения для проверки и запуска приложения с gdb.
> The repository has recommended extensions for developing with Visual Studio Code.
### Зависимости
### Dependencies
#### repository [gnome-nightly](https://wiki.gnome.org/Apps/Nightly):
#### репозиторий [gnome-nightly](https://wiki.gnome.org/Apps/Nightly):
```shell
flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
```
#### To run
#### Для запуска
`org.gnome.Platform//master`
```shell
flatpak install org.gnome.Platform//master
```
#### To build
#### Для сборки
`org.gnome.Sdk//master` \
`org.freedesktop.Sdk.Extension.vala//23.08beta`
```shell
flatpak install org.gnome.Sdk//master org.freedesktop.Sdk.Extension.vala//23.08beta
```
## Support
You can support in several ways:
- Create an issue with a problem or a suggestion for improvement
- Submit a merge request with a fix or new functionality
- Support financially (Please include your nickname in the "Message to the recipient" when sending via T-Bank)
## Поддержка
Вы можете поддержать несколькими способами:
- Создать ишью с проблемой или предложением по улучшению
- Отправить pull request с фиксом или добавлением функционала
- Поддержать рублём (Просьба указывать в "Сообщении получателю" свой никнейм при отправлении через Тинькофф):
<br>
<p>
<a href="https://www.tinkoff.ru/cf/21GCxLuFuE9">
<img height="36" src="https://github.com/Rirusha/Cassette/assets/95986183/87496207-aa1c-40fc-a511-57bac188bc72" alt="Tinkoff">
</a>
</p>
<p>
<a href="https://boosty.to/rirusha/donate">
<img height="36" src="https://github.com/Rirusha/Cassette/assets/95986183/313ee5af-d374-4f95-af62-9445d1c27347" alt="boosty.to">
</a>
</p>
<div align="center">
<a href="https://www.tbank.ru/cf/21GCxLuFuE9" style="margin-right: 100px;">
<img height="200" src="assets/tbank.png" alt="Tinkoff">
</a>
<a href="https://boosty.to/rirusha/donate">
<img height="200" src="assets/boosty.png" alt="boosty.to">
</a>
</div>
## Gratitude
Thank you [MarshalX](https://github.com/MarshalX ). The [yandex-music-api](https://github.com/MarshalX/yandex-music-api) library was used as api documentation.
## Благодарность
Спасибо [MarshalX](https://github.com/MarshalX). Библиотека [yandex-music-api](https://github.com/MarshalX/yandex-music-api) была использована в качестве документации к api.
> Attention!
> Cassette is an unofficial client, not affiliated with Yandex and not approved by it.
> [!NOTE]
Cassette - неофициальный клиент, не связан с компанией Яндекс и не одобрен ей.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 258 KiB

View file

@ -0,0 +1,61 @@
{
"id" : "io.github.Rirusha.Cassette-Devel",
"runtime" : "org.gnome.Platform",
"runtime-version" : "master",
"sdk" : "org.gnome.Sdk",
"command" : "cassette",
"finish-args" : [
"--share=network",
"--share=ipc",
"--socket=fallback-x11",
"--device=dri",
"--socket=pulseaudio",
"--socket=wayland",
"--filesystem=xdg-music:ro",
"--filesystem=xdg-download:ro",
"--talk-name=org.mpris.MediaPlayer2.Player",
"--own-name=org.mpris.MediaPlayer2.cassette"
],
"build-options" : {
"append-path" : "/usr/lib/sdk/vala/bin",
"prepend-ld-library-path" : "/usr/lib/sdk/vala/lib"
},
"cleanup" : [
"/include",
"/lib/pkgconfig",
"/man",
"/share/doc",
"/share/gtk-doc",
"/share/man",
"/share/pkgconfig",
"/share/vala",
"*.la",
"*.a"
],
"modules" : [
{
"name": "blueprint-compiler",
"buildsystem": "meson",
"sources": [
{
"type": "git",
"url": "https://gitlab.gnome.org/jwestman/blueprint-compiler",
"tag": "v0.12.0",
"commit": "66b43c36cf1017c878762007373964a096b3d2a5"
}
]
},
{
"name" : "cassette",
"builddir" : true,
"buildsystem" : "meson",
"config-opts": [ "-Dprofile=development" ],
"sources" : [
{
"type" : "dir",
"path" : "../../../"
}
]
}
]
}

View file

@ -0,0 +1,60 @@
{
"id" : "io.github.Rirusha.Cassette",
"runtime" : "org.gnome.Platform",
"runtime-version" : "46",
"sdk" : "org.gnome.Sdk",
"command" : "cassette",
"finish-args" : [
"--share=network",
"--share=ipc",
"--socket=fallback-x11",
"--device=dri",
"--socket=pulseaudio",
"--socket=wayland",
"--filesystem=xdg-music:ro",
"--filesystem=xdg-download:ro",
"--talk-name=org.mpris.MediaPlayer2.Player",
"--own-name=org.mpris.MediaPlayer2.cassette"
],
"build-options" : {
"append-path" : "/usr/lib/sdk/vala/bin",
"prepend-ld-library-path" : "/usr/lib/sdk/vala/lib"
},
"cleanup" : [
"/include",
"/lib/pkgconfig",
"/man",
"/share/doc",
"/share/gtk-doc",
"/share/man",
"/share/pkgconfig",
"/share/vala",
"*.la",
"*.a"
],
"modules" : [
{
"name": "blueprint-compiler",
"buildsystem": "meson",
"sources": [
{
"type": "git",
"url": "https://gitlab.gnome.org/jwestman/blueprint-compiler",
"tag": "v0.12.0",
"commit": "66b43c36cf1017c878762007373964a096b3d2a5"
}
]
},
{
"name" : "cassette",
"builddir" : true,
"buildsystem" : "meson",
"sources" : [
{
"type" : "dir",
"path" : "../../../"
}
]
}
]
}

View file

@ -1,68 +0,0 @@
{
"id": "space.rirusha.Cassette.Devel",
"runtime": "org.gnome.Platform",
"runtime-version": "master",
"sdk": "org.gnome.Sdk",
"sdk-extensions": [
"org.freedesktop.Sdk.Extension.vala"
],
"command": "cassette",
"finish-args": [
"--share=network",
"--share=ipc",
"--socket=fallback-x11",
"--device=dri",
"--socket=pulseaudio",
"--socket=wayland",
"--filesystem=xdg-music:ro",
"--filesystem=xdg-download:ro",
"--own-name=org.mpris.MediaPlayer2.space.rirusha.Cassette.Devel"
],
"build-options": {
"append-path": "/usr/lib/sdk/vala/bin",
"prepend-ld-library-path": "/usr/lib/sdk/vala/lib"
},
"cleanup": [
"/include",
"/lib/pkgconfig",
"/man",
"/share/doc",
"/share/gtk-doc",
"/share/man",
"/share/pkgconfig",
"/share/vala",
"*.la",
"*.a"
],
"modules": [
{
"name": "blueprint-compiler",
"buildsystem": "meson",
"cleanup": [
"*"
],
"sources": [
{
"type": "git",
"url": "https://gitlab.gnome.org/jwestman/blueprint-compiler",
"commit": "04ef0944db56ab01307a29aaa7303df6067cb3c0",
"tag": "v0.16.0"
}
]
},
{
"name": "cassette",
"buildsystem": "meson",
"builddir": true,
"config-opts": [
"-Dis_devel=true"
],
"sources": [
{
"type": "dir",
"path": "../../"
}
]
}
]
}

View file

@ -1,49 +0,0 @@
id: space.rirusha.Cassette.Devel
runtime: org.gnome.Platform
runtime-version: 'master'
sdk: org.gnome.Sdk
sdk-extensions:
- org.freedesktop.Sdk.Extension.vala
command: cassette
finish-args:
- --share=network
- --share=ipc
- --socket=fallback-x11
- --device=dri
- --socket=pulseaudio
- --socket=wayland
- --filesystem=xdg-music:ro
- --filesystem=xdg-download:ro
- --own-name=org.mpris.MediaPlayer2.space.rirusha.Cassette.Devel
build-options:
append-path: /usr/lib/sdk/vala/bin
prepend-ld-library-path: /usr/lib/sdk/vala/lib
cleanup:
- /include
- /lib/pkgconfig
- /man
- /share/doc
- /share/gtk-doc
- /share/man
- /share/pkgconfig
- /share/vala
- '*.la'
- '*.a'
modules:
- name: blueprint-compiler
buildsystem: meson
cleanup:
- '*'
sources:
- type: git
url: https://gitlab.gnome.org/jwestman/blueprint-compiler
commit: 04ef0944db56ab01307a29aaa7303df6067cb3c0
tag: v0.16.0
- name: cassette
buildsystem: meson
builddir: true
config-opts:
- -Dis_devel=true
sources:
- type: dir
path: ../../

View file

@ -1,47 +0,0 @@
id: space.rirusha.Cassette
runtime: org.gnome.Platform
runtime-version: '47'
sdk: org.gnome.Sdk
sdk-extensions:
- org.freedesktop.Sdk.Extension.vala
command: cassette
finish-args:
- --share=network
- --share=ipc
- --socket=fallback-x11
- --device=dri
- --socket=pulseaudio
- --socket=wayland
- --filesystem=xdg-music:ro
- --filesystem=xdg-download:ro
- --own-name=org.mpris.MediaPlayer2.space.rirusha.Cassette
build-options:
append-path: /usr/lib/sdk/vala/bin
prepend-ld-library-path: /usr/lib/sdk/vala/lib
cleanup:
- /include
- /lib/pkgconfig
- /man
- /share/doc
- /share/gtk-doc
- /share/man
- /share/pkgconfig
- /share/vala
- '*.la'
- '*.a'
modules:
- name: blueprint-compiler
buildsystem: meson
cleanup:
- '*'
sources:
- type: git
url: https://gitlab.gnome.org/jwestman/blueprint-compiler
commit: 8e10fcf8692108b9d4ab78f41086c5d7773ef864
tag: v0.14.0
- name: cassette
buildsystem: meson
builddir: true
sources:
- type: dir
path: ../../

View file

@ -5,6 +5,7 @@
xmlns:gnome="http://api.gnome.org/doap-extensions#"
xmlns="http://usefulinc.com/ns/doap#">
<name xml:lang="en">Cassette</name>
<name xml:lang="es">Casete</name>
<name xml:lang="fr">Cassette</name>
<name xml:lang="de">Kassette</name>
@ -27,38 +28,37 @@
<name xml:lang="fi">Kasetti</name>
<name xml:lang="hu">Kazetta</name>
<name xml:lang="th">เทปคาสเซ็ท</name>
<name xml:lang="en">Cassette</name>
<shortdesc xml:lang="es">Cliente no oficial de Yandex Music</shortdesc>
<shortdesc xml:lang="fr">Client non officiel de Yandex Music</shortdesc>
<shortdesc xml:lang="de">Inoffizieller Yandex Music-Client</shortdesc>
<shortdesc xml:lang="it">Client non ufficiale di Yandex Music</shortdesc>
<shortdesc xml:lang="pt">Cliente não oficial do Yandex Music</shortdesc>
<shortdesc xml:lang="en">Unofficial Yandex.Music client</shortdesc>
<shortdesc xml:lang="es">Cliente no oficial de Yandex.Music</shortdesc>
<shortdesc xml:lang="fr">Client non officiel de Yandex.Music</shortdesc>
<shortdesc xml:lang="de">Inoffizieller Yandex.Music-Client</shortdesc>
<shortdesc xml:lang="it">Client non ufficiale di Yandex.Music</shortdesc>
<shortdesc xml:lang="pt">Cliente não oficial do Yandex.Music</shortdesc>
<shortdesc xml:lang="ru">Неофициальный клиент Яндекс.Музыки</shortdesc>
<shortdesc xml:lang="ja">非公式のYandex Musicクライアント</shortdesc>
<shortdesc xml:lang="zh">非官方的Yandex Music客户端</shortdesc>
<shortdesc xml:lang="ar">عميل غير رسمي لـ Yandex Music</shortdesc>
<shortdesc xml:lang="hi">अनौपचारिक Yandex Music क्लाइंट</shortdesc>
<shortdesc xml:lang="ko">비공식 Yandex Music 클라이언트</shortdesc>
<shortdesc xml:lang="tr">Resmi olmayan Yandex Music istemcisi</shortdesc>
<shortdesc xml:lang="he">לקוח לא רשמי של Yandex Music</shortdesc>
<shortdesc xml:lang="el">Ανεπίσημος πελάτης του Yandex Music</shortdesc>
<shortdesc xml:lang="nl">Onofficiële Yandex Music-client</shortdesc>
<shortdesc xml:lang="sv">Inofficiell Yandex Music-klient</shortdesc>
<shortdesc xml:lang="pl">Nieoficjalny klient Yandex Music</shortdesc>
<shortdesc xml:lang="cs">Neoficiální klient Yandex Music</shortdesc>
<shortdesc xml:lang="da">Uofficiel Yandex Music-klient</shortdesc>
<shortdesc xml:lang="fi">Epävirallinen Yandex Music-asiakas</shortdesc>
<shortdesc xml:lang="hu">Nem hivatalos Yandex Music kliens</shortdesc>
<shortdesc xml:lang="th">ไคลเอนต์ Yandex Music อย่างไม่เป็นทางการ</shortdesc>
<shortdesc xml:lang="en">Unofficial Yandex Music client</shortdesc>
<shortdesc xml:lang="ja">非公式のYandex.Musicクライアント</shortdesc>
<shortdesc xml:lang="zh">非官方的Yandex.Music客户端</shortdesc>
<shortdesc xml:lang="ar">عميل غير رسمي لـ Yandex.Music</shortdesc>
<shortdesc xml:lang="hi">अनौपचारिक Yandex.Music क्लाइंट</shortdesc>
<shortdesc xml:lang="ko">비공식 Yandex.Music 클라이언트</shortdesc>
<shortdesc xml:lang="tr">Resmi olmayan Yandex.Music istemcisi</shortdesc>
<shortdesc xml:lang="he">לקוח לא רשמי של Yandex.Music</shortdesc>
<shortdesc xml:lang="el">Ανεπίσημος πελάτης του Yandex.Music</shortdesc>
<shortdesc xml:lang="nl">Onofficiële Yandex.Music-client</shortdesc>
<shortdesc xml:lang="sv">Inofficiell Yandex.Music-klient</shortdesc>
<shortdesc xml:lang="pl">Nieoficjalny klient Yandex.Music</shortdesc>
<shortdesc xml:lang="cs">Neoficiální klient Yandex.Music</shortdesc>
<shortdesc xml:lang="da">Uofficiel Yandex.Music-klient</shortdesc>
<shortdesc xml:lang="fi">Epävirallinen Yandex.Music-asiakas</shortdesc>
<shortdesc xml:lang="hu">Nem hivatalos Yandex.Music kliens</shortdesc>
<shortdesc xml:lang="th">ไคลเอนต์ Yandex.Music อย่างไม่เป็นทางการ</shortdesc>
<description>
GTK/Adwaita application that allows you to use Yandex Music service on Linux operating systems
</description>
<homepage rdf:resource="https://gitlab.gnome.org/Rirusha/Cassette" />
<download-page rdf:resource="https://gitlab.gnome.org/Rirusha/Cassette/-/tags" />
<bug-database rdf:resource="https://gitlab.gnome.org/Rirusha/Cassette/-/issues" />
<homepage rdf:resource="https://github.com/Rirusha/Cassette" />
<download-page rdf:resource="https://github.com/Rirusha/Cassette/tags" />
<bug-database rdf:resource="https://github.com/Rirusha/Cassette/issues" />
<programming-language>Vala</programming-language>
<platform>GTK 4</platform>
@ -70,7 +70,7 @@
<foaf:mbox rdf:resource="mailto:rirusha@altlinux.org" />
<foaf:account>
<foaf:OnlineAccount>
<foaf:accountServiceHomepage rdf:resource="https://gitlab.gnome.org"/>
<foaf:accountServiceHomepage rdf:resource="https://github.com"/>
<foaf:accountName>Rirusha</foaf:accountName>
</foaf:OnlineAccount>
</foaf:account>

View file

@ -0,0 +1,48 @@
#!/bin/bash
import sys
import os
import re
def check_indentation (file_path, root_dir) -> list[str]:
file_err_list = []
with open (file_path, 'r') as file:
lines = file.readlines ()
empty_lines_count = 0
for i, line in enumerate (lines):
if line.strip () == "":
empty_line_count += 1
else:
empty_line_count = 0
if empty_line_count > 1:
file_err_list.append (f"To mant empty lines in file '{file_path.replace (root_dir, "", 1)}' at line {i + 1}: \"{line.rstrip ()}\".")
return file_err_list
def scan_directory (directory) -> list[str]:
err_list = []
for root, dirs, files in os.walk (directory):
for file in files:
if (file.endswith ('.vala') or file.endswith ('.blp')) and (("/data/ui" in root or "/src" in root or "/tests" in root) and "/.flatpak/" not in root):
file_path = os.path.join (root, file)
file_err_list = check_indentation (file_path, directory)
if (file_err_list):
err_list += file_err_list
return err_list
if __name__ == "__main__":
err_list = scan_directory (sys.argv[1])
print (*err_list, sep="\n", end="\n\n")
print (f"Total errors: {len (err_list)}")
if (len (err_list) != 0):
sys.exit (1)

View file

@ -0,0 +1,47 @@
#!/bin/bash
import sys
import os
import re
def check_indentation (file_path, root_dir) -> list[str]:
file_err_list = []
with open (file_path, 'r') as file:
lines = file.readlines ()
for i, line in enumerate (lines):
if "ind-check=skip-file" in line:
return
if re.match (r'^(?!.*(?:new|if|else| => |try|catch|switch|}|get |set |while|namespace|class|foreach|throws|ind-check=ignore| = {))(?=(?:.*?\s+\w+\s+\w+.*?){1}).*{', line):
indentation = len (re.match(r'^(\s*)', line).group(1))
if indentation != 4:
file_err_list.append (f"Indentation error in file '{file_path.replace (root_dir, "", 1)}' at line {i + 1}: \"{line.rstrip ()}\". {indentation} spaces instead of 4.")
return file_err_list
def scan_directory (directory) -> list[str]:
err_list = []
for root, dirs, files in os.walk (directory):
for file in files:
if file.endswith ('.vala'):
file_path = os.path.join (root, file)
file_err_list = check_indentation (file_path, directory)
if (file_err_list):
err_list += file_err_list
return err_list
if __name__ == "__main__":
err_list = scan_directory (sys.argv[1])
print (*err_list, sep="\n", end="\n\n")
print (f"Total errors: {len (err_list)}")
if (len (err_list) != 0):
sys.exit (1)

View file

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<path d="m 11.847656 1 c -1.109375 -0.027344 -2.1875 0.371094 -3.003906 1.121094 l -0.863281 0.769531 l -0.859375 -0.769531 c -1.136719 -1.019532 -2.734375 -1.355469 -4.1875 -0.875 c -1.453125 0.476562 -2.539063 1.695312 -2.8476565 3.195312 c -0.3085935 1.496094 0.2109375 3.046875 1.3554685 4.058594 l 6.539063 5.828125 l 6.542969 -5.828125 c 1.332031 -1.152344 1.820312 -3.003906 1.226562 -4.664062 c -0.589844 -1.660157 -2.140625 -2.785157 -3.902344 -2.835938 z m 0 0" fill="#2e3436" fill-rule="evenodd"/>
</svg>

Before

Width:  |  Height:  |  Size: 647 B

View file

@ -4,7 +4,7 @@
height="128"
version="1.1"
id="svg16"
sodipodi:docname="space.rirusha.Cassette.Devel.svg"
sodipodi:docname="io.github.Rirusha.Cassette-Devel.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
@ -38,9 +38,9 @@
inkscape:window-height="1011"
id="namedview18"
showgrid="false"
inkscape:zoom="11.313709"
inkscape:cx="89.095454"
inkscape:cy="94.708114"
inkscape:zoom="4.3101714"
inkscape:cx="36.54147"
inkscape:cy="53.014133"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
@ -799,7 +799,7 @@
<g
id="g2"
style="display:inline;opacity:0.8"
transform="matrix(1.0003571,0,0,1.0006746,-7.7599937,-17.158376)">
transform="translate(-7.734375,-17.092503)">
<path
id="path10"
style="display:inline;fill:url(#linearGradient38)"

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Before After
Before After

View file

@ -6,7 +6,7 @@
fill="none"
version="1.1"
id="svg35"
sodipodi:docname="space.rirusha.Cassette.svg"
sodipodi:docname="io.github.Rirusha.Cassette.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before After
Before After

View file

@ -6,9 +6,9 @@
fill="none"
version="1.1"
id="svg35"
sodipodi:docname="space.rirusha.Cassette.Devel-symbolic.svg"
sodipodi:docname="io.github.Rirusha.Cassette-Devel-symbolic.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
inkscape:export-filename="space.rirusha.Cassette-symbolic.png"
inkscape:export-filename="io.github.Rirusha.Cassette-symbolic.png"
inkscape:export-xdpi="75"
inkscape:export-ydpi="75"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

View file

@ -6,9 +6,9 @@
fill="none"
version="1.1"
id="svg35"
sodipodi:docname="space.rirusha.Cassette.Devel-symbolic.svg"
sodipodi:docname="io.github.Rirusha.Cassette-Devel-symbolic.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
inkscape:export-filename="space.rirusha.Cassette-symbolic.png"
inkscape:export-filename="io.github.Rirusha.Cassette-symbolic.png"
inkscape:export-xdpi="75"
inkscape:export-ydpi="75"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 KiB

BIN
data/images/1-liked.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 523 KiB

BIN
data/images/2-playlists.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

BIN
data/images/3-lyrics.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 193 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 198 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 204 KiB

BIN
data/images/4-queue.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 156 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

View file

@ -1,14 +1,14 @@
[Desktop Entry]
# Translators: app name should be translated
Name=Cassette (Devel)
Comment=Unofficial Yandex Music client for GNOME (Devel build)
Comment=Unofficial Yandex.Music client for GNOME (Development)
# Translators: keep number of ';'
Keywords=yandex;yandex music;yam;music;
Exec=cassette %U
Icon=@APP_ID_DYN@
Icon=io.github.Rirusha.Cassette-Devel
Terminal=false
Type=Application
Categories=GNOME;GTK;Music;Audio;AudioVideo;
Categories=Audio
StartupNotify=true
MimeType=x-scheme-handler/yandexmusic;
X-GNOME-UsesNotifications=true
X-GNOME-UsesNotifications=true

View file

@ -1,10 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<component type="desktop-application">
<component type="desktop">
<name>Cassette</name>
<id>@APP_ID@</id>
<id>io.github.Rirusha.Cassette</id>
<metadata_license>CC0-1.0</metadata_license>
<project_license>GPL-3.0-or-later</project_license>
<summary>Unofficial Yandex Music client</summary>
<project_license>GPL-3.0-only</project_license>
<description>
<p>
GTK/Adwaita application that allows to use Yandex Music
@ -35,61 +34,41 @@
Cassette is an unofficial client and is not associated with or endorsed by Yandex.
</p>
</description>
<launchable type="desktop-id">@APP_ID_DYN@.desktop</launchable>
<developer id="space.rirusha">
<name>Vladimir Vaskov</name>
<name xml:lang="ru">Владимир Васьков</name>
</developer>
<recommends>
<control>keyboard</control>
<control>pointing</control>
<control>touch</control>
</recommends>
<branding>
<color type="primary" scheme_preference="light">#fee372</color>
<color type="primary" scheme_preference="dark">#dd624b</color>
<color type="primary" scheme_preference="light">#c0c0c0</color>
<color type="primary" scheme_preference="dark">#303030</color>
</branding>
<content_rating type="oars-1.1">
<content_attribute id="sex-themes">mild</content_attribute>
<content_attribute id="language-profanity">moderate</content_attribute>
<content_attribute id="language-discrimination">mild</content_attribute>
</content_rating>
<url type="homepage">@HOMEPAGE@</url>
<url type="bugtracker">@BUGTRACKER@</url>
<url type="help">@HELP@</url>
<screenshots>
<screenshot type="default">
<image>https://gitlab.gnome.org/Rirusha/Cassette/-/raw/959c28f67e219efdba1fa280d2170d3d72bed20a/data/images/1-liked-view.png</image>
<caption>Liked view</caption>
<image>https://github.com/Rirusha/Cassette/blob/ver-0.2.0/data/images/1-liked.png?raw=true</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/Rirusha/Cassette/-/raw/959c28f67e219efdba1fa280d2170d3d72bed20a/data/images/2-playlists-view.png</image>
<caption>Playlists view</caption>
<image>https://github.com/Rirusha/Cassette/blob/ver-0.2.0/data/images/2-playlists.png?raw=true</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/Rirusha/Cassette/-/raw/959c28f67e219efdba1fa280d2170d3d72bed20a/data/images/3-sync-lyrics.png</image>
<caption>Sync lyrics</caption>
<image>https://github.com/Rirusha/Cassette/blob/ver-0.2.0/data/images/3-lyrics.png?raw=true</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/Rirusha/Cassette/-/raw/959c28f67e219efdba1fa280d2170d3d72bed20a/data/images/4-playback-queue.png</image>
<caption>Playback queue</caption>
<image>https://github.com/Rirusha/Cassette/blob/ver-0.2.0/data/images/4-queue.png?raw=true</image>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/Rirusha/Cassette/-/raw/959c28f67e219efdba1fa280d2170d3d72bed20a/data/images/5-waves-view.png</image>
<caption>Waves view</caption>
</screenshot>
<screenshot>
<image>https://gitlab.gnome.org/Rirusha/Cassette/-/raw/959c28f67e219efdba1fa280d2170d3d72bed20a/data/images/6-main-settings.png</image>
<caption>Main preferences</caption>
<image>https://github.com/Rirusha/Cassette/blob/ver-0.2.0/data/images/5-main-settings.png?raw=true</image>
</screenshot>
</screenshots>
<summary>Unofficial Yandex.Music client</summary>
<launchable type="desktop-id">io.github.Rirusha.Cassette.desktop</launchable>
<releases>
<release version="0.2.1" date="2025-02-25">
<description>
<p>Fixed a bug on the stations page and the playlist page in GNOME 48</p>
</description>
</release>
<release version="0.2.0" date="2024-07-10">
<release version="0.2.0" date="2024-01-28">
<description>
<p>A release dedicated to My Vibe</p>
<ul>
@ -153,4 +132,8 @@
</description>
</release>
</releases>
<url type="homepage">https://github.com/Rirusha/Cassette</url>
<url type="bugtracker">https://github.com/Rirusha/Cassette/issues</url>
<url type="help">https://t.me/CassetteGNOME_Discussion</url>
<developer_name>Rirusha</developer_name>
</component>

View file

@ -1,14 +1,14 @@
[Desktop Entry]
# Translators: app name should be translated
Name=Cassette
Comment=Unofficial Yandex Music client for GNOME
Comment=Unofficial Yandex.Music client for GNOME
# Translators: keep number of ';'
Keywords=yandex;yandex music;yam;music;
Exec=cassette %U
Icon=@APP_ID_DYN@
Icon=io.github.Rirusha.Cassette
Terminal=false
Type=Application
Categories=GNOME;GTK;Music;Audio;AudioVideo;
Categories=Audio
StartupNotify=true
MimeType=x-scheme-handler/yandexmusic;
X-GNOME-UsesNotifications=true
X-GNOME-UsesNotifications=true

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/space/rirusha/Cassette/icons/scalable/actions/">
<gresource prefix="/io/github/Rirusha/Cassette/icons/scalable/actions/">
<file alias="audio-volume-high-symbolic.svg">assets/icons/audio-volume-high-symbolic.svg</file>
<file alias="audio-volume-low-symbolic.svg">assets/icons/audio-volume-low-symbolic.svg</file>
<file alias="audio-volume-medium-symbolic.svg">assets/icons/audio-volume-medium-symbolic.svg</file>
@ -22,7 +22,6 @@
<file alias="go-next-symbolic.svg">assets/icons/go-next-symbolic.svg</file>
<file alias="go-previous-symbolic.svg">assets/icons/go-previous-symbolic.svg</file>
<file alias="isound-wave-alt-symbolic.svg">assets/icons/isound-wave-alt-symbolic.svg</file>
<file alias="like-symbolic.svg">assets/icons/like-symbolic.svg</file>
<file alias="media-playback-pause-symbolic.svg">assets/icons/media-playback-pause-symbolic.svg</file>
<file alias="media-playback-start-symbolic.svg">assets/icons/media-playback-start-symbolic.svg</file>
<file alias="media-playlist-repeat-song-symbolic.svg">assets/icons/media-playlist-repeat-song-symbolic.svg</file>
@ -129,7 +128,7 @@
<file alias="wave-my-wave-symbolic.svg">assets/icons/wave-my-wave-symbolic.svg</file>
<file alias="window-close-symbolic.svg">assets/icons/window-close-symbolic.svg</file>
</gresource>
<gresource prefix="/space/rirusha/Cassette/">
<gresource prefix="/io/github/Rirusha/Cassette">
<file alias="gtk/help-overlay.ui" preprocess="xml-stripblanks">ui/help-overlay.ui</file>
<file>style.css</file>
<file preprocess="xml-stripblanks">ui/account-info-dialog.ui</file>

View file

@ -1,23 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<schemalist gettext-domain="cassette">
<schema id="space.rirusha.Cassette" path="/space/rirusha/Cassette/">
<child schema="space.rirusha.Cassette.application" name="application"/>
<child schema="space.rirusha.Cassette.client" name="client"/>
<schema id="io.github.Rirusha.Cassette" path="/io/github/Rirusha/Cassette/">
<child schema="io.github.Rirusha.Cassette.application" name="application"/>
<child schema="io.github.Rirusha.Cassette.client" name="client"/>
</schema>
<!-- GUI Application -->
<enum id="space.rirusha.Cassette.application.application-state">
<enum id="io.github.Rirusha.Cassette.application.application-state">
<value nick="begin" value="0"/>
<value nick="online" value="1"/>
<value nick="local" value="2"/>
<value nick="offline" value="3"/>
</enum>
<schema id="space.rirusha.Cassette.application" path="/space/rirusha/Cassette/application/">
<schema id="io.github.Rirusha.Cassette.application" path="/io/github/Rirusha/Cassette/application/">
<key name="application-state" enum="space.rirusha.Cassette.application.application-state">
<key name="application-state" enum="io.github.Rirusha.Cassette.application.application-state">
<default>"begin"</default>
</key>
@ -73,22 +73,22 @@
<!-- Client -->
<enum id="space.rirusha.Cassette.client.repeat-mode">
<enum id="io.github.Rirusha.Cassette.client.repeat-mode">
<value nick="off" value="0"/>
<value nick="one" value="1"/>
<value nick="queue" value="2"/>
</enum>
<enum id="space.rirusha.Cassette.client.shuffle-mode">
<enum id="io.github.Rirusha.Cassette.client.shuffle-mode">
<value nick="off" value="0"/>
<value nick="on" value="1"/>
</enum>
<schema id="space.rirusha.Cassette.client" path="/space/rirusha/Cassette/client/">
<schema id="io.github.Rirusha.Cassette.client" path="/io/github/Rirusha/Cassette/client/">
<key name="repeat-mode" enum="space.rirusha.Cassette.client.repeat-mode">
<key name="repeat-mode" enum="io.github.Rirusha.Cassette.client.repeat-mode">
<default>"off"</default>
</key>
<key name="shuffle-mode" enum="space.rirusha.Cassette.client.shuffle-mode">
<key name="shuffle-mode" enum="io.github.Rirusha.Cassette.client.shuffle-mode">
<default>"off"</default>
</key>

View file

@ -1,11 +1,5 @@
desktop_conf = configuration_data()
desktop_conf.set('APP_ID_DYN', app_id_dyn)
desktop_file = i18n.merge_file(
input: configure_file(
output: '@0@.desktop.in'.format(app_id_dyn),
input: '@0@.desktop.in.in'.format(app_id_dyn),
configuration: desktop_conf),
input: '@0@.desktop.in'.format(app_id_dyn),
output: '@0@.desktop'.format(app_id_dyn),
type: 'desktop',
po_dir: '../po',
@ -18,22 +12,12 @@ if desktop_utils.found()
test('Validate desktop file', desktop_utils, args: [desktop_file])
endif
appstream_conf = configuration_data()
appstream_conf.set('APP_ID', app_id)
appstream_conf.set('APP_ID_DYN', app_id_dyn)
appstream_conf.set('HOMEPAGE', 'https://gitlab.gnome.org/Rirusha/Cassette')
appstream_conf.set('BUGTRACKER', 'https://gitlab.gnome.org/Rirusha/Cassette/-/issues')
appstream_conf.set('HELP', 'https://t.me/CassetteGNOME_Discussion')
appstream_file = i18n.merge_file(
input: configure_file(
output: '@0@.metainfo.xml.in'.format(app_id),
input: '@0@.metainfo.xml.in.in'.format(app_id),
configuration: appstream_conf),
output: '@0@.metainfo.xml'.format(app_id),
input: '@0@.appdata.xml.in'.format(app_id),
output: '@0@.appdata.xml'.format(app_id),
po_dir: '../po',
install: true,
install_dir: join_paths(get_option('datadir'), 'metainfo')
install_dir: join_paths(get_option('datadir'), 'appdata')
)
appstreamcli = find_program('appstreamcli', required: false)
@ -93,9 +77,8 @@ resource_files = files('@0@.gresource.xml'.format(app_id))
resources = gnome.compile_resources(
'cassette-resources',
resource_files,
source_dir: meson.current_build_dir(),
dependencies: blueprints,
c_name: 'cassette'
)
subdir('icons')
subdir('icons')

View file

@ -65,7 +65,7 @@ frame {
background-color: rgba(0, 0, 0, 0);
}
.plus-button {
.plus-background {
color: white;
background-image: linear-gradient(90deg,#ff5c4d,#eb469f 30%,#8341ef 75%,#3f68f9);
}

View file

@ -21,10 +21,10 @@ template $CassetteAccountInfoDialog: Adw.Dialog {
margin-bottom: 12;
margin-start: 12;
margin-end: 12;
maximum-size: 360;
maximum-size: 450;
Box {
spacing: 12;
spacing: 24;
orientation: vertical;
Adw.Avatar avatar {}
@ -39,35 +39,45 @@ template $CassetteAccountInfoDialog: Adw.Dialog {
wrap: true;
}
ListBox {
styles [
"boxed-list-separate"
]
Box {
orientation: vertical;
halign: center;
spacing: 8;
margin-top: 12;
selection-mode: none;
Button user_button {
styles [
"pill"
]
Adw.ButtonRow user_button {
action-name: "app.open-account";
title: _("Open in browser");
label: _("Open in browser");
hexpand: true;
can-shrink: true;
}
Adw.ButtonRow plus_button {
Button plus_button {
styles [
"plus-button"
"pill",
"plus-background"
]
action-name: "app.open-plus";
title: _("Plus");
label: _("Plus");
hexpand: true;
can-shrink: true;
}
Adw.ButtonRow logout_button {
Button logout_button {
styles [
"pill",
"destructive-action"
]
margin-top: 24;
action-name: "app.log-out";
title: _("Log out");
label: _("Log out");
hexpand: true;
can-shrink: true;
}
}
}

View file

@ -5,17 +5,7 @@ template $CassetteCoverImage: Frame {
halign: center;
valign: center;
Stack stack {
hhomogeneous: true;
StackPage {
name: "placeholder";
child: Image placeholder_image {
icon-size: large;
icon-name: "audio-x-generic-symbolic";
width-request: bind template.image-widget-size;
height-request: bind template.image-widget-size;
};
}
Image real_image {
icon-size: large;
}
}

View file

@ -25,8 +25,8 @@ template $CassetteHeaderBar: $CassetteShrinkableBin {
ToggleButton search_button {
icon-name: "edit-find-symbolic";
visible: false;
tooltip-text: _("Yandex Music search");
// sensitive: bind template.interactive;
tooltip-text: _("Yandex.Music search");
sensitive: bind template.interactive;
}
title-widget: Adw.ViewSwitcher switcher_title {

View file

@ -11,46 +11,27 @@ template $CassetteNoPlusDialog: Adw.Dialog {
[top]
Adw.HeaderBar {}
content: Box {
orientation: vertical;
content: Adw.StatusPage {
margin-top: 24;
margin-bottom: 12;
margin-start: 12;
margin-end: 12;
icon-name: "dialog-warning-symbolic";
title: _("No Plus Subscription");
description: _("To avoid problems with Yandex, the online functions of the application are not available without a Yandex.Plus subscription. Thanks for understanding.");
Adw.StatusPage {
vexpand: true;
icon-name: "dialog-warning-symbolic";
title: _("No Plus Subscription");
description: _("To avoid problems with Yandex, the online functions of the application are not available without a Yandex.Plus subscription. Thanks for understanding.");
}
ListBox {
Button logout_button {
styles [
"boxed-list-separate"
"pill",
"destructive-action"
]
margin-top: 12;
margin-bottom: 12;
margin-start: 12;
margin-end: 12;
selection-mode: none;
Adw.ButtonRow get_plus_button {
styles [
"plus-button",
]
action-name: "app.get-plus";
title: _("Get Plus");
hexpand: true;
}
Adw.ButtonRow logout_button {
styles [
"destructive-action"
]
action-name: "app.log-out";
title: _("Log out");
hexpand: true;
}
visible: bind template.log-out-button-visible;
margin-top: 24;
action-name: "app.log-out";
label: _("Log out");
hexpand: true;
can-shrink: true;
}
};
}

View file

@ -36,7 +36,7 @@
<style>
<class name="title-1"/>
</style>
<property name="label" translatable="true">Also you liked these playlists</property>
<property name="label" translatable="true">Also you liked this playlists</property>
</object>
</child>
<child>

View file

@ -17,7 +17,7 @@
</style>
<property name="search-delay">900</property>
<property name="hexpand">true</property>
<!-- Translators: placeholder of "search" entry. Local track search (inside of track list) -->
<!-- Translators: placeholder of "search" entry. Local track search (inside of track lsit) -->
<property name="placeholder-text" translatable="true">Search track</property>
</object>
</child>

61
docs/CONTRIBUTING.md Normal file
View file

@ -0,0 +1,61 @@
## Как внести вклад
Если вы не знаете, чем занятся, то:
* Все запланированные задачи лежат в разделе issue и имеют ярлык "enchancement".
* Все известные проблемы лежат там же и имеют ярлык "bug".
Выбирайте задачи из ближайших версией. Их список вы можете найти [здесь](https://github.com/Rirusha/Cassette/milestones). Это как ускорит выход следующей версии, так и облегчит ревью, так так не нужно будет переключаться с одной глобальной проблемы на другую.
Также если решили исправить какой-то баг, описанный в issue, сначала убедитесь, что его всё ещё можно воспроизвести в `master` ветке.
Также, если вы считаете, что приложению чего-то не хватает или вы нашли баг, то не стесняйтесь создавать issue.
## Именование коммитов
Заголовок сообщения должен иметь вид:
```
feat: добавить кнопку проигрывания в `Имя виджета`
Кнопки не хватало, поэтому её нужно было добавить
```
Это пример. Подробнее правила описаны [здесь](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional). Также тело сообщения необязательно, если информация в заголове исчерпывающая. Также вот список всех типов коммитов с описаниями:
* `build`: Используется для изменений, связанных с сборкой системы или внешними зависимостями.
* `chore`: Обычно включает в себя изменения, которые не относятся непосредственно к коду или тестам, например, обновление документации, настройка среды разработки, повышение версии и т. д.
* `ci`: Относится к изменениям, связанным с настройкой или улучшением CI.
* `docs`: Используется для изменений, касающихся только документации, например, исправления опечаток, обновление README или добавление комментариев в код.
* `feat`: Обозначает добавление новой функциональности или возможности в проект.
* `fix`: Относится к исправлению ошибок в коде или исправлению неполадок в проекте.
* `perf`: Используется, когда вносятся изменения с целью улучшения производительности.
* `refactor`: Относится к изменениям, которые не добавляют новую функциональность, а только изменяют структуру или организацию существующего кода.
* `revert`: Используется для отмены предыдущих коммитов в истории проекта.
* `style`: Относится к изменениям в форматировании кода, например, правки пробелов, отступов, переносов строк и т. д.
* `test`: Используется для добавления или изменения тестового кода, например, тестирование новой функциональности или исправление существующих тестов.
* `po`: Используется для добавления или изменения перевода.
## Создание Pull Request'ов
Все Pull Request'ы должны быть сделанны в `master` ветку. Если вы закрываете какое-то issue, то ссылайтесь на него с ключевым словом "close" в теле коммита, например:
```
fix: исправить некорректное поведение
close #123
```
## Форматирование кода
Если вы используете Visual Studio Code, то есть таск для запуска линтера. Иначе используйте в линтере конфигурацию в корне репозитория: vala-lint.conf, CI использует именно её.
## Разработка
Проверяйте сборку, используя flatpak, так как это единственная официально поддерживаемая версия.
## Тестирование
Крайне приветствуется написание или дополнение существующих тестов для клиента.

View file

@ -42,13 +42,13 @@ wsl -t Ubuntu
#### В терминале Ubuntu:
```shell
sudo flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
sudo flatpak install space.rirusha.Cassette
sudo flatpak install io.github.Rirusha.Cassette
```
> [!NOTE]
> После перезагрузки Windows в меню «Пуск» появиться ярлык приложения Cassette, но его также можно запустить из терминала Ubuntu так:
> ```shell
> flatpak run space.rirusha.Cassette
> flatpak run io.github.Rirusha.Cassette
> ```
### nightly версия
@ -76,11 +76,11 @@ sudo flatpak remote-add --if-not-exists cassette-nightly https://rirusha.github.
```shell
sudo flatpak install org.gnome.Platform//master
sudo flatpak install cassette-nightly space.rirusha.Cassette.Devel
sudo flatpak install cassette-nightly io.github.Rirusha.Cassette-Devel
```
> [!NOTE]
> После перезагрузки Windows в меню «Пуск» появиться ярлык приложения Cassette.Devel, но его также можно запустить из терминала Ubuntu так:
> После перезагрузки Windows в меню «Пуск» появиться ярлык приложения Cassette-Devel, но его также можно запустить из терминала Ubuntu так:
> ```shell
> flatpak run space.rirusha.Cassette.Devel
> flatpak run io.github.Rirusha.Cassette-Devel
> ```

View file

@ -1,194 +0,0 @@
Язык README: \
[![En](https://img.shields.io/badge/en-gray)](README.md)
[![Ru](https://img.shields.io/badge/ru-green)](docs/README-ru.md)
<div align="center">
<h1>
<img
src="data/icons/hicolor/scalable/apps/space.rirusha.Cassette.svg"
height="64"
/>
Cassette
</h1>
<a href="https://stopthemingmy.app">
<img src="https://stopthemingmy.app/badge.svg"/>
</a>
<a href="https://t.me/CassetteGNOME_Devlog">
<img alt="Static Badge" src="https://img.shields.io/badge/Канал-blue?style=flat&logo=telegram">
</a>
<a href="https://t.me/CassetteGNOME_Devlog">
<img alt="Static Badge" src="https://img.shields.io/badge/Чат-blue?style=flat&logo=telegram">
</a>
</div>
<div align="center"><h4>GTK4/Adwaita приложение, которое позволит вам использовать Я.Музыку на Linux.</h4></div>
<div align="center">
<img src="data/images/1-liked-view.png" alt="Preview"/>
</div>
## Установка
**Flathub:**
<a href="https://flathub.org/apps/details/space.rirusha.Cassette">
<img width='240' alt='Скачать на Flathub' src='https://flathub.org/assets/badges/flathub-badge-en.svg'/>
</a>
```shell
flatpak install space.rirusha.Cassette
```
**Репозитории дистрибутивов:**
[![Состояние упаковки](https://repology.org/badge/vertical-allrepos/cassette.svg)](https://repology.org/project/cassette/versions)
### ALT Linux
```shell
su -
apt-get install cassette
```
### Arch Linux
> Большинство помощников AUR поддерживают флаги в стиле Pacman, например, yay.
#### yay
```shell
yay -S cassette
```
#### pamac
```shell
pamac install cassette
```
### NixOS Unstable
```shell
nix-shell -p cassette
```
## Сборка
#### Зависимости:
* `gtk4`, версия: `>= 4.14`
* `libadwaita-1`, версия: `>= 1.5`
* `libsoup-3.0`
* `gdk-pixbuf-2.0`
* `json-glib-1.0`
* `sqlite3`
* `gee-0.8`
* `libxml-2.0`
* `gstreamer-1.0`
* `webkitgtk-6.0`
* `gio-2.0`, версия: `>= 2.72`
* `git`, только для `devel`
#### Утилиты для сборки:
* `meson`
* `ninja`
* `cmake`
* `blueprint-compiler`
* `gcc`
* `valac`
* `pkg`
* `appstream-utils`
### ПредРелиз
> В данной версии будут недоступны нестабильные функции, находящиеся в разработке.
```shell
meson setup _build
```
### Флаг `is_devel`
> В данной версии будут доступны все функции, находящиеся в разработке.
```shell
meson setup _build -Dis_devel=true
```
#### Установка
```shell
sudo ninja install -C _build
```
#### Тестирование
```shell
ninja -C _build test
```
#### Удаление
```shell
sudo ninja uninstall -C _build
```
## Версия "В разработке"
> Эта версия обновляется после каждого изменения, так что она может быть нестабильна.
Нужно добавить `cassette-nightly` и `gnome-nightly` репозиторий:
```shell
flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
flatpak remote-add --if-not-exists cassette-nightly https://rirusha.space/repos/cassette-nightly.flatpakrepo
```
Установка приложения:
```shell
flatpak install cassette-nightly space.rirusha.Cassette.Devel
```
## Для разработчиков
> Репозиторий имеет рекомендуемые расширения для разработки с Visual Studio Code.
### Зависимости
#### репозиторий [gnome-nightly](https://wiki.gnome.org/Apps/Nightly):
```shell
flatpak remote-add --if-not-exists gnome-nightly https://nightly.gnome.org/gnome-nightly.flatpakrepo
```
#### Для запуска
`org.gnome.Platform//master`
```shell
flatpak install org.gnome.Platform//master
```
#### Для сборки
`org.gnome.Sdk//master` \
`org.freedesktop.Sdk.Extension.vala//23.08beta`
```shell
flatpak install org.gnome.Sdk//master org.freedesktop.Sdk.Extension.vala//23.08beta
```
## Поддержка
Вы можете поддержать несколькими способами:
- Создать issue с проблемой или предложением по улучшению
- Отправить merge request с фиксом или добавлением функционала
- Поддержать рублём (Просьба указывать в "Сообщении получателю" свой никнейм при отправлении через Т-Банк):
<br>
<div align="center">
<a href="https://www.tbank.ru/cf/21GCxLuFuE9" style="margin-right: 100px;">
<img height="200" src="../assets/tbank.png" alt="Tinkoff">
</a>
<a href="https://boosty.to/rirusha/donate">
<img height="200" src="../assets/boosty.png" alt="boosty.to">
</a>
</div>
## Благодарность
Спасибо [MarshalX](https://github.com/MarshalX). Библиотека [yandex-music-api](https://github.com/MarshalX/yandex-music-api) была использована в качестве документации к api.
> Внимание!
> Cassette - неофициальный клиент, не связан с компанией Яндекс и не одобрен ей.

61
flake.lock generated
View file

@ -1,61 +0,0 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1720542800,
"narHash": "sha256-ZgnNHuKV6h2+fQ5LuqnUaqZey1Lqqt5dTUAiAnqH0QQ=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "feb2849fdeb70028c70d73b848214b00d324a497",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

View file

@ -1,69 +0,0 @@
{
description = "GTK4/Adwaita application that allows you to use Yandex Music service on Linux operating systems";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
};
outputs = {
self,
nixpkgs,
flake-utils,
...
}:
flake-utils.lib.eachDefaultSystem
(
system: let
pkgs = import nixpkgs {inherit system;};
nativeBuildInputs = with pkgs; [
blueprint-compiler
desktop-file-utils
meson
ninja
pkg-config
vala
];
buildInputs = with pkgs; [
glib-networking
gst_all_1.gst-plugins-bad
gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good
gst_all_1.gstreamer
gtk4
json-glib
libadwaita
libgee
libsoup_3
libxml2
sqlite
webkitgtk_6_0
];
in {
packages.default = pkgs.stdenv.mkDerivation {
name = "cassette";
src = self;
mesonFlags = [
"-Dis_devel=true"
];
nativeBuildInputs = with pkgs;
[
wrapGAppsHook4
git
]
++ nativeBuildInputs;
inherit buildInputs;
strictDeps = true;
};
devShells.default = pkgs.mkShell {
packages = with pkgs; [alejandra] ++ nativeBuildInputs ++ buildInputs;
};
}
);
}

View file

@ -1,16 +1,16 @@
project(
'cassette',
['c', 'vala'],
version: '0.2.1',
meson_version: '>= 1.0.0',
license: 'GPL-3.0-or-later',
version: '0.2.0',
meson_version: '>= 0.62.0',
license: 'GPL-3.0-only',
)
i18n = import('i18n')
gnome = import('gnome')
gtk = dependency('gtk4', version: '>= 4.15')
libadwaita = dependency('libadwaita-1', version: '>= 1.6')
gtk = dependency('gtk4', version: '>= 4.14')
libadwaita = dependency('libadwaita-1', version: '>= 1.5')
threads = dependency('threads')
libsoup = dependency('libsoup-3.0')
gdkpixbuf = dependency('gdk-pixbuf-2.0')
@ -22,37 +22,35 @@ gstreamer = dependency('gstreamer-1.0')
webkit = dependency('webkitgtk-6.0')
gio = dependency('gio-2.0', version: '>= 2.72')
app_id = 'space.rirusha.Cassette'
name_suffix = ''
version_suffix = ''
app_id_suffix = ''
if get_option('is_devel')
name_suffix = ' (Devel)'
app_id_suffix = '.Devel'
app_id = 'io.github.Rirusha.Cassette'
if get_option('profile') == 'development'
find_program('git', required: true)
vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD', check: true).stdout().strip()
name_postfix = ' (Devel)'
app_id_dyn = '@0@-Devel'.format(app_id)
app_identity_dyn = 'Cassette (Devel)'
profile = 'Devel'
vcs_tag = run_command('git', 'rev-parse', '--short', 'HEAD').stdout().strip()
version_suffix = '-dev.@0@'.format (vcs_tag)
else
name_postfix = ''
app_id_dyn = app_id
app_identity_dyn = 'Cassette'
profile = ''
version_suffix = ''
endif
app_id_dyn = '@0@@1@'.format (app_id, app_id_suffix)
app_name = 'Cassette@0@'.format (name_suffix)
conf = configuration_data()
conf.set_quoted('APP_ID', app_id)
conf.set_quoted('APP_NAME', 'Cassette@0@'.format (name_postfix))
conf.set_quoted('APP_ID_DYN', app_id_dyn)
conf.set_quoted('APP_NAME', app_name)
conf.set_quoted('APP_IDENTITY_DYN', app_identity_dyn)
conf.set_quoted('G_LOG_DOMAIN', app_id)
conf.set10('IS_DEVEL', get_option('is_devel'))
conf.set_quoted('VERSION', '@0@@1@'.format (meson.project_version(), version_suffix))
conf.set_quoted('PROFILE', profile)
conf.set_quoted('VERSION', meson.project_version() + version_suffix)
conf.set_quoted('GETTEXT_PACKAGE', meson.project_name())
conf.set_quoted('DATADIR', join_paths(get_option('prefix'), get_option('datadir')))
conf.set_quoted('GNOMELOCALEDIR', join_paths(get_option('prefix'), get_option('localedir')))
conf.set_quoted('HOMEPAGE', 'https://gitlab.gnome.org/Rirusha/Cassette')
conf.set_quoted('BUGTRACKER', 'https://gitlab.gnome.org/Rirusha/Cassette/-/issues')
conf.set_quoted('HELP', 'https://t.me/CassetteGNOME_Discussion')
subdir('data')
@ -82,4 +80,4 @@ gnome.post_install(
glib_compile_schemas: true,
gtk_update_icon_cache: true,
update_desktop_database: true,
)
)

View file

@ -1,5 +1,10 @@
option(
'is_devel',
type: 'boolean',
value: false
'profile',
type: 'combo',
choices: [
'default',
'development',
],
value: 'default',
description: 'The build profile for app. One of "default" or "development".'
)

View file

@ -1,13 +1,4 @@
# Please keep this list alphabetically sorted
az
be
de
es
ka
pt
pt_BR
ru
sl
sv
tr
zh_CN

View file

@ -1,6 +1,6 @@
data/space.rirusha.Cassette.desktop.in.in
data/space.rirusha.Cassette.Devel.desktop.in.in
data/space.rirusha.Cassette.metainfo.xml.in.in
data/io.github.Rirusha.Cassette.appdata.xml.in
data/io.github.Rirusha.Cassette.desktop.in
data/io.github.Rirusha.Cassette-Devel.desktop.in
data/ui/account-info-dialog.blp
data/ui/begin-view.ui
data/ui/cache-deletion-preferences.ui

1317
po/az.po

File diff suppressed because it is too large Load diff

2071
po/be.po

File diff suppressed because it is too large Load diff

1350
po/de.po

File diff suppressed because it is too large Load diff

2042
po/es.po

File diff suppressed because it is too large Load diff

1317
po/ka.po

File diff suppressed because it is too large Load diff

View file

@ -1 +1,2 @@
# add_project_arguments('-DGETTEXT_PACKAGE="cassette"', language:'c')
i18n.gettext(meson.project_name(), preset: 'glib')

1363
po/pt.po

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

1255
po/ru.po

File diff suppressed because it is too large Load diff

1374
po/sl.po

File diff suppressed because it is too large Load diff

1366
po/sv.po

File diff suppressed because it is too large Load diff

1328
po/tr.po

File diff suppressed because it is too large Load diff

View file

@ -6,8 +6,8 @@ touch ./po/unsort-POTFILES.in
find ./data/ui -iname "*.ui" -type f -exec grep -l "translatable" {} + | while read file; do echo "${file#./}" >> ./po/unsort-POTFILES.in; done
find ./data/ui -iname "*.blp" -type f -exec grep -lrE '_\(|C_|ngettext' {} + | while read file; do echo "${file#./}" >> ./po/unsort-POTFILES.in; done
find ./src -iname "*.vala" -type f -exec grep -lrE '_\(|C_|ngettext' {} + | while read file; do echo "${file#./}" >> ./po/unsort-POTFILES.in; done
find ./data/ -iname "*.desktop.in.in" | while read file; do echo "${file#./}" >> ./po/unsort-POTFILES.in; done
find ./data/ -iname "*.metainfo.xml.in.in" | while read file; do echo "${file#./}" >> ./po/unsort-POTFILES.in; done
find ./data/ -iname "*.desktop.in" | while read file; do echo "${file#./}" >> ./po/unsort-POTFILES.in; done
find ./data/ -iname "*.appdata.xml.in" | while read file; do echo "${file#./}" >> ./po/unsort-POTFILES.in; done
cat ./po/unsort-POTFILES.in | sort | uniq > ./po/POTFILES.in

File diff suppressed because it is too large Load diff

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,35 +12,36 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette {
public Adw.AboutDialog build_about_dialog () {
const string ME = "Vladimir Vaskov https://gitlab.gnome.org/Rirusha";
const string RIRUSHA = "Rirusha https://github.com/Rirusha";
const string TELEGRAM_CHAT = "https://t.me/CassetteGNOME_Discussion";
const string TELEGRAM_CHANNEL = "https://t.me/CassetteGNOME_Devlog";
const string ISSUE_LINK = "https://github.com/Rirusha/Cassette/issues/new";
const string TINKOFF_SUPPORT_LINK = "https://www.tinkoff.ru/cf/21GCxLuFuE9";
const string BOOSTY_SUPPORT_LINK = "https://boosty.to/rirusha/donate";
string[] developers = {
ME,
RIRUSHA,
"KseBooka https://github.com/KseBooka"
};
string[] designers = {
ME
RIRUSHA
};
string[] artists = {
ME,
RIRUSHA,
"Arseniy Nechkin <krisgeniusnos@gmail.com>",
"NaumovSN",
};
string[] documenters = {
ME,
RIRUSHA,
"Armatik https://github.com/Armatik",
"Fiersik https://github.com/fiersik",
"Mikazil https://github.com/Mikazil",
@ -50,7 +50,7 @@ namespace Cassette {
var about = new Adw.AboutDialog () {
application_name = Config.APP_NAME,
application_icon = Config.APP_ID_DYN,
developer_name = "Vladimir Vaskov",
developer_name = "Rirusha",
version = Config.VERSION,
developers = developers,
designers = designers,
@ -58,10 +58,10 @@ namespace Cassette {
documenters = documenters,
// Translators: NAME <EMAIL.COM> /n NAME <EMAIL.COM>
translator_credits = _("translator-credits"),
license_type = Gtk.License.GPL_3_0,
copyright = "© 2023-2024 Vladimir Vaskov",
license_type = Gtk.License.GPL_3_0_ONLY,
copyright = "© 2023-2024 Rirusha",
support_url = TELEGRAM_CHAT,
issue_url = Config.BUGTRACKER,
issue_url = ISSUE_LINK,
release_notes_version = Config.VERSION
};
@ -69,43 +69,28 @@ namespace Cassette {
about.add_link (_("Financial support (Tinkoff)"), TINKOFF_SUPPORT_LINK);
about.add_link (_("Financial support (Boosty)"), BOOSTY_SUPPORT_LINK);
// Please keep alphabetical
about.add_acknowledgement_section (_("Sponsors"), {
"Alex Gluck",
"Amper Shiz",
"Anton P.",
"AveryanAlex",
"Avr_Iv",
"belovmv",
"dant4ick",
"Dmitry M.",
"Do6pblu_Jyk",
"eugene_t",
"Fiersik",
"Fissium",
"gen1s",
"InDevOne",
"IQQator",
"Ivan A.",
"katze_942",
"khaustovdn",
"krylov_alexandr",
"kvadrozorro",
"Mikazil E.",
"Mikazil",
"Mikhail Postnikov",
"Nikolai M.",
"Oleg Shchavelev",
"Pavel T.",
"Petr Chelpanov",
"Roman Aysin",
"Semen Fomchenkov",
"Sergey G.",
"Sergey P.",
"Sergey S.",
"Shakhrutdin Z.",
"Spp595",
"Tamahome",
"Toxblh",
"Vasily Biryukov",
"werlock",

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Cassette.Client;
@ -55,7 +54,6 @@ namespace Cassette {
{ "parse-url", on_parse_url_action },
{ "open-account", on_open_account_action },
{ "open-plus", on_open_plus_action },
{ "get-plus", on_get_plus_action },
{ "mute", on_mute_action },
};
@ -92,14 +90,14 @@ namespace Cassette {
public bool is_devel {
get {
return Config.IS_DEVEL;
return Config.PROFILE == "Devel";
}
}
public Application () {
Object (
application_id: Config.APP_ID_DYN,
resource_base_path: "/space/rirusha/Cassette/",
resource_base_path: "/io/github/Rirusha/Cassette/",
flags: ApplicationFlags.DEFAULT_FLAGS | ApplicationFlags.HANDLES_OPEN
);
}
@ -107,7 +105,7 @@ namespace Cassette {
construct {
application = this;
settings = new Settings ("space.rirusha.Cassette.application");
settings = new Settings ("io.github.Rirusha.Cassette.application");
Cassette.Client.init (is_devel);
@ -439,15 +437,21 @@ namespace Cassette {
}
void on_open_account_action () {
new Gtk.UriLauncher ("https://id.yandex.ru/").launch.begin (null, null);
try {
Process.spawn_command_line_async ("xdg-open https://id.yandex.ru/");
} catch (SpawnError e) {
Logger.warning (_("Error while opening uri: %s").printf (e.message));
}
}
void on_open_plus_action () {
new Gtk.UriLauncher ("https://plus.yandex.ru/").launch.begin (null, null);
}
try {
Process.spawn_command_line_async ("xdg-open https://plus.yandex.ru/");
void on_get_plus_action () {
new Gtk.UriLauncher ("https://plus.yandex.ru/getplus/").launch.begin (null, null);
} catch (SpawnError e) {
Logger.warning (_("Error while opening uri: %s").printf (e.message));
}
}
void on_mute_action () {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
// DEPROCATED

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
using Gee;

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/
namespace Cassette.Client.YaMAPI {

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/

View file

@ -1,9 +1,8 @@
/* Copyright 2023-2024 Vladimir Vaskov
/* Copyright 2023-2024 Rirusha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* the Free Software Foundation, version 3
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
@ -13,7 +12,7 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-License-Identifier: GPL-3.0-only
*/

Some files were not shown because too many files have changed in this diff Show more