You are not logged in.
Did some changes
#!/bin/bash
shopt -s lastpipe
url_vid="https://invidio.us"
channels=$HOME/.channels
#sel=$(echo "$channels" | sed 's/\ [^ ]*$//' | dmenu -l 20)
dmenu -l 20 -p "YouTube Channels" < $channels | read -a "sel"
[[ ! $sel ]] && exit
list=$(curl -s "${sel[@]:1}" | sed -n 's/.*<p><a href="\(\/watch?v=[^"]*\)">\([^<]*\).*/\1;\2/p')
sel2=$(echo "$list" | sed 's/.*;//'| dmenu -l 20)
[[ ! $sel2 ]] && exit
mpv ${url_vid}$(echo "$list" | sed -n "s/;$sel2$//p")
I used channels list separated by space (instead of ";" ) in separate file, and added exit so when no channels of video is selected script stops instead of going to next step.
The output of curl was too much for my scripting capabilities so I left it as it is.
Last edited by Docbroke (2020-01-30 04:40:44)
Arch is home!
https://github.com/Docbroke
Offline
chans=$(printf "%s\n" "${options[@]%%;*}" | dmenu -i)
Yes, but the line in the dmenu menu is one line.
Can not reproduce, even with -l.
Offline
I'm trying to bind C-v to the functionality of C-Y to mimic how traditional pasting works when copying a cell content (C-c) from LibreOffice Calc and pasting to an application like Firefox. Seems simple enough, especially when C-v and C-V looks like it's unbounded, but the following does not work as I would expect. I simply copied the code for XK_Y to XK_v and XK-V, but end result is that the functionality of C-y and C-Y is duplicated in C-v and C-V, respectively. To re-iterate, I want the functionality of C-Y to be C-v, not C-V. Any help is much appreciated.
--- dmenu-4.9/dmenu.c 2020-01-29 23:35:55.978968100 -0500
+++ dmenu-4.9/dmenu.c 2020-01-30 00:41:13.247510200 -0500
@@ -354,6 +354,14 @@
while (cursor > 0 && !strchr(worddelimiters, text[nextrune(-1)]))
insert(NULL, nextrune(-1) - cursor);
break;
+ case XK_v:
+ XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
+ utf8, utf8, win, CurrentTime);
+ return;
+ case XK_V:
+ XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
+ utf8, utf8, win, CurrentTime);
+ return;
case XK_y: /* paste selection */
case XK_Y:
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
Offline
qinohe wrote:chans=$(printf "%s\n" "${options[@]%%;*}" | dmenu -i)
Yes, but the line in the dmenu menu is one line.
Can not reproduce, even with -l.
So you say all lines in your dmenu menu are produced under each other and not besides(separated by space) ?
Are you using some patched version and can anyone else confirm this is also working for them?
Offline
...
and added exit so when no channels of video is selected script stops instead of going to next step.
...
I have never seen this as a real problem and just escape, non of my layered dmenu scripts have an 'exit'
Nevertheless, nice script. This one script has seen a lot of forms already. Good to see dmenu is very much alive;)
I was sticking to dmenu but I thought everyone has stepped over to rofi ...
Offline
jasonwryan wrote:qinohe wrote:chans=$(printf "%s\n" "${options[@]%%;*}" | dmenu -i)
Yes, but the line in the dmenu menu is one line.
Can not reproduce, even with -l.
So you say all lines in your dmenu menu are produced under each other and not besides(separated by space) ?
Are you using some patched version and can anyone else confirm this is also working for them?
Yes. It's not patched, it is the expected behaviour. You can see that for yourself, each item of the array is split onto a new line:
printf "%s\n" "${options[@]%%;*}"
Offline
Yes, sure I do see that 'printf "%s\n"'
However I'm looking for a way to get this output
NBA
BBALLBREAKDOWN
Basketball Box
not this
NBA BBALLBREAKDOWN Basketball Box
BTW. why have chosen to loop through the channel and not give a second menu?
Offline
Yes, sure I do see that 'printf "%s\n"'
However I'm looking for a way to get this outputNBA BBALLBREAKDOWN Basketball Box
not this
NBA BBALLBREAKDOWN Basketball Box
This is the output I get when I use dmenu -l, otherwise it is presented horizontally, but each item is still \n separated.
BTW. why have chosen to loop through the channel and not give a second menu?
You don't need a second menu: you match the selection from the first against the corresponding URL and hand it to mpv.
Offline
We are talking besides one another, I want your script to show this:
NBA
BBALLBREAKDOWN
Basketball Box
and it doesn't whatever I try, though even I know it's '\n' separated;)
Yes, you don't need a second menu, though, it's looping trough then, you can't choose video's individually which is also nice BTW. was just wondering..
Last edited by qinohe (2020-01-30 17:08:33)
Offline
We are talking besides one another, I want your script to show this:
NBA BBALLBREAKDOWN Basketball Box
and it doesn't whatever I try, though even I know it's '\n' separated;)
It does behave this way (when -l is used): exactly consistent with how the shell works. There is no mystery here. If you can't reproduce, it is something you have altered/configured.
Offline
Oops, I did not even notice the '-i' I normally add a link to my dmenurc and add the '-l'
But since I was testing the script I didn't do that yet. Temporary brain damage I guess sorry for the noise..
Offline
I saw this post first page of this thread and thought it would be a fun project.
If e.g. you read the new archweb-planet on the site, this tool gives an output thats easier to read;)
Reads RSS1, RSS2 & ATOM1 and produces readable output without mangling inline code fields(mostly).
FOAF and OPML can be read too. Links will be downloaded or opened in a browser like lynx(default)
The XML tag base is big and so I leave it to these formats.
Don't expect it to be perfect with a few lines of sed code
Note: adding characters may be an ongoing process;)
Ask for it or check if the script was updated once in a while, thanks.
Thinking about creating a file containing all or most html tags
Minimal dependencies are:
• dmenu
• curl
• xsel or xclip
• lynx(default) or any other browser
Font type may make a difference, chooce a type that shows all characters!
Tested: DejaVuSansMono does show most if not all chars.
How to get started this script:
Easiest is to create a dmenurc in the root dir. of this script, a sample is shown below.
Store the script in a dir., default '~/.config/dmenu'.
There is a usage menu in the script by starting it with dmenu.
Thats it have fun;) I love to hear from you.
An example dmenurc:
# Used colors: RAL 9003 0n RAL 9004 & choice line RAL 9004 on RAL 9007 or reversed.
#dmnews='dmenu -i -l 40 -fn DejaVuSansMono-11 -nb #2e3032 -nf #f4f8f4 -sb #2e3032 -sf #8f8f8c'
dmnews='dmenu -i -l 40 -fn DejaVuSansMono-11 -nb #f4f8f4 -nf #2e3032 -sb #8f8f8c -sf #2e2032'
Main script
#!/bin/sh
# Read various local files or remote XML files & newssites with dmenu
# browser, terminal, update time(min.) and the place where you store this script & or data
user=$(logname)
browser='lynx'
term="xterm"
updtime="120"
progdir="/home/$user/.config/dmenu"
datadir="$progdir/data/rss-sites"
[ -f "$progdir"/dmenurc-news ] &&
. "$progdir"/dmenurc-news || dmnews='dmenu -l 30'
while [ ! -d "$datadir" ] || [ ! -e "$datadir"/xml-sites ]; do
[ ! -d "$datadir" ] && mkdir -p "$datadir"
[ ! -e "$datadir/xml-sites" ] &&
touch "$datadir/xml-sites"
done
trap clean EXIT HUP INT QUIT TERM
clean()
{
unset news site state choice link clink brows address clip next
xclip -sel clip /dev/null
exit 0
}
_necessities() {
if xclip -version 2>/dev/null; then clip="xclip -sel clip -o"
elif xsel --version 2>/dev/null; then clip="xsel -bco"; fi
}
_menu() {
news=$( printf "shownews\nadd-site\ndelete-site\nusage" \
| $dmnews -l 10 -p 'News:' )
}
_newsmenu() {
for xml in $datadir/xml-sites; do
[ -n "$site" ] && exit
site=$( awk '{print $1}' "$xml" | $dmnews -l 10 -p "$news:" ) || exit
done
}
_cleanxml() {
[ "$site" = '' ] && _newsmenu && truncate -s 0 "$datadir/$site"
sed -e 's/\&/\&/g;s/\</</g;s/\>/>/g;s/\'/'\''/g;s/\"/"/g;s/\r$//g;
/<p>/,/<\/p>/s/<br \/>//;/<p>/,/<\/p>/s/<br\/>//;
s/<br \/>/<p>/g;s/<br\/>/<p>/g;
s/<\/p>/&\n/g;
0,/<title>/s//Feed: /;
0,/<lastBuildDate>/s//&\nLastBuild: /;
s/<title>/&\n\n---TITLE--- /g;
s/<dc:title>/Title: /g;
s/<guid isPermaLink=\"true\">[^>]*>//g;
s/<!\[CDATA\[//g;s/\]\]>//g;
s/<link>/&\n\nLink: /g;s/<\/link>/&\n/g;
/<description>/s//&\n\nContent: &\n/g;
/<language>/s//&\nLanguage: /g;
/<copyright>/s//&\nCopyright: /g;
s/<dc:date[^>]*>/&\n /g;
s/<dc:creator[^>]*>/&\n\n/g;
s/<pubDate>/&\n/g;
s/tag:[^>]*>//g;
s/<li[^strong>]*strong>/ • /g;
s/<li>/ • /g;
s/<guid>[^<\/guid>]*<\/guid>//g;
s/<premium>[^<\/premium>]*<\/premium>//g;
s/<[^>]*>//g;
s/\…/…/g;
s/\’/’/g;s/\‘/’/g;s/\“/“/g;s/\”/”/g;
s/\"/"/g;s/\'/'\''/g;s/\</</g;s/\>/>/g;
s/\'/'\''/g;s/\ / /g;
s/\↩/↩/g;s/\︎/. ︎./g;
s/\–/–/g;s/\“/“/g;s/\”/”/g;s/\…/…/g;
s/\&/\&/g;s/\&/\&/g;
s/\t//g;s/^ *$//g' "$datadir/${site}".xml | fold -s -w135 \
| sed 's/^[[:space:]]*$//g' > "$datadir/$site"
sed -i '/^$/N;/^\n$/D' "$datadir/$site"
sed -i '/---TITLE/,/^$/s/\//-/' "$datadir/$site"
sed -i '/---TITLE/,/^$/s/\[/(/' "$datadir/$site"
sed -i '/---TITLE/,/^$/s/\]/)/' "$datadir/$site"
}
_cleanfoaf() {
[ "$site" = '' ] && _newsmenu && truncate -s 0 "$datadir/$site"
sed -e 's/<?[^>]*?>//;
s/\(<[^="]*="\s*\|"[^="]*="\s*\|[^"\/>]*"\/>\s*\|[^">]*">\s*\|[^" \/>]*" \/>\)//g;
s/<\/[^>]*>//g;s/<[^\/>]*\/>//g;s/<rdf[^>]*>//g;
s/<[^>]*>//g;
s/\&/\&/g;s/\'/'\''/g;s/\</</g;s/\>/>/g;s/\"/"/g' \
"$datadir/${site}".xml | fold -s -w135 \
| sed 's/^[[:space:]]*$//g' > "$datadir/$site"
sed -i '/^$/N;/^\n$/D' "$datadir/$site"
}
_cleanopml() {
[ "$site" = '' ] && _newsmenu && truncate -s 0 "$datadir/$site"
sed -e '0,/<title>/s//Feed: /;
s/\&/\&/g;
s/\(<outline[^*]*text="\s*\|"[^*]* title="\s*\|"[^*]* xmlUrl="\)/ •• /g;
s/<[^>]*>//g;
s/"\/>/\n/g;s/">//g;' "$datadir/${site}".xml \
| fold -s -w135 | sed 's/^[[:space:]]*$//g' > "$datadir/$site"
sed -i '/^$/N;/^\n$/D' "$datadir/$site"
}
_newstate() {
if [ "$( cksum "$datadir/${site}".xml | awk '{print $1 ,$2}' )" \
!= "$( awk '{print $1 ,$2}' "$datadir/${site}"_sum )" ]; then
if grep -q '<foaf:' "$datadir/${site}".xml; then
clink='foaf' && [ -s "$datadir/${site}".xml ] &&
state='You have news' && _cleanfoaf
elif grep -q '<opml' "$datadir/${site}".xml; then
clink='opml' && [ -s "$datadir/${site}".xml ] &&
state='You have news' && _cleanopml
else
clink='xml' && [ -s "$datadir/${site}".xml ] &&
state='You have news' && _cleanxml
fi
else
if grep -q '<foaf:' "$datadir/${site}".xml; then
clink='foaf' && state='No news'
[ -e "$datadir/$site" ] || _cleanfoaf
elif grep -q '<opml' "$datadir/${site}".xml; then
clink='opml' && state='No news'
[ -e "$datadir/$site" ] || _cleanopml
else
clink='xml' && state='No news'
[ -e "$datadir/$site" ] || _cleanxml
fi
fi
}
_shownews_one_file() {
choice=$( $dmnews -p "$state:" < "$datadir/$site" ) #&&
[ "$choice" != '' ] && link=$( echo "$choice" | awk '{print $1}') || exit
[ "$link" = 'Link:' ] || [ -n "$link" ] && _brows || exit
}
_shownews() {
_newsmenu
[ -z "$site" ] && exit
_updatexml
_newstate
[ -n "$site" ] && cksum "$datadir/${site}".xml > "$datadir/${site}"_sum
if ! grep -q 'TITLE' "$datadir/${site}"; then
_shownews_one_file && return
fi
while [ -n "$site" ]; do
if [ "$clink" = xml ]; then
article=$( sed -n 's/---TITLE---//p' "$datadir/$site" \
| $dmnews -p "$state:" ) || exit
else
choice=$( $dmnews -p "$state:" < "$datadir/$site" ) || exit
fi
[ "$clink" = xml ] &&
choice=$(sed -n "/$article/,/---TITLE/p;" "$datadir/$site" \
| sed -e '0,/---TITLE---/ s/---TITLE--- //' \
| sed -e 's/---TITLE---/Next item: /' \
| $dmnews -p "$state:" ) || exit
if [ "$clink" = opml ]; then
link=$( echo "$choice" | awk '{print $NF}')
elif [ "$clink" = foaf ]; then
link=$( echo "$choice" | awk '{print $1}')
elif [ "$clink" = xml ]; then
link=$( echo "$choice" | awk '{print $2}')
fi || exit
if [ "$link" = 'Link:' ]; then
_brows
elif [ "$( echo "$link" | cut -c1-4 )" = 'http' ]; then
_brows
elif [ "$link" = 'item:' ]; then
while [ -n "$link" ]; do
next=$(echo "$choice" | sed -e 's/Next item: //')
choice=$(sed -n "/$next/,/---TITLE/p;" "$datadir/$site" \
| sed -e '0,/---TITLE---/ s/---TITLE--- //' \
| sed -e 's/---TITLE---/Next item: /' \
| $dmnews -p "$state:" ) || exit
[ -z "$choice" ] &&
link=$( echo "$choice" | awk '{print $2}' )
[ "$( echo "$link" | cut -c1-4 )" = 'http' ] && _brows
link1=$( echo "$choice" | awk '{print $1}' )
[ "$link1" != 'Next' ] && break
done
fi
done
}
_brows() {
brows=$( echo "$link" | sed 's/Link: //' )
[ -n "$brows" ] && eval $term -e "$browser" "$brows" && exit || exit
}
_updatexml() {
for sites in $site; do
[ -z "$(find "$datadir" -maxdepth 1 -name "${sites}".xml -mmin -"${updtime}")" ] &&
curl "$(awk "/$site/"'{print $2}' \
"$datadir/xml-sites")" -o "$datadir/${sites}.xml"
done
}
_addsite() {
_necessities
address="$( eval "$clip" | $dmnews -p "$news address:" )" || exit
[ -z "$address" ] && exit
site="$( echo '' | $dmnews -p "Name for $address?:" )" || exit
[ -z "$site" ] && exit
curl "$address" -o "$datadir/${site}".xml
cksum "$datadir/${site}".xml > "$datadir/${site}"_sum
printf "%s\n" "$site $address" >> "$datadir"/xml-sites
_newstate
}
_delsite() {
_newsmenu
[ -z "$site" ] && exit
[ -e "$datadir" ] &&
sed -i "/$site/d" "$datadir"/xml-sites
rm "$datadir/${site}".xml \
"$datadir/${site}"_sum \
"$datadir/$site" || exit
}
_usage() {
printf "%s\n" " Add a site:
-----------
Copy a http/s feed address
Enter 'add-site' in the menu
Use tab to add the copied site into place
Or manually add local or remote address
You're asked to give the site a name
Shownews:
---------
The added site should be visable in 'shownews'
You can now read the index of a news page.
Following a news item is done by using the Enter key
Return to index is also done by using Enter.
Going directly to the next news item is done by
following : 'Next item' at the bottom of each news post.
There are RSS files that can only be read as one file.
If so the page page will be shown like this.
Shownews will close if enter is used!
Opening a link will close the reader and open a browser
of your choice
Closing shownews is done by Escape or Ctrl-c
Updates:
--------
Updates are done if you call the news page
Default time is set to 120 minutes change the value of this
variable in this script.
Be carefull not to set it too low, sites may or will ban
your IP for being a bot, at least for a while!
Delete a site:
--------------
Enter the 'delete-site' menu.
Choose a site and hit enter, the site and it's data are removed.
Change the first 5 variables to your liking:
'browser term updtime progdir datadir'" \
| $dmnews -p "$state:"
}
_menu
_pass() {
[ "$news" = shownews ] && _shownews
[ "$news" = add-site ] && _addsite
[ "$news" = delete-site ] && _delsite
[ "$news" = usage ] && _usage
}
_pass "$@"
edit: new way
edit: check for one file XML's
Last edited by qinohe (2020-03-06 16:12:26)
Offline
Main script
Well done! I've tried it out and i like it :-)
getting it running took a couple minutes, but i took some notes for you
1 remove -w flag for compatibility with 'other' dmenu versions
2 use default alternative for XDG_CONFIG_HOME
progdir="${XDG_CONFIG_HOME:=$HOME/.config}/dmenu"
3 check for xclip if xsel is not installed
:%s/xsel -bco/"$clip"/g
if xclip -version 2>/dev/null; then clip="xclip -sel clip -o"
elif xsel --version 2>/dev/null; then clip="xsel -bco"; fi
3.1 Might aswell bring up support for wget at this stage
4 handle folder creation on launch to prevent spam from checking feeds
after you've deleted them all or as in my case on first launch
4.1 clean() attemped to write to a non existant file
same scenario, check if the file exists before running checksum
related to #5
5 Chaining dmenu prevents smooth termination
address="$( $clip | $dmindex -p "$news address:")"
mangles ctrl+c
address="$( $clip | $dmindex -p "$news address:")" || exit
doesn't mangle ctrl+c
6 echo "$choice" | awk '{print $1}'
can be shortened to awk '{print $1}' <<< "$choice"
or cut -d' ' -f1 <<< "$chocie"
or or "${choice%% *}" in bash ( bash only? )
7 no need to [ "$address" = '' ]; just [ "$address" ]
8 you're launching _menu right after defining it, had me running in circles
around the bottom of the script for a moment there :-) should skip that
function if $1 is one of the options for _pass, no?
9 isn't >| a bashism? this script is #!/bin/sh
10 for some reason scrolling through a modest length post ( like your last
post in this thread ) introduced noticable lag in dmenu
Much as that a downside for dmenu i think it could be an upside for you,
Could break up the feed into posts? no :)
11 Heh all you're *really* missing is something along the lines of a while
true loop and you'll be golden.
and ofcourse, good job with sed. I'll have to go over that bit some other time.
Offline
Thanks @neol09 very happy you tried it, and glad you like it.
I have tried a few RSS readers and most of them screw inline code-fields or completely mess up readability.
I will have to take some time to update everything and test it all.
One thing I don't quite get though why "_menu" got you running circles as it's passed before "_pass"
I will however see if I can implement "_menu" with some other logic...
Also didn't know ">|" is a bashism, thought it was sh compliant...
Then 10 & 11 I had no issues scrolling trough the thread and I work on a tiny board as a daily system.
I don't know if it's worth it to show every item as a separate one and have an index but I will have a look at it after I went trough all this first..
If you're interested ; Upboard version1 https://up-board.org/up/specifications/
Offline
Again, @neol09, Thanks for your extensive list there were some very valid pointers in it. If you're the sole user of a script you tend work around it's shortcomings, I was already using it for a little while.
It now don't matter if you exit the script using Enter Esc or Ctrl-c at any point.
I created the list again with the updates or not and gave reasons why I did not implement it.
Could be I have forgot something still, please let me know, Thanks;)
• Q 1 remove -w flag for compatibility with 'other' dmenu versions
• A 1 removed -w width so dmenu users can use it too.• Q 2 use default alternative for XDG_CONFIG_HOME
progdir="${XDG_CONFIG_HOME:=$HOME/.config}/dmenu"
• A 2 XDG removed added user and dir.• Q 3 check for xclip if xsel is not installed
:%s/xsel -bco/"$clip"/g
if xclip -version 2>/dev/null; then clip="xclip -sel clip -o"
elif xsel --version 2>/dev/null; then clip="xsel -bco"; fi
• A 3 xclip or xsel was a minor adjustment, good call• Q 3.1 Might aswell bring up support for wget at this stage
• A 3.1 wget is a different story, local files('file://') must be able to be used too, curl is best suited for this task.
Unless of course you know a way to implement this with wget in a sane way...• Q 4 handle folder creation on launch to prevent spam from checking feeds
after you've deleted them all or as in my case on first launch
• A 4 agreed• Q 4.1 clean() attemped to write to a non existant file
same scenario, check if the file exists before running checksum
related to #5
• A 4.1 brought some new logic into place for clean()• Q 5 Chaining dmenu prevents smooth termination
address="$( $clip | $dmindex -p "$news address:")"
mangles ctrl+c
address="$( $clip | $dmindex -p "$news address:")" || exit
doesn't mangle ctrl+c
• A 5 agreed• Q 6 echo "$choice" | awk '{print $1}'
can be shortened to awk '{print $1}' <<< "$choice"
or cut -d' ' -f1 <<< "$chocie"
or or "${choice%% *}" in bash ( bash only? )
• A 6 '<<<' 'here document' ; you can't use this in POSIX sh• Q 7 no need to [ "$address" = '' ]; just [ "$address" ]
• A 7 must check existence so '-z'• Q 8 you're launching _menu right after defining it, had me running in circles
around the bottom of the script for a moment there :-) should skip that
function if $1 is one of the options for _pass, no?
• A 8 You can't pass '$1' in '_pass' it breaks the script...• Q 9 isn't >| a bashism? this script is #!/bin/sh
• A 9 agreed, removed '|>' though, I thought it is POSIX sh, '-o' is cleaner and part of curl• Q 10 for some reason scrolling through a modest length post ( like your last
post in this thread ) introduced noticable lag in dmenu
Much as that a downside for dmenu i think it could be an upside for you,
Could break up the feed into posts? no
• A 10 no problems scrolling long documents here using dmenu or dmenu2
maybe in a later state if I polished things for a while I will think of breaking up posts...• Q 11 Heh all you're *really* missing is something along the lines of a while
true loop and you'll be golden.
• A 11 there is a while loop now to check for the files, but is that what you meant?
Last edited by qinohe (2020-02-24 17:21:45)
Offline
To re-iterate, I want the functionality of C-Y to be C-v, not C-V. Any help is much appreciated.]
youu dont need to duplicate code like you're doing, just add the switch case without any return or break, like so
case XK_v:
case XK_y: /* paste selection */
case XK_Y:
XConvertSelection(dpy, (ev->state & ShiftMask) ? clip : XA_PRIMARY,
utf8, utf8, win, CurrentTime);
and this works fine for me. did you by chance forget to recompile?
Offline
The dmenu xml reader (#362) has got an overhaul which have changed it's working quite a bit.
The news pages now have an index of which each item shows a single news post.
Read usage in the menu to see exactly how it works, hope you like it..
edit: added way to open one file XML, like VuXML
Last edited by qinohe (2020-03-06 16:14:12)
Offline
Hi
I could use some help with a wee script i been playing with, i am by no means a coder in any shape or form, so im sure my script could be sanitized, i have gotten it to work almost the way i want, the only issue im having is how to close feh once the track is finished, as is im using feh -A flag to close the feh window when clicked on.
here is my mish mash
#!/bin/bash
url=$(cat /home/cirrus/Documents/mp3.txt | cut -c 31- | shuf |sed 's/....$//' | bemenu --tf "#028e9b" --tb "#1c1c1c" --nb "#303030" --nf "#f5e5d5" --hf "#d79921" --hb "#191919" --sb "#080808" --sf "#d7ff00" -l 17 -P Play:➤ )
ffmpeg -i "/home/cirrus/Music/mp3/$url.mp3" /home/cirrus/cover.png -y && feh -P -. -g 150x150+1192+597 -A 'rm /home/cirrus/cover.png' /home/cirrus/cover.png | mpg123 "/home/cirrus/Music/mp3/$url.mp3" &
exit
fehartmp3
I pasted path of mp3 directory into firefox then used the Link Gopher extension to snarf all the paths of my mp3's then saved them to a .txt file, and as you can see i killed a cat [sic].
Any help on cleaning this up and/or how to rm ~/cover.png && exit feh after track completion would be great, thanks in advance.
P.S i am aware
mpv --geometry=150x150+1192+597 --autofit-smaller=150x1500 "/home/cirrus/Music/mp3/$url.mp3"
would suffice but id rather use the ffmpeg method to show embedded album art.
Regards:
cirrus
Last edited by cirrus (2020-03-15 19:56:44)
Ancestoral Clan https://cirrus.freevar.com/mclean.html
Offline
@cirrus, Haven't had time to try but I have a question; what is 'shuf', or did you mean shuffle?
I'm sure you don't need to kill the cat , bring it to the animal pension instead (you can get rid of it yeah for sure)
Also it's worthwhile to mention needed dependencies..
Offline
@cirrus, Haven't had time to try but I have a question; what is 'shuf', or did you mean shuffle?
https://linux.die.net/man/1/shuf
https://www.gnu.org/software/coreutils/ … ation.html
Offline
No, he meant shuf. I didn't even know shuffle existed. Now that I do, I can't imagine why it does. shuf is a shell built in (edit: I guess not in bash, but it is provided by coreutils as it's a POSIX tool).
Cirrus, I can't make heads or tails of what the ffmpeg et al line does, but for the first line, ditch the text file and just use find:
find /path/to/mp3s/ -type f -name '*.mp3' | shuf ...
Last edited by Trilby (2020-03-15 23:09:48)
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Well how about that, I knew shuffle exists but I didn't know about shuf, coreutils even..;)
edit: @Trilby, he extracts an image from the *.mp3 with ffmpeg, shows it with feh and later deletes it and plays the file with mpg123
Last edited by qinohe (2020-03-15 22:50:46)
Offline
Yes, but why would those steps be in a pipeline? Why is the rm command a parameter and what is piped to mpg123. None of that seems necessary.
"UNIX is simple and coherent" - Dennis Ritchie; "GNU's Not Unix" - Richard Stallman
Offline
Agreed, but beats me, it's his script. I was simply telling in words what I saw after you said heads or tails;)
edit: He's using 'feh -A' (action) and uses a shell command to remove the extracted picture...
Right so I had some time to try your script and it's very ugly, really
I now get the pipe to mpg123... but it will only work if there's embedded art...
Loose that feh crap or think out a working solution...
Here's a working based on your script without feh btw. & based on dmenu.
I used find as proposed by Trilby.
#!/bin/bash
[ -f "$HOME"/.config/dmenu/dmenurc ] &&
. "$HOME"/.config/dmenu/dmenurc || dmuse='dmenu'
dir=("$HOME"/Music
"$HOME"/Nextcloud/Music)
file=$(find "${dir[@]}" -maxdepth 6 -type f -name '*.mp3' \
| shuf | sed 's/....$//' | $dmuse -l 30 -p "Play:➤" )
mpg123 "${file}.mp3" &
Last edited by qinohe (2020-03-16 05:20:54)
Offline
Thank you all for taking the time to respond to my spaghetti mess, and for the useful tips.
i apologise if i posted in the wrong place as im aware this is not a support thread.
kind regards
[edit]
I now get the pipe to mpg123... but it will only work if there's embedded art...
i use a rubygem named fancy_audio which makes embedding art a breeze w/ the -all flag.
qinohe Thanks your more sane script with the slight edit
#mpg123 "/home/cirrus/Music/mp3/${file}.mp3" &
mpv --geometry=150x150+1192+600 --autofit-smaller=150x150 "/home/cirrus/Music/mp3/${file}.mp3" &
makes it do exactly as i hoped.
Last edited by cirrus (2020-03-16 21:22:53)
Ancestoral Clan https://cirrus.freevar.com/mclean.html
Offline