~aleteoryx/lfm_embed

ref: 41a5fa81b5c12feb8aab0ad82d42c135e93065f7 lfm_embed/TODO.md -rw-r--r-- 4.0 KiB
41a5fa81alyx Add custom font support. 11 months ago

#Future plans for this project:

#Custom Fonts

For ease-of-inclusion this should probably be handled by internal code, and provided as a set of properties on lfm_embed::ctx::model::Data.

There are 3 main kinds of fonts we should support.

  • User-hosted fonts. These would be loaded directly from a link to a TTF,WOFF2,etc font file.
  • Google fonts fonts. In theory, we'd proxy these, but that's not 100% necessary.
  • Named fonts. e.x. 'serif', 'sans-serif', 'monospace'. Browser will handle these.

There is no good way to expose a typed enum with the current wizard UI, and the resulting UI from this could allow added user flexibility.

#Query Parameters

  • ?font=foo corresponds directly with * { font-family: 'foo' } in the CSS.
  • ?font=foo&include-font=https://example.com/font.otf will additionally append @font-face { font-family: 'foo' src: url('https://example.com/font.otf') }.
  • ?include-stylesheet allows for general stylesheet inclusion. It may be specified N times.

#Context Members

  • font: object null if no font params specified.
  • font.name: string contains ?font
  • font.additional_css will contain the ?include-font css, as well as the proxied contents of ?include-stylesheet.

#Move more things internal

Of the crates currently relied on, the following appear too feature-packed should be replaced with simpler internal code, to reduce binary size.

  • duration-str
  • urlencoding

#Watermarking

Support for a limited form of (optional) watermaking. It would be up to the themes to include it.

#Query Parameters

  • ?watermark specifies opting-in to the watermark.

#Config Entries

  • LFME_WATERMARK_MANDATORY: 0|1 forces a watermark if 1. The main instance will not use this, but alternate instances may.
  • LFME_WATERMARK_TEXT: string should contain the name of the specific instance, or a tagline.
  • LFME_WATERMARK_IMG: string should contain a link to an image. The rendered size of this image is at the discretion of a given theme, but it should be around 32x32, and have an aspect ratio no greater than 1:2.
  • LFME_WATERMARK_URL: string should contain a link to the host, or whoever else the watermarker wishes.

#Context Members

  • watermark: object null, unless (LFME_WATERMARK_TEXT || LFME_WATERMARK_IMG || LFME_WATERMARK_URL) && (?watermark || LFME_WATERMARK_MANDATORY). Should be interpreted as whether to render a watermark.
  • watermark.text = LFME_WATERMARK_TEXT. Defaults to lfm_embed.
  • watermark.img = LFME_WATERMARK_IMG. Defaults to null.
  • watermark.url = LFME_WATERMARK_URL. Defaults to null.

All that is guaranteed is the presence of watermark.text, so all themes should be able to fallback to text. Image support should be considered optional. Linking should be considered optional.

It is not an error to specify a mandatory watermark with no possible contents, as the watermark object will simply not be present. A warning should be output on startup.

#Additional Helpers

  • (range Number start: Number = 0): Number Generates values from start to the main argument, exclusive.
  • (random): Number Generates a random float.

#Additional Services to Support

This should be as transparent as possible to the theme and end-user.

#Services

  • libre.fm
  • listenbrainz
  • hacienda if/when it gets off the ground.

#Config Entries

  • LFME_BACKEND_DEFAULT: string specifies a default backend for /user/ requests..
  • LFME_BACKEND_ADDITIONAL_GNUKEBOX: string,* specifies a set of additional domains supporting the libre.fm API.
  • LFME_BACKEND_ADDITIONAL_LISTENBRAINZ: string,* specifies a set of additional domains supporting the listenbrainz API.
  • LFME_BACKEND_ADDITIONAL_AUDIOSCROBBLER: string,* specifies a set of additional domains supporting the last.fm API.

#Query Parameters

  • ?backend=(last.fm|libre.fm|listenbrainz|LFME_BACKEND_ADDITIONAL_*)

#Context Members

  • user.service never not null
  • user.service.type (audioscrobbler|listenbrainz|gnukebox)
  • user.service.domain the string for the service's domain.