Skip to content

Commit

Permalink
open public
Browse files Browse the repository at this point in the history
  • Loading branch information
umnik1 committed Nov 9, 2023
1 parent c1d779e commit 57a5f39
Show file tree
Hide file tree
Showing 31 changed files with 2,353 additions and 1,063 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
node_modules
.cache
.parcel-cache
.parcel-cache
skin.json
token.json
89 changes: 17 additions & 72 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,84 +1,29 @@
<p align="center">
<a href="https://desktop.webamp.org/">
<img src="./res/logo.svg" alt="Webamp on desktop logo" width=384 height=128>
</a>
# Yaamp

<h3 align="center">Webamp on desktop</h3>
Исходники проекта по интеграции Яндекс.Музыки и *Winamp (Webamp)*

<p align="center">
Just like the original, now on your Mac, Windows or a Linux!
</p>
### **Установка**

<p align="center">
<a href="https://desktop.webamp.org" title="Downloads"><img src="https://img.shields.io/github/downloads/durasj/webamp-desktop/total.svg" /></a>
<a href="https://travis-ci.org/durasj/webamp-desktop" title="Build"><img src="https://img.shields.io/travis/durasj/webamp-desktop/master.svg" alt="Build badge" /></a>
<a href="https://twitter.com/intent/tweet?text=Wow:&url=https%3A%2F%2Fgithub.com%2Fdurasj%2Fwebamp-desktop" title="Tweet"><img src="https://img.shields.io/twitter/url/https/github.com/durasj/webamp-desktop.svg?style=social" alt="Tweet badge" /></a>
</p>
</p>
1. yarn install
2. В **node_modules/yandex-music-client** перенести папки **"core" и "services"** с заменой.
3. Поправить в package.json - "copy" на тот, на какой системе вы сейчас работаете, на данный момент настроенно на Windows

<br>
**Добавление функционала и работа с Webamp**

[![Screenshot of webamp desktop on Windows](./res/screen-win.gif)](https://desktop.webamp.org/) [![Screenshot of Webamp on Linux](./res/screen-linux.png)](https://desktop.webamp.org/) [![Screenshot of Webamp on Mac OS X](./res/screen-mac.png)](https://desktop.webamp.org/)
1. Собираем проект - [https://github.com/umnik1/yaaamp-base](https://github.com/umnik1/yaaamp-base "https://github.com/umnik1/yaaamp-base")
2. Переносим оттуда файл **webamp.bundle.js** в папку **/src/webamp**

Unofficial app. It has most of the functionality of the original Winamp, but it's still more of a proof of concept. Based on the [Webamp](https://github.com/captbaritone/webamp) - "A reimplementation of Winamp 2.9 in HTML5 and JavaScript." by the [@captbaritone](https://github.com/captbaritone). Linux support via AppImage and .deb package tested on the Ubuntu 18.04.
### **Общая информация**

## Downloads
Head over to the [desktop.webamp.org](https://desktop.webamp.org/) for the latest download files for your platform.
**Всё взаимодейстиве между electron и webamp происходит через ipc**

## Ideas for the future
**При сборке под linux и mac удалите или закомментриуйте дискорд интеграцию - DiscordRPC* (rpc var)***

### Higher priority
### **Ошибки в коде и помощь с проектом**

- "Media Keys" support (Play, Pause, Stop, Previous, Next) via [Media Transport Controls](https://docs.microsoft.com/en-us/windows/uwp/audio-video-camera/system-media-transport-controls) on Windows, MPRemoteCommandCenter on Mac and [D-BUS on Linux](https://specifications.freedesktop.org/mpris-spec/latest/) - inspiration from [electron-media-service](https://github.com/MarshallOfSound/electron-media-service)
- Implement Taskbar media control buttons
- Milkdrop visualizer
- Persisting state of the player
Я толком не "прибирался" в коде, поэтому он выглядит не очень красиво и стерильно, но со временем я почищу всё.

### Lower priority
*Проект открыт для любых реквестов, особенно нужна помощь со сборкой под Mac и Linux.
*

- Support for multiple displays
- Automatic updates (prepared, notifications already done)
- Support file associations

### Nice to have / Experiments

- Features that can't be in the web version (by extending the API)
- Try to integrate Spotify (inspiration from [winampify-js](https://github.com/remigallego/winampify-js)?), milkdrop can be integrated using microphone (?) due to problems with the DRM

## Known issues

### Installation files are not trusted

Some operating systems, especially Windows or some browsers do not trust the installation files because they are not digitally signed and/or commonly used yet. Unfortunately, code signing certificates that would help us overcome this cost hundreds of euro per year. This project does not have any funding and therefore can't afford it. It's recommended to verify the checksum of the files if you are worried. Every commit (and therefore published checksum) is signed in this repository.

### Poor performance on Linux

Caused by the disabled hardware acceleration on the Linux. The reason is [issues with the transparency on the Chromium project](https://bugs.chromium.org/p/chromium/issues/detail?id=854601#c7).

## Developing

### Prerequisites

Make sure you have latest [node.js](https://nodejs.org/en/) and [yarn](https://yarnpkg.com/lang/en/).

### Installing

Clone this repository, install dependencies and run the start script:

```
git clone https://github.com/durasj/webamp-desktop.git
cd webamp-desktop
yarn install
yarn start
```

After the build has completed, you should see one window with the app and one with developer tools. To try some changes, you can: change the code in the `./src` dir, close the current window and run the `yarn start` again.

## Kudos

This project is possible thanks to the [Webamp](https://github.com/captbaritone/webamp) from [@captbaritone](https://github.com/captbaritone) and wonderful open source work of others like [@jberg](https://github.com/jberg) and authors of [many dependencies](https://github.com/durasj/webamp-desktop/blob/master/package.json).

Thumbar icons on Windows by [Smashicons](https://smashicons.com).

## Disclaimer
Not affiliated with the [Winamp](http://www.winamp.com/). All product names, logos, and brands are property of their respective owners.
http://yaamp.ru/
Binary file added build/icon.ico
Binary file not shown.
Binary file added build/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 10 additions & 0 deletions core/ApiError.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { ApiResult } from './ApiResult';
export declare class ApiError extends Error {
readonly url: string;
readonly status: number;
readonly statusText: string;
readonly body: any;
readonly request: ApiRequestOptions;
constructor(request: ApiRequestOptions, response: ApiResult, message: string);
}
33 changes: 33 additions & 0 deletions core/ApiError.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.ApiError = void 0;
var ApiError = /** @class */ (function (_super) {
__extends(ApiError, _super);
function ApiError(request, response, message) {
var _this = _super.call(this, message) || this;
_this.name = 'ApiError';
_this.url = response.url;
_this.status = response.status;
_this.statusText = response.statusText;
_this.body = response.body;
_this.request = request;
return _this;
}
return ApiError;
}(Error));
exports.ApiError = ApiError;
13 changes: 13 additions & 0 deletions core/ApiRequestOptions.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export type ApiRequestOptions = {
readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH';
readonly url: string;
readonly path?: Record<string, any>;
readonly cookies?: Record<string, any>;
readonly headers?: Record<string, any>;
readonly query?: Record<string, any>;
readonly formData?: Record<string, any>;
readonly body?: any;
readonly mediaType?: string;
readonly responseHeader?: string;
readonly errors?: Record<number, string>;
};
2 changes: 2 additions & 0 deletions core/ApiRequestOptions.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
7 changes: 7 additions & 0 deletions core/ApiResult.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export type ApiResult = {
readonly url: string;
readonly ok: boolean;
readonly status: number;
readonly statusText: string;
readonly body: any;
};
2 changes: 2 additions & 0 deletions core/ApiResult.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
14 changes: 14 additions & 0 deletions core/AxiosHttpRequest.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { ApiRequestOptions } from './ApiRequestOptions';
import { BaseHttpRequest } from './BaseHttpRequest';
import type { CancelablePromise } from './CancelablePromise';
import type { OpenAPIConfig } from './OpenAPI';
export declare class AxiosHttpRequest extends BaseHttpRequest {
constructor(config: OpenAPIConfig);
/**
* Request method
* @param options The request options from the service
* @returns CancelablePromise<T>
* @throws ApiError
*/
request<T>(options: ApiRequestOptions): CancelablePromise<T>;
}
37 changes: 37 additions & 0 deletions core/AxiosHttpRequest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AxiosHttpRequest = void 0;
var BaseHttpRequest_1 = require("./BaseHttpRequest");
var request_1 = require("./request");
var AxiosHttpRequest = /** @class */ (function (_super) {
__extends(AxiosHttpRequest, _super);
function AxiosHttpRequest(config) {
return _super.call(this, config) || this;
}
/**
* Request method
* @param options The request options from the service
* @returns CancelablePromise<T>
* @throws ApiError
*/
AxiosHttpRequest.prototype.request = function (options) {
return (0, request_1.request)(this.config, options);
};
return AxiosHttpRequest;
}(BaseHttpRequest_1.BaseHttpRequest));
exports.AxiosHttpRequest = AxiosHttpRequest;
8 changes: 8 additions & 0 deletions core/BaseHttpRequest.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { ApiRequestOptions } from './ApiRequestOptions';
import type { CancelablePromise } from './CancelablePromise';
import type { OpenAPIConfig } from './OpenAPI';
export declare abstract class BaseHttpRequest {
readonly config: OpenAPIConfig;
constructor(config: OpenAPIConfig);
abstract request<T>(options: ApiRequestOptions): CancelablePromise<T>;
}
10 changes: 10 additions & 0 deletions core/BaseHttpRequest.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseHttpRequest = void 0;
var BaseHttpRequest = /** @class */ (function () {
function BaseHttpRequest(config) {
this.config = config;
}
return BaseHttpRequest;
}());
exports.BaseHttpRequest = BaseHttpRequest;
26 changes: 26 additions & 0 deletions core/CancelablePromise.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
export declare class CancelError extends Error {
constructor(message: string);
get isCancelled(): boolean;
}
export interface OnCancel {
readonly isResolved: boolean;
readonly isRejected: boolean;
readonly isCancelled: boolean;
(cancelHandler: () => void): void;
}
export declare class CancelablePromise<T> implements Promise<T> {
readonly [Symbol.toStringTag]: string;
private _isResolved;
private _isRejected;
private _isCancelled;
private readonly _cancelHandlers;
private readonly _promise;
private _resolve?;
private _reject?;
constructor(executor: (resolve: (value: T | PromiseLike<T>) => void, reject: (reason?: any) => void, onCancel: OnCancel) => void);
then<TResult1 = T, TResult2 = never>(onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null, onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null): Promise<TResult1 | TResult2>;
catch<TResult = never>(onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): Promise<T | TResult>;
finally(onFinally?: (() => void) | null): Promise<T>;
cancel(): void;
get isCancelled(): boolean;
}
Loading

0 comments on commit 57a5f39

Please sign in to comment.