Merge lp:~jpakkane/mediascanner2/standalone-art-uri into lp:mediascanner2

Proposed by Jussi Pakkanen
Status: Rejected
Rejected by: Marcus Tomlinson
Proposed branch: lp:~jpakkane/mediascanner2/standalone-art-uri
Merge into: lp:mediascanner2
Diff against target: 129 lines (+69/-4)
3 files modified
src/mediascanner/MediaFile.cc (+52/-4)
test/test_mfbuilder.cc (+14/-0)
test/test_util.cc (+3/-0)
To merge this branch: bzr merge lp:~jpakkane/mediascanner2/standalone-art-uri
Reviewer Review Type Date Requested Status
Marcus Tomlinson (community) Disapprove
PS Jenkins bot (community) continuous-integration Approve
Review via email: mp+244588@code.launchpad.net

Commit message

Detect standalone album art and return art uris that points to it.

Description of the change

Detect standalone album art and return art uris that points to it.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
291. By Jussi Pakkanen

Whitespace fix to restart Jenkins.

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Ruben Maes (ruben-maes96) wrote :

When is this going to be reviewed and merged? It seems like a pretty minor change but it's important to the UX.

Revision history for this message
Marcus Tomlinson (marcustomlinson) wrote :
review: Disapprove

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/mediascanner/MediaFile.cc'
2--- src/mediascanner/MediaFile.cc 2014-08-31 03:24:25 +0000
3+++ src/mediascanner/MediaFile.cc 2015-01-20 15:02:41 +0000
4@@ -22,9 +22,52 @@
5 #include "internal/MediaFilePrivate.hh"
6 #include "internal/utils.hh"
7 #include <stdexcept>
8+#include<array>
9+#include<cstdlib>
10+#include<memory>
11+#include<dirent.h>
12+#include<algorithm>
13
14 using namespace std;
15
16+namespace {
17+
18+std::string detect_standalone_albumart(const string &absolute_filename) {
19+ static const std::array<const char *, 2> suffixes{"png", "jpg"};
20+ static const std::array<const char *, 6> namebases{"cover", "album", "albumart", "front", ".folder", "folder"};
21+ auto slash = absolute_filename.rfind('/');
22+ if (slash == string::npos) {
23+ return "";
24+ }
25+ string dirname = absolute_filename.substr(0, slash);
26+ string detected;
27+ unique_ptr<DIR, int(*)(DIR*)> dir(opendir(dirname.c_str()), closedir);
28+ if(!dir) {
29+ return "";
30+ }
31+ unique_ptr<struct dirent, void(*)(void*)> entry((dirent*)malloc(sizeof(dirent) + NAME_MAX + 1), free);
32+ struct dirent *de = nullptr;
33+ while(readdir_r(dir.get(), entry.get(), &de) == 0 && de) {
34+ const string fname(entry->d_name);
35+ auto sufpoint = fname.rfind('.');
36+ if(sufpoint == string::npos) {
37+ continue;
38+ }
39+ auto namebase = fname.substr(0, sufpoint);
40+ auto suffix = fname.substr(sufpoint+1);
41+ transform(namebase.begin(), namebase.end(), namebase.begin(), ::tolower);
42+ transform(suffix.begin(), suffix.end(), suffix.begin(), ::tolower);
43+ if(find(namebases.begin(), namebases.end(), namebase) != namebases.end() &&
44+ find(suffixes.begin(), suffixes.end(), suffix) != suffixes.end()) {
45+ detected = dirname + "/" + fname;
46+ break;
47+ }
48+ }
49+ return detected;
50+}
51+
52+}
53+
54 namespace mediascanner {
55
56 MediaFile::MediaFile() : p(new MediaFilePrivate) {
57@@ -151,12 +194,17 @@
58
59 std::string MediaFile::getArtUri() const {
60 switch (p->type) {
61- case AudioMedia:
62+ case AudioMedia: {
63 if (p->has_thumbnail) {
64 return make_thumbnail_uri(getUri());
65- } else {
66- return make_album_art_uri(getAuthor(), getAlbum());
67- }
68+ }
69+ auto standalone = detect_standalone_albumart(p->filename);
70+ if(!standalone.empty()) {
71+ return make_thumbnail_uri(mediascanner::getUri(standalone));
72+ }
73+ return make_album_art_uri(getAuthor(), getAlbum());
74+ }
75+
76 default:
77 return make_thumbnail_uri(getUri());
78 }
79
80=== added directory 'test/media/standalone_art'
81=== added file 'test/media/standalone_art/cover.jpg'
82Binary files test/media/standalone_art/cover.jpg 1970-01-01 00:00:00 +0000 and test/media/standalone_art/cover.jpg 2015-01-20 15:02:41 +0000 differ
83=== modified file 'test/test_mfbuilder.cc'
84--- test/test_mfbuilder.cc 2014-08-29 06:58:59 +0000
85+++ test/test_mfbuilder.cc 2015-01-20 15:02:41 +0000
86@@ -20,8 +20,11 @@
87 #include<gtest/gtest.h>
88 #include"mediascanner/MediaFile.hh"
89 #include"mediascanner/MediaFileBuilder.hh"
90+#include"test_config.h"
91 #include<stdexcept>
92
93+#define STANDALONE_DIR SOURCE_DIR "/media/standalone_art"
94+
95 using namespace mediascanner;
96
97 class MFBTest : public ::testing::Test {
98@@ -203,6 +206,17 @@
99 EXPECT_EQ("image://thumbnailer/file:///foo/bar/baz.mp4", mf.getArtUri());
100 }
101
102+TEST_F(MFBTest, standaloneArt) {
103+ std::string fname(STANDALONE_DIR "/dummy.mp3");
104+ MediaFileBuilder mfb(fname);
105+ mfb.setType(AudioMedia);
106+ MediaFile m(mfb);
107+ std::string expected("image://thumbnailer/file://");
108+ expected += STANDALONE_DIR;
109+ expected += "/cover.jpg";
110+ ASSERT_EQ(expected, m.getArtUri());
111+}
112+
113 int main(int argc, char **argv) {
114 ::testing::InitGoogleTest(&argc, argv);
115 return RUN_ALL_TESTS();
116
117=== modified file 'test/test_util.cc'
118--- test/test_util.cc 2014-05-09 14:04:48 +0000
119+++ test/test_util.cc 2015-01-20 15:02:41 +0000
120@@ -19,6 +19,9 @@
121
122 #include <gtest/gtest.h>
123 #include"../src/mediascanner/internal/utils.hh"
124+#include"../src/mediascanner/MediaFile.hh"
125+#include"../src/mediascanner/MediaFileBuilder.hh"
126+
127 #include "test_config.h"
128
129 using namespace mediascanner;

Subscribers

People subscribed via source and target branches