<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<rss version="2.0"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
  <channel>
    <title>🤔-&gt;😉 on @jelloeater👾</title>
    <link>https://jelloeater.me/mood/-/</link>
    <description>Recent content in 🤔-&gt;😉 on @jelloeater👾</description>
    <generator>Hugo</generator>
    <language>en</language>
    
    <copyright>Jelloeater 2024</copyright>
    <image>
      <title>🤔-&gt;😉 on @jelloeater👾</title>
      <url>https://jelloeater.me/mood/-/favicon-32x32.png</url>
      <link>https://jelloeater.me/mood/-/</link>
      <description>Recent content in 🤔-&gt;😉 on @jelloeater👾</description>
    </image>
    <lastBuildDate>Mon, 07 Jul 2025 01:32:00 -0500</lastBuildDate>
    
    <atom:link href="https://jelloeater.me/mood/-/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Moving my diary to Obsidian</title>
      <link>
      https://jelloeater.me/blog/diary-migrate/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/diary-migrate/#comments
      </comments>
      <pubDate>Mon, 07 Jul 2025 01:32:00 -0500</pubDate>
      <category>diary</category>
      
      <category>obsidian</category>
      
      <category>personal</category>
      
      <category>private</category>
      
      <category>update</category>
      <guid>https://jelloeater.me/blog/diary-migrate/</guid>
      
      <media:content url="https://jelloeater.me/blog/diary-migrate.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/diary-migrate.png"/>
      


    
    



      
      
      <description><![CDATA[Keeping private thoughts; private]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/diary-migrate.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>So, I recently decided to migrate from <a href="https://diaroapp.com">Diaro</a> to Two Obsidian for my diary. Not that I have a problem with their website. For the low price of $20, I believe it was, I think it&rsquo;s a good deal. They gave me a lifetime subscription to their site, which utilizes Dropbox to sync its data backend. They&rsquo;ve never lost a single entry, and they&rsquo;ve helped me chronicle my life over the last three or four years. One of the great features they had was that you could upload a photo, and it would tag the location and set the time and date based on the photo. This was a great feature, and something I hope I can find similar to in Obsidian.</p>
<h2 id="getting-the-data-out">Getting the data out</h2>
<p>Getting the data out of the service wasn&rsquo;t exactly the easiest process, though they offered a few different export options, one that did CSV and one that did Text. When the PDF, A few different things, depending on which platform you tried to export from, the options were different depending on whether you did it on mobile or on the website. This was a little bit difficult because all the formats that they offered didn&rsquo;t include photos, at least in an easy-to-access format. Y, You could try and export the photos by ripping them out of the PDFs, but that was a nightmare. Luckily, I was able to do some digging through the Dropbox account that it happened to be using as a backend sync. In there. I found some XML files and my photos all as JPEGs. The XML file wasn&rsquo;t the easiest to parse, but thankfully, the structure was relatively sane. Attachments were in one table, Locations in another, and then the direct entries themselves in another table, all on one giant XML document.</p>
<h2 id="custom-scripting">Custom scripting</h2>
<p>I was able to cook up a little bit of Python magic to get all this converted into a standardized markdown format with some YAML front matter and the images embedded at the bottom of the posts. All in all. This took two to three days Of Work over a weekend. Nothing too crazy, but I do wish that they offered a better export option. Maybe something with JSON or at least CSVs with attachments easily linked? Maybe like a photo dump option as well, just some food for thought. Either way, I can&rsquo;t complain too much. For a whopping $20, I spent on a lifetime license, and the fact that they never lost a single post, but arguably, I would have to probably thank Dropbox for that. As they were debating the back end. Thankfully, the app always worked on every single device, and the website was reliable, so no digs against them. I&rsquo;m gonna include a link to the Python script or maybe just embed it in this post. At the bottom, we&rsquo;ll see. Just in case, it can help somebody else out down the road by moving their notes over from this service to either Obsidian or another markdown-based Diary application. Thanks!</p>
<p>🖖 Jelloeater</p>
<h2 id="migration-script">Migration script</h2>


  
    <blockquote>
      <p>This script is used to migrate data from Diaro to Obsidian, parsing XML files and creating markdown files with metadata. It&rsquo;s kind of crap, but it DOES work. Feel free to email me if you need help&hellip; ❤️</p>
    </blockquote>
  
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env -S uv run --quiet</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># /// script</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># requires-python = &#34;&gt;=3.12&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># dependencies = [</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#     &#34;pymarkdownlnt&#34;,</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ]</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ///</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> xml.etree.ElementTree <span style="color:#66d9ef">as</span> ET
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> datetime <span style="color:#f92672">import</span> datetime
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> zipfile
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> re
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> pymarkdown
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> xml.etree.ElementTree <span style="color:#66d9ef">as</span> ET
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Location</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __init__(self, uid, title, address, lat, lng, zoom):
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>uid <span style="color:#f92672">=</span> uid
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>title <span style="color:#f92672">=</span> title
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>address <span style="color:#f92672">=</span> address
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>lat <span style="color:#f92672">=</span> lat
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>lng <span style="color:#f92672">=</span> lng
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>zoom <span style="color:#f92672">=</span> zoom
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __repr__(self):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> (
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Location(uid=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>uid<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, title=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>title<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, &#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;address=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>address<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, lat=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>lat<span style="color:#e6db74">}</span><span style="color:#e6db74">, lng=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>lng<span style="color:#e6db74">}</span><span style="color:#e6db74">, zoom=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>zoom<span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Attachment</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __init__(self, uid, entry_uid, type, filename, position):
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>uid <span style="color:#f92672">=</span> uid
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>entry_uid <span style="color:#f92672">=</span> entry_uid
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>type <span style="color:#f92672">=</span> type
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>filename <span style="color:#f92672">=</span> filename
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>position <span style="color:#f92672">=</span> position
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __repr__(self):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> (
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Attachment(uid=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>uid<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, entry_uid=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>entry_uid<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, &#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;type=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>type<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, filename=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, position=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>position<span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">parse_locations_xml</span>(xml_file_path):
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Parses an XML file containing location data into a list of Location objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Args:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        xml_file_path (str): The path to the XML file.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Returns:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        list: A list of Location objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    tree <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>parse(xml_file_path)
</span></span><span style="display:flex;"><span>    root <span style="color:#f92672">=</span> tree<span style="color:#f92672">.</span>getroot()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    locations <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> r_element <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;r&#34;</span>):
</span></span><span style="display:flex;"><span>        uid <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        title <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;title&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;title&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>        address <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;address&#34;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;address&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        lat_text <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lat&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lat&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0.0&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>        lng_text <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lng&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lng&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0.0&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>        zoom_text <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;zoom&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;zoom&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            lat <span style="color:#f92672">=</span> float(lat_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            lat <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            lng <span style="color:#f92672">=</span> float(lng_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            lng <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            zoom <span style="color:#f92672">=</span> int(zoom_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            zoom <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        location <span style="color:#f92672">=</span> Location(uid, title, address, lat, lng, zoom)
</span></span><span style="display:flex;"><span>        locations<span style="color:#f92672">.</span>append(location)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> locations
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">parse_attachments_xml</span>(xml_file_path):
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Parses an XML file containing attachment data into a list of Attachment objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Args:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        xml_file_path (str): The path to the XML file.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Returns:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        list: A list of Attachment objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    tree <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>parse(xml_file_path)
</span></span><span style="display:flex;"><span>    root <span style="color:#f92672">=</span> tree<span style="color:#f92672">.</span>getroot()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    attachments <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> r_element <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;r&#34;</span>):
</span></span><span style="display:flex;"><span>        uid <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        entry_uid <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;entry_uid&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;entry_uid&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        type <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;type&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;type&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        filename <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;filename&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;filename&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        position_text <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;position&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;position&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            position <span style="color:#f92672">=</span> int(position_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            position <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        attachment <span style="color:#f92672">=</span> Attachment(uid, entry_uid, type, filename, position)
</span></span><span style="display:flex;"><span>        attachments<span style="color:#f92672">.</span>append(attachment)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> attachments
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">write_files</span>():
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Parses the Diaro XML data from a string, creates markdown files,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    and zips them up.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    data <span style="color:#f92672">=</span> open(<span style="color:#e6db74">&#39;DiaroBackup.xml&#39;</span>)<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>    root <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>fromstring(data)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    folders <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>        folder<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;uid&#39;</span>)<span style="color:#f92672">.</span>text: folder<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;title&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> folder <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;.//table[@name=&#39;diaro_folders&#39;]/r&#34;</span>)
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># locations = {</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     location.find(&#39;uid&#39;).text: location.find(&#39;name&#39;).text</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     for location in root.findall(&#34;.//table[@name=&#39;diaro_locations&#39;]/r&#34;)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># }</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># moods = {</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     mood.find(&#39;uid&#39;).text: mood.find(&#39;name&#39;).text</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     for mood in root.findall(&#34;.//table[@name=&#39;diaro_moods&#39;]/r&#34;)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># }</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    entries <span style="color:#f92672">=</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;.//table[@name=&#39;diaro_entries&#39;]/r&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    output_dir <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;diaro_markdown_entries&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>exists(output_dir):
</span></span><span style="display:flex;"><span>        os<span style="color:#f92672">.</span>makedirs(output_dir)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    markdown_files <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    xml_path <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;./locations.xml&#34;</span>
</span></span><span style="display:flex;"><span>    parsed_locations <span style="color:#f92672">=</span> parse_locations_xml(xml_path)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    xml_path_attach <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;./attachments.xml&#34;</span>
</span></span><span style="display:flex;"><span>    parsed_attach <span style="color:#f92672">=</span> parse_attachments_xml(xml_path_attach)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> entry <span style="color:#f92672">in</span> entries:
</span></span><span style="display:flex;"><span>        date_ms <span style="color:#f92672">=</span> int(entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;date&#39;</span>)<span style="color:#f92672">.</span>text)
</span></span><span style="display:flex;"><span>        dt_object <span style="color:#f92672">=</span> datetime<span style="color:#f92672">.</span>fromtimestamp(date_ms <span style="color:#f92672">/</span> <span style="color:#ae81ff">1000</span>)
</span></span><span style="display:flex;"><span>        date_str <span style="color:#f92672">=</span> dt_object<span style="color:#f92672">.</span>strftime(<span style="color:#e6db74">&#34;%Y-%m-</span><span style="color:#e6db74">%d</span><span style="color:#e6db74"> %H:%M:%S %z&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        text_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;text&#39;</span>)
</span></span><span style="display:flex;"><span>        text <span style="color:#f92672">=</span> text_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> text_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> text_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;No content&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        title_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;title&#39;</span>)
</span></span><span style="display:flex;"><span>        title <span style="color:#f92672">=</span> title_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> title_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> title_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;Untitled&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> title <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;Untitled&#34;</span>:
</span></span><span style="display:flex;"><span>            title <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>sub(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#34;[^\w]&#34;</span>, <span style="color:#e6db74">&#34; &#34;</span>, text<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#39;.&#39;</span>)[<span style="color:#ae81ff">0</span>][:<span style="color:#ae81ff">30</span>])
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Use the first X characters of text if title is &#34;Untitled&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        mood_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;mood&#39;</span>)
</span></span><span style="display:flex;"><span>        mood <span style="color:#f92672">=</span> title_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> mood_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> mood_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;3&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;1&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;5-🥰&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;2&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;4-🙂&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;3&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;3-😑&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;4&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;2-🙁&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;5&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;1-😢&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        media_path <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;../media/&#34;</span>
</span></span><span style="display:flex;"><span>        attachments <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> parsed_attach:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> i<span style="color:#f92672">.</span>entry_uid <span style="color:#f92672">==</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;uid&#39;</span>)<span style="color:#f92672">.</span>text:
</span></span><span style="display:flex;"><span>                attachments <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">---------------------------------------------------------------&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> i<span style="color:#f92672">.</span>type <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;image&#34;</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">![</span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">elif</span> i<span style="color:#f92672">.</span>type <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;video&#34;</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">[Video: </span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">elif</span> i<span style="color:#f92672">.</span>type <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;audio&#34;</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">[Audio: </span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">![</span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Create a safe filename</span>
</span></span><span style="display:flex;"><span>        safe_title <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>sub(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#39;[^\w\s-]&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>, title)<span style="color:#f92672">.</span>strip()<span style="color:#f92672">.</span>lower()
</span></span><span style="display:flex;"><span>        safe_title <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>sub(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#39;[-\s]+&#39;</span>, <span style="color:#e6db74">&#39;-&#39;</span>, safe_title) <span style="color:#66d9ef">if</span> safe_title <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;entry&#34;</span>
</span></span><span style="display:flex;"><span>        filename <span style="color:#f92672">=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>dt_object<span style="color:#f92672">.</span>strftime(<span style="color:#e6db74">&#39;%Y-%m-</span><span style="color:#e6db74">%d</span><span style="color:#e6db74">&#39;</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">-</span><span style="color:#e6db74">{</span>safe_title<span style="color:#e6db74">}</span><span style="color:#e6db74">.md&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Front Matter</span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;---</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> title:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;title: </span><span style="color:#e6db74">{</span>title<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;title: Entry on </span><span style="color:#e6db74">{</span>dt_object<span style="color:#f92672">.</span>strftime(<span style="color:#e6db74">&#39;%Y-%m-</span><span style="color:#e6db74">%d</span><span style="color:#e6db74">&#39;</span>)<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;date: </span><span style="color:#e6db74">{</span>date_str<span style="color:#f92672">.</span>rstrip()<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        folder_uid <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;folder_uid&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> folder_uid <span style="color:#f92672">and</span> folder_uid <span style="color:#f92672">in</span> folders:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;folder: </span><span style="color:#e6db74">{</span>folders[folder_uid]<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># location_uid = entry.find(&#39;location_uid&#39;).text</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># if location_uid and location_uid in locations:</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">#     front_matter += f&#34;location: {locations[location_uid]}\n&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        location_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;location_uid&#39;</span>)
</span></span><span style="display:flex;"><span>        location <span style="color:#f92672">=</span> location_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> location_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> location_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;N/A&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> location <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#34;N/A&#34;</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Find the location in the parsed locations</span>
</span></span><span style="display:flex;"><span>            location_obj <span style="color:#f92672">=</span> next((loc <span style="color:#66d9ef">for</span> loc <span style="color:#f92672">in</span> parsed_locations <span style="color:#66d9ef">if</span> loc<span style="color:#f92672">.</span>uid <span style="color:#f92672">==</span> location), <span style="color:#66d9ef">None</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> location_obj:
</span></span><span style="display:flex;"><span>                location_obj <span style="color:#f92672">=</span> location_obj
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>                location_obj <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Unknown Location&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> location <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#34;N/A&#34;</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;location: </span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>lat<span style="color:#e6db74">}</span><span style="color:#e6db74">,</span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>lng<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;location_title: </span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>title<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;location_address: </span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>address<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;location: Unknown</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;mood: </span><span style="color:#e6db74">{</span>mood<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        tags_text <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;tags&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> tags_text <span style="color:#f92672">and</span> tags_text<span style="color:#f92672">.</span>strip(<span style="color:#e6db74">&#39;,&#39;</span>) :
</span></span><span style="display:flex;"><span>            tags <span style="color:#f92672">=</span> [tag<span style="color:#f92672">.</span>strip() <span style="color:#66d9ef">for</span> tag <span style="color:#f92672">in</span> tags_text<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#39;,&#39;</span>) <span style="color:#66d9ef">if</span> tag<span style="color:#f92672">.</span>strip()]
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;tags: </span><span style="color:#e6db74">{</span>tags<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># mood_uid = entry.find(&#39;mood&#39;).text</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># if mood_uid and mood_uid in moods:</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">#     front_matter += f&#34;mood: {moods[mood_uid]}\n&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        weather_temp <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;weather_temperature&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        weather_icon <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;weather_icon&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        weather_desc <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;weather_description&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> weather_temp:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;temp_c: </span><span style="color:#e6db74">{</span>weather_temp<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> weather_icon:
</span></span><span style="display:flex;"><span>            weather_data <span style="color:#f92672">=</span> weather_icon<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#34;-&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            time_of_day <span style="color:#f92672">=</span> weather_data[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> time_of_day <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;day&#34;</span>:
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;time_of_day: day</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">elif</span> time_of_day <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;night&#34;</span>:
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;time_of_day: night</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;time_of_day: unknown</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            weather_icon <span style="color:#f92672">=</span> weather_data[<span style="color:#ae81ff">1</span>:]
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> weather_icon:
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#39;alt&#39;</span> <span style="color:#f92672">in</span> weather_icon:
</span></span><span style="display:flex;"><span>                    weather_icon<span style="color:#f92672">.</span>remove(<span style="color:#e6db74">&#39;alt&#39;</span>)
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;weather: [</span><span style="color:#e6db74">{</span><span style="color:#e6db74">&#39;, &#39;</span><span style="color:#f92672">.</span>join(weather_icon)<span style="color:#e6db74">}</span><span style="color:#e6db74">]</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> weather_desc:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;forcast: </span><span style="color:#e6db74">{</span>weather_desc<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;-----BEGIN PGP MESSAGE-----&#34;</span> <span style="color:#f92672">in</span> text:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;encrypted: true</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;encrypted: false</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;---</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        converted_entry <span style="color:#f92672">=</span> front_matter <span style="color:#f92672">+</span> text <span style="color:#f92672">+</span> attachments <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Write markdown file</span>
</span></span><span style="display:flex;"><span>        filepath <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>join(output_dir, filename)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">with</span> open(filepath, <span style="color:#e6db74">&#39;w&#39;</span>, encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;utf-8&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>            f<span style="color:#f92672">.</span>write(converted_entry)
</span></span><span style="display:flex;"><span>        markdown_files<span style="color:#f92672">.</span>append(filepath)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>:
</span></span><span style="display:flex;"><span>    write_files()
</span></span></code></pre></div><h2 id="ai-version">AI version</h2>
<p>I ran this through Gemini to see if it would emulate my style&hellip; eh&hellip;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>I recently made the switch from [<span style="color:#f92672">Diaro</span>](<span style="color:#a6e22e">https://diaroapp.com</span>) to [<span style="color:#f92672">Obsidian</span>](<span style="color:#a6e22e">https://obsidian.md/</span>) for my personal diary. While I had a great experience with Diaro - their lifetime subscription was a steal at around $20, and their Dropbox sync never lost a single entry over three or four years. Diaro&#39;s feature to automatically tag location, time, and date from uploaded photos was incredibly convenient, and I&#39;m hoping to find a similar workflow in Obsidian.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Extracting the Data
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>Getting my data out of Diaro proved to be the trickiest part. Diaro offered various export options (CSV, text, PDF), but these varied by platform (mobile vs. web) and none provided an easy way to export photos alongside the entries. Ripping images from PDFs was an absolute nightmare.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Fortunately, I dug into the Dropbox backend Diaro used for syncing. There, I discovered XML files containing all my entries and, more importantly, all my photos as JPEGs. The XML structure was relatively sane, with attachments, locations, and the diary entries themselves all contained within one large document, which made parsing manageable.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Custom Scripting for Conversion
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>To get everything into a standardized Markdown format with YAML front matter and embedded images, I cooked up some Python magic. This conversion process took me a solid two to three days over a weekend. While not &#34;crazy&#34; in terms of effort, I do wish Diaro offered more robust export options – perhaps JSON or CSVs with easily linked attachments, or even a dedicated photo dump.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>That said, for a $20 lifetime license and the peace of mind that came with never losing a single post (kudos to Dropbox for the reliable backend!), I can&#39;t really complain too much. The Diaro app itself was consistently reliable across all my devices, and the website was solid.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>I&#39;ll include a link to the Python script, or perhaps embed it directly in this post, just in case it can help someone else migrate their notes from Diaro to Obsidian or another Markdown-based diary application down the road.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Thanks for reading!
</span></span><span style="display:flex;"><span>--- over From this service to either obsidian Or another Mark down based Diary application. Thanks!
</span></span></code></pre></div>
        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:diary-migrate">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/diary-migrate/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/diary/">#diary</a>

<a href="https://jelloeater.me/tags/obsidian/">#obsidian</a>

<a href="https://jelloeater.me/tags/personal/">#personal</a>

<a href="https://jelloeater.me/tags/private/">#private</a>

<a href="https://jelloeater.me/tags/update/">#update</a>

        ]]>
        </content:encoded>
    </item>
  </channel>
</rss>
