165 lines
6.2 KiB
Python
165 lines
6.2 KiB
Python
import sys, io
|
|
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
|
|
|
import psycopg2
|
|
|
|
conn = psycopg2.connect(host='192.168.1.76', port=5432, dbname='fotky_buzalkovi',
|
|
user='vladimir.buzalka', password='Vlado7309208104++')
|
|
cur = conn.cursor()
|
|
|
|
# 1. Duplikáty sha256_pixels
|
|
print('=== DUPLIKÁTY sha256_pixels ===')
|
|
cur.execute('''SELECT sha256_pixels, COUNT(*) as cnt FROM photos
|
|
WHERE sha256_pixels IS NOT NULL GROUP BY sha256_pixels HAVING COUNT(*) > 1
|
|
ORDER BY cnt DESC LIMIT 10''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0][:16]}... : {r[1]}x')
|
|
cur.execute('''SELECT COUNT(*), SUM(cnt) FROM (
|
|
SELECT COUNT(*) as cnt FROM photos WHERE sha256_pixels IS NOT NULL
|
|
GROUP BY sha256_pixels HAVING COUNT(*) > 1) x''')
|
|
r = cur.fetchone()
|
|
print(f'Celkem skupin duplikátů: {r[0]}, fotek v duplikátech: {r[1]}')
|
|
|
|
# 2. Identické phash
|
|
print('\n=== IDENTICKÉ phash ===')
|
|
cur.execute('''SELECT phash, COUNT(*) as cnt FROM photos
|
|
WHERE phash IS NOT NULL GROUP BY phash HAVING COUNT(*) > 1
|
|
ORDER BY cnt DESC LIMIT 10''')
|
|
for r in cur.fetchall():
|
|
print(f' phash={r[0]}: {r[1]}x')
|
|
cur.execute('''SELECT COUNT(*), SUM(cnt) FROM (
|
|
SELECT COUNT(*) as cnt FROM photos WHERE phash IS NOT NULL
|
|
GROUP BY phash HAVING COUNT(*) > 1) x''')
|
|
r = cur.fetchone()
|
|
print(f'Celkem skupin: {r[0]}, fotek: {r[1]}')
|
|
|
|
# 3. Screenshoty
|
|
print('\n=== SCREENSHOTY ===')
|
|
cur.execute('SELECT COUNT(*) FROM photos WHERE is_screenshot = true')
|
|
print(f'is_screenshot=true: {cur.fetchone()[0]}')
|
|
|
|
# 4. Objektivy
|
|
print('\n=== TOP OBJEKTIVY ===')
|
|
cur.execute('''SELECT COALESCE(lens_model, '(neuvedeno)') as lens, COUNT(*) as cnt
|
|
FROM photos GROUP BY lens ORDER BY cnt DESC LIMIT 15''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[1]:>6} {r[0]}')
|
|
|
|
# 5. ISO distribuce
|
|
print('\n=== ISO DISTRIBUCE ===')
|
|
cur.execute('''SELECT iso, COUNT(*) as cnt FROM photos WHERE iso IS NOT NULL
|
|
GROUP BY iso ORDER BY cnt DESC LIMIT 15''')
|
|
for r in cur.fetchall():
|
|
print(f' ISO {r[0]:>6}: {r[1]}')
|
|
|
|
# 6. Clona
|
|
print('\n=== CLONA (aperture) TOP ===')
|
|
cur.execute('''SELECT aperture, COUNT(*) as cnt FROM photos WHERE aperture IS NOT NULL
|
|
GROUP BY aperture ORDER BY cnt DESC LIMIT 15''')
|
|
for r in cur.fetchall():
|
|
print(f' f/{r[0]}: {r[1]}')
|
|
|
|
# 7. Expoziční čas
|
|
print('\n=== EXPOZIČNÍ ČAS TOP ===')
|
|
cur.execute('''SELECT exposure_time, COUNT(*) as cnt FROM photos WHERE exposure_time IS NOT NULL
|
|
GROUP BY exposure_time ORDER BY cnt DESC LIMIT 15''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}: {r[1]}')
|
|
|
|
# 8. GPS top lokace
|
|
print('\n=== GPS TOP LOKACE (zaokrouhleno na 0.1 stupne) ===')
|
|
cur.execute('''SELECT ROUND(gps_lat::numeric, 1) as lat, ROUND(gps_lon::numeric, 1) as lon, COUNT(*) as cnt
|
|
FROM photos WHERE gps_lat IS NOT NULL AND gps_lon IS NOT NULL
|
|
GROUP BY lat, lon ORDER BY cnt DESC LIMIT 20''')
|
|
for r in cur.fetchall():
|
|
print(f' [{r[0]}, {r[1]}]: {r[2]} fotek')
|
|
|
|
cur.execute('''SELECT MIN(gps_lat), MAX(gps_lat), MIN(gps_lon), MAX(gps_lon)
|
|
FROM photos WHERE gps_lat IS NOT NULL''')
|
|
r = cur.fetchone()
|
|
print(f' Rozsah Lat: {r[0]} .. {r[1]}')
|
|
print(f' Rozsah Lon: {r[2]} .. {r[3]}')
|
|
|
|
# 9. Megapixely po letech
|
|
print('\n=== PRUMERNE MEGAPIXELY PO LETECH ===')
|
|
cur.execute('''SELECT EXTRACT(YEAR FROM taken_at)::INT as rok,
|
|
ROUND(AVG(megapixels)::numeric, 1) as avg_mp,
|
|
ROUND(MAX(megapixels)::numeric, 1) as max_mp, COUNT(*) as cnt
|
|
FROM photos WHERE taken_at IS NOT NULL AND megapixels IS NOT NULL
|
|
GROUP BY rok ORDER BY rok''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}: avg={r[1]} MP, max={r[2]} MP ({r[3]} fotek)')
|
|
|
|
# 10. Formáty
|
|
print('\n=== FORMATY ===')
|
|
cur.execute('''SELECT COALESCE(file_ext, '(none)') as ext, COUNT(*) as cnt
|
|
FROM photos GROUP BY ext ORDER BY cnt DESC''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}: {r[1]}')
|
|
|
|
# 11. Průhlednost
|
|
print('\n=== PRUHLEDNOST ===')
|
|
cur.execute('SELECT COUNT(*) FROM photos WHERE has_transparency = true')
|
|
print(f' S pruhlednosti: {cur.fetchone()[0]}')
|
|
|
|
# 12. Barevné módy
|
|
print('\n=== BAREVNE MODY ===')
|
|
cur.execute('''SELECT COALESCE(mode, '(none)') as m, COUNT(*) as cnt
|
|
FROM photos GROUP BY m ORDER BY cnt DESC''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}: {r[1]}')
|
|
|
|
# 13. Neznámé fotky - vzory názvů
|
|
print('\n=== NEZNAME FOTKY 2015-2016 (bez kamery) - vzory nazvu ===')
|
|
cur.execute('''SELECT file_name FROM photos
|
|
WHERE camera_model IS NULL AND EXTRACT(YEAR FROM taken_at) BETWEEN 2015 AND 2016
|
|
LIMIT 30''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}')
|
|
|
|
print('\n=== NEZNAME FOTKY 2022 - vzory nazvu ===')
|
|
cur.execute('''SELECT file_name FROM photos
|
|
WHERE camera_model IS NULL AND EXTRACT(YEAR FROM taken_at) = 2022
|
|
LIMIT 30''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}')
|
|
|
|
print('\n=== 2022 PREFIXES ===')
|
|
cur.execute('''SELECT LEFT(file_name, 10) as prefix, COUNT(*) as cnt FROM photos
|
|
WHERE camera_model IS NULL AND EXTRACT(YEAR FROM taken_at) = 2022
|
|
GROUP BY prefix ORDER BY cnt DESC LIMIT 15''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}: {r[1]}')
|
|
|
|
# 14. Měsíce
|
|
print('\n=== FOTKY PO MESICICH ===')
|
|
nazvy = ['','Leden','Unor','Brezen','Duben','Kveten','Cerven','Cervenec','Srpen','Zari','Rijen','Listopad','Prosinec']
|
|
cur.execute('''SELECT EXTRACT(MONTH FROM taken_at)::INT as mesic, COUNT(*) as cnt
|
|
FROM photos WHERE taken_at IS NOT NULL GROUP BY mesic ORDER BY mesic''')
|
|
for r in cur.fetchall():
|
|
print(f' {nazvy[r[0]]}: {r[1]}')
|
|
|
|
# 15. Dny v týdnu
|
|
print('\n=== FOTKY PO DNECH V TYDNU ===')
|
|
dny = ['Nedele','Pondeli','Utery','Streda','Ctvrtek','Patek','Sobota']
|
|
cur.execute('''SELECT EXTRACT(DOW FROM taken_at)::INT as den, COUNT(*) as cnt
|
|
FROM photos WHERE taken_at IS NOT NULL GROUP BY den ORDER BY den''')
|
|
for r in cur.fetchall():
|
|
print(f' {dny[r[0]]}: {r[1]}')
|
|
|
|
# 16. Hodiny
|
|
print('\n=== FOTKY PO HODINACH ===')
|
|
cur.execute('''SELECT EXTRACT(HOUR FROM taken_at)::INT as hod, COUNT(*) as cnt
|
|
FROM photos WHERE taken_at IS NOT NULL GROUP BY hod ORDER BY hod''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]:02d}:00 - {r[1]}')
|
|
|
|
# 17. Top dny (události)
|
|
print('\n=== TOP 20 DNU (nejvic fotek = udalosti) ===')
|
|
cur.execute('''SELECT taken_at::date as den, COUNT(*) as cnt
|
|
FROM photos WHERE taken_at IS NOT NULL GROUP BY den ORDER BY cnt DESC LIMIT 20''')
|
|
for r in cur.fetchall():
|
|
print(f' {r[0]}: {r[1]} fotek')
|
|
|
|
conn.close()
|