Przeglądaj źródła

Initial commit after convert from RCS to git

Markus Spring 1 rok temu
rodzic
commit
4a2f23b9c4
7 zmienionych plików z 578 dodań i 445 usunięć
  1. 0 233
      blogs-i-read
  2. 1 0
      blogsiread.json
  3. 1 0
      blogsiread.json~
  4. 10 4
      blogsiread.py
  5. 425 0
      blogsiread.py~
  6. 141 0
      cronlinks.html
  7. 0 208
      docker-compose.yml

+ 0 - 233
blogs-i-read

@@ -1,233 +0,0 @@
-#!/usr/bin/python3
-
-# 	$Id:$
-#       $Revision:$
-#       $Date:$
-#       $Log:$
-
-
-"""
-* if yes
-  * read the spring2life linklist on blogger,
-  * special treatment for websites without feed
-  * save list with timestamp into file
-  * output list
-"""
-import json
-import hashlib
-import time
-import datetime
-import os
-import re
-import socket
-import time
-import urllib.request
-
-from pathlib import Path
-
-spring2life_links_url = 'https://spring2life-links.blogspot.com/'
-html_file             = '/home/springm/docker/wordpress-nginx/wordpress/wp-content/themes/twentytwentyone-child-spring2life/cronlinks.html'
-database_file         = '/home/springm/docker/wordpress-nginx/blogsiread.json'
-if socket.gethostname() == 'denkbrett' or socket.gethostname() == 'kudell':    # for development
-    html_file             = 'cronlinks.html'
-    database_file         = 'blogsiread.json'
-timestamp             = int(time.time())
-list_of_blogs         = {}
-last_separator        = ''
-
-def reduce_lines(html):
-    lines = html.split('\n')
-    i = 0
-    j = 0
-    found = 0
-    bloglist = ''
-    while i < len(lines):
-        if lines[i] == "<ul id='BlogList1_blogs'>":
-            found = 1
-        if found == 1 and lines[i] == "</ul>":
-            found = 0
-            break
-        if found == 1:
-            # print(lines[i])
-            bloglist = bloglist + lines[i]
-        i = i + 1
-    return(bloglist)
-
-def timestamp_to_epoch_secs( time_text, i ):
-    m = re.search(r"(\d+) (Sekunde|Minute|Stunde|Tag|Woche|Monat|Jahr)", time_text)
-    if m:
-        if m.group(2).startswith('Sekunde'):
-            return timestamp - int(m.group(1)) - i
-        if m.group(2).startswith('Minute'):
-            return timestamp - int(m.group(1)) * 60 - i
-        elif m.group(2).startswith('Stunde'):
-            return timestamp - int(m.group(1)) * 3600 - i
-        elif m.group(2).startswith('Tag'):
-            return timestamp - int(m.group(1)) * 24 * 3600 - i
-        elif m.group(2).startswith('Woche'):
-            return timestamp - int(m.group(1)) * 7 * 24 * 3600 - i
-        elif m.group(2).startswith('Monat'):
-            return timestamp - int(m.group(1)) * 30 * 24 * 3600 - i
-        elif m.group(2).startswith('Jahr'):
-            return timestamp - int(m.group(1)) * 365 * 24 * 3600 - i
-    # else:
-    #     print(time_text)
-
-def orengradcom(b, domain, i):
-    global meta_values
-    m = hashlib.sha256()
-    with urllib.request.urlopen(b[1]) as response:
-        m.update(response.read())
-    hash = (m.hexdigest())
-    if not domain in meta_values or not meta_values[domain]['hash'] == hash:      # Unterschiedliche Hashes
-        meta_values[domain] = { 'hash': hash,
-                                'timestamp': timestamp - i,
-                                'posttitle': '',
-                                'posturl': '' }
-        meta_values[domain]['hash'] = hash
-        # print(meta_values)
-    # else:
-        # print('hashes are equal')
-    return b
-
-def lfionlinede(b, domain, i):
-    global meta_values
-    m = hashlib.sha256()
-    html = ""
-    ts = 0                      # timestamp
-    url = 'https://lfi-online.de/ceemes/de/blog/'
-    with urllib.request.urlopen(b[1]) as response:
-        html = response.read()
-        m.update(html)
-        hash = (m.hexdigest())
-        if not domain in meta_values: # first run
-            meta_values[domain] = { 'hash': '1' } # fake value
-        if not meta_values[domain]['hash'] == hash:      # Unterschiedliche Hashes
-            meta_values[domain]['hash'] = hash
-            p = re.search('titlebox30 cu-pointer[\'"] onclick=[\'"]window.location\s*=\s*[\'"]https://(.*?)[\'"][\'"]>\s*<h1.*?>(.*?)</h1', html.decode('utf-8'), re.MULTILINE | re.DOTALL)
-            if p:
-                # purl = p[1]
-                # ptitle = p[2]
-                # print(f"{purl} -- {ptitle}")
-                meta_values[domain] = { 'hash': hash,
-                                        'timestamp': timestamp - i,
-                                        'posttitle': p[2],
-                                        'posturl': p[1] }
-                return (p, timestamp + i)
-                # print(meta_values)
-            else:
-                pass
-                #print('p is empty :(')
-        else:
-            pass
-            #print('hashes are equal')
-        return (b, meta_values[domain]['timestamp'])
-
-def treat_special_domain(domain, b, i):
-    ts = 0
-    if domain == 'www.orengrad.com':
-        # print(f"treat_special_domain 3: {domain}")
-        # b = orengradcom(b, domain, i)
-        pass
-    # elif domain == 'jims-ramblings.blogspot.com':
-    #     print(f"special: {domain}")
-    elif domain == 'lfi-online.de':
-        #print(f"special: {domain}")
-        (b, ts)  = lfionlinede(b, domain, i)
-    # elif domain == 'www.picturesfromthezone.com':
-    #     print(f"special: {domain}")
-    return (b, ts)
-
-def read_spring2life_links():
-    #print('read_spring2life_links')
-    with urllib.request.urlopen(spring2life_links_url) as response:
-        html = response.read().decode('utf-8')
-        bloglist = reduce_lines(html)
-    regex = r"'blog-title'>\s*<a href='(.*?)'.*?>\s*(.*?)<\/a>(.*?)<div style='clear: both;'>"
-    counter = 0
-    global list_of_blogs
-    for b in re.finditer(regex, bloglist, re.MULTILINE | re.DOTALL):
-        burl = b[1]
-        bdomain = re.sub( r"(https?://|/<?.*?$)", "", burl)
-        btitle = b[2]
-        z = re.search(r".*?href='(.*?)'.*?>\s*(.*?)<.*?item-time'>\s*(.*?)\s*<", b[3], re.MULTILINE | re.DOTALL)
-        if z:
-            purl = z[1]
-            ptitle = z[2]
-            blogtimestamp = timestamp_to_epoch_secs(z[3], counter)
-        else:
-            (z, ts) = treat_special_domain(bdomain, b, counter)
-            #print(f"""href='{b[1]}' >{b[2]}<  href='{z[1]}' >{z[2]}<""")
-            blogtimestamp = ts
-        counter += 1
-        list_of_blogs[int(blogtimestamp)] = (f"""<li><a href='{b[1]}' target='_blank'>{b[2]}</a>"""
-                                             f"""&nbsp;//&nbsp;<a href='{z[1]}' target='_blank'>{z[2]}</a></li>""")
-
-def read_value_hash():
-    global meta_values
-    try:
-        f = open(database_file, 'r')
-        meta_values = json.loads(f.read())
-        # meta_values['lfi-online.de']['hash'] = 'abc' # for testing, set false hash
-        # print(meta_values)
-    except:
-        meta_values = {}
-
-def write_value_hash():
-    f = open(database_file, 'w+')
-    f.write(json.dumps(meta_values))
-
-def separator(t):
-    global last_separator
-    # print(f"{timestamp - t} -- {last_separator}")
-    if ( timestamp - t ) > 10368000:
-        if not last_separator == "From medieval times": # 24*30*24*600
-            last_separator = "From medieval times"
-            return last_separator
-    elif ( timestamp - t ) > 2592000:
-        if not last_separator == "Quite old": # 6*30*24*600
-            last_separator = "Quite old"
-            return last_separator
-    elif ( timestamp - t ) > 432000:
-        if not last_separator == "Less then a month": # 30*24*600
-            last_separator = "Less then a month"
-            return last_separator
-    elif ( timestamp - t ) > 100800:
-        if not last_separator == "Less then a week": # 7*24*600
-            last_separator = "Less then a week"
-            return last_separator
-    elif ( timestamp - t ) > 86400: 
-        if not last_separator == "A day and older": # 24*600
-            last_separator = "A day and older"
-            return last_separator
-    elif ( timestamp - t ) < 86400: 
-        if not last_separator == "Hot from the Blogosphere": # 24*600
-            last_separator = "Hot from the Blogosphere"
-            return last_separator
-    return False
-
-
-def output_list():
-    # print(timestamp)
-    with open(html_file, "w") as f:
-        # f.write( f"{blogtimestamp};{bdomain};{burl};{btitle};{purl};{ptitle}\n" )
-        firstsep = True
-        for t in sorted(list_of_blogs, reverse=True):
-            sep = separator(t)
-            if sep:
-                if not firstsep:
-                    f.write("</ul>")
-                else:
-                    firstsep = False
-                f.write(f"<li style='font-weight: bold;'>{sep}</li>\n<ul>")
-            f.write(f"\t{list_of_blogs[t]}\n")
-        f.write("</ul>")
-# ------------------------------------------------------------- main ---
-read_value_hash()
-read_spring2life_links()
-output_list()
-write_value_hash()
-
-# Local Variables:
-# compile-command: "/usr/bin/python3 blogsiread.py"
-# End:

+ 1 - 0
blogsiread.json

@@ -0,0 +1 @@
+{"www.orengrad.com": {"hash": "ee755c7d95b06e8098b48ba9d0a524bdeabca767b8b1e0f7543b86570808f115", "timestamp": 1661933768, "posttitle": "", "posturl": "https://www.orengrad.com/thingsseen/index.html"}, "photoplacegallery.com": {"hash": "edd711d457a8aa20db57d9da9bc157f0b06fc20aa84059990e4551d0d2923d92", "timestamp": 1705659333, "posttitle": "Quiet Landscape", "posturl": "https://photoplacegallery.com/online-juried-shows/quiet-landscape-2/"}, "lfi-online.de": {"hash": "a886b72e4c84d71ac0697d23f24d10f1127aa89363ee9a560d54265268a0ff57", "timestamp": 1705659364, "posttitle": "The production of Leica watches", "posturl": "https://lfi-online.de/en/stories/the-production-of-leica-watches-20452.html"}, "www.picturesfromthezone.com": {"hash": "e5e239560bc125a20ff2ac1fea50915bc198dd4f5b5256ec447a8a71e00132b3", "timestamp": 1665413119, "posttitle": "", "posturl": "http://www.picturesfromthezone.com/"}}

+ 1 - 0
blogsiread.json~

@@ -0,0 +1 @@
+{"www.orengrad.com": {"hash": "ee755c7d95b06e8098b48ba9d0a524bdeabca767b8b1e0f7543b86570808f115", "timestamp": 1661933768, "posttitle": "", "posturl": "https://www.orengrad.com/thingsseen/index.html"}, "photoplacegallery.com": {"hash": "30cc92d87a1e767febfdd38cb7d9ec97c7516c9cfe721fd80dd065e88331947c", "timestamp": 1701980953, "posttitle": "Monochrome", "posturl": "https://photoplacegallery.com/online-juried-shows/monochrome-2/"}, "lfi-online.de": {"hash": "7894bbde7e84ce3c599758411d31b1932882a60b1d7dab0f582ce286b5608a68", "timestamp": 1701981166, "posttitle": null, "posturl": "https://lfi-online.de/ceemes/en/stories/subtle-amp-subversive-20409.html"}, "www.picturesfromthezone.com": {"hash": "e5e239560bc125a20ff2ac1fea50915bc198dd4f5b5256ec447a8a71e00132b3", "timestamp": 1665413119, "posttitle": "", "posturl": "http://www.picturesfromthezone.com/"}}

+ 10 - 4
blogsiread.py

@@ -2,11 +2,14 @@
 # -*- coding: utf-8 -*-
 # coding=utf8
 
-#       $Id: blogsiread.py,v 1.12 2023/12/07 20:14:40 springm Exp springm $
-#       $Revision: 1.12 $
-#       $Date: 2023/12/07 20:14:40 $
+#       $Id: blogsiread.py,v 1.13 2023/12/07 20:36:12 springm Exp springm $
+#       $Revision: 1.13 $
+#       $Date: 2023/12/07 20:36:12 $
 #
 #       $Log: blogsiread.py,v $
+#       Revision 1.13  2023/12/07 20:36:12  springm
+#       Summary: lfi logik an neues Layout angepasst
+#
 #       Revision 1.12  2023/12/07 20:14:40  springm
 #       Summary: lfi auskommentiert bis zur Reparatur
 #
@@ -277,7 +280,10 @@ def picturesfromthezone(b, domain, i):
 def treat_special_domain(domain, b, i):
     ts = 0
     if domain == 'www.orengrad.com':
-        (b, ts)  = orengradcom(b, domain, i)
+        try:
+            (b, ts)  = orengradcom(b, domain, i)
+        except:
+            pass
     elif domain == 'lfi-online.de':
         (b, ts)  = lfionlinede(b, domain, i)
     elif domain == 'photoplacegallery.com':

+ 425 - 0
blogsiread.py~

@@ -0,0 +1,425 @@
+#!/usr/bin/python3
+# -*- coding: utf-8 -*-
+# coding=utf8
+
+#       $Id: blogsiread.py,v 1.13 2023/12/07 20:36:12 springm Exp $
+#       $Revision: 1.13 $
+#       $Date: 2023/12/07 20:36:12 $
+#
+#       $Log: blogsiread.py,v $
+#       Revision 1.13  2023/12/07 20:36:12  springm
+#       Summary: lfi logik an neues Layout angepasst
+#
+#       Revision 1.12  2023/12/07 20:14:40  springm
+#       Summary: lfi auskommentiert bis zur Reparatur
+#
+#       Revision 1.11  2022/12/28 07:30:17  springm
+#       Summary: added try...except to photoplacegallery
+#
+#       Revision 1.10  2022/11/10 13:32:19  springm
+#       Summary: lfi nochmal korrigiert; strin2hash war falsch
+#
+#       Revision 1.9  2022/10/12 19:56:10  springm
+#       Summary: coding utf-8 hinzugefuegt
+#
+#       Revision 1.8  2022/10/12 19:41:36  springm
+#       Summary: lfionline zurückgestellt auf hash des gesamten html.
+#
+#       Revision 1.7  2022/10/10 15:16:29  springm
+#       Summary: added special treatment for picturesfromthezone
+#
+#       Revision 1.6  2022/10/10 14:30:28  springm
+#       Summary: lfi repariert
+#
+#       Revision 1.5  2022/10/01 11:36:32  springm
+#       Summary: Works
+#
+#       Revision 1.4  2022/09/29 04:42:00  springm
+#       Summary: works, but LFI gets on top too often
+#
+#       Revision 1.3  2022/09/02 05:06:33  springm
+#       Summary: photoplacegallery hash jetzt vom Titel der ersten Ausstellung
+#
+
+"""
+* if yes
+  * read the spring2life linklist on blogger,
+  * special treatment for websites without feed
+  * save list with timestamp into file
+  * output list
+"""
+import json
+import hashlib
+import time
+import datetime
+import logging
+import logging.config
+import os
+import os.path
+import re
+import socket
+import time
+import urllib.request
+
+from pathlib import Path
+
+spring2life_links_url = 'http://spring2life-links.blogspot.com/'
+html_file             = '/home/springm/docker/wordpress-nginx/wordpress/wp-content/themes/twentytwentyone-child-spring2life/cronlinks.html'
+database_file         = '/home/springm/docker/wordpress-nginx/blogsiread.json'
+loglevel              = logging.WARN
+
+# ------------------------------------------ nothing to change below ---
+if socket.gethostname() == 'denkbrett' or socket.gethostname() == 'kudell':    # for development
+    html_file     = 'cronlinks.html'
+    database_file = 'blogsiread.json'
+    loglevel      = logging.DEBUG
+timestamp             = int(time.time())
+list_of_blogs         = {}
+last_separator        = ''
+re_flags              = re.MULTILINE | re.DOTALL | re.UNICODE | re.IGNORECASE
+
+alternative_blog_urls = { 'jlfeixa.tumblr.com' : 'www.jeanlucfeixa.com' }
+
+def reduce_lines(html):
+    lines = html.split('\n')
+    i = 0
+    j = 0
+    found = 0
+    bloglist = ''
+    while i < len(lines):
+        if lines[i] == "<ul id='BlogList1_blogs'>":
+            found = 1
+        if found == 1 and lines[i] == "</ul>":
+            found = 0
+            break
+        if found == 1:
+            # print(lines[i])
+            bloglist = bloglist + lines[i]
+        i = i + 1
+    return(bloglist)
+
+def timestamp_to_epoch_secs( time_text, i ):
+    m = re.search(r"(\d+) (Sekunde|Minute|Stunde|Tag|Woche|Monat|Jahr)", time_text)
+    if m:
+        if m.group(2).startswith('Sekunde'):
+            return timestamp - int(m.group(1)) - i
+        if m.group(2).startswith('Minute'):
+            return timestamp - int(m.group(1)) * 60 - i
+        elif m.group(2).startswith('Stunde'):
+            return timestamp - int(m.group(1)) * 3600 - i
+        elif m.group(2).startswith('Tag'):
+            return timestamp - int(m.group(1)) * 24 * 3600 - i
+        elif m.group(2).startswith('Woche'):
+            return timestamp - int(m.group(1)) * 7 * 24 * 3600 - i
+        elif m.group(2).startswith('Monat'):
+            return timestamp - int(m.group(1)) * 30 * 24 * 3600 - i
+        elif m.group(2).startswith('Jahr'):
+            return timestamp - int(m.group(1)) * 365 * 24 * 3600 - i
+    # else:
+    #     print(time_text)
+
+def orengradcom(b, domain, i):
+    global meta_values
+    m = hashlib.sha256()
+    html = ""
+    ts = 0                      # timestamp
+    url = 'https://www.orengrad.com/thingsseen/index.html'
+    with urllib.request.urlopen(b[1]) as response:
+        html = response.read()
+        m.update(html)
+        hash = (m.hexdigest())
+        if not domain in meta_values: # first run
+            meta_values[domain] = { 'hash': '1' } # fake value
+        if not meta_values[domain]['hash'] == hash:      # Unterschiedliche Hashes
+            logger.debug(f"unterschiedliche hashes")
+            meta_values[domain]['hash'] = hash
+            p = re.search('div id="bodycontent">.*<p><img src="pictures\/(.*?)\.(jpg)"', html.decode('utf-8'), re.MULTILINE | re.DOTALL )
+            if p:
+                logger.debug(f"match {p}")
+                meta_values[domain] = { 'hash': hash,
+                                        'timestamp': timestamp - i,
+                                        'posttitle': '',
+                                        'posturl': url }
+                return (p, timestamp + i)
+                # print(meta_values)
+            else:
+                pass
+                #print('p is empty :(')
+        else:
+            pass
+            #print('hashes are equal')
+        return (b, meta_values[domain]['timestamp'])
+
+def photoplacegallery(b, domain, i):
+    # logger.debug(f"{domain}")
+    global meta_values
+    m = hashlib.sha256()
+    html = ""
+    ts = 0                      # timestamp
+    url = 'https://photoplacegallery.com/online-juried-shows/'
+    req = urllib.request.Request(b[1], None,
+       { 'User-Agent' : 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:104.0) Gecko/20100101 Firefox/104.0',
+         'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
+         'Accept-Language' : 'de,en-US;q=0.7,en;q=0.3',
+         'Referer' : 'http://spring2life-links.blogspot.com/',
+         'DNT' : '1',
+         'Connection' : 'keep-alive',
+         'Upgrade-Insecure-Requests' : '1',
+         'Sec-Fetch-Dest' : 'document',
+         'Sec-Fetch-Mode' : 'navigate',
+         'Sec-Fetch-Site' : 'cross-site',
+         'Pragma' : 'no-cache',
+         'Cache-Control' : 'no-cache' })
+    try:
+        r = urllib.request.urlopen(req)
+        with r as response:
+            html = response.read()
+            # hash only from content-relevant part of website
+            subset = re.search( '<div class="main">.*?<div class="widget-title"><a href=".*?" class="h3">(.*?)</a>.*?</div>\s*</div>\s*</div>', html.decode('utf-8'), re.MULTILINE | re.DOTALL )
+            m.update(subset[1].encode('utf-8'))
+            hash = (m.hexdigest())
+            if not domain in meta_values: # first run
+                meta_values[domain] = { 'hash': '1' } # fake value
+            if not meta_values[domain]['hash'] == hash:      # Unterschiedliche Hashes
+                logger.debug(f"unterschiedliche hashes")
+                meta_values[domain]['hash'] = hash
+                p = re.search('<div class="widget-title"><a href="(/online-juried-shows/[^"]*?)" class="h3">([^<]*?)</a></div>', html.decode('utf-8'), re.MULTILINE | re.DOTALL )
+                if p:
+                    logger.debug(f"re search erfolgreich: {p[1]} {p[2]}")
+                    meta_values[domain] = { 'hash': hash,
+                                            'timestamp': timestamp - i,
+                                            'posttitle': p[2],
+                                            'posturl': f"https://{domain}{p[1]}" }
+                    q = {}
+                    q[1] = f"https://{domain}{p[1]}"
+                    q[2] = p[2]
+                    return (q, timestamp + i)
+                    # print(meta_values)
+                else:
+                    pass
+                    #print('p is empty :(')
+            else:
+                logger.debug(f"gleiche hashes")
+                q = {}
+                q[1] = meta_values[domain]['posturl']
+                q[2] = meta_values[domain]['posttitle']
+                return (q, meta_values[domain]['timestamp'])
+    except:
+        logger.debug('request to photogplacegallery failed')
+    return (b, meta_values[domain]['timestamp'])
+
+def lfionlinede(matchgroup, domain, i):
+    global meta_values
+    m = hashlib.sha256()
+    html = ""
+    ts = 0                      # timestamp
+    with urllib.request.urlopen(matchgroup[1]) as response:
+        html = response.read()
+        logger.debug(f"{matchgroup[1]} -- {len(html.decode('utf-8'))}")
+        regex = r"""<div class="card">\s*<a href="(.*?)">.*?<p class="date l12 "><span class="story-flag">STORIES.*?</span><span>.*?</span></p>\s*<h3 class="l-b24 m-b18 s-b18">(.*?)</h3>"""
+        p = re.search( regex, html.decode('utf-8'), re_flags )
+        string2hash = p[0]
+        logger.debug(f"{p[0]}")
+        m.update(string2hash.encode('utf-8'))
+        hash = (m.hexdigest())
+        if not domain in meta_values: # first run
+            meta_values[domain] = { 'hash': '1' } # fake value
+        if not meta_values[domain]['hash'] == hash:      # Unterschiedliche Hashes
+            logger.debug('unterschiedliche hashes')
+            logger.debug(f"search result {p[1]} {p[2]}")
+            # string2hash = f"""p[2]"""
+            m.update(string2hash.encode('utf-8'))
+            # hash = (m.hexdigest())
+            meta_values[domain] = { 'hash': hash,
+                                    'timestamp': timestamp - i,
+                                    'posttitle': p[2],
+                                    'posturl':   p[1] }
+            q = {}
+            q[1] = p[1]
+            q[2] = p[2]
+            return (q, timestamp + i)
+        else:
+            logger.debug('gleiche hashes')
+            q = {}
+            q[1] = meta_values[domain]['posturl']
+            q[2] = meta_values[domain]['posttitle']
+            return (q, meta_values[domain]['timestamp'])
+        return (matchgroup, meta_values[domain]['timestamp'])
+
+def picturesfromthezone(b, domain, i):
+    global meta_values
+    m = hashlib.sha256()
+    html = ""
+    ts = 0                      # timestamp
+    with urllib.request.urlopen(b[1]) as response:
+        html = response.read()
+        string2hash = f"""html"""
+        m.update(string2hash.encode('utf-8'))
+        hash = (m.hexdigest())
+        if not domain in meta_values: # first run
+            logger.debug(domain)
+            meta_values[domain] = { 'hash': '1' } # fake value
+        if not meta_values[domain]['hash'] == hash:      # Unterschiedliche Hashes
+            logger.debug('unterschiedliche hashes')
+            meta_values[domain] = { 'hash': hash,
+                                    'timestamp': timestamp - i,
+                                    'posttitle': '',
+                                    'posturl':   b[1] }
+            q = {}
+            q[2] = ''
+            q[1] = b[1]
+            return (q, timestamp + i)
+        else:
+            logger.debug('gleiche hashes')
+            q = {}
+            q[1] = meta_values[domain]['posturl']
+            q[2] = meta_values[domain]['posttitle']
+            return (q, meta_values[domain]['timestamp'])
+        # return (b, meta_values[domain]['timestamp'])
+
+def treat_special_domain(domain, b, i):
+    ts = 0
+    if domain == 'www.orengrad.com':
+        (b, ts)  = orengradcom(b, domain, i)
+    elif domain == 'lfi-online.de':
+        (b, ts)  = lfionlinede(b, domain, i)
+    elif domain == 'photoplacegallery.com':
+        (b, ts)  = photoplacegallery(b, domain, i)
+    elif domain == 'www.picturesfromthezone.com':
+        (b, ts)  = picturesfromthezone(b, domain, i)
+    return (b, ts)
+
+def read_spring2life_links():
+    #print('read_spring2life_links')
+    with urllib.request.urlopen(spring2life_links_url) as response:
+        html = response.read().decode('utf-8')
+        bloglist = reduce_lines(html)
+    regex = r"'blog-title'>\s*<a href='(.*?)'.*?>\s*(.*?)<\/a>(.*?)<div style='clear: both;'>"
+    counter = 0
+    global list_of_blogs
+    for b in re.finditer(regex, bloglist, re.MULTILINE | re.DOTALL):
+        burl = b[1]
+        bdomain = re.sub( r"(https?://|/<?.*?$)", "", burl)
+        # print(f"---->", bdomain)            
+        if bdomain in alternative_blog_urls.keys():
+            burl = burl.replace(bdomain, alternative_blog_urls[bdomain])
+            # print(f"---->", burl)            
+        btitle = b[2]
+        z = re.search(r".*?href='(.*?)'.*?>\s*(.*?)<.*?item-time'>\s*(.*?)\s*<", b[3], re.MULTILINE | re.DOTALL)
+        if z:
+            purl = z[1]
+            ptitle = z[2]
+            blogtimestamp = timestamp_to_epoch_secs(z[3], counter)
+        else:
+            (z, ts) = treat_special_domain(bdomain, b, counter)
+            blogtimestamp = ts
+        counter += 1
+        list_of_blogs[int(blogtimestamp)] = (f"""<li><a href='{burl}' target='_blank'>{b[2]}</a>"""
+                                             f"""&nbsp;//&nbsp;<a href='{z[1]}' target='_blank'>{z[2]}</a></li>""")
+
+def read_value_hash():
+    global meta_values
+    try:
+        f = open(database_file, 'r')
+        meta_values = json.loads(f.read())
+        # meta_values['lfi-online.de']['hash'] = 'abc' # for testing, set false hash
+        # print(meta_values)
+    except:
+        meta_values = {}
+
+def write_value_hash():
+    f = open(database_file, 'w+')
+    f.write(json.dumps(meta_values))
+
+def separator(t):
+    global last_separator
+    # print(f"{timestamp - t} -- {last_separator}")
+    if ( timestamp - t ) > 10368000:
+        if not last_separator == "From medieval times": # 24*30*24*600
+            last_separator = "From medieval times"
+            return last_separator
+    elif ( timestamp - t ) > 2592000:
+        if not last_separator == "Quite old": # 6*30*24*600
+            last_separator = "Quite old"
+            return last_separator
+    elif ( timestamp - t ) > 432000:
+        if not last_separator == "Less then a month": # 30*24*600
+            last_separator = "Less then a month"
+            return last_separator
+    elif ( timestamp - t ) > 100800:
+        if not last_separator == "Less then a week": # 7*24*600
+            last_separator = "Less then a week"
+            return last_separator
+    elif ( timestamp - t ) > 86400: 
+        if not last_separator == "A day and older": # 24*600
+            last_separator = "A day and older"
+            return last_separator
+    elif ( timestamp - t ) < 86400: 
+        if not last_separator == "Hot from the Blogosphere": # 24*600
+            last_separator = "Hot from the Blogosphere"
+            return last_separator
+    return False
+
+
+def output_list():
+    # print(timestamp)
+    with open(html_file, "w") as f:
+        # f.write( f"{blogtimestamp};{bdomain};{burl};{btitle};{purl};{ptitle}\n" )
+        firstsep = True
+        for t in sorted(list_of_blogs, reverse=True):
+            sep = separator(t)
+            if sep:
+                if not firstsep:
+                    f.write("</ul>")
+                else:
+                    firstsep = False
+                f.write(f"<li style='font-weight: bold;'>{sep}</li>\n<ul>")
+            f.write(f"\t{list_of_blogs[t]}\n")
+        f.write("</ul>")
+
+
+logger = logging.getLogger(__name__)
+# ------------------------------------------------------------- main ---
+def main():
+    logging_config = {
+        'version': 1,
+        'disable_existing_loggers': False,
+        'formatters': {
+            'standard': {
+                # 'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
+                'format': '[ %(lineno)s - %(funcName)25s() ] %(message)s'
+            },
+        },
+        'handlers': {
+            'default_handler': {'class': 'logging.StreamHandler',
+                                'formatter': 'standard',
+                                'level': loglevel },
+            # {
+            #     'class': 'logging.FileHandler',
+            #     'level': 'DEBUG',
+            #     'formatter': 'standard',
+            #     'filename': os.path.join('', 'application.log'),
+            #     'encoding': 'utf8'
+            # },
+        },
+        'loggers': {
+            '': {
+                'handlers': ['default_handler'],
+                'level': 'DEBUG',
+                'propagate': False
+            }
+        }
+    }
+    logging.config.dictConfig(logging_config)
+    
+    read_value_hash()
+    read_spring2life_links()
+    output_list()
+    write_value_hash()
+
+if __name__ == '__main__':
+    main()
+    
+# Local Variables:
+# compile-command: "./blogsiread.py --log DEBUG"
+# End:

+ 141 - 0
cronlinks.html

@@ -0,0 +1,141 @@
+<li style='font-weight: bold;'>Hot from the Blogosphere</li>
+<ul>	<li><a href='https://photoplacegallery.com/online-juried-shows/' target='_blank'>Photoplace Galleries</a>&nbsp;//&nbsp;<a href='https://photoplacegallery.com/online-juried-shows/quiet-landscape-2/' target='_blank'>Quiet Landscape</a></li>
+	<li><a href='https://lfi-online.de/ceemes/en/blog/' target='_blank'>LFI - Leica Fotografie International</a>&nbsp;//&nbsp;<a href='https://lfi-online.de/en/stories/the-production-of-leica-watches-20452.html' target='_blank'>The production of Leica watches</a></li>
+	<li><a href='https://grantedmutterings.blogspot.com/' target='_blank'>Taken For Granted</a>&nbsp;//&nbsp;<a href='https://grantedmutterings.blogspot.com/2024/01/downey-woodpecker.html' target='_blank'>Downey Woodpecker</a></li>
+	<li><a href='https://americansuburbx.com' target='_blank'>AMERICAN SUBURB X</a>&nbsp;//&nbsp;<a href='https://americansuburbx.com/2024/01/max-pinckers-thomas-sauvin-the-future-without-you.html' target='_blank'>Max Pinckers & Thomas Sauvin &#8211; The Future Without You</a></li>
+	<li><a href='https://www.nytimes.com/section/lens' target='_blank'>NY Times Lens</a>&nbsp;//&nbsp;<a href='https://www.nytimes.com/2024/01/18/lens/applications-open-for-the-2024-new-york-portfolio-review.html' target='_blank'>Applications Open for the 2024 New York Portfolio Review</a></li>
+	<li><a href='https://blog.blackandwhiteandcolours.de' target='_blank'>blackandwhiteandcolours</a>&nbsp;//&nbsp;<a href='https://blog.blackandwhiteandcolours.de/?p=20627' target='_blank'>Who doesn&#8217;t look upward when searching for a name?</a></li>
+	<li><a href='http://orvokki4.blogspot.com/' target='_blank'>orvokki4you</a>&nbsp;//&nbsp;<a href='http://orvokki4.blogspot.com/2024/01/auringonlasku-sunset.html' target='_blank'>Auringonlasku / Sunset</a></li>
+	<li><a href='https://ridl.wordpress.com' target='_blank'>RIDL.COM</a>&nbsp;//&nbsp;<a href='https://ridl.wordpress.com/2024/01/18/january-18-ice-storm/' target='_blank'>January 18, &#8220;Ice Storm&#8221;</a></li>
+	<li><a href='http://visualsciencelab.blogspot.com/' target='_blank'>The Visual Science Lab / Kirk Tuck</a>&nbsp;//&nbsp;<a href='http://visualsciencelab.blogspot.com/2024/01/having-fun-working-on-projects-beats.html' target='_blank'>Having fun working on projects. Beats sitting around waiting for the pipes to freeze...</a></li>
+	<li><a href='https://brucepercy.co.uk/blog/' target='_blank'>Bruce Percy Colourchrome</a>&nbsp;//&nbsp;<a href='https://brucepercy.co.uk/blog/2024/1/18/the-winter-sun' target='_blank'>The winter sun</a></li>
+	<li><a href='https://nevigeser.blogspot.com/' target='_blank'>42553 Neviges</a>&nbsp;//&nbsp;<a href='https://nevigeser.blogspot.com/2024/01/erinnert-ihr-euch-noch-die-groe.html' target='_blank'></a></li>
+	<li><a href='https://www.flickr.com/photos/chrisbertram/' target='_blank'>Chris Bertram</a>&nbsp;//&nbsp;<a href='https://www.flickr.com/photos/chrisbertram/53470806147/' target='_blank'>Mount Pleasant</a></li>
+	<li><a href='https://lenscratch.com' target='_blank'>LENSCRATCH</a>&nbsp;//&nbsp;<a href='https://lenscratch.com/2024/01/wheaton-mahoney/' target='_blank'>Wheaton Mahoney: The Forgotten and Nature&#8217;s Embrace</a></li>
+	<li><a href='https://islerweb.com' target='_blank'>obBLOGato</a>&nbsp;//&nbsp;<a href='https://islerweb.com/2024/01/18/boxing-day-at-caesars-camp/' target='_blank'>Boxing Day at Caesar&#8217;s Camp</a></li>
+	<li><a href='https://www.sequimwadailyphoto.com' target='_blank'>Sequim Daily</a>&nbsp;//&nbsp;<a href='https://www.sequimwadailyphoto.com/2024/01/18/the-rugged-washington-coast/' target='_blank'>The rugged Washington Coast</a></li>
+</ul><li style='font-weight: bold;'>A day and older</li>
+<ul>	<li><a href='https://www.591photography.com/' target='_blank'>591 Photography</a>&nbsp;//&nbsp;<a href='https://www.591photography.com/2024/01/urban-budapest.html' target='_blank'>Urban, Budapest</a></li>
+	<li><a href='https://blog.andreas-manessinger.info/' target='_blank'>Andreas Manessinger</a>&nbsp;//&nbsp;<a href='https://blog.andreas-manessinger.info/2024/01/6298-as-gardens-vanish.html' target='_blank'>6298 - As Gardens Vanish</a></li>
+	<li><a href='https://munchow.wordpress.com' target='_blank'>In Flow with Otto</a>&nbsp;//&nbsp;<a href='https://munchow.wordpress.com/2024/01/18/three-essential-artistic-techniques/' target='_blank'>Three Essential Artistic Techniques</a></li>
+	<li><a href='https://blog.josephholmes.io' target='_blank'>joe's nyc</a>&nbsp;//&nbsp;<a href='https://blog.josephholmes.io/home-again-2-15375' target='_blank'>Home Again</a></li>
+	<li><a href='https://www.lensworkonline.com/login.php' target='_blank'>LensWork Online Today's Additions</a>&nbsp;//&nbsp;<a href='http://www.lensworkonline.com/login.php' target='_blank'>Today's LensWork Online Additions - 18 Jan 2023</a></li>
+	<li><a href='https://phillipreeve.net/blog/' target='_blank'>phillipreeve.net</a>&nbsp;//&nbsp;<a href='https://phillipreeve.net/blog/hands-on-thypoch-simera-28mm-1-4-and-35mm-1-4/' target='_blank'>Hands-On: Thypoch Simera 28mm 1.4 and 35mm 1.4</a></li>
+	<li><a href='https://photobookjournal.com' target='_blank'>PhotoBook Journal</a>&nbsp;//&nbsp;<a href='https://photobookjournal.com/2024/01/17/dominic-turner-false-friends/' target='_blank'>Dominic Turner &#8211; False Friends</a></li>
+	<li><a href='https://salzblog.wordpress.com' target='_blank'>Salzblog</a>&nbsp;//&nbsp;<a href='https://salzblog.wordpress.com/2024/01/18/bruxismus/' target='_blank'>Light. Lean. Clean.</a></li>
+	<li><a href='https://theonlinephotographer.typepad.com/the_online_photographer/' target='_blank'>The Online Photographer</a>&nbsp;//&nbsp;<a href='https://feeds.feedblitz.com/~/862749353/_/theonlinephotographer~Jackpot-Photography.html' target='_blank'>Jackpot Photography</a></li>
+</ul><li style='font-weight: bold;'>Less then a week</li>
+<ul>	<li><a href='https://awazo.com' target='_blank'>BOXMAN fotologue</a>&nbsp;//&nbsp;<a href='https://awazo.com/article/the_mosscovered_ryusenen_garde.html' target='_blank'>The Moss-covered Ryusenen Garden Looked Like It Was In A Dense Forest (Shizuoka)</a></li>
+	<li><a href='https://lightscatter.wordpress.com' target='_blank'>lightscatter</a>&nbsp;//&nbsp;<a href='https://lightscatter.wordpress.com/2024/01/17/1-17-24/' target='_blank'>1 17 24</a></li>
+	<li><a href='https://luminous-landscape.com/' target='_blank'>Luminous Landscape</a>&nbsp;//&nbsp;<a href='https://luminous-landscape.com/celebrating-alternative-photography-mastering-the-van-dyke-process-with-ashok-viswanathan/' target='_blank'>Celebrating Alternative Photography: Mastering the Van Dyke Process with Ashok Viswanathan</a></li>
+	<li><a href='https://onthecorkboard.blogspot.com/' target='_blank'>On the Cork Board</a>&nbsp;//&nbsp;<a href='https://onthecorkboard.blogspot.com/2024/01/blog-post_16.html' target='_blank'></a></li>
+	<li><a href='https://photohaikus.com' target='_blank'>photohaikus</a>&nbsp;//&nbsp;<a href='https://photohaikus.com/mind-of-winter/' target='_blank'>Mind Of Winter</a></li>
+	<li><a href='http://lifesquared.squarespace.com/blog/' target='_blank'>The Landscapist</a>&nbsp;//&nbsp;<a href='http://lifesquared.squarespace.com/blog/sy9m5amcxexgk88k37tmhrj35xl88d' target='_blank'># 6858 / common things &#8226; around the house ~ get real</a></li>
+	<li><a href='https://xkcd.com/' target='_blank'>xkcd.com</a>&nbsp;//&nbsp;<a href='https://xkcd.com/2882/' target='_blank'>Net Rotations</a></li>
+	<li><a href='https://www.flickr.com/photos/chriskernpix/' target='_blank'>Chris Kern Pix</a>&nbsp;//&nbsp;<a href='https://www.flickr.com/photos/chriskernpix/53465521027/' target='_blank'>Snow on a Patio Chair</a></li>
+	<li><a href='https://ora2.blogspot.com/' target='_blank'>Here Now, Gone Before Long</a>&nbsp;//&nbsp;<a href='https://ora2.blogspot.com/2024/01/blog-post_15.html' target='_blank'></a></li>
+	<li><a href='https://idiotic-hat.blogspot.com/' target='_blank'>Idiotic Hat</a>&nbsp;//&nbsp;<a href='https://idiotic-hat.blogspot.com/2024/01/winter-woodland.html' target='_blank'>Winter Woodland</a></li>
+	<li><a href='https://www.keptlight.com' target='_blank'>Kept Light Photography</a>&nbsp;//&nbsp;<a href='https://www.keptlight.com/public-art-in-salt-lake-city/' target='_blank'>Public Art In Salt Lake City</a></li>
+	<li><a href='https://spazierensehen.de' target='_blank'>Spazierensehen</a>&nbsp;//&nbsp;<a href='https://spazierensehen.de/2024/01/15/fenster-zum-hof-2/' target='_blank'>Fenster zum Hof</a></li>
+	<li><a href='https://tao-of-digital-photography.blogspot.com/' target='_blank'>Tao of Photography</a>&nbsp;//&nbsp;<a href='https://tao-of-digital-photography.blogspot.com/2024/01/time-and-space.html' target='_blank'>Time and Space</a></li>
+	<li><a href='https://worldofdecay.blogspot.com/' target='_blank'>Urban Decay</a>&nbsp;//&nbsp;<a href='https://worldofdecay.blogspot.com/2024/01/into-woods-squaxin-park-olympia.html' target='_blank'>Into the Woods: Squaxin Park, Olympia, Washington</a></li>
+	<li><a href='https://2look.blogspot.com/' target='_blank'>A Second Look</a>&nbsp;//&nbsp;<a href='https://2look.blogspot.com/2024/01/transisition.html' target='_blank'>Transisition</a></li>
+	<li><a href='https://www.flickr.com/photos/hobokollektiv/' target='_blank'>hobokollektiv | ʌıʇʞǝlloʞoqoɥ</a>&nbsp;//&nbsp;<a href='https://www.flickr.com/photos/hobokollektiv/53464486074/' target='_blank'>NO ONE EVER TOLD ME THE END OF THE STORY</a></li>
+	<li><a href='https://meanderingpassage.com' target='_blank'>Meandering Passage</a>&nbsp;//&nbsp;<a href='https://meanderingpassage.com/2024/01/14/dealing-with-covid/' target='_blank'>Dealing with Covid</a></li>
+	<li><a href='https://shashindo.de' target='_blank'>shashin-do</a>&nbsp;//&nbsp;<a href='https://shashindo.de/quadratisch-schneenebel/' target='_blank'>[Quadratisch] Schneenebel</a></li>
+</ul><li style='font-weight: bold;'>Less then a month</li>
+<ul>	<li><a href='https://porfolio.gorga.org' target='_blank'>Frank R. Gorga</a>&nbsp;//&nbsp;<a href='https://porfolio.gorga.org/wilton-lyndeborough-center' target='_blank'>Wilton & Lyndeborough Center</a></li>
+	<li><a href='https://www.juergen-hurst.de' target='_blank'>Jürgen Hurst</a>&nbsp;//&nbsp;<a href='https://www.juergen-hurst.de/kleines-glueck/' target='_blank'>Kleines Glück</a></li>
+	<li><a href='https://kwerfeldein.de' target='_blank'>kwerfeldein</a>&nbsp;//&nbsp;<a href='https://kwerfeldein.de/2024/01/14/browserfruits-2-2024/' target='_blank'>browserfruits 2.2024</a></li>
+	<li><a href='https://www.nassio.com/empty' target='_blank'>Empty</a>&nbsp;//&nbsp;<a href='https://www.nassio.com/empty/?p=5858' target='_blank'>Bloomsbury Place</a></li>
+	<li><a href='https://tokyocamerastyle.com/' target='_blank'>tokyo camera style</a>&nbsp;//&nbsp;<a href='https://tokyocamerastyle.com/post/739357545016246272' target='_blank'>Naoki Ishikawa Hair</a></li>
+	<li><a href='' target='_blank'>Balades</a>&nbsp;//&nbsp;<a href='index.html' target='_blank'></a></li>
+	<li><a href='https://www.biodiversityphoto.com/' target='_blank'>Biodiversity Photo</a>&nbsp;//&nbsp;<a href='https://www.biodiversityphoto.com/p117362573' target='_blank'>Slideshow</a></li>
+	<li><a href='https://www.flickr.com/photos/brucebordner/' target='_blank'>Bruce Bordner</a>&nbsp;//&nbsp;<a href='https://www.flickr.com/photos/brucebordner/53451871006/' target='_blank'>PXL_20240106_192703822.mp4</a></li>
+	<li><a href='https://cphmag.com/' target='_blank'>Conscientious Photography Magazine</a>&nbsp;//&nbsp;<a href='https://cphmag.com/packing-my-library/' target='_blank'>Packing My Library</a></li>
+	<li><a href='https://www.jwsmithphoto.com/blog/' target='_blank'>JW Smith Photography</a>&nbsp;//&nbsp;<a href='https://www.jwsmithphoto.com/blog/snow-dog' target='_blank'>Snow Dog</a></li>
+	<li><a href='https://lawrencepallant.com' target='_blank'>Lawrence Pallant Photography</a>&nbsp;//&nbsp;<a href='https://lawrencepallant.com/2024/01/07/lake-henshaw-in-the-fog/' target='_blank'>Lake Henshaw in the Fog</a></li>
+	<li><a href='https://hebphoto.blogspot.com/' target='_blank'>photo hebrides</a>&nbsp;//&nbsp;<a href='https://hebphoto.blogspot.com/2024/01/a-day-of-memories-elgol.html' target='_blank'>a day of memories, Elgol</a></li>
+	<li><a href='https://stevemccurry.blog' target='_blank'>Steve McCurry Curated</a>&nbsp;//&nbsp;<a href='https://stevemccurry.blog/2024/01/05/portraits-of-us/' target='_blank'>Portraits of Us</a></li>
+	<li><a href='https://thequietphotographer.wordpress.com' target='_blank'>the quiet photographer</a>&nbsp;//&nbsp;<a href='https://thequietphotographer.wordpress.com/2024/01/06/befana-day/' target='_blank'>Befana Day</a></li>
+	<li><a href='http://tomdills.com/blog' target='_blank'>Tom Dills Photography Blog</a>&nbsp;//&nbsp;<a href='http://tomdills.com/blog/2024/01/07/travel-with-friends/' target='_blank'>Travel With Friends</a></li>
+	<li><a href='http://workingpictures.blogspot.com/' target='_blank'>Working Pictures</a>&nbsp;//&nbsp;<a href='http://workingpictures.blogspot.com/2024/01/update.html' target='_blank'>Update</a></li>
+	<li><a href='https://www.davidadam.com/blog/' target='_blank'>David Adam Edelstein</a>&nbsp;//&nbsp;<a href='https://www.davidadam.com/blog/2024-1/even-still-more-platinum' target='_blank'>Even still more Platinum</a></li>
+	<li><a href='http://garynylander.blogspot.com/' target='_blank'>G.R. Nylander Photography</a>&nbsp;//&nbsp;<a href='http://garynylander.blogspot.com/2023/12/wild-pacific-trail-no-18-18a.html' target='_blank'>Wild Pacific Trail No. 18-18A</a></li>
+	<li><a href='https://kazuyank.photo/' target='_blank'>kazuyank.photo</a>&nbsp;//&nbsp;<a href='https://kazuyank.photo/entry/20240101-4943.html' target='_blank'>Tokyo #1143</a></li>
+	<li><a href='https://www.melmannphoto.com/' target='_blank'>Mel Mann Photography</a>&nbsp;//&nbsp;<a href='https://www.melmannphoto.com/p635635601' target='_blank'>Best of 2023 Images</a></li>
+	<li><a href='https://photothunk.blogspot.com/' target='_blank'>Photos and Stuff</a>&nbsp;//&nbsp;<a href='https://photothunk.blogspot.com/2024/01/im-not-dead.html' target='_blank'>I'm Not Dead</a></li>
+	<li><a href='https://ct73.blogspot.com/' target='_blank'>Sepp Broger Photographien</a>&nbsp;//&nbsp;<a href='https://ct73.blogspot.com/2023/12/impressionen-in-grun.html' target='_blank'>Impressionen in Grün</a></li>
+	<li><a href='https://singularimages.net' target='_blank'>Singular Images</a>&nbsp;//&nbsp;<a href='https://singularimages.net/2024/01/03/cyanotype-myth-ferric-ammonium-citrate-fac-will-work-forever/' target='_blank'>Cyanotype myth: Ferric Ammonium Citrate (FAC) will work forever</a></li>
+	<li><a href='http://www.ericareadeimages.com/erica-reade-blog/' target='_blank'>Erica Reade Images</a>&nbsp;//&nbsp;<a href='http://www.ericareadeimages.com/erica-reade-blog/2024/1/16/23-in-2023' target='_blank'>23 in 2023</a></li>
+	<li><a href='https://sjconnor.wordpress.com' target='_blank'>Shaggy Dog Pix</a>&nbsp;//&nbsp;<a href='https://sjconnor.wordpress.com/2023/12/27/7064/' target='_blank'></a></li>
+	<li><a href='https://www.nearbycafe.com/artandphoto/photocritic' target='_blank'>Photocritic International</a>&nbsp;//&nbsp;<a href='https://www.nearbycafe.com/artandphoto/photocritic/2023/12/21/fourscore-a-chronology/' target='_blank'>Four Score: A Chronology</a></li>
+</ul><li style='font-weight: bold;'>Quite old</li>
+<ul>	<li><a href='https://www.magnumphotos.com' target='_blank'>Magnum Digest</a>&nbsp;//&nbsp;<a href='https://www.magnumphotos.com/newsroom/magnum-digest/peter-van-agtmael-a-decade-of-documenting-israel-and-palestine/' target='_blank'>Protected: Peter van Agtmael: A Decade of Documenting Israel and Palestine</a></li>
+	<li><a href='https://oook.info/blog' target='_blank'>oookblog2 </a>&nbsp;//&nbsp;<a href='https://oook.info/blog/?p=4526' target='_blank'>Joerndts</a></li>
+	<li><a href='http://www.throughfrozenfields.com/' target='_blank'>Through Frozen Fields</a>&nbsp;//&nbsp;<a href='http://www.throughfrozenfields.com/2023/11/fall-at-spring-creek.html' target='_blank'>Fall at Spring Creek</a></li>
+	<li><a href='https://davidduchemin.com' target='_blank'>David duChemin</a>&nbsp;//&nbsp;<a href='https://davidduchemin.com/2023/12/compensating-for-something/' target='_blank'>Compensating for Something?</a></li>
+	<li><a href='https://fkmagazine.lv' target='_blank'>FK Magazine &#8211; FK</a>&nbsp;//&nbsp;<a href='https://fkmagazine.lv/2023/11/13/arnis-balcus-about-the-scene-exhibition/' target='_blank'>Arnis Balčus about the Scene exhibition</a></li>
+	<li><a href='https://jimbullard.zenfolio.com/' target='_blank'>Jim Bullard Photography</a>&nbsp;//&nbsp;<a href='https://jimbullard.zenfolio.com/p311862634' target='_blank'>Grieving Angels</a></li>
+	<li><a href='https://www.flickr.com/photos/196641999@N06/' target='_blank'>Jim's World West</a>&nbsp;//&nbsp;<a href='https://www.flickr.com/photos/196641999@N06/53318736127/' target='_blank'>Urn</a></li>
+	<li><a href='https://www.smugmug.com/' target='_blank'>Rob de Loë: Solos</a>&nbsp;//&nbsp;<a href='https://www.robdeloephotography.com/Works/Solos/i-N5HDz5r' target='_blank'>Rob de Loe's photo</a></li>
+	<li><a href='https://pixeluz2.wordpress.com' target='_blank'>Éléments du monde ordinaire</a>&nbsp;//&nbsp;<a href='https://pixeluz2.wordpress.com/2023/11/05/robot-classe-delprat2023/' target='_blank'>robot classe delprat2023</a></li>
+	<li><a href='http://imagefiction.blogspot.com/' target='_blank'>ImageFiction</a>&nbsp;//&nbsp;<a href='http://imagefiction.blogspot.com/2023/10/true-grit-breakfast-coffee-in-konya.html' target='_blank'></a></li>
+	<li><a href='http://thepubliceyeblog.blogspot.com/' target='_blank'>The Public Eye Blog</a>&nbsp;//&nbsp;<a href='http://thepubliceyeblog.blogspot.com/2023/10/paar-couple.html' target='_blank'>Paar &#8211; Couple</a></li>
+</ul><li style='font-weight: bold;'>From medieval times</li>
+<ul>	<li><a href='http://blog.mattalofs.com' target='_blank'>blog.mattalofs.com</a>&nbsp;//&nbsp;<a href='http://blog.mattalofs.com/10690002-2/' target='_blank'>10690002</a></li>
+	<li><a href='https://new.cogitatione-imaginem-fingere.de' target='_blank'>agrestis</a>&nbsp;//&nbsp;<a href='https://new.cogitatione-imaginem-fingere.de/2023/08/06/hier-darf-er-noch-stehen/' target='_blank'>Hier darf er noch stehen</a></li>
+	<li><a href='https://fotosinn.de/' target='_blank'>Fotosinn (German)</a>&nbsp;//&nbsp;<a href='https://fotosinn.de/blog/fotosinn-neu/' target='_blank'>fotosinn neu</a></li>
+	<li><a href='https://pbase.com/randalldidit/root&view=recent' target='_blank'>Randall Teasley</a>&nbsp;//&nbsp;<a href='https://pbase.com/randalldidit/small_world' target='_blank'>Small World</a></li>
+	<li><a href='https://camerawork.de/en/homepage/' target='_blank'>camera work</a>&nbsp;//&nbsp;<a href='https://camerawork.de/en/martin-schoeller-2023/' target='_blank'>Martin Schoeller</a></li>
+	<li><a href='https://leicaphilia.com' target='_blank'>Leicaphilia</a>&nbsp;//&nbsp;<a href='https://leicaphilia.com/timothy-vanderweert-photography-exhibit-august-9-2023/' target='_blank'>Timothy Vanderweert Photography Exhibit, August 9, 2023</a></li>
+	<li><a href='http://www.janber.net' target='_blank'>Jan Bernhardtz Photography</a>&nbsp;//&nbsp;<a href='http://www.janber.net/2023/06/04/five-books-about-berlin/' target='_blank'>Five books about Berlin</a></li>
+	<li><a href='https://www.ronnynilsen.com/' target='_blank'>The Quiet Landscape</a>&nbsp;//&nbsp;<a href='https://www.ronnynilsen.com/blogpost/White-throated-dipper/' target='_blank'>White-throated dipper</a></li>
+	<li><a href='https://www.anthonyreczek.com' target='_blank'>Anthony Reczek Photography</a>&nbsp;//&nbsp;<a href='https://www.anthonyreczek.com/2023/04/book-launch-2/?utm_source=rss&utm_medium=rss&utm_campaign=book-launch-2' target='_blank'>Book Launch!!!</a></li>
+	<li><a href='https://www.flickr.com/photos/keinidyll/' target='_blank'>keinidyll</a>&nbsp;//&nbsp;<a href='https://www.flickr.com/photos/keinidyll/52853466287/' target='_blank'>Bodenschätze - natural resources</a></li>
+	<li><a href='https://martina-mettner.de/' target='_blank'>fotofeinkost</a>&nbsp;//&nbsp;<a href='https://martina-mettner.de/auftragsfotografie-in-der-krise/' target='_blank'>Auftragsfotografie in der Krise?</a></li>
+	<li><a href='https://www.jeanlucfeixa.com/' target='_blank'>Jean-Luc Feixa</a>&nbsp;//&nbsp;<a href='https://jlfeixa.tumblr.com/post/710800668011757568' target='_blank'>A Arles ce week-end ? N'hésitez pas à passer par la...</a></li>
+	<li><a href='https://www.photoclubalpha.com' target='_blank'>Photoclubalpha</a>&nbsp;//&nbsp;<a href='https://www.photoclubalpha.com/2023/01/23/sony-20-70mm-f-4-g-a-new-type-of-lens/' target='_blank'>Sony 20-70mm f/4 G &#8211; a new type of lens</a></li>
+	<li><a href='http://circulationexchange.org/' target='_blank'>Circulation | Exchange</a>&nbsp;//&nbsp;<a href='http://circulationexchange.org/articles/Menchelli.html' target='_blank'>Under the Blue Sun</a></li>
+	<li><a href='https://claudioturri.it' target='_blank'>Claudio Turri</a>&nbsp;//&nbsp;<a href='https://claudioturri.it/2022/10/13/365-project-2022-day-286/' target='_blank'>365 project 2022 &#8211; day 286</a></li>
+	<li><a href='https://www.rudyortega.com/blog/' target='_blank'>Denver Street Photographer</a>&nbsp;//&nbsp;<a href='https://www.rudyortega.com/blog/chinese-new-year-festival' target='_blank'>Chinese New Year Festival</a></li>
+	<li><a href='http://www.disphotic.com' target='_blank'>Disphotic</a>&nbsp;//&nbsp;<a href='http://www.disphotic.com/good-bye-disphotic/' target='_blank'>Goodbye Disphotic</a></li>
+	<li><a href='https://www.expose-verlag.de' target='_blank'>ex pose</a>&nbsp;//&nbsp;<a href='https://www.expose-verlag.de/videoeinbettung/' target='_blank'>Videoeinbettung</a></li>
+	<li><a href='http://www.jbuhler.com' target='_blank'>Juan Buhler</a>&nbsp;//&nbsp;<a href='http://www.jbuhler.com/buenos-aires-2018-51/' target='_blank'>Buenos Aires, 2018</a></li>
+	<li><a href='http://northfloridapictures.blogspot.com/' target='_blank'>North Florida Pictures</a>&nbsp;//&nbsp;<a href='http://northfloridapictures.blogspot.com/2022/10/me-and-kate-garden-roscoe.html' target='_blank'>Me and Kate, Garden, Roscoe</a></li>
+	<li><a href='https://paullesterphoto.com' target='_blank'>Paul's Walk</a>&nbsp;//&nbsp;<a href='https://www.paullesterphoto.com/wordpress/2023/01/10/changing-locations/' target='_blank'>Changing locations</a></li>
+	<li><a href='https://pearweed.net' target='_blank'>pearweed journal(s)</a>&nbsp;//&nbsp;<a href='https://pearweed.net/floret/' target='_blank'>floret</a></li>
+	<li><a href='https://blog.sz-photo.de' target='_blank'>SZ Photo blog</a>&nbsp;//&nbsp;<a href='https://blog.sz-photo.de/aktuelles/portratfotografie-bei-sz-photo/' target='_blank'>Porträtfotografie bei SZ Photo</a></li>
+	<li><a href='http://www.picturesfromthezone.com/' target='_blank'>Pictures of Places - Thomas Rink</a>&nbsp;//&nbsp;<a href='http://www.picturesfromthezone.com/' target='_blank'></a></li>
+	<li><a href='https://www.donttakepictures.com/dtp-blog/' target='_blank'>Don't Take Pictures - Don't Take Pictures</a>&nbsp;//&nbsp;<a href='https://www.donttakepictures.com/dtp-blog/2021/9/8/keep-making-pictures-thank-you-for-8-great-years' target='_blank'>Keep Making Pictures: Thank You for 8 Great Years</a></li>
+	<li><a href='https://newlandscapephotography.com' target='_blank'>New Landscape Photography</a>&nbsp;//&nbsp;<a href='https://newlandscapephotography.com/2021/09/08/luigi-manzione/' target='_blank'>Luigi Manzione</a></li>
+	<li><a href='http://thesouthedition.org' target='_blank'>The South Edition</a>&nbsp;//&nbsp;<a href='http://thesouthedition.org/2021/11/29/hello-world/' target='_blank'>Hello world!</a></li>
+	<li><a href='http://tripleway.blogspot.com/' target='_blank'>Triple Ways</a>&nbsp;//&nbsp;<a href='http://tripleway.blogspot.com/2021/11/f-rere-de-coeur-huit-ans-sans-voir-lun.html' target='_blank'></a></li>
+	<li><a href='http://www.urbanstreetdiving.com' target='_blank'>Urban Street Diving</a>&nbsp;//&nbsp;<a href='http://www.urbanstreetdiving.com/deep-dive/jeffrey-de-keyser-belgium/' target='_blank'>&#8220;Belgium is complex&#8221;</a></li>
+	<li><a href='https://blog.babaoskar.info' target='_blank'>Babaoskar Shoots Back</a>&nbsp;//&nbsp;<a href='https://blog.babaoskar.info/2020/12/30/frozen-leaves/' target='_blank'>frozen leaves</a></li>
+	<li><a href='https://www.cogitatione-imaginem-fingere.de/' target='_blank'>Cogitatione imaginem fingere</a>&nbsp;//&nbsp;<a href='https://www.cogitatione-imaginem-fingere.de/index.php?/archives/57-Kugel,-Wuerfel,-Pyramide.html' target='_blank'>Kugel, Würfel, Pyramide</a></li>
+	<li><a href='https://www.cyberhalides.com' target='_blank'>CyberHalides</a>&nbsp;//&nbsp;<a href='https://www.cyberhalides.com/dux-one-plus-four/' target='_blank'>Dux: One plus Four</a></li>
+	<li><a href='https://enjayar.wordpress.com' target='_blank'>eNJayaR</a>&nbsp;//&nbsp;<a href='https://enjayar.wordpress.com/2020/05/12/the-blue-door/' target='_blank'>The Blue Door</a></li>
+	<li><a href='https://www.flickr.com/photos/erik-van-straten/' target='_blank'>Eric van Straten</a>&nbsp;//&nbsp;<a href='https://www.flickr.com/photos/erik-van-straten/50723735082/' target='_blank'>Amsterdam-2020-1111-koolz</a></li>
+	<li><a href='https://georgebarr.com' target='_blank'>George Barr Fine Art Photography</a>&nbsp;//&nbsp;<a href='https://georgebarr.com/depths-of-maligne-canyon/' target='_blank'>Depths Of Maligne Canyon</a></li>
+	<li><a href='https://lichtbildnerin.de' target='_blank'>Lichtbildnerin</a>&nbsp;//&nbsp;<a href='https://lichtbildnerin.de/2020/05/01/waiting/' target='_blank'>waiting</a></li>
+	<li><a href='http://lightscrape.blogspot.com/' target='_blank'>Light Scrape</a>&nbsp;//&nbsp;<a href='http://lightscrape.blogspot.com/2020/05/slowly-strange-name-in-strange-tongue.html' target='_blank'>Slowly a strange name in a strange tongue</a></li>
+	<li><a href='https://rawurbanshots.com/blogs/news' target='_blank'>Raw Urban Shots - News</a>&nbsp;//&nbsp;<a href='https://rawurbanshots.com/blogs/news/februarys-top-picks-on-raw-urban-shots' target='_blank'>February's top picks on Raw Urban Shots</a></li>
+	<li><a href='http://wpii.blogspot.com/' target='_blank'>WPII</a>&nbsp;//&nbsp;<a href='http://wpii.blogspot.com/2020/03/burr-pond-park-walk-3820.html' target='_blank'>Burr Pond Park Walk, 3/8/20</a></li>
+	<li><a href='https://www.mikepeters-photography.com/gallery/200515510_cJRDxB/' target='_blank'>Mike Peters</a>&nbsp;//&nbsp;<a href='https://www.mikepeters-photography.com/Personal-Work-sets/042119-Easter-NYC/i-W5n245C' target='_blank'>042119_1941_NYC Easter</a></li>
+	<li><a href='https://georg-ritter.info' target='_blank'>Schorsch sagt OM</a>&nbsp;//&nbsp;<a href='https://georg-ritter.info/2019/03/cafe-schwarz-weiss/' target='_blank'>Cafe schwarz-weiß</a></li>
+	<li><a href='http://phototrivia.blogspot.com/' target='_blank'>Photographing Trivialities</a>&nbsp;//&nbsp;<a href='http://phototrivia.blogspot.com/2018/11/snowy-barriers.html' target='_blank'>Snowy Barriers</a></li>
+	<li><a href='https://www.skiai.ch/' target='_blank'>The Pedestrian. Urbanscapes</a>&nbsp;//&nbsp;<a href='https://www.skiai.ch/genova-pra-marina/' target='_blank'>Pra&#8217; Marina, Genova/Genoa, Liguria, Italy</a></li>
+	<li><a href='http://walterneiger.blogspot.com/' target='_blank'>a picture a day keeps the doctor away</a>&nbsp;//&nbsp;<a href='http://walterneiger.blogspot.com/2017/09/fotoausstellung-zum-thema-bruch.html' target='_blank'>Fotoausstellung zum Thema &#171;Bruch&#187;</a></li>
+	<li><a href='http://historyinphotos.blogspot.com/' target='_blank'>History in Photos</a>&nbsp;//&nbsp;<a href='http://historyinphotos.blogspot.com/2017/08/farewell.html' target='_blank'>Farewell</a></li>
+	<li><a href='https://butfornow.net/' target='_blank'>But for Now We Are Young</a>&nbsp;//&nbsp;<a href='https://butfornow.net/post/154262244964' target='_blank'>Photo</a></li>
+	<li><a href='http://ndepree.com/photoblave/' target='_blank'>Photoblave</a>&nbsp;//&nbsp;<a href='http://ndepree.com/photoblave/2016/1/17/landschaftspark-playground-in-a-steel-mill' target='_blank'>Landschaftspark - Playground in a Steel Mill</a></li>
+	<li><a href='https://TheCharmOfLight.com' target='_blank'>The Charm of Light</a>&nbsp;//&nbsp;<a href='https://TheCharmOfLight.com/hazy-path/' target='_blank'>Hazy path</a></li>
+	<li><a href='http://www.annev-blog.fr/' target='_blank'>Anne V.</a>&nbsp;//&nbsp;<a href='http://www.annev-blog.fr/index.php?showimage=762' target='_blank'>Deux jours à la mer... V</a></li>
+	<li><a href='https://redskiesatnight.com' target='_blank'>Red Skies at Night</a>&nbsp;//&nbsp;<a href='https://redskiesatnight.com/2014/05/05/love-sandwich-triptych/' target='_blank'>Love Sandwich Triptych</a></li>
+	<li><a href='http://sabrinahenry.com' target='_blank'>SABRINA HENRY</a>&nbsp;//&nbsp;<a href='http://sabrinahenry.com/2014/10/09/farm-to-fork-graze-restaurant-2/' target='_blank'>farm to fork: graze restaurant</a></li>
+	<li><a href='https://wondering-in-wonderland.blogspot.com/' target='_blank'>Wondering in Wonderland &#169; Janine L. Thun</a>&nbsp;//&nbsp;<a href='https://wondering-in-wonderland.blogspot.com/2014/09/r-e-m-e-m-b-e-r-i-n-g.html' target='_blank'>R e m e m b e r i n g</a></li>
+	<li><a href='https://uebersehenes.aberdoch.de' target='_blank'>Übersehenes</a>&nbsp;//&nbsp;<a href='https://uebersehenes.aberdoch.de/2013/03/22/stille/' target='_blank'>Stille</a></li>
+	<li><a href='https://largeformatfilm.blogspot.com/' target='_blank'>Expose for the Shadows</a>&nbsp;//&nbsp;<a href='https://largeformatfilm.blogspot.com/2012/07/redrock-country-ii.html' target='_blank'>Redrock Country II</a></li>
+	<li><a href='https://www.zauber-allenthalben.de' target='_blank'>Zauber allenthalben</a>&nbsp;//&nbsp;<a href='https://www.zauber-allenthalben.de' target='_blank'>Zauber allenthalben</a></li>
+</ul>

+ 0 - 208
docker-compose.yml

@@ -1,208 +0,0 @@
-# 	$Id: docker-compose.yml,v 1.6 2022/06/22 11:58:38 springm Exp springm $
-#       $Revision: 1.6 $
-#       $Date: 2022/06/22 11:58:38 $
-#       $Log: docker-compose.yml,v $
-#       Revision 1.6  2022/06/22 11:58:38  springm
-#       Summary: Running version before integrating Matomo
-#
-#       Revision 1.5  2022/06/05 09:29:36  springm
-#       Summary: DISABLE_WP_CRON eingefügt
-#
-#
-#       Revision 1.4  2022/06/05 06:26:37  springm
-#       Summary: define COOKIE_DOMAIN auf $$_SERVER... hinzugefügt. Behebt
-#       Cookie-Fehlermeldung beim Einloggen
-#
-#       Revision 1.3  2022/06/05 05:44:06  springm
-#       Summary: ADMIN_COOKIE_PATH auskommentiert
-#       Weitere Cookie-Variablen auskommentiert
-#
-#       Revision 1.2  2022/06/05 05:29:29  springm
-#       Summary: RCS-Header eingefügt
-#
-#
-# from https://www.ddmboss.com/2022/01/20/wordpress-docker-development-set-up-with-traefik-redis-and-nginx/
-version: '3.8'
-
-services:
-  nginx:
-    image: nginx:alpine
-    container_name: wp-matomo-nginx
-    restart: always
-    depends_on:
-      - wordpress-fpm
-      - matomo-fpm
-    expose:
-      - 80
-      - 443
-    volumes:
-      - ./conf:/etc/nginx/conf.d
-      - ./logs:/var/log/nginx
-      - ./wordpress:/var/www/html
-      - ./matomo:/var/www/matomo
-    networks:
-      - wordpress
-      - proxy
-    labels:
-      - traefik.enable=true
-      - "traefik.docker.network=proxy"
-      - traefik.http.routers.wordpress.rule=Host(`${WP_URL}`, `${WP_WWW_URL}`)
-      #- "traefik.http.routers.wordpress.rule=Host(`${WP_URL}`) || HostRegexp(`{subdomain:[a-z0-9]+}.${WP_DOMAIN}`)"
-      - traefik.http.routers.wordpress.entrypoints=web
-      - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https
-      - traefik.http.routers.wordpress.middlewares=redirect-to-https@docker
-      - traefik.http.routers.wordpress-secure.rule=Host(`${WP_URL}`, `${WP_WWW_URL}`)
-      #- "traefik.http.routers.wordpress-secure.rule=Host(`${WP_URL}`) || HostRegexp(`{subdomain:[a-z0-9]+}.${WP_DOMAIN}`)"
-      - traefik.http.routers.wordpress-secure.entrypoints=websecure
-      - traefik.http.routers.wordpress-secure.tls.certresolver=cloudflare
-
-  wp-fpm:
-    image: wordpress:php8.0-fpm-alpine
-    restart: always
-    container_name: wp-fpm
-    depends_on: 
-      - mariadb
-      - redis
-    expose:
-      - 9000
-    environment:
-      WORDPRESS_DB_HOST: mariadb
-      WORDPRESS_DB_NAME: ${WP_DB_NAME}
-      WORDPRESS_DB_USER: ${WP_DB_USER}
-      WORDPRESS_DB_PASSWORD: ${WP_DB_PASSWORD}
-      WORDPRESS_TABLE_PREFIX: ${WP_DB_PREFIX}
-      WORDPRESS_CONFIG_EXTRA:
-        define( 'WP_REDIS_HOST', 'redis' );
-        define( 'WP_REDIS_PORT', 6379 );
-        define( 'COMPRESS_CSS', true );
-        define( 'COMPRESS_SCRIPTS', true );
-        define( 'CONCATENATE_SCRIPTS', true );
-        /* define( 'ENFORCE_GZIP', true ); */
-        define( 'ENFORCE_GZIP', false );
-        define( 'AUTOSAVE_INTERVAL', 120 );
-        define( 'WP_POST_REVISIONS', 10);
-        define( 'MEDIA_TRASH', true );
-        define( 'EMPTY_TRASH_DAYS', 30 );
-        define( 'IMAGE_EDIT_OVERWRITE', true );
-        define( 'DISALLOW_FILE_EDIT', true );
-        define( 'MULTISITE', true );
-        define( 'SUBDOMAIN_INSTALL', true );
-        define( 'DOMAIN_CURRENT_SITE', 'wordpress.markus-spring.de' );
-        define( 'PATH_CURRENT_SITE', '/' );
-        define( 'SITE_ID_CURRENT_SITE', 1 );
-        define( 'BLOG_ID_CURRENT_SITE', 1 );
-        /* define('ADMIN_COOKIE_PATH', '/'); */
-        /* define('COOKIE_DOMAIN', ''); */
-        /* define('COOKIEPATH', ''); */
-        /* define('SITECOOKIEPATH', ''); */
-        /* define( 'WP_DEBUG_LOG', true );
-        define( 'WP_DEBUG_DISPLAY', false );
-        define( 'SAVEQUERIES', true ); */
-        /* https://wp-staging.com/how-to-fix-the-error-cookies-are-blocked-or-not-supported-by-your-browser/ */
-        define('COOKIE_DOMAIN', $$_SERVER['HTTP_HOST'] );
-        /* define( 'SUNRISE', 'on' ); */ 
-        define('DISABLE_WP_CRON', true);
-    volumes:
-      - ./wordpress:/var/www/html
-      - ./wordpress.ini:/usr/local/etc/php/conf.d/wordpress.ini
-    networks:
-      - wordpress
-      - proxy
-  
-  matomo-fpm:
-    image: matomo:fpm-alpine
-    #image: wordpress:php8.0-fpm-alpine
-    container_name: matomo-fpm
-    restart: unless-stopped
-    depends_on: 
-      - mariadb
-    volumes:
-      - ./matomo:/var/www/matomo
-    environment:
-      - MATOMO_DATABASE_HOST=mariadb
-      - MATOMO_DATABASE_ADAPTER=mariadb
-      - MATOMO_DATABASE_TABLES_PREFIX=${MATOMO_DATABASE_TABLES_PREFIX}
-      - MATOMO_DATABASE_USERNAME=${MYSQL_USER}
-      - MATOMO_DATABASE_PASSWORD=${MYSQL_PASSWORD}
-      - MATOMO_DATABASE_DBNAME=${MYSQL_DATABASE}
-    networks:
-      - wordpress
-      - proxy
-
-  mariadb:
-    image: mariadb:latest
-    restart: always
-    container_name: wp-mariadb
-    expose:
-      - 3306
-    environment:
-      MYSQL_DATABASE: ${WP_DB_NAME}
-      MYSQL_USER: ${WP_DB_USER}
-      MYSQL_PASSWORD: ${WP_DB_PASSWORD}
-      # MYSQL_RANDOM_ROOT_PASSWORD: '1'
-    volumes:
-      - mariadb:/var/lib/mysql
-    networks:
-      - wordpress
-    # for resetting the root password
-    # https://gist.github.com/rordi/ab55c92848fd06884172ed22ae88d7df
-    # entrypoint: mysqld_safe --skip-grant-tables --user=mysql
-
-  redis:
-    image: redis:6.2.7
-    restart: unless-stopped
-    container_name: wp-redis
-    expose:
-      - 6379
-    command: 
-      - redis-server
-      - --loglevel warning
-      - --maxmemory 512mb 
-      - --maxmemory-policy allkeys-lru 
-      - --save 60 1 
-    volumes:
-      - redis:/var/lib/redis
-      - redis:/data
-      #- ./redis.conf:/usr/local/etc/redis/redis.conf
-    networks:
-      - wordpress
-
-  # phpmyadmin:
-  #   image: phpmyadmin/phpmyadmin
-  #   container_name: phpmyadmin
-  #   ports:
-  #     - "${LOCAL_PORT_DB_GUI}:80"
-  #   restart: on-failure:5
-  #   # depends_on:
-  #   #   - database
-  #   environment:
-  #     PMA_HOST: "${PMA_HOST}"
-  #     # PMA_ABSOLUTE_URI: "phpmyadmin.markus-spring.de"
-  #     # PMA_USER: "${PMA_USER}"
-  #     # PMA_PASSWORD: "${PMA_PASSWORD}"
-  #   labels:
-  #     - "traefik.enable=true"
-  #     - "traefik.docker.network=proxy"
-  #     - "traefik.http.routers.phpmyadmin.rule=Host(`phpmyadmin.markus-spring.de`)" #edit domain for host
-  #     - "traefik.http.routers.phpmyadmin.priority=99"
-  #     - "traefik.http.routers.phpmyadmin.entrypoints=websecure"
-  #     - "traefik.http.routers.phpmyadmin.tls=true"
-  #     - "traefik.http.routers.phpmyadmin.tls.certresolver=cloudflare"
-  #     - "traefik.http.services.phpmyadmin.loadBalancer.server.port=80"
-  #   networks:
-  #     - proxy
-  #     - wordpress
-      
-volumes:
-  redis:
-  mariadb:
-
-networks:
-  proxy:
-    external: true
-  wordpress:
-    internal: true
-
-
-# 
-# docker-compose.yml ends here