1. I don't see any reason to get rid of them.
But they do primarily exist simply because that was what was
there
before. The filters factories that I created later on took into
consideration that they could be combined with logic and other
filters. Initially I made one for versions of all the filters
that the
browser had so I could preserve it's API.
2. I did not build an autoload system for the filters that are
kept.
Their names are generated and rather verbose.
And just because you kept a filter doesn't mean you want to
load it
automatically next time. I didn't make assumptions about what
people
might want to do. I personally found that I rarely used kept
filters
directly.
What I do is I look through my kept filters and copy the ones I
want
into my config. I fix their names and sometimes modify them.
They are
good way to understand how filters work as well.
I don't really keep that many anymore. I can write them
directly
without much effort.
3. Yes of course.
Https://codeberg.org/ZeniesQis/zis-hydras.git
I just pushed them as part of my emacs configuration cleanup. I
mostly
only use a couple of the EMMS ones.
Have fun!
Goodnight!
Erica (Zenie)
Sent from Proton Mail for Android.
-------- Original Message --------
On Friday, 11/28/25 at 22:40 Igor Sosa Mayor
<[email protected]> wrote:
Hi Erica,
thanks for your reply and your elaborate explanation.
I have at least three questions:
1. when you say
> The filter system was just beginning to take shape and
> backward
compatible was a big concern.
> Now, there is no longer a good reason to have both.
what are you exactly proposing? Just to have the since-filter
and
remove
the not-filter?
2. when you say
> Also the filters you build on the filter stack can be
> saved,
> and you can copy them into your config, give them a name
> and just
have them as choices in the system. They are human readable
data.
How does the save mechanism really work? If a) I make a filter,
b)
execute emms-filters-keep, the filter is saved to the file I
have
configured with emms-filters-multi-filter-save-file. But: If I
restart
emacs, this file is never read again (I do not see any code for
this in
emms-filters.el). How is this supposed to work?
Could you maybe give us an example?
3. could you share your hydra please?
Many thanks in advance.
On 11/28/25 18:54, Erica Qi wrote:
Hello everyone,
I thought I should show the fix and explain a little bit about
the filter system. These were two of the first filters I
replaced from the old browser filters.
I replaced them purely to be backwards compatible in the same
choices. But really, the not filter is unnecessary.
So much so that I forget to put the 'not'.
A 'push-not' of the played-within filter does the same thing.
So here is the fix, and a short explanation of using the
Interactive filter stack.
---
The fix is the 'not' in front of the (funcall ....
Filters are simple tests which take an Emms track. They get
the values they care about and test them how they want.
And return true or false.
To get a filter that is the not of another filter we can use
the original filter and put a 'not' around it.
(defun emms-filters-make-filter-not-played-within (days)
"Make a not played since DAYS filter."
(lambda (track)
(not (funcall (emms-filters-make-filter-played-within
days)
track))))
(emms-filters-register-filter-factory "Not played since"
'emms-filters-make-filter-not-played-within
'(("Days: " (:number . nil))))
Historically, the within and not-within were 2 of the first
filters I created because the browser originally had them.
The filter system was just beginning to take shape and
backward compatible was a big concern.
Now, there is no longer a good reason to have both.
Another way to filter 'not within is with the interactive
filter stack. Push a 'Not' filter of 'played-since' onto the
filter stack with 'push-not'. That's a not played within
filter.
You can save it, and put the definition in your config.
It's just data.
The filter stack is the way to filter your tracks.
Pushes can be 'regular', 'and', 'or' and 'not'.
The filter stack is a stack of filter lists.
Each list is a list of 'or' filters.
Between the lists you can think of them as 'and'
So think of an 'and list' of 'or's.
A 'not' is a special way to start a new 'and' that indicates
that it is 'not' this or this or this.
There are actually 4 ways to push a filter onto the filter
stack. There is the regular push, push-and, push-or,
push-not.
The 'regular' push starts a new list of lists. You can have
more than one on the stack. That means you can be searching
and decide to 'start over' with some quick search. When you
are done with that you can 'pop' back down to where you were
and resume where you left off.
push-and adds a new list with a filter in it to whatever is
going on. Push-and is the same as push if it's the first one.
push-or adds a new filter to the current 'and' list.
push-not starts a new 'and' list flagged as 'not'.
Popping goes back to the previous way things were.
Smashing will clear the stack to a new choice.
Squashing reduces the stack to have only the top thing.
Swap will swap the top thing with the one below it.
You can also swap and pop, so swap the last thing with the
thing before it and pop it off. If you swap-pop enough you
have a squash.
If you happen to make a 'new' filter as you go, that filter
will show up in its factory's menu so you don't need to create
it again until the next session.
Also the filters you build on the filter stack can be saved,
and you can copy them into your config, give them a name and
just have them as choices in the system. They are human
readable data.
Don't forget you can also push and pop your results on the
cache-stack. If you have a huge library this can speed things
up quite a bit. The cache is the data, the filter is a 'view'
of the data. You can push to the cache stack and keep going or
smash your filter and continue like that.
Caches can also be stashed for later in the session. Once
stashed you can push them back on your cache stack whenever
you want. They are like a snaposhot database of your results.
I hope that all makes sense.
I don't know why I didn't think to just say do a 'push-not'.
Also, I do have a nice hydra that allows all this to be done
interactively so you can see the two stacks change as you push
and pop filters.
I'm not sure transient is capable of the same thing. I haven't
seen one that shows much in the way of formatted and changing
data. I'm working on a filter-view-mode for it. But it's not
ready yet. I'll post a link to my hydra.
Have a nice day or evening. It's evening here.
Erica
Sent from Proton Mail for Android.
-------- Original Message --------
On Tuesday, 11/25/25 at 08:53 Igor Sosa Mayor
<[email protected]> wrote:
Hi emms-users,
I have already a small problem. In this case with the filter
factory
defined as "Not played since". If I filter my tracks with
"Played since"
and "Not played since" 30 days, I get exactly the same
results... Either
it is a problem with the way my tracks are storing the time or
a problem
with the code.
More precisely my question is: is this code working at
expected?
(defun emms-filters-make-filter-not-played-within (days)
"Make a not played since DAYS filter."
(lambda (track)
(funcall (emms-filters-make-filter-played-within days)
track)))
Thanks in advance!
Best,