mirror of
https://github.com/photoprism/photoprism.git
synced 2025-10-13 04:24:26 +08:00
Add lens, category, color and year search filters
Signed-off-by: Michael Mayer <michael@liquidbytes.net>
This commit is contained in:
@@ -59,7 +59,6 @@ seashore:
|
||||
threshold: 0.3
|
||||
categories:
|
||||
- beach
|
||||
- coast
|
||||
- water
|
||||
|
||||
lakeside:
|
||||
@@ -104,9 +103,7 @@ fashion:
|
||||
label: portrait
|
||||
threshold: 0.1
|
||||
categories:
|
||||
- fashion
|
||||
- person
|
||||
- face
|
||||
- people
|
||||
|
||||
poncho:
|
||||
see: fashion
|
||||
@@ -274,10 +271,8 @@ stingray:
|
||||
threshold: 0.2
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- fish
|
||||
- animal
|
||||
- ray
|
||||
|
||||
cock:
|
||||
threshold: 0.2
|
||||
@@ -731,7 +726,6 @@ wombat:
|
||||
jellyfish:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- animal
|
||||
- fish
|
||||
|
||||
@@ -1480,20 +1474,17 @@ starfish:
|
||||
threshold: 0.5
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- animal
|
||||
- fish
|
||||
|
||||
sea urchin:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- animal
|
||||
|
||||
sea cucumber:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- animal
|
||||
|
||||
rabbit:
|
||||
@@ -1789,7 +1780,6 @@ fish:
|
||||
threshold: 0.2
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- animal
|
||||
|
||||
barracouta:
|
||||
@@ -1903,7 +1893,7 @@ barbershop:
|
||||
|
||||
barn:
|
||||
cateories:
|
||||
- building
|
||||
- architecture
|
||||
|
||||
bassoon:
|
||||
label: entertainment
|
||||
@@ -1926,7 +1916,6 @@ bathtub:
|
||||
|
||||
beacon:
|
||||
categories:
|
||||
- building
|
||||
- tower
|
||||
- architecture
|
||||
|
||||
@@ -1945,7 +1934,6 @@ beer glass:
|
||||
bell cote:
|
||||
label: church
|
||||
categories:
|
||||
- building
|
||||
- architecture
|
||||
|
||||
bicycle-built-for-two:
|
||||
@@ -1956,13 +1944,12 @@ bicycle-built-for-two:
|
||||
|
||||
birdhouse:
|
||||
categories:
|
||||
- building
|
||||
- house
|
||||
- bird
|
||||
- outdoor
|
||||
|
||||
boathouse:
|
||||
categories:
|
||||
- building
|
||||
- house
|
||||
- architecture
|
||||
- water
|
||||
|
||||
bobsled:
|
||||
@@ -2030,9 +2017,7 @@ car wheel:
|
||||
|
||||
castle:
|
||||
categories:
|
||||
- building
|
||||
- old
|
||||
- architecture
|
||||
- historic
|
||||
|
||||
catamaran:
|
||||
categories:
|
||||
@@ -2169,7 +2154,6 @@ disk brake:
|
||||
dock:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
|
||||
dogsled:
|
||||
categories:
|
||||
@@ -2389,7 +2373,6 @@ library:
|
||||
lifeboat:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- boat
|
||||
|
||||
lighter:
|
||||
@@ -2457,13 +2440,11 @@ microwave:
|
||||
minibus:
|
||||
label: bus
|
||||
categories:
|
||||
- van
|
||||
- vehicle
|
||||
|
||||
minivan:
|
||||
label: van
|
||||
categories:
|
||||
- car
|
||||
- vehicle
|
||||
|
||||
mixing bowl:
|
||||
@@ -2511,7 +2492,6 @@ moving van:
|
||||
label: van
|
||||
categories:
|
||||
- vehicle
|
||||
- bus
|
||||
|
||||
notebook:
|
||||
label: computer
|
||||
@@ -2548,7 +2528,6 @@ paddle:
|
||||
paddlewheel:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
|
||||
padlock:
|
||||
label: tool
|
||||
@@ -2565,7 +2544,7 @@ paintbrush:
|
||||
palace:
|
||||
label: historic architecture
|
||||
categories:
|
||||
- building
|
||||
- historic
|
||||
|
||||
panpipe:
|
||||
label: goods
|
||||
@@ -2657,7 +2636,6 @@ police van:
|
||||
label: van
|
||||
categories:
|
||||
- vehicle
|
||||
- bus
|
||||
|
||||
pool table:
|
||||
categories:
|
||||
@@ -2699,8 +2677,6 @@ punching bag:
|
||||
recreational vehicle:
|
||||
label: camper
|
||||
categories:
|
||||
- bus
|
||||
- van
|
||||
- vehicle
|
||||
|
||||
reflex camera:
|
||||
@@ -2806,7 +2782,6 @@ snorkel:
|
||||
categories:
|
||||
- swimming
|
||||
- water
|
||||
- sea
|
||||
|
||||
snowmobile:
|
||||
categories:
|
||||
@@ -2841,7 +2816,6 @@ spatula:
|
||||
speedboat:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- boat
|
||||
|
||||
sports car:
|
||||
@@ -2885,7 +2859,6 @@ studio couch:
|
||||
submarine:
|
||||
categories:
|
||||
- water
|
||||
- sea
|
||||
- boat
|
||||
|
||||
suspension bridge:
|
||||
@@ -2939,7 +2912,6 @@ trimaran:
|
||||
categories:
|
||||
- boat
|
||||
- water
|
||||
- sea
|
||||
|
||||
triumphal arch:
|
||||
categories:
|
||||
@@ -2949,7 +2921,6 @@ triumphal arch:
|
||||
trolleybus:
|
||||
label: bus
|
||||
categories:
|
||||
- van
|
||||
- vehicle
|
||||
|
||||
trombone:
|
||||
@@ -3022,10 +2993,8 @@ wreck:
|
||||
|
||||
yawl:
|
||||
categories:
|
||||
- ship
|
||||
- boat
|
||||
- water
|
||||
- sea
|
||||
- vehicle
|
||||
|
||||
yurt:
|
||||
@@ -3347,7 +3316,6 @@ tile roof:
|
||||
label: building
|
||||
categories:
|
||||
- architecture
|
||||
- house
|
||||
|
||||
croquet ball:
|
||||
label: pumpkin
|
||||
@@ -3463,8 +3431,6 @@ band aid:
|
||||
portrait:
|
||||
label: portrait
|
||||
categories:
|
||||
- person
|
||||
- face
|
||||
- people
|
||||
|
||||
oxygen mask:
|
||||
@@ -3480,8 +3446,6 @@ heritage:
|
||||
label: portrait
|
||||
categories:
|
||||
- people
|
||||
- person
|
||||
- face
|
||||
|
||||
safety pin:
|
||||
priority: -1
|
||||
@@ -3500,10 +3464,7 @@ vestment:
|
||||
bassinet:
|
||||
label: baby
|
||||
categories:
|
||||
- person
|
||||
- child
|
||||
- portrait
|
||||
- face
|
||||
- people
|
||||
|
||||
patio:
|
||||
label: building
|
||||
|
@@ -54,18 +54,18 @@
|
||||
item-value="code"
|
||||
item-text="name"
|
||||
v-model="filter.country"
|
||||
:items="options.countries">
|
||||
:items="countryOptions">
|
||||
</v-select>
|
||||
</v-flex>
|
||||
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
|
||||
<v-select @change="dropdownChange"
|
||||
:label="labels.camera"
|
||||
:label="labels.year"
|
||||
flat solo hide-details
|
||||
color="secondary-dark"
|
||||
item-value="ID"
|
||||
item-text="CameraModel"
|
||||
v-model="filter.camera"
|
||||
:items="options.cameras">
|
||||
item-value="year"
|
||||
item-text="label"
|
||||
v-model="filter.year"
|
||||
:items="yearOptions">
|
||||
</v-select>
|
||||
</v-flex>
|
||||
<v-flex xs12 sm6 md3 pa-2 class="p-view-select">
|
||||
@@ -87,7 +87,51 @@
|
||||
:items="options.sorting">
|
||||
</v-select>
|
||||
</v-flex>
|
||||
<v-flex xs6 pa-2 class="p-time-after">
|
||||
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
|
||||
<v-select @change="dropdownChange"
|
||||
:label="labels.camera"
|
||||
flat solo hide-details
|
||||
color="secondary-dark"
|
||||
item-value="ID"
|
||||
item-text="CameraModel"
|
||||
v-model="filter.camera"
|
||||
:items="cameraOptions">
|
||||
</v-select>
|
||||
</v-flex>
|
||||
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
|
||||
<v-select @change="dropdownChange"
|
||||
:label="labels.lens"
|
||||
flat solo hide-details
|
||||
color="secondary-dark"
|
||||
item-value="ID"
|
||||
item-text="LensModel"
|
||||
v-model="filter.lens"
|
||||
:items="lensOptions">
|
||||
</v-select>
|
||||
</v-flex>
|
||||
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
|
||||
<v-select @change="dropdownChange"
|
||||
:label="labels.color"
|
||||
flat solo hide-details
|
||||
color="secondary-dark"
|
||||
item-value="name"
|
||||
item-text="label"
|
||||
v-model="filter.color"
|
||||
:items="colorOptions">
|
||||
</v-select>
|
||||
</v-flex>
|
||||
<v-flex xs12 sm6 md3 pa-2 class="p-camera-select">
|
||||
<v-select @change="dropdownChange"
|
||||
:label="labels.category"
|
||||
flat solo hide-details
|
||||
color="secondary-dark"
|
||||
item-value="LabelName"
|
||||
item-text="Title"
|
||||
v-model="filter.label"
|
||||
:items="categoryOptions">
|
||||
</v-select>
|
||||
</v-flex>
|
||||
<!-- v-flex xs6 pa-2 class="p-time-after">
|
||||
<v-menu v-model="showAfterPicker"
|
||||
:close-on-content-click="false"
|
||||
:nudge-right="40"
|
||||
@@ -136,7 +180,7 @@
|
||||
@input="datepickerChange">
|
||||
</v-date-picker>
|
||||
</v-menu>
|
||||
</v-flex>
|
||||
</v-flex -->
|
||||
</v-layout>
|
||||
</v-card-text>
|
||||
</v-card>
|
||||
@@ -152,42 +196,69 @@
|
||||
filterChange: Function,
|
||||
},
|
||||
data() {
|
||||
const cameras = [{ID: 0, CameraModel: this.$gettext('All Cameras')}].concat(this.$config.getValue('cameras'));
|
||||
const countries = [{
|
||||
code: '',
|
||||
name: this.$gettext('All Countries')
|
||||
}].concat(this.$config.getValue('countries'));
|
||||
|
||||
return {
|
||||
config: this.$config.values,
|
||||
searchExpanded: false,
|
||||
all: {
|
||||
countries: [{ code: "", name: this.$gettext("All Countries")}],
|
||||
cameras: [{ID: 0, CameraModel: this.$gettext("All Cameras")}],
|
||||
lenses: [{ID: 0, LensModel: "All Lenses"}],
|
||||
colors: [{label: "All Colors", name: ""}],
|
||||
categories: [{LabelName: "", Title: this.$gettext("All Categories")}],
|
||||
},
|
||||
options: {
|
||||
'views': [
|
||||
// {value: 'tiles', text: this.$gettext('Tiles')},
|
||||
{value: 'mosaic', text: this.$gettext('Mosaic')},
|
||||
{value: 'details', text: this.$gettext('Details')},
|
||||
{value: 'list', text: this.$gettext('List')},
|
||||
],
|
||||
'countries': countries,
|
||||
'cameras': cameras,
|
||||
'sorting': [
|
||||
{value: 'imported', text: this.$gettext('Recently imported')},
|
||||
{value: 'newest', text: this.$gettext('Newest first')},
|
||||
{value: 'oldest', text: this.$gettext('Oldest first')},
|
||||
],
|
||||
},
|
||||
showAfterPicker: false,
|
||||
showBeforePicker: false,
|
||||
// showAfterPicker: false,
|
||||
// showBeforePicker: false,
|
||||
labels: {
|
||||
search: this.$gettext("Search"),
|
||||
view: this.$gettext("View"),
|
||||
country: this.$gettext("Country"),
|
||||
camera: this.$gettext("Camera"),
|
||||
lens: this.$gettext("Lens"),
|
||||
year: this.$gettext("Year"),
|
||||
color: this.$gettext("Color"),
|
||||
category: this.$gettext("Category"),
|
||||
sort: this.$gettext("Sort By"),
|
||||
before: this.$gettext("Taken before"),
|
||||
after: this.$gettext("Taken after"),
|
||||
},
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
countryOptions() {
|
||||
return this.all.countries.concat(this.config.countries);
|
||||
},
|
||||
cameraOptions() {
|
||||
return this.all.cameras.concat(this.config.cameras);
|
||||
},
|
||||
lensOptions() {
|
||||
return this.all.lenses.concat(this.config.lenses);
|
||||
},
|
||||
colorOptions() {
|
||||
return this.all.colors.concat(this.config.colors);
|
||||
},
|
||||
categoryOptions() {
|
||||
return this.all.categories.concat(this.config.categories);
|
||||
},
|
||||
yearOptions() {
|
||||
let result = [{"year": 0, "label": "All Years"}];
|
||||
for (let i = 0; i < this.config.years.length; i++) {
|
||||
result.push({"year": this.config.years[i], "label": this.config.years[i].toString()});
|
||||
}
|
||||
return result;
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
dropdownChange() {
|
||||
this.filterChange();
|
||||
@@ -196,16 +267,12 @@
|
||||
this.searchExpanded = false;
|
||||
}
|
||||
},
|
||||
datepickerChange() {
|
||||
/*datepickerChange() {
|
||||
this.showAfterPicker = false;
|
||||
this.showBeforePicker = false;
|
||||
|
||||
this.dropdownChange();
|
||||
},
|
||||
setView(name) {
|
||||
this.settings.view = name;
|
||||
this.filterChange();
|
||||
},
|
||||
clearBefore() {
|
||||
this.filter.before = '';
|
||||
this.datepickerChange();
|
||||
@@ -213,11 +280,16 @@
|
||||
clearAfter() {
|
||||
this.filter.after = '';
|
||||
this.datepickerChange();
|
||||
},
|
||||
*/
|
||||
setView(name) {
|
||||
this.settings.view = name;
|
||||
this.filterChange();
|
||||
},
|
||||
clearQuery() {
|
||||
this.filter.q = '';
|
||||
this.filterChange();
|
||||
},
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
@@ -50,8 +50,14 @@
|
||||
this.filter.q = query['q'] ? query['q'] : '';
|
||||
this.filter.camera = query['camera'] ? parseInt(query['camera']) : 0;
|
||||
this.filter.country = query['country'] ? query['country'] : '';
|
||||
this.filter.before = query['before'] ? query['before'] : '';
|
||||
this.filter.after = query['after'] ? query['after'] : '';
|
||||
this.filter.lens = query['lens'] ? parseInt(query['lens']) : 0;
|
||||
this.filter.year = query['year'] ? parseInt(query['year']) : 0;
|
||||
this.filter.color = query['color'] ? query['color'] : '';
|
||||
this.filter.label = query['label'] ? query['label'] : '';
|
||||
|
||||
// this.filter.before = query['before'] ? query['before'] : '';
|
||||
// this.filter.after = query['after'] ? query['after'] : '';
|
||||
|
||||
this.settings.view = this.viewType();
|
||||
this.lastFilter = {};
|
||||
this.routeName = this.$route.name;
|
||||
@@ -64,11 +70,28 @@
|
||||
const order = query['order'] ? query['order'] : 'imported';
|
||||
const camera = query['camera'] ? parseInt(query['camera']) : 0;
|
||||
const q = query['q'] ? query['q'] : '';
|
||||
const before = query['before'] ? query['before'] : '';
|
||||
const after = query['after'] ? query['after'] : '';
|
||||
|
||||
// const before = query['before'] ? query['before'] : '';
|
||||
// const after = query['after'] ? query['after'] : '';
|
||||
|
||||
const country = query['country'] ? query['country'] : '';
|
||||
const lens = query['lens'] ? parseInt(query['lens']) : 0;
|
||||
const year = query['year'] ? parseInt(query['year']) : 0;
|
||||
const color = query['color'] ? query['color'] : '';
|
||||
const label = query['label'] ? query['label'] : '';
|
||||
const view = this.viewType();
|
||||
const filter = {country: country, camera: camera, order: order, q: q, before: before, after: after};
|
||||
const filter = {
|
||||
country: country,
|
||||
camera: camera,
|
||||
lens: lens,
|
||||
label: label,
|
||||
year: year,
|
||||
color: color,
|
||||
order: order,
|
||||
q: q,
|
||||
/* before: before,
|
||||
after: after, */
|
||||
};
|
||||
const settings = {view: view};
|
||||
|
||||
return {
|
||||
|
@@ -61,17 +61,17 @@ var All = Colors{
|
||||
Cyan,
|
||||
Blue,
|
||||
Purple,
|
||||
Brown,
|
||||
White,
|
||||
Grey,
|
||||
Black,
|
||||
Brown,
|
||||
}
|
||||
|
||||
var Names = map[Color]string{
|
||||
Black: "dark", // 0
|
||||
Brown: "brown", // 1
|
||||
Grey: "grey", // 2
|
||||
White: "bright", // 3
|
||||
White: "white", // 3
|
||||
Purple: "purple", // 4
|
||||
Gold: "gold", // 5
|
||||
Blue: "blue", // 6
|
||||
|
@@ -652,7 +652,7 @@ func (c *Config) ClientConfig() ClientConfig {
|
||||
Limit(20).Order("album_name").
|
||||
Find(&albums)
|
||||
|
||||
var years []string
|
||||
var years []int
|
||||
|
||||
db.Table("photos").
|
||||
Order("photo_year DESC").
|
||||
|
@@ -35,8 +35,11 @@ type PhotoSearch struct {
|
||||
Album string `form:"album"`
|
||||
Label string `form:"label"`
|
||||
Country string `form:"country"`
|
||||
Year uint `form:"year"`
|
||||
Month uint `form:"month"`
|
||||
Color string `form:"color"`
|
||||
Camera int `form:"camera"`
|
||||
Lens int `form:"lens"`
|
||||
Before time.Time `form:"before" time_format:"2006-01-02"`
|
||||
After time.Time `form:"after" time_format:"2006-01-02"`
|
||||
Favorites bool `form:"favorites"`
|
||||
|
@@ -233,9 +233,9 @@ func TestTensorFlow_BestLabels(t *testing.T) {
|
||||
result := tensorFlow.bestLabels(p)
|
||||
assert.Equal(t, "chicken", result[0].Name)
|
||||
assert.Equal(t, "bird", result[0].Categories[0])
|
||||
assert.Equal(t, "animal", result[1].Categories[1])
|
||||
assert.Equal(t, "image", result[0].Source)
|
||||
assert.Equal(t, "fish", result[1].Name)
|
||||
assert.Equal(t, "animal", result[1].Categories[2])
|
||||
assert.Equal(t, "image", result[1].Source)
|
||||
t.Log(result)
|
||||
})
|
||||
|
@@ -193,6 +193,18 @@ func (s *Repo) Photos(f form.PhotoSearch) (results []PhotoResult, err error) {
|
||||
q = q.Where("photos.camera_id = ?", f.Camera)
|
||||
}
|
||||
|
||||
if f.Lens > 0 {
|
||||
q = q.Where("photos.lens_id = ?", f.Lens)
|
||||
}
|
||||
|
||||
if f.Year > 0 {
|
||||
q = q.Where("photos.photo_year = ?", f.Year)
|
||||
}
|
||||
|
||||
if f.Month > 0 {
|
||||
q = q.Where("photos.photo_month = ?", f.Month)
|
||||
}
|
||||
|
||||
if f.Color != "" {
|
||||
q = q.Where("files.file_main_color = ?", strings.ToLower(f.Color))
|
||||
}
|
||||
|
Reference in New Issue
Block a user