<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>K&#039;s Lair &#187; Photography</title>
	<atom:link href="http://andreas.goelzer.de/category/photography/feed" rel="self" type="application/rss+xml" />
	<link>http://andreas.goelzer.de</link>
	<description>Electronics and small programs and other stuff</description>
	<lastBuildDate>Thu, 02 Sep 2010 12:30:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Feeding a screensaver from the digikam database</title>
		<link>http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database</link>
		<comments>http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database#comments</comments>
		<pubDate>Mon, 02 Jun 2008 20:17:09 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[digikam]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screensaver]]></category>

		<guid isPermaLink="false">http://andreas.goelzer.de/?p=12</guid>
		<description><![CDATA[After several months of living without any screensaver, I decided it just would be nice to once again have something nice to watch and show while idling. I really like the photo slideshow that ships with windows vista, but as &#8230; <a href="http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>After several months of living without any screensaver, I decided it just would be nice to once again have something nice to watch and show while idling. I really like the photo slideshow that ships with windows vista, but as my laptop runs linux only that was not possible. The next best thing i found was glslideshow from the <a href="http://www.jwz.org/xscreensaver/">xscreensaver compilation</a>. Like most slideshow programs, glslideshow will look into a given directory, and show files out of it in random order. However, there are downsides to that simple approach: My photo folder contains some private pictures, and also some pictures that are just ugly. So i decided to connect it to my <a href="http://www.digicam.org">digikam</a> database, which was surprisingly simple.</p>
<p>By default, xscreensaver takes the directory out of its configfile ~/.xscreensaver, and passes it to a helper script xscreensaver-getimage-file, which then prints the complete path to a random file in that directory. So all one needs to do to add another source for pictures is to replace that file, there is already <a href="http://jrwren.wrenfam.com/blog/2005/02/20/flickr-xscreensaver-fun/">xscreensaver-getimage-flickr<br />
</a>, which pulls photos off flickr. So I wrote a similar script in python to print a random file from my digikam database. Maybe there are more?</p>
<h4>Installation</h4>
<p>The script is written in python, so that has to be installed (which is usually the case), it also requires sqlite and python bindings for it (apt-get install python-pysqlite2 in debian and ubuntu). If those are installed, backup the original xscreensaver-getimage-file, and copy the script there. Check that it is executable.<br />
the overall process would look like(assuming xscreensaver-glslideshow already works)</p>
<pre>
sudo apt-get install python-pysqlite2
cd ~
wget http://andreas.goelzer.de/download/xscreensaver-getimage-digikam.py
chmod +x xscreensaver-getimage-digikam.py
cd /usr/bin
sudo mv xscreensaver-getimage-file xscreensaver-getimage-file-original
sudo mv ~/xscreensaver-getimage-digikam.py /usr/bin/
ln -s xscreensaver-getimage-digikam.py xscreensaver-getimage-file
</pre>
<p>If you had previously pointed xscreensaver to your digikam photo folder, that should work now. If not, edit ~/.xscreensaver and add a line pointing to that directory, in my case:</p>
<pre>
imageDirectory: /home/goelzera/Documents/Bilder
</pre>
</p>
<h4>Modification</h4>
<p>Right now this is all a bit hacky. at the beginning of the file, there is a line</p>
<pre>bad_tags = "('private','me','Nophoto','Notmeanttobenice')"</pre>
<p>If called, the script will take a random picture out of the database, then check if it has one of those tags. If it is tagged with one of those, it will be dismissed, similarly, if it has an extension indicating xscreensaver won&#8217;t be able to display it. So, set those line to the tags you do not want in your slideshow. For everything else you need to change the sql queries or the source code.</p>
<h4>Running</h4>
<p>Set your screensaver to glslideshow and wait for it to start</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
<span style="color: #483d8b;">&quot;&quot;&quot;
Script to choose random pictures from the digikam database
Copyright (C) 2008  Andreas Goelzer
&nbsp;
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
&nbsp;
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
&nbsp;
You should have received a copy of the GNU General Public License
along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
&nbsp;
&nbsp;
This program takes one random picture out of a sqlite-database
made by digikam.
This is useful for screensavers, xscreensaver-glslideshow in particular.
&quot;&quot;&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#import sys;</span>
<span style="color: #808080; font-style: italic;">#ef=open('/home/goelzera/Documents/Programme/python/xscreensaver-errlog','a')</span>
<span style="color: #808080; font-style: italic;">#sys.stderr = ef</span>
&nbsp;
good_extensions = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'jpg'</span>, <span style="color: #483d8b;">'jpeg'</span>, <span style="color: #483d8b;">'pjpeg'</span>, <span style="color: #483d8b;">'pjpg'</span>, <span style="color: #483d8b;">'png'</span>, <span style="color: #483d8b;">'gif'</span>, <span style="color: #483d8b;">'tif'</span>, <span style="color: #483d8b;">'tiff'</span>, <span style="color: #483d8b;">'xbm'</span>, <span style="color: #483d8b;">'xpm'</span><span style="color: black;">&#41;</span>
bad_tags = <span style="color: #483d8b;">&quot;('private','me','Nophoto','Notmeanttobenice')&quot;</span>
<span style="color: #808080; font-style: italic;">#good_tags = &quot;('public')&quot;</span>
good_tags = <span style="color: #483d8b;">&quot;&quot;</span>
attempts = <span style="color: #ff4500;">200</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3<span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">sys</span> <span style="color: #ff7700;font-weight:bold;">import</span> argv, exit<span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span> <span style="color: #ff7700;font-weight:bold;">import</span> splitext<span style="color: #66cc66;">;</span>
&nbsp;
digikamversion = <span style="color: #483d8b;">&quot;4&quot;</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>argv<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
	dirname = argv<span style="color: black;">&#91;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>argv<span style="color: black;">&#41;</span> - <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
	dirname = <span style="color: #483d8b;">&quot;/home/goelzera/Documents/Pictures&quot;</span>
&nbsp;
con = sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span>dirname + <span style="color: #483d8b;">&quot;/digikam&quot;</span> + digikamversion + <span style="color: #483d8b;">&quot;.db&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>digikamversion == <span style="color: #483d8b;">&quot;4&quot;</span><span style="color: black;">&#41;</span>:
	url = <span style="color: #483d8b;">&quot;relativePath&quot;</span>
	dirid = <span style="color: #483d8b;">&quot;album&quot;</span>
<span style="color: #ff7700;font-weight:bold;">else</span>:
	url = <span style="color: #483d8b;">&quot;url&quot;</span>
	dirid = <span style="color: #483d8b;">&quot;dirid&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#from time import time</span>
<span style="color: #808080; font-style: italic;">#f=open('/home/goelzera/Documents/Programme/python/xscreensaver-log','a')</span>
<span style="color: #808080; font-style: italic;">#f.write(str(time()) + '\t' + str(argv) + '\t')</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#get tagids for bad tags</span>
<span style="color: #ff7700;font-weight:bold;">def</span> getTagIdsFromNames<span style="color: black;">&#40;</span>names<span style="color: black;">&#41;</span>:
	tag_ids = <span style="color: #483d8b;">' '</span><span style="color: #66cc66;">;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT id FROM Tags WHERE name IN &quot;</span>+ names<span style="color: black;">&#41;</span>:
		tag_ids += <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">','</span>
	tag_ids = <span style="color: #483d8b;">'('</span> + tag_ids<span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">')'</span>
	<span style="color: #ff7700;font-weight:bold;">return</span> tag_ids
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>bad_tags <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>: bad_tag_ids = getTagIdsFromNames<span style="color: black;">&#40;</span>bad_tags<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>good_tags <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>: good_tag_ids = getTagIdsFromNames<span style="color: black;">&#40;</span>good_tags<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #008000;">file</span> = <span style="color: #483d8b;">'none'</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#search for images, take a random one out of the db and see if it fulfills the criteria</span>
<span style="color: #ff7700;font-weight:bold;">for</span> attempt <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>attempts<span style="color: black;">&#41;</span>:
	<span style="color: #808080; font-style: italic;">#get a random picture, i guess this is the wrong way, performs horrible</span>
	<span style="color: #808080; font-style: italic;">#truely random, but painfully slow</span>
	<span style="color: #808080; font-style: italic;">#row = con.execute(&quot;SELECT id, name, $dirid FROM Images ORDER BY RANDOM() LIMIT 0,1&quot;).fetchone()</span>
	<span style="color: #808080; font-style: italic;">#fast, but not as random</span>
	row = con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT id, name, &quot;</span>+ dirid+<span style="color: #483d8b;">&quot; FROM Images WHERE id &gt;= (abs(RANDOM()) % (SELECT max(id) FROM Images)) LIMIT 0,1&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #808080; font-style: italic;">#f.write(str(row[0]) + ',')</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">#check for bad tag</span>
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>bad_tags <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT 1 FROM ImageTags WHERE imageid = &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; AND tagid IN &quot;</span>+ bad_tag_ids<span style="color: black;">&#41;</span>.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>: <span style="color: #ff7700;font-weight:bold;">continue</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">#check for good tag</span>
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>good_tags <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">not</span> con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT 1 FROM ImageTags WHERE imageid = &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; AND tagid IN &quot;</span>+ good_tag_ids<span style="color: black;">&#41;</span>.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>: <span style="color: #ff7700;font-weight:bold;">continue</span>
&nbsp;
&nbsp;
	<span style="color: #808080; font-style: italic;">#check for invalid extension</span>
	ext = splitext<span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
	ext = ext<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span>.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">not</span> ext <span style="color: #ff7700;font-weight:bold;">in</span> good_extensions<span style="color: black;">&#41;</span>: <span style="color: #ff7700;font-weight:bold;">continue</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">#not rejected, get directory</span>
	drow = con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT &quot;</span>+url+<span style="color: #483d8b;">&quot; FROM Albums WHERE id = &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #008000;">file</span> = dirname + drow<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">'/'</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #008000;">file</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf-8'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#f.write(file.encode('latin-1') + '\n')</span></pre></td></tr></table></div>

<hr /><a href='http://andreas.goelzer.de/download/xscreensaver-getimage-digikam.py'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-source-alt.png" width="16" height="16" alt="filetype" class="icon16" /> xscreensaver-getimage-digikam.py</a> (3.29 kiB, 2009-08-06)<br/><br />
<hr />
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/feeding-a-screensaver-from-the-digikam-database/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Synchronizing Digikam and NGG</title>
		<link>http://andreas.goelzer.de/synchronizing-digikam-and-ngg</link>
		<comments>http://andreas.goelzer.de/synchronizing-digikam-and-ngg#comments</comments>
		<pubDate>Thu, 06 Mar 2008 01:53:07 +0000</pubDate>
		<dc:creator>Andreas Goelzer</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[digikam]]></category>
		<category><![CDATA[ngg]]></category>

		<guid isPermaLink="false">http://www.goelzer.de/andreas/wordpress/index.php/synchronizing-digikam-and-ngg/.</guid>
		<description><![CDATA[This little script automatically generates the gallery on this site from the local digikam(kde 3) database. To accomplish that task, it looks for files tagged public, and uploads them if they aren&#8217;t already uploaded. It completely rewrites the ngg database, &#8230; <a href="http://andreas.goelzer.de/synchronizing-digikam-and-ngg">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>This little script automatically generates the gallery on this site from the local <a href="http://www.digikam.org/">digikam</a>(kde 3) database. To accomplish that task, it looks for files tagged public, and uploads them if they aren&#8217;t already uploaded. It completely rewrites the <a href="http://alexrabe.boelinger.com/category/nextgengallery/">ngg</a> database, so don&#8217;t use this if yo have put effort into creating a database with the ngg frontend.<br />
Pictures are resized locally using imagemagick, so it avoids problems with low memory on some shared servers.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #483d8b;">&quot;&quot;&quot;
Script to export Photos from Digikam to NGG
Copyright (C) 2008  Andreas Goelzer
&nbsp;
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
&nbsp;
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
&nbsp;
You should have received a copy of the GNU General Public License
along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.
&nbsp;
&nbsp;
This program exports pictures from your 
DigiKam (http://www.digikam.org/) database to a
NGG (http://alexrabe.boelinger.com/category/nextgengallery/) database.
It is at the moment highly experimental and in a works-for-me-right-now
state.
Be really really careful if trying to use it, it will
- determine which photos are tagged &quot;public&quot;
- upload them to a dir, kill everything in the target dir not tagged public
- rewrite the remote database
- automatically create thumbnails along the way
I don't know much about databases, so this code is quite inefficient. It
doesn't pose a big problem for my ~5k local, 100 remote photos, though
&nbsp;
Once again, it *will* erase the remote directory, and possibly more. 
NO WARRANTY!
see http://andreas.goelzer.de/synchronizing-digikam-and-ngg for updates.
&quot;&quot;&quot;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> sqlite3<span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span><span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span><span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Calculating new remote DB&quot;</span>
&nbsp;
con = sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;digikam3.db&quot;</span><span style="color: black;">&#41;</span>
target = <span style="color: #483d8b;">&quot;www.domain.de@ssh.strato.de&quot;</span>
targetdir = <span style="color: #483d8b;">&quot;subdir&quot;</span>	
openmysql = <span style="color: #483d8b;">&quot;mysql -h rdbms -u username --password=pw database&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> mymask<span style="color: black;">&#40;</span>obj<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>obj<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span><span style="color: #008000;">str</span>, <span style="color: #008000;">unicode</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\'</span>&quot;</span> + obj.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'&quot;'</span>, <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>&quot;'</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;'&quot;</span>, <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>,<span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>n&quot;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\'</span>&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">else</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>obj<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">def</span> myrepr<span style="color: black;">&#40;</span>obj<span style="color: black;">&#41;</span>:
	<span style="color: #008000;">str</span>=<span style="color: #483d8b;">&quot;&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">type</span><span style="color: black;">&#40;</span>obj<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: black;">&#40;</span><span style="color: #008000;">tuple</span>, <span style="color: #008000;">list</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">for</span> elem <span style="color: #ff7700;font-weight:bold;">in</span> obj:
			<span style="color: #008000;">str</span> += mymask<span style="color: black;">&#40;</span>elem<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;,&quot;</span><span style="color: #66cc66;">;</span>
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;(&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;)&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">else</span>:
		<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">repr</span><span style="color: black;">&#40;</span>obj<span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> joinselect<span style="color: black;">&#40;</span>con, query<span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">&quot;,&quot;</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #008000;">list</span><span style="color: black;">&#40;</span>myrepr<span style="color: black;">&#40;</span>row<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>query<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> remoteexec<span style="color: black;">&#40;</span><span style="color: #dc143c;">cmd</span><span style="color: black;">&#41;</span>:
	<span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ssh &quot;</span> + target + <span style="color: #483d8b;">&quot; <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + <span style="color: #dc143c;">cmd</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> copyremote<span style="color: black;">&#40;</span><span style="color: #008000;">file</span>,tsubdir<span style="color: black;">&#41;</span>:
	<span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;scp -p &quot;</span> + <span style="color: #008000;">file</span> + <span style="color: #483d8b;">&quot; &quot;</span> + target + <span style="color: #483d8b;">&quot;:&quot;</span> + <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>targetdir + tsubdir<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
dbprefix = <span style="color: #483d8b;">&quot;wp_ngg_&quot;</span>
chooseidsstring = <span style="color: #483d8b;">&quot;(SELECT DISTINCT imageid FROM imagetags WHERE tagid = (SELECT id FROM tags WHERE name = <span style="color: #000099; font-weight: bold;">\&quot;</span>public<span style="color: #000099; font-weight: bold;">\&quot;</span>))&quot;</span>
sqlcommands  = <span style="color: #483d8b;">&quot;DELETE FROM &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;pic2tags;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">;</span>
sqlcommands += <span style="color: #483d8b;">&quot;DELETE FROM &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;tags;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">;</span>
sqlcommands += <span style="color: #483d8b;">&quot;DELETE FROM &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;pictures;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">;</span>
sqlcommands += <span style="color: #483d8b;">&quot;DELETE FROM &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;gallery;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">;</span>
sqlcommands += <span style="color: #483d8b;">&quot;DELETE FROM &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;album;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">;</span>
&nbsp;
&nbsp;
&nbsp;
&nbsp;
sqlcommands += <span style="color: #483d8b;">&quot;INSERT INTO &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;pic2tags(picid,tagid) VALUES &quot;</span> + joinselect<span style="color: black;">&#40;</span>con, <span style="color: #483d8b;">&quot;SELECT  imageid, tagid FROM imagetags  WHERE imageid IN  &quot;</span> + chooseidsstring<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
&nbsp;
sqlcommands += <span style="color: #483d8b;">&quot;INSERT INTO &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;tags(id, name, slug) VALUES &quot;</span> + joinselect<span style="color: black;">&#40;</span>con, <span style="color: #483d8b;">&quot;SELECT  id,name,name FROM tags WHERE id IN (SELECT DISTINCT tagid FROM imagetags   WHERE imageid IN    &quot;</span> + chooseidsstring + <span style="color: #483d8b;">&quot;)&quot;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
&nbsp;
sqlcommands += <span style="color: #483d8b;">&quot;INSERT INTO &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;pictures(pid, galleryid, filename, description) VALUES &quot;</span> + joinselect<span style="color: black;">&#40;</span>con, <span style="color: #483d8b;">&quot;SELECT  id,dirid,name,caption FROM images   WHERE id IN &quot;</span>  + chooseidsstring <span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
&nbsp;
&nbsp;
sqlcommands += <span style="color: #483d8b;">&quot;INSERT INTO &quot;</span> + dbprefix + <span style="color: #483d8b;">&quot;gallery(gid, name, path, title,previewpic) VALUES &quot;</span>
&nbsp;
&nbsp;
allalbums=<span style="color: #483d8b;">&quot;&quot;</span><span style="color: #66cc66;">;</span>
j=<span style="color: #ff4500;">0</span><span style="color: #66cc66;">;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT id,url,icon FROM albums WHERE id IN (SELECT DISTINCT dirid FROM images WHERE id IN &quot;</span> + chooseidsstring + <span style="color: #483d8b;">&quot;) ORDER BY url&quot;</span><span style="color: black;">&#41;</span>:
	allalbums += <span style="color: #483d8b;">&quot;i:&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>j<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;;i:&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;;&quot;</span>
	j += <span style="color: #ff4500;">1</span>
	<span style="color: #808080; font-style: italic;">#if(row[2] == None): icon = &quot;NULL&quot;</span>
	<span style="color: #808080; font-style: italic;">#check whether icon is public</span>
	icon = <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#93;</span> == <span style="color: #008000;">None</span> <span style="color: #ff7700;font-weight:bold;">or</span> con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span>chooseidsstring<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot; AND imageid = &quot;</span> + icon<span style="color: black;">&#41;</span>.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
		nrow = con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT id FROM images WHERE id IN &quot;</span> + chooseidsstring + <span style="color: #483d8b;">&quot; AND dirid = &quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">fetchone</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
		icon=<span style="color: #008000;">str</span><span style="color: black;">&#40;</span>nrow<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
	sqlcommands += <span style="color: #483d8b;">&quot;(&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;, <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">basename</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> , <span style="color: #000099; font-weight: bold;">\&quot;</span>photos&quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>, <span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span>+ <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">basename</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;_&quot;</span>,<span style="color: #483d8b;">&quot; &quot;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>,&quot;</span> + icon + <span style="color: #483d8b;">&quot;),&quot;</span>	
&nbsp;
sqlcommands = sqlcommands<span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
allalbums = <span style="color: #483d8b;">&quot;a:&quot;</span> + <span style="color: #008000;">str</span><span style="color: black;">&#40;</span>j<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;:{&quot;</span> + allalbums + <span style="color: #483d8b;">&quot;}&quot;</span>
&nbsp;
sqlcommands += <span style="color: #483d8b;">&quot;INSERT INTO &quot;</span>+ dbprefix + <span style="color: #483d8b;">&quot;album(id, name, sortorder) VALUES (1, 'Main Gallery', '&quot;</span> + allalbums + <span style="color: #483d8b;">&quot;');<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#print s</span>
f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'remotedb.sql'</span>,<span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
f.<span style="color: black;">write</span><span style="color: black;">&#40;</span>sqlcommands.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'latin-1'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
copyremote<span style="color: black;">&#40;</span><span style="color: #483d8b;">'remotedb.sql'</span>,<span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>
remoteexec<span style="color: black;">&#40;</span>openmysql + <span style="color: #483d8b;">'&lt;'</span> + targetdir + <span style="color: #483d8b;">'/'</span> + <span style="color: #483d8b;">'remotedb.sql'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#exit()</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;creating remote directories&quot;</span>
<span style="color: #808080; font-style: italic;">#remotely create dirs</span>
con2 = sqlite3.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;:memory:&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CREATE TABLE remotedirs (file varchar(255), PRIMARY KEY (file))&quot;</span><span style="color: black;">&#41;</span>
a = <span style="color: #dc143c;">os</span>.<span style="color: black;">popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ssh &quot;</span> + target + <span style="color: #483d8b;">&quot; find &quot;</span> + <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>targetdir<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; -type d&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> elem <span style="color: #ff7700;font-weight:bold;">in</span> a:
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>elem <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>: con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;INSERT INTO remotedirs VALUES (<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + elem<span style="color: black;">&#91;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>targetdir<span style="color: black;">&#41;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>)&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CREATE TABLE localdirs (file varchar(255))&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span>  con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT DISTINCT albums.url from images INNER JOIN albums ON images.dirid = albums.id WHERE images.id IN &quot;</span> + chooseidsstring<span style="color: black;">&#41;</span>:
	dirs=row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;/&quot;</span><span style="color: black;">&#41;</span>
	dire=<span style="color: #483d8b;">&quot;&quot;</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> dirss <span style="color: #ff7700;font-weight:bold;">in</span> dirs<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span>:
		dire += <span style="color: #483d8b;">&quot;/&quot;</span> + dirss
		con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;INSERT INTO localdirs VALUES (<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + dire + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>)&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
	con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;INSERT INTO localdirs VALUES (<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>+<span style="color: #483d8b;">&quot;/thumbs<span style="color: #000099; font-weight: bold;">\&quot;</span>)&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
<span style="color: #808080; font-style: italic;">#delete dirs</span>
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT file FROM remotedirs WHERE file NOT IN (SELECT DISTINCT file FROM localdirs) ORDER BY length(file) DESC&quot;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;deleting &quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">;</span> 
	remoteexec<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;rmdir &quot;</span> + <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>targetdir + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">#create dirs</span>
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT file FROM localdirs WHERE file NOT IN (SELECT file FROM remotedirs)&quot;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;creating &quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">;</span> 
	remoteexec<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;mkdir &quot;</span> + <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>targetdir + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
&nbsp;
&nbsp;
<span style="color: #808080; font-style: italic;">#handle files</span>
a = <span style="color: #dc143c;">os</span>.<span style="color: black;">popen</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;ssh &quot;</span> + target + <span style="color: #483d8b;">&quot; find &quot;</span> + <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>targetdir<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot; -type f&quot;</span><span style="color: black;">&#41;</span>.<span style="color: black;">readlines</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CREATE TABLE remote (file varchar(255), PRIMARY KEY (file))&quot;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> elem <span style="color: #ff7700;font-weight:bold;">in</span> a:
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>elem <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>: con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;INSERT INTO remote VALUES (<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + elem<span style="color: black;">&#91;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>targetdir<span style="color: black;">&#41;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>)&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;CREATE TABLE local (file varchar(255), isthumb bool , PRIMARY KEY (file))&quot;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span>  con.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT albums.url, images.name from images INNER JOIN albums ON images.dirid = albums.id WHERE images.id IN &quot;</span> + chooseidsstring<span style="color: black;">&#41;</span>:
	con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;INSERT INTO local VALUES (<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>+<span style="color: #483d8b;">&quot;/&quot;</span>+row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>, 0)&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
	con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;INSERT INTO local VALUES (<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>+<span style="color: #483d8b;">&quot;/thumbs/thumbs_&quot;</span>+row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>, 1)&quot;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Deleting leftover files&quot;</span>
<span style="color: #808080; font-style: italic;">#delete files no longer in the db</span>
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT file FROM remote WHERE file NOT IN (SELECT file FROM local)&quot;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;deleting &quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">;</span> 
	remoteexec<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;rm &quot;</span> +  <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>targetdir + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Uploading files&quot;</span>
<span style="color: #808080; font-style: italic;">#upload files</span>
<span style="color: #ff7700;font-weight:bold;">for</span> row <span style="color: #ff7700;font-weight:bold;">in</span> con2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;SELECT file,isthumb FROM local WHERE file NOT IN (SELECT file FROM remote)&quot;</span><span style="color: black;">&#41;</span>:
	<span style="color: #ff7700;font-weight:bold;">if</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>:
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;creating and uploading thumbnail: &quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">;</span> 
		<span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;convert <span style="color: #000099; font-weight: bold;">\&quot;</span>.&quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>.<span style="color: black;">replace</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;thumbs/thumbs_&quot;</span>,<span style="color: #483d8b;">&quot;&quot;</span><span style="color: black;">&#41;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> -thumbnail 100x75 thumb.jpg&quot;</span><span style="color: black;">&#41;</span>
		copyremote<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;thumb.jpg&quot;</span>, <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">else</span>:
		<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;resizing and uploading image:     &quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: #66cc66;">;</span> 
		<span style="color: #dc143c;">os</span>.<span style="color: black;">system</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;convert <span style="color: #000099; font-weight: bold;">\&quot;</span>.&quot;</span> + row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> + <span style="color: #483d8b;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span> -resize <span style="color: #000099; font-weight: bold;">\&quot;</span>1024x768&gt;<span style="color: #000099; font-weight: bold;">\&quot;</span> small.jpg&quot;</span><span style="color: black;">&#41;</span>
		copyremote<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;small.jpg&quot;</span>, <span style="color: #dc143c;">re</span>.<span style="color: black;">escape</span><span style="color: black;">&#40;</span>row<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<hr /><a href='http://andreas.goelzer.de/download/uploader.py'><img src="http://andreas.goelzer.de/wp-content/plugins/kfile/fileicons/file-source-alt.png" width="16" height="16" alt="filetype" class="icon16" /> uploader.py</a> (7.25 kiB, 2008-10-06)<br/><br />
<hr />
]]></content:encoded>
			<wfw:commentRss>http://andreas.goelzer.de/synchronizing-digikam-and-ngg/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)

Served from: andreas.goelzer.de @ 2010-09-06 09:07:28 -->