semvec/pypi-packages huggingface dataset:
plyrfm-mcp 0.0.1a15
MCP server for plyr.fm
Requires Python: >=3.10
Keywords: atproto, mcp, music, plyr, streaming

# plyrfm-mcp

MCP server for [plyr.fm](https://plyr.fm) - expose your music library to LLM clients.

## quickstart

use the hosted server with claude code:

```bash
claude mcp add-json plyr-fm '{"type": "http", "url": "https://plyrfm.fastmcp.app/mcp", "headers": {"x-plyr-token": "YOUR_TOKEN"}}'
```

or run locally via uvx:

```bash
PLYR_TOKEN="your_token" uvx plyrfm-mcp
```

## install

```bash
uv add plyrfm-mcp
```

## tools

this server is **read-only** by design. use the `plyrfm` CLI for mutations (upload, delete, like, unlike).

**public (no auth):**
- `list_tracks` - list public tracks
- `get_track` - get a single track by ID
- `search` - search tracks, artists, albums, tags
- `top_tracks` - get top tracks by likes
- `list_tags` - list all tags with track counts
- `tracks_by_tag` - get tracks with a specific tag

**authenticated:**
- `my_tracks` - list your tracks
- `liked_tracks` - list your liked tracks

tools that return lists support `_filter` for jmespath filtering.

## filtering

tools that return lists support a `_filter` parameter for jmespath expressions:

```
# select specific fields
list_tracks(_filter="[*].{id: id, title: title}")

# filter by condition
list_tracks(_filter="[?play_count > `50`]")

# extract values
list_tracks(_filter="[*].title")
```

## auth

get a developer token at [plyr.fm/portal](https://plyr.fm/portal) -> "developer tokens"
plyrfm 0.0.1a15
python sdk for plyr.fm - music streaming on AT Protocol
Requires Python: >=3.10
Keywords: atproto, audio, bluesky, music, plyr, streaming

# plyrfm

python sdk for [plyr.fm](https://plyr.fm) - music on atproto.

## quickstart

requires `uv`. lists recent tracks:

```bash
uv run --with plyrfm python -c "
from plyrfm import PlyrClient

client = PlyrClient()
for t in client.list_tracks(limit=5):
    print(f'{t.id}: {t.title} by {t.artist}')
"
```

## install

```bash
uv add plyrfm
```

## usage

```python
from plyrfm import PlyrClient

# public operations (no auth needed)
client = PlyrClient()
tracks = client.list_tracks()
track = client.get_track(42)

# authenticated operations
client = PlyrClient(token="your_token")
my_tracks = client.my_tracks()
client.upload("song.mp3", "My Song")
client.download(42)
```

## CLI

```bash
# set token once
export PLYR_TOKEN="your_token"

# list public tracks
plyrfm list

# list your tracks
plyrfm my-tracks

# upload
plyrfm upload track.mp3 "Song Title"

# download
plyrfm download 42
```

## auth

get a developer token at [plyr.fm/portal](https://plyr.fm/portal) -> "developer tokens"
vibro-nomogram 0.1.0
Matplotlib projection class for frequency-domain vibration analysis
Requires Python: >=3.9

Matplotlib Double-Log Projection with Acceleration and Displacement Axes
========================================================================

.. figure:: https://raw.githubusercontent.com/a-ma72/vibro-nomogram/main/demo.png



This project provides a custom projection for Matplotlib to create double-logarithmic plots of velocity vs. frequency,
with additional-tilted axes for acceleration and displacement.

Features
--------

- Log-log plot for velocity vs. frequency.
- Additional axes for acceleration and displacement.
- Customizable grid lines.

Installation
------------

To install this package, you can run:

.. code-block:: bash

    pip install .

from the root of this repository.

Usage
-----

Here is a simple example of how to use this projection:

.. code-block:: python

    import matplotlib.pyplot as plt
    import numpy as np
    import vibro_nomogram

    def main():
        fig, ax = plt.subplots(1, 1, subplot_kw=dict(projection='frequency_space'))

        # plot some data
        f = np.logspace(-1, 3, 100)
        v = 100 * np.exp(-f/1000)

        ax.plot(f, v, 'k-')
        ax.grid(True, which='both')

        ax.set_xlabel('Frequency (Hz)')
        ax.set_ylabel('Velocity (mm/s)')
        ax.set_xlim(0.1, 1000)
        ax.set_ylim(1e-2, 1e3)

        plt.show()

    if __name__ == '__main__':
        main()