• Aktuell
    • Tags
    • Beliebt
    • Benutzer
    • Gruppen
    • Suche
    • Registrieren
    • Anmelden

    API - Hinzufügen/Löschen von Song-Links funktioniert nicht?

    ChurchTools Schnittstellen
    2
    2
    93
    Lade mehr Beiträge
    • Älteste zuerst
    • Neuste zuerst
    • Meiste Stimmen
    Antworten
    • In einem neuen Thema antworten
    Anmelden zum Antworten
    Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
    • E
      Escabix
      zuletzt editiert von

      Hallo zusammen,

      ich generiere automatisch Audioübungsdateien und speichere sie in Nextcloud. Anschließend erstelle ich einen Link zu diesen Audiodateien, der über die ChurchTools API zu einem Song hinzugefügt werden soll. Leider funktioniert dieser letzte Schritt nicht.
      Ich habe ein einfaches Testskript geschrieben (siehe Code), das einen neuen Link im ersten Arrangement für den Song "Test-Song" hinzufügen soll. Hat jemand eine Idee, warum es nicht funktioniert? Response ist immer in Ordnung, aber online befindet sich kein neuer Link. Wie lösche ich Links?

      #!/usr/bin/env python3
      """
      Minimal ChurchTools API test script for adding links to song arrangements
      This script demonstrates the issue with adding links via REST API
      """
      
      import requests
      import json
      
      # 🔧 Configuration - UPDATE THESE VALUES
      CHURCH_TOOLS_URL = "https://myChurch.church.tools"
      CHURCH_TOOLS_USERNAME = "myEmail"
      CHURCH_TOOLS_PASSWORD = "password"  # Change to your password
      TEST_SONG_NAME = "Test-Song"  # Change to existing song name
      
      class ChurchToolsAPITest:
          def __init__(self):
              self.base_url = CHURCH_TOOLS_URL
              self.username = CHURCH_TOOLS_USERNAME
              self.password = CHURCH_TOOLS_PASSWORD
              self.session = requests.Session()
              self.logged_in = False
              
          def login(self):
              """Login to ChurchTools API"""
              login_url = f"{self.base_url}/api/login"
              login_data = {
                  "username": self.username,
                  "password": self.password
              }
              
              try:
                  response = self.session.post(login_url, json=login_data)
                  if response.status_code == 200:
                      self.logged_in = True
                      print("✅ Login successful")
                      return True
                  else:
                      print(f"❌ Login failed: {response.status_code} - {response.text}")
                      return False
              except Exception as e:
                  print(f"❌ Login error: {e}")
                  return False
          
          def get_song_by_name(self, song_name):
              """Get song data by name"""
              if not self.logged_in:
                  if not self.login():
                      return None
                      
              url = f"{self.base_url}/api/songs"
              params = {"name": song_name, "page": 1, "limit": 1}
              
              try:
                  response = self.session.get(url, params=params)
                  if response.status_code == 200:
                      data = response.json()
                      if data.get('data') and len(data['data']) > 0:
                          return data['data'][0]
                  return None
              except Exception as e:
                  print(f"❌ Error getting song: {e}")
                  return None
          
          def add_link_to_arrangement(self, song_name, link_name, link_url):
              """Attempt to add a link to song arrangement"""
              print(f"\n🎵 Testing add link for song: '{song_name}'")
              
              # Get song data
              song = self.get_song_by_name(song_name)
              if not song:
                  print(f"❌ Song '{song_name}' not found")
                  return False
                  
              song_id = song['id']
              arrangement = song['arrangements'][0]  # Get first arrangement
              arrangement_id = arrangement['id']
              
              print(f"📊 Song ID: {song_id}, Arrangement ID: {arrangement_id}")
              print(f"🔗 Current links count: {len(arrangement.get('links', []))}")
              
              # Create new link object
              new_link = {
                  "name": link_name,
                  "filename": link_url,
                  "fileUrl": link_url,
                  "domainType": "arrangement",
                  "domainId": str(arrangement_id)
              }
              
              # Add new link to existing links
              existing_links = arrangement.get('links', [])
              updated_links = existing_links + [new_link]
              
              # Prepare payload for arrangement update
              payload = {
                  "id": arrangement_id,
                  "name": arrangement["name"],
                  "key": arrangement.get("key", ""),
                  "tempo": arrangement.get("tempo", arrangement.get("bpm", 0)),
                  "songId": song_id,
                  "arrangementId": arrangement_id,
                  "links": updated_links,
                  "description": arrangement.get("description", arrangement.get("note", ""))
              }
              
              # Try to update arrangement with new link
              url = f"{self.base_url}/api/songs/{song_id}/arrangements/{arrangement_id}"
              
              print(f"🚀 Making PUT request to: {url}")
              print(f"📦 Payload: {json.dumps(payload, indent=2)}")
              
              try:
                  response = self.session.put(url, json=payload)
                  print(f"📋 Response Status: {response.status_code}")
                  print(f"📄 Response Body: {response.text}")
                  
                  if response.status_code == 200:
                      print(f"✅ Successfully added link '{link_name}'")
                      return True
                  else:
                      print(f"❌ Failed to add link. Status: {response.status_code}")
                      return False
                      
              except Exception as e:
                  print(f"❌ Error during request: {e}")
                  return False
      
      def main():
          """Main test function"""
          print("🔧 ChurchTools API - Add Link Test Script")
          print("=" * 50)
          
          # Initialize API client
          api = ChurchToolsAPITest()
          
          # Test adding a link
          test_link_name = "Test Link"
          test_link_url = "https://www.youtube.com/watch?v=4GthZbt1lPo"
          
          success = api.add_link_to_arrangement(TEST_SONG_NAME, test_link_name, test_link_url)
          
          if success:
              print("\n✅ Test completed successfully!")
          else:
              print("\n❌ Test failed - please check the output above")
              print("\n🆘 Questions for ChurchTools forum:")
              print("1. Is it possible to add links to arrangements via REST API?")
              print("2. What is the correct API endpoint and payload structure?")
              print("3. Are there any special permissions required?")
      
      if __name__ == "__main__":
          main()
      
      # Requirements for this script:
      # pip install requests
      #
      # Update the configuration variables at the top of this file:
      # - CHURCH_TOOLS_URL
      # - CHURCH_TOOLS_USERNAME  
      # - CHURCH_TOOLS_PASSWORD
      # - TEST_SONG_NAME
      

      Vielen Dank im Voraus!

      T 1 Antwort Letzte Antwort Antworten Zitieren 0
      • T
        thommyb ChurchToolsMitarbeiter @Escabix
        zuletzt editiert von

        @Escabix Die Links werden zwar als Teil des Arrangements zurückgegeben (weil es nützlich ist), aber gesetzt können sie darüber nicht werden.

        Schau mal unter "POST /api/files/song_arrangement/<arrangement_Id>/link". Dort findest du, was du suchst.

        1 Antwort Letzte Antwort Antworten Zitieren 1
        • Erster Beitrag
          Letzter Beitrag