pimutils / vdirsyncer

📇 Synchronize calendars and contacts.
https://vdirsyncer.pimutils.org/
Other
1.58k stars 163 forks source link

Only last entry of read-only get synced #1018

Open oschmidteu opened 1 year ago

oschmidteu commented 1 year ago

vdirsyncer, version 0.18.0 Server: Docker/Synology/Vdirsyncer-DOCKERIZED

Config:

### General ###
[general]
status_path = "/vdirsyncer/status/"

### Pairs ###
[pair apple_synology_carddav]
a = "apple_carddav"
b = "synology_carddav"
collections = [["Kontakte", "card", "dd5efb90-e26e-4d45-b602-d466176f4e6a"]]
conflict_resolution = "a wins"
#metadata = ["color", "displayname"]

[pair apple_synology_caldav]
a = "apple_caldav"
b = "synology_caldav"
collections = [["Privat", "home", "home"], ["Geschaeftlich", "work", "dnnbz"], ["Family", "ea85ffdd-611a-4b20-9b4a-f95b12127f74", "dfjvncn"], ["Monatlich_wiederkehrend", "50D2E8C1-03C9-4FCD-83C1-D82A98F4A88B", "lxrldoh"], ["Winterdienst", "7129C58E-7C7E-44BC-8522-FB9A8FFF61B2", "flrld"],["Sport", "C1A5EF69-D077-4D9D-947E-1414153F5CDF", "bftnriv"], ["Urlaub", "7B992AC4-DF16-4F40-AF30-89EC00EA6146", "znpvjcf"]]
conflict_resolution = "a wins"
#metadata = ["color", "displayname"]

### Storages ###
[storage apple_carddav]
type = "carddav"
url = "https://contacts.icloud.com/"
username = "XXX XXX XXX"
password = "XXX XXX XXX"

[storage synology_carddav]
type = "carddav"
url = "https://kontakte.XXX XXX XXX/carddav/XXX XXX XXX/"
username = "XXX XXX XXX"
password = "XXX XXX XXX"

[storage apple_caldav]
type = "caldav"
url = "https://caldav.icloud.com"
username = "XXX XXX XXX"
password = "XXX XXX XXX"

[storage synology_caldav]
type = "caldav"
url = "https://kalender.XXX XXX XXX/caldav/XXX XXX XXX"
username = "XXX XXX XXX"
password = "XXX XXX XXX"

### TESTING ###
[pair intervals]
a = "intervals_icu"
b = "intervals_syno"
collections = null

[storage intervals_icu]
type = "http"
url = "https://intervals.icu/api/cal/i30567/f3946e3c0f4f0f8a.ics"

[storage intervals_syno]
type = "caldav"
url = "https://kalender.XXX XXX XXX/caldav/XXX XXX XXX/djvdvix/"
username = "XXX XXX XXX"
password = "XXX XXX XXX"

Sync Synology:

UID:7ab0e63b-68c1-4d68-b9de-9109400d8686\r\nDTSTART;VALUE=DATE:20230401\r\nDTEND;VALUE=DATE:20230402\r\nSUMMARY:VirtualBike: 45m Primers\r\nDESCRIPTION:Four Dimensional Power Focus:\\n- Neuromuscular Power (NM - 5 se\r\n cond): \xe2\x9c\xad\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\\n- Anaerobic Capacity (AC - 1 minute): \xe2\x9c\xad\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\\n- Maximal Aerob\r\n ic Power (MAP- 5 minute): \xe2\x9c\xad\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\\n- Functional Threshold Power (FTP - 20 mi\r\n nute): \xe2\x9c\xad\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\xe2\x9c\xa9\\nWhether you have power testing\\, a group ride you want to sm\r\n ash\\, that event you have been training all winter for\\, or even just a fu\r\n n route you want to have a great ride on\\, this is the perfect session to \r\n do the day before.\\nUnlike other Sufferfest videos\\, this one should not b\r\n e viewed as a stand alone \xe2\x80\x9ctraining\xe2\x80\x9d session\\, but rather the ace up your \r\n sleeve you get to pull out when that big ride comes around.\\nThe key to th\r\n is session is just enough time right around threshold\\, with sufficient re\r\n covery between efforts and a handful of sprints to prime all of your syste\r\n ms for tomorrow\'s event.\\n- 33s 131w 90rpm\\n- 7m2s 144w 90rpm\\n- 1m 222w 9\r\n 0rpm\\n- 1m 248w 95rpm\\n- 31s 107.5% 100rpm\\n- 29s 113.7% 100rpm\\n- 3m 131w \r\n 90rpm\\n- 3m 235w 90rpm\\n- 3m2s 131w 90rpm\\n- 2m59s 108.7% 90rpm\\n- 3m 131w \r\n 90rpm\\n- 3m1s 261w 90rpm\\n- 2m59s 131w 90rpm\\n- 11s 300w 100rpm\\n- 5m 131w \r\n 90rpm\\n- 10s 128.7% 100rpm\\n- 5m2s 131w 90rpm\\n- 10s 493w 100rpm\\n- 3m 131\r\n w 90rpm\\n\\n42 training load\r\nLAST-MODIFIED:20221220T131628Z\r\nCATEGORIES:WORKOUT\r\nCATEGORIES:VirtualRide\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nDTSTAMP:20221220T131641Z\r\n
UID:884815a6-9744-426f-8c0f-575da23efb4b\r\nDTSTART;VALUE=DATE:20230402\r\nDTEND;VALUE=DATE:20230403\r\nSUMMARY:VirtualBike: 56m Full Frontal (4DP Test)\r\nDESCRIPTION:Four Dimensional Power Focus:\\n- Neuromuscular Power (NM - 5 se\r\n cond): \xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\\n- Anaerobic Capacity (AC - 1 minute): \xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\\n- Maximal Aerob\r\n ic Power (MAP- 5 minute): \xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\\n- Functional Threshold Power (FTP - 20 mi\r\n nute): \xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\xe2\x9c\xad\\nFull Frontal: The Complete One.  We recommend Full Frontal f\r\n or experienced riders and those who are about to start\\, or who have just \r\n finished\\, a training plan.\\n\\nThis is our full 4DP fitness test and is th\r\n e only test that exposes every aspect of your unique physiology in a singl\r\n e hour.  Developed by Wahoo Fitness Head of Sports Science\\, Coach Neal He\r\n nderson\\, Full Frontal uses the same lab-verified testing protocol that Ne\r\n al has used at the highest level for over a decade with professional and a\r\n mateur athletes. This test will provide you with a complete personal power \r\n profile\\, identify your rider type\\, and tell you exactly what aspects of \r\n your fitness you need to focus on to become a more complete cyclist.  More \r\n importantly\\, The Sufferfest app will then use your results to set persona\r\n lised power targets for all of your workouts based on your unique profile\\\r\n , resulting in the most precise\\, effective workouts available.\\n\\n**Befor\r\n e starting your Full Frontal**\\nRead [this article](https://thesufferfest.\r\n com/blogs/training-resources/how-to-get-the-most-out-of-full-frontal) abou\r\n t how to get the most out of your test. Trust us\\, you\xe2\x80\x99ll be glad you did.\r\n \\n\\n**Smart trainer users**\\nUse level/slope mode.  Read [this article](ht\r\n tps://support.thesufferfest.com/hc/en-us/articles/360017608919) for more i\r\n nformation about level mode.\\n\\n**Turn off Auto-Pause**\\nOnce you have sta\r\n rted your workout\\, turn off auto-pause in the \'settings\' tab once you sta\r\n rt the workout.\\n\\n**For the most accurate results**\\nEnter your WEIGHT\\, \r\n GENDER\\, and DATE OF BIRTH in Settings > Personal Information\\n\\nOnce you \r\n come out the other side of Full Frontal you\'ll get your profile and rider \r\n type. From then on\\, every Sufferfest Video will be customized to your abi\r\n lities to ensure no session is too hard or too easy.  Not only do you get \r\n customized workouts with Full Frontal\\, you will also get to see the exact \r\n areas where you shine.  You will also get insight into the areas where you \r\n might need to do some work\\, giving you the road map of where you should g\r\n uide your training until your next exposure to Full Frontal.\\n\\n* Note: Yo\r\n u must have a power device connected in order to get results from Full Fro\r\n ntal. If you\'re not sure you do\\, [contact us here](https://support.thesuf\r\n ferfest.com/hc/en-us/requests/new) and we\'ll help you out.\\n- 2m38s 131w 8\r\n 0rpm\\n- 2m 144w 85rpm\\n- 1m 157w 90rpm\\n- 1m 209w 90rpm\\n- 1m 131w 80rpm\\n\r\n - 31s 248w 65rpm\\n- 30s 131w 90rpm\\n- 30s 287w 100rpm\\n- 1m 131w 90rpm\\n- \r\n 30s 261w 95rpm\\n- 1m30s 131w 90rpm\\n- 30s 144w 95rpm\\n- 30s 157w 95rpm\\n- \r\n 7s 1235w\\n- 1m58s 104w 85rpm\\n- 58s 131w 90rpm\\n- 1m4s 144w 95rpm\\n- 7s 12\r\n 35w\\n- 1m1s 104w 85rpm\\n- 1m59s 104w 85rpm\\n- 5m 326w\\n- 2m1s 78w 80rpm\\n- \r\n 30s 104w 80rpm\\n- 1m28s 104w 80rpm\\n- 20m 261w\\n- 1m30s 78w 80rpm\\n- 3m1s \r\n 104w 90rpm\\n- 31s 226.8%\\n- 29s 151.2%\\n- 2m1s 104w 80rpm\\n\\n88 training l\r\n oad\r\nLAST-MODIFIED:20221220T131629Z\r\nCATEGORIES:WORKOUT\r\nCATEGORIES:VirtualRide\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nDTSTAMP:20221220T131641Z\r\n
UID:19a8acea-f701-4177-9554-975f687efec3\r\nDTSTART;VALUE=DATE:20230402\r\nDTEND;VALUE=DATE:20230403\r\nSUMMARY:Yoga: 3m Breathing to Crush Them\r\nDESCRIPTION:This is the breathing technique used by Navy Seals to help them \r\n focus and find calm before major operations. Learn and use this technique \r\n before heading into your own major events and races.\\n\r\nLAST-MODIFIED:20221220T131629Z\r\nCATEGORIES:WORKOUT\r\nCATEGORIES:Yoga\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nDTSTAMP:20221220T131641Z\r\n
UID:a4fc87dd-b857-47dd-9289-34ef8ed08aa8\r\nDTSTART;VALUE=DATE:20230402\r\nDTEND;VALUE=DATE:20230403\r\nSUMMARY:Completed Level 3 Strength \r\nDESCRIPTION:Congratulations on completing Level 3 Strength!  \\n  \\nWe recom\r\n mend starting on Level 4 for your next plan.  \\n\r\nLAST-MODIFIED:20221220T131629Z\r\nCATEGORIES:NOTE\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n'
debug: ====================
debug: PROPFIND https://kalender.XXX XXX XXX/caldav/XXX XXX XXX/djvdvix/
debug: {'User-Agent': 'vdirsyncer/0.18.0', 'Content-Type': 'application/xml; charset=UTF-8', 'Depth': '1'}
debug: b'<?xml version="1.0" encoding="utf-8" ?>\n            <propfind xmlns="DAV:">\n                <prop>\n                    <resourcetype/>\n                    <getcontenttype/>\n                    <getetag/>\n                </prop>\n            </propfind>\n            '
debug: Sending request...
debug: 207
debug: {'Date': 'Tue, 20 Dec 2022 13:16:42 GMT', 'Content-Type': 'text/xml; charset="utf-8"', 'Content-Length': '838', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=20', 'DAV': '1, 2, 3, access-control, calendar-access, calendar-schedule, extended-mkcol, bind, addressbook, calendar-auto-schedule', 'ETag': '"bac6fef5658dd6886512a7df6d4f26ab"', 'X-DAViCal-Version': 'DAViCal/1.1.9; DB/1.2.12'}
debug: b'<?xml version="1.0" encoding="utf-8" ?>\n<multistatus xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">\n <response>\n  <href>/caldav.php/XXX XXX XXX/djvdvix/</href>\n  <propstat>\n   <prop>\n    <resourcetype>\n     <collection/>\n     <C:calendar/>\n    </resourcetype>\n    <getcontenttype>httpd/unix-directory</getcontenttype>\n   </prop>\n   <status>HTTP/1.1 200 OK</status>\n  </propstat>\n  <propstat>\n   <prop>\n    <getetag/>\n   </prop>\n   <status>HTTP/1.1 404 Not Found</status>\n  </propstat>\n </response>\n <response>\n  <href>/caldav.php/XXX XXX XXX/djvdvix/f3946e3c0f4f0f8a.ics</href>\n  <propstat>\n   <prop>\n    <resourcetype/>\n    <getcontenttype>text/calendar; component=vevent</getcontenttype>\n    <getetag>"28d2cec314a6872fa88d50dd3be20768"</getetag>\n   </prop>\n   <status>HTTP/1.1 200 OK</status>\n  </propstat>\n </response>\n</multistatus>\n'
debug: Already normalized: '/caldav.php/XXX XXX XXX/djvdvix/'
debug: Skipping '/caldav.php/XXX XXX XXX/djvdvix/', is collection.
debug: Already normalized: '/caldav.php/XXX XXX XXX/djvdvix/f3946e3c0f4f0f8a.ics'
Copying (updating) item f3946e3c0f4f0f8a to intervals_syno
debug: Already normalized: '/caldav.php/XXX XXX XXX/djvdvix/f3946e3c0f4f0f8a.ics'
debug: ====================
debug: PUT https://kalender.XXX XXX XXX/caldav.php/XXX XXX XXX/djvdvix/f3946e3c0f4f0f8a.ics
debug: {'User-Agent': 'vdirsyncer/0.18.0', 'Content-Type': 'text/calendar', 'If-Match': '"28d2cec314a6872fa88d50dd3be20768"'}
debug: b'BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPRODID:-//Intervals.icu//Cycling//EN\r\nNAME:oschmidt Intervals.icu calendar\r\nX-WR-CALNAME:oschmidt Intervals.icu calendar\r\nUID:f3946e3c0f4f0f8a\r\nCALSCALE:GREGORIAN\r\nURL:https://intervals.icu/athlete/i30567/activities\r\nREFRESH-INTERVAL:PT15M\r\nLAST-MODIFIED:20221220T131629Z\r\nBEGIN:VEVENT\r\nDTSTAMP:20221220T131641Z\r\nDTSTART;VALUE=DATE:20230402\r\nDTEND;VALUE=DATE:20230403\r\nSUMMARY:Completed Level 3 Strength \r\nDESCRIPTION:Congratulations on completing Level 3 Strength!  \\n  \\nWe recom\r\n mend starting on Level 4 for your next plan.  \\n\r\nLAST-MODIFIED:20221220T131629Z\r\nCATEGORIES:NOTE\r\nUID:ae1455af0bf04d91c52b977518ab89a7642d330f53a7dd6f79d62644b2db8a94\r\nEND:VEVENT\r\nEND:VCALENDAR'
debug: Sending request...
debug: 204
debug: {'Date': 'Tue, 20 Dec 2022 13:16:42 GMT', 'Content-Type': 'text/plain; charset="utf-8"', 'Connection': 'keep-alive', 'Keep-Alive': 'timeout=20', 'DAV': '1, 2, 3, access-control, calendar-access, calendar-schedule, extended-mkcol, bind, addressbook, calendar-auto-schedule', 'ETag': '"05797bb943a4efbd1994bcd02d52ae85"', 'X-DAViCal-Version': 'DAViCal/1.1.9; DB/1.2.12'}
debug: b''
debug: Normalized URL from 'https://kalender.XXX XXX XXX/caldav.php/XXX XXX XXX/djvdvix/f3946e3c0f4f0f8a.ics' to '/caldav.php/XXX XXX XXX/djvdvix/f3946e3c0f4f0f8a.ics'

I Would like to sync my intervals.icu publich calender to my Synology Calender. Discovery and sync goes through without error, but only the last entry will get synced to Synology.

Is there anything I can do or is there something wrong with the source file?

matthewKeville commented 5 months ago

I encountered a similar issue trying to integrate with free holiday calendars. I think the issue might be related to the format/version of the ics file. When I try to sync locally to this url https://www.webcal.guru/en-US/download_calendar?calendar_instance_id=41 , which provides an ics file with multiple events. Only the last event gets synced. However, when I try with a different url https://www.officeholidays.com/ics-fed/usa , which is also a single ics file, all events get synced.