LinuxQuestions.org
Share your knowledge at the LQ Wiki.
Home Forums Tutorials Articles Register
Go Back   LinuxQuestions.org > Forums > Linux Forums > Linux - Software
User Name
Password
Linux - Software This forum is for Software issues.
Having a problem installing a new program? Want to know which application is best for the job? Post your question in this forum.

Notices


Reply
  Search this Thread
Old 03-30-2012, 11:15 PM   #1
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Rep: Reputation: 0
Talking Program to recursively find images and rename to "cover.jpg"


As the title suggests, I'm looking for a simple way to rename all the album art that has accumulated in my music folders over the years. I've used multiple music players in a never ending quest to find the perfect audio player, consequently ending up with a bazillion different jpg's and png's in my music sub-folders (due to stupid automatic cover downloading plugins) with ridiculously long names, such as:
Code:
Accept_-_Metal_Masters-front.jpg
rather than just "cover" or "folder".

What I want to do here is
  1. Search my music folder recursively and find all jpg's and png's
  2. either just completely remove them or change the name to "cover.jpg" or "cover.png" somehow

Ideally I envision a graphical interface that will find the files and display them to me, allowing me to then perform one of the actions I listed above. Does such a program exist? The closest thing that I've ever seen to this is a program written for Windows called Album Art Downloader. It is an awesome program and runs in wine, but sometimes gives me weird results. Is there a native Linux program similar? Many thanks.

**A caveat here is now I'm using xmms2 with xmms2tray, which uses dbus to display album art in the pop-ups. Every one of my albums has art, yet for some reason hardly any of it displays in the pop-up. Anyone know what the filename is that xmms2tray is looking for?
 
Old 03-31-2012, 03:24 AM   #2
fukawi1
Member
 
Registered: Apr 2009
Location: Melbourne
Distribution: Fedora & CentOS
Posts: 854

Rep: Reputation: 193Reputation: 193
I have no idea about a GUI application. But from the command line it is quite easy, with "find".

Code:
# find . -name ".jpg" -exec mv {} cover.jpg \;
This would move them all to the . directory and rename them, you would need to specify the full path to the results directory, I'm not sure how to do this.

Alternatively you could replace "-exec mv {} cover.jpg \;" with -delete, to remove them completely.
 
Old 04-01-2012, 04:04 AM   #3
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Original Poster
Rep: Reputation: 0
That sounds like it will work. Do you know if I could use the rename command rather than delete? I'll probably just use delete and start from scratch as it will less painful, but for future reference?
 
Old 04-01-2012, 07:29 AM   #4
catkin
LQ 5k Club
 
Registered: Dec 2008
Location: Tamil Nadu, India
Distribution: Debian
Posts: 8,578
Blog Entries: 31

Rep: Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208
Quote:
Originally Posted by fukawi1 View Post
Code:
# find . -name ".jpg" -exec mv {} cover.jpg \;
This would move them all to the . directory and rename them ...
Beware! That would effectively delete them all except the last found because each successive mv would overwrite the previous ./cover.jpg
 
Old 04-01-2012, 07:43 AM   #5
colucix
LQ Guru
 
Registered: Sep 2003
Location: Bologna
Distribution: CentOS 6.5 OpenSuSE 12.3
Posts: 10,509

Rep: Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983Reputation: 1983
Quote:
Originally Posted by catkin View Post
Beware! That would effectively delete them all except the last found because each successive mv would overwrite the previous ./cover.jpg
Good catch! Moving/deleting/renaming commands should be given carefully. Furthermore, the command above will not find anything but a hidden file named .jpg (it misses the wildcard). Try this instead:
Code:
find . -name '*.jpg' -execdir echo mv {} cover.jpg \;
Here the echo statement before mv just shows the commands to be executed, without actually execute them. In this way you can review the results and if all appears right, run again without echo. Notice the -execdir action addresses the problem raised by catkin: the command will be executed inside each directory where the JPG files are found! Hope this helps.
 
Old 04-04-2012, 10:35 AM   #6
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Original Poster
Rep: Reputation: 0
Thanks for the tip about -execdir and echo. I wasn't familiar with that. I've got so much multiple art though I think I'm just going to delete it and start fresh. What a pain. How would I use echo with delete?
 
Old 04-04-2012, 10:47 AM   #7
TobiSGD
Moderator
 
Registered: Dec 2009
Location: Germany
Distribution: Whatever fits the task best
Posts: 17,148
Blog Entries: 2

Rep: Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886Reputation: 4886
Quote:
Originally Posted by strungoutfan78 View Post
How would I use echo with delete?
You wouldn't. You would have to use rm instead of the inbuilt -delete option. That would look like this:
Code:
find . -name '*.jpg' -exec echo rm '{}' \;
By the way, AFAIK the curly braces have to be escaped, therefore the single quotes around them.
 
Old 04-04-2012, 11:00 AM   #8
catkin
LQ 5k Club
 
Registered: Dec 2008
Location: Tamil Nadu, India
Distribution: Debian
Posts: 8,578
Blog Entries: 31

Rep: Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208Reputation: 1208
Quote:
Originally Posted by TobiSGD View Post
By the way, AFAIK the curly braces have to be escaped, therefore the single quotes around them.
It always used to be necessary but I routinely do not do so. IDK at what point it became unnecessary. From the GNU bash ref:
Code:
{}

              { list; }

    Placing a list of commands between curly braces causes the list to be executed in the current shell context. No subshell is created.
That does not define what happens when the list is empty.

Experimenting:
Code:
c@CW8:~$ echo {}
{}
c@CW8:~$ echo { echo foo > /dev/null }
[no output]
It would be nice to find a reference explaining that behaviour.
 
Old 04-04-2012, 11:07 PM   #9
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Original Poster
Rep: Reputation: 0
Quote:
Originally Posted by TobiSGD View Post
You wouldn't. You would have to use rm instead of the inbuilt -delete option.
That's what I was wondering. Thanks for that.
 
Old 04-05-2012, 09:03 AM   #10
matrix13
Member
 
Registered: Nov 2006
Location: Kerala, India
Distribution: Arch Linux
Posts: 134

Rep: Reputation: 25
Also, use "-iname" instead of "-name" in you want to match case insensitively (*.jpg and *.JPG are different files in linux).

Use the following to find both *.jpg and *.png in one go.
Quote:
find . -iname '*.jpg" -o -iname '*.png' -exec echo rm '{}' \;
Hope this helps.
 
Old 04-05-2012, 10:12 AM   #11
cascade9
Senior Member
 
Registered: Mar 2011
Location: Brisneyland
Distribution: Debian, aptosid
Posts: 3,753

Rep: Reputation: 935Reputation: 935Reputation: 935Reputation: 935Reputation: 935Reputation: 935Reputation: 935Reputation: 935
I can understand wanting to remove 'excess' artwork......but why would you want them named 'folder.***' or 'cover.***'? Seems a bad idea to have 10s, 100s or 1000s or files with the same name, even if they are in different folders. I know some media players require 'cover.***' or 'folder.***' but that has always struck me as silly....and the media players I use with album art display dont have requirements like that.

I have no idea why xmms2tray wont display most of your album art. Try checking the art it will display, there are a few possibilities (like it gets the 1st pic file it finds, and tries to display it, but wont display images over 200x200, or wont display images that arent .jpeg, etc..). It might even be that it is only displaying artwork embedded into the tags....
 
Old 04-05-2012, 11:08 PM   #12
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Original Poster
Rep: Reputation: 0
Quote:
Originally Posted by matrix13 View Post
Also, use "-iname" instead of "-name" in you want to match case insensitively (*.jpg and *.JPG are different files in linux).

Use the following to find both *.jpg and *.png in one go.

Hope this helps.
I will most likely do exactly that. Thanks for reminding me about -iname.
 
Old 04-05-2012, 11:18 PM   #13
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Original Poster
Rep: Reputation: 0
Quote:
Originally Posted by cascade9 View Post
I have no idea why xmms2tray wont display most of your album art. Try checking the art it will display, there are a few possibilities (like it gets the 1st pic file it finds, and tries to display it, but wont display images over 200x200, or wont display images that arent .jpeg, etc..). It might even be that it is only displaying artwork embedded into the tags....
In all likelihood that's the real problem. I hardly have any art embedded in my ID3 tags, which probably correlates to the small percentage of songs which actually display art. The documentation on xmms2tray is slim to none. I emailed the developer to ask what type of file it is looking for but got absolutely no response. I guess I could browse the source code. Can't be too many lines of code. The only reason I would want to rename them all to "folder" or "cover" is simply to take a shot in the dark to see if it picks them up afterward. I guess I could use easytag to embed all the artwork, but 10,000+ songs is a lot when it won't allow me to do more than one song at a time. *sigh*

Anyone know if exfalso do batch art embedding? (or any other program for that matter)
 
Old 04-05-2012, 11:35 PM   #14
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Original Poster
Rep: Reputation: 0
Well, I'm not too familiar with python, but i think I've found the relevant portion of code handling album art. Can anyone clarify what I'm looking at here? (HAVE_IMAGING is set to true as long as python imaging library is found, which it is in this case) Looks to me like it wants a 64x64 image and will resize to this if the original image is larger. This could be my problem because all my art is MINIMUM 500x500. Any thoughts?

Code:
def newsong(self,res):
        v = res.value()
        
        if isinstance(v, numbers.Integral):
	    # this is the ID. I want the whole info.
	    self.xmms.medialib_get_info(res.value(),self.newsong)
        else:
            if isinstance(v, basestring): # coverart
                info = self.curinfo
                coverimg = StringIO(v)
            elif v is None: # what?
                return
            else:
                info = v
                coverimg = None
                self.curinfo = info

            img = os.getcwd() + '/data/xmms2_64.png'
            if HAVE_IMAGING and 'picture_front' in info:
                if info['picture_front'] == self.lastimg[0]:
                    #same image, just use last.
                    img = self.lastimg[1]
                else:
                    if self.lastimg[1]:
                        #there is an old image to delete.
                        os.remove(self.lastimg[1])
                        self.lastimg = ('', '')
                    if coverimg:
                        orig_pic = Image.open(coverimg)
                        if orig_pic.size[1] <= 64:
                            sm_pic = orig_pic
                        else:
                            sm_pic = orig_pic.resize((64,64), Image.BICUBIC)
                        fname = '/tmp/xmms2tray_cover%08X.png' \
                                    % random.randint(0, 2**32-1)
                        sm_pic.save(fname)
                        self.lastimg = (info['picture_front'], fname)
                        img = fname
                    else:
                        self.xmms.bindata_retrieve(info['picture_front'],
                                                    self.newsong)
                        return
 
Old 04-06-2012, 12:17 AM   #15
strungoutfan78
Member
 
Registered: Mar 2011
Location: San Diego, CA
Distribution: Debian
Posts: 46

Original Poster
Rep: Reputation: 0
Well I did some more digging and found that it is only reading embedded art from the ID3 tags. That really blows. Guess I'll get started embedding one song at a time....
 
  


Reply



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off



Similar Threads
Thread Thread Starter Forum Replies Last Post
[SOLVED] How does a program "find" another file or program when it calls one? pottzie Programming 8 11-10-2011 10:07 PM
Rename all ".JPG" files to ".jpg" under all subfolders... jiapei100 Programming 4 04-25-2010 06:27 PM
please help with bash find / -name "*.sized.jpg" -exec rm -f {} ; rioguia Programming 4 01-16-2010 03:48 PM
Recursively add missing ".jpg" to all JPEG files. Chekote Linux - General 4 09-14-2009 11:45 PM
Just finished compiling Wine, getting "couldn't find program" error Maronflower Linux - Software 1 11-10-2003 06:50 PM

LinuxQuestions.org > Forums > Linux Forums > Linux - Software

All times are GMT -5. The time now is 07:01 PM.

Main Menu
Advertisement
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
Open Source Consulting | Domain Registration